無料Wikiサービス | デモページ
Linux Kernel(2.6)の実装に関するメモ書き
リンク
最近更新したページ
検索

ARP


IPv4のアドレス解決プロトコルARPの実装に関するメモ

概要

ARPのアドレス解決処理の多くは他のプロトコルとの共通処理(Neighbour)として実装されている。データ構造などの詳細はアドレス解決プロトコルを参照。ARPの管理テーブルの大元はstruct neigh_table arp_tblになる。


関連ルーチン

arp_rcv()
ARPパケットの受信ルーチン
パケットの内容をチェックして問題なければ、arp_process()を呼びだす。

arp_process()
ARPパケット受信処理のメインルーチン

自分対する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()でルーティングキャッシュにエントリを追加する時に呼び出される。

arp_solicit()
ARP Requestの送信ルーチン

struct neigh_opsの.solicitに登録されており、共通処理部(Neighbour)からアドレス解決やProbeで、Requestの送信が必要になった時に呼び出される。


[関連ページ]
アドレス解決プロトコル
ルーティングテーブル
IPv4


最終更新 2006/08/07 18:38:53 - kztomita
(2006/08/07 17:27:33 作成)