ARP
IPv4のアドレス解決プロトコルARPの実装に関するメモ
概要
ARPのアドレス解決処理の多くは他のプロトコルとの共通処理(Neighbour)として実装されている。データ構造などの詳細はアドレス解決プロトコルを参照。ARPの管理テーブルの大元はstruct neigh_table arp_tblになる。
関連ルーチン
arp_rcv()
ARPパケットの受信ルーチン
パケットの内容をチェックして問題なければ、arp_process()を呼びだす。
パケットの内容をチェックして問題なければ、arp_process()を呼びだす。
arp_process()
ARPパケット受信処理のメインルーチン
自分対するRequestにReplyを返したり、アドレス解決処理のReplyを受け取ったときの処理を行う。
自分対するRequestにReplyを返したり、アドレス解決処理のReplyを受け取ったときの処理を行う。
arp_process()の処理概要
/* * H/W Typeなどのパケットの内容チェック */ if (sip == 0) { /* アドレス重複チェック用のパケットだった */ /* TargetIPが自システムのIPと同じであれば * 重複しているのでReplyを返す */ goto out; } if (arp->ar_op == htons(ARPOP_REQUEST) && ip_route_input(skb, tip, sip, 0, dev) == 0) { /* 受信したパケットがRequest */ : if (addr_type == RTN_LOCAL) { /* 自システムのIPアドレスに対するRequest */ /* Requestを受信したことをNeighbourエントリに通知 * 条件によってはNeighbour(ARP)エントリの状態遷移が発生する */ n = neigh_event_ns(); if (n) { /* Replyを返す */ arp_send(); } goto out; } else if (IN_DEV_FORWARD(in_dev)) { /* ProxyARPの処理 */ : goto out; } } /* * Replyの受信もしくは他システム宛のRequestだった */ /* ARPパケット送信元(sip)のARPエントリを取得 */ n = __neigh_lookup(&arp_tbl, &sip, dev, 0); if (n) { /* エントリ状態をReachable(アドレス解決済み)にする */ state = NUD_REACHABLE; : /* Neighbourの状態更新 アドレス解決待ちのパケットが * neigh->arp_queueにキューされていたなら * ここで送信される。 */ neigh_update(); } out: return 0;
arp_bind_neighbour(dst)
dstにARPエントリを括り付ける。
NextHop(((struct
rtable*)dst)->rt_gateway)に対して__neigh_lookup_errno()を呼び出し、Neighborエントリ(ARPエントリ)を探す。見つかったエントリをdst->neighbourに登録する。もしARPエントリがまだなかった場合は、__neigh_lookup_errno()は新しいエントリを作成してそれを返すので空エントリが登録される。このエントリの状態はNUD_NONE。
このルーチンはrt_intern_hash()でルーティングキャッシュにエントリを追加する時に呼び出される。
このルーチンはrt_intern_hash()でルーティングキャッシュにエントリを追加する時に呼び出される。
arp_solicit()
ARP Requestの送信ルーチン
struct neigh_opsの.solicitに登録されており、共通処理部(Neighbour)からアドレス解決やProbeで、Requestの送信が必要になった時に呼び出される。
struct neigh_opsの.solicitに登録されており、共通処理部(Neighbour)からアドレス解決やProbeで、Requestの送信が必要になった時に呼び出される。
[関連ページ]
アドレス解決プロトコル
ルーティングテーブル
IPv4