Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
上位プロトコル層(IP層など)から、パケット送信のためにネットワークドライバの起動(dev_queue_xmit関数)を行う場合、論理アドレス(IPアドレスなど)とハードウェアアドレス(イーサアドレス)との対応作業が必要である。
下位ハードウェアの種類により、アドレス解決の方法は異なる。複数の解決方法が用意されており、各ドライバは初期化時に下記いずれかの解決方法(操作関数テーブル)を登録する。
操作関数テーブル | 説明 |
arp_hh_ops | ARPプロトコルにより、アドレス解決なデバイス用。 一度解決したARP情報をキャッシュとして保存する。 イーサデバイスはこれに含まれる。 |
arp_direct_ops | 物理アドレスとの対応付けの必要のないデバイスの場合。 1対1の直結線などでハードヘッダ生成不必要のデバイス用。 出力時のアドレス変換作業は行わず、毎回直接dev_queue_xmit関数を 起動する。 |
arp_generic_ops | ハードウェア(ドライバ)レベルでアドレス解決機能を持つことのできる デバイス用。 |
イーサドライバの場合、通常arp_hh_ops が登録される。下図は、IPパケットをイーサへ出力する場合の動作を表している。
IPレイヤの送信処理(ip_finish_output関数)は、送信先のARP情報が登録されていない(dst_entryが空)場合、アドレス解決付の出力関数を呼び出す。(arp_hh_opsが登録されているデバイスの場合、neigh_resolve_output関数を呼び出す。)
アドレス解決要求を出した後、応答がある前に次々とパケット送信要求があった場合は、neighbour構造体の arp_queueメンバに繋いでおき、実際の送信処理は開始しない(できない)。
ARPパケットが到着した場合、arp_rcv関数が呼び出される。ARPパケットには、先に要求したアドレス解決要求パケットに対する応答(リプライ)の場合と、他のホストから当ホストへのアドレス解決要求である場合がある。
(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST1
[ページ情報]
更新日時: 2008-08-27 14:17:59, 更新者: hiromichi-m
[権限]
表示:無制限, 編集:ログインユーザ, 削除/設定:メンバー