IPv4のアドレス解決プロトコルARPの実装に関するメモ
ARPのアドレス解決処理の多くは他のプロトコルとの共通処理(Neighbour)として実装されている。データ構造などの詳細はアドレス解決プロトコルを参照。ARPの管理テーブルの大元はstruct neigh_table arp_tblになる。
/* * 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;