アドレスの解決

上位プロトコル層(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パケットをイーサへ出力する場合の動作を表している。

img96.gif

IPレイヤの送信処理(ip_finish_output関数)は、送信先のARP情報が登録されていない(dst_entryが空)場合、アドレス解決付の出力関数を呼び出す。(arp_hh_opsが登録されているデバイスの場合、neigh_resolve_output関数を呼び出す。)

  1. ARPキャッシュ上を検索する。
    • ARPキャッシュ上に情報が無い場合、ARPプロトコルによりアドレスの 解決を試みる。arp_solicit関数により、アドレス解決要求パケットを 生成し送出する(arp_send(ARPOP_REQUEST)関数)。
    • 送出すべきパケットは、ARPの返答があるまで、neighbour構造体の arp_queueメンバに全てリンクしておく。
    • ARPパケットがロストした時に備え、 ARP再送タイマ(neigh_timer_handler関数)の起動要求を行う。
  • ARPキャッシュ上に情報がある場合、
    • dst_entryにARP情報を登録。これにより次回のIPレイヤの 送信処理(ip_finish_output関数)からの出力要求は dev_queue_xmit()が呼び出されるようになる(hh_outputメソッド)。
    • パケットにハードウェアヘッダを生成し (net_device構造体の hard_headerメソッド呼び出し)、 その後、ドライバへパケット送信(dev_queue_xmit関数)を行う。

アドレス解決要求を出した後、応答がある前に次々とパケット送信要求があった場合は、neighbour構造体の arp_queueメンバに繋いでおき、実際の送信処理は開始しない(できない)。

ARPパケットが到着した場合、arp_rcv関数が呼び出される。ARPパケットには、先に要求したアドレス解決要求パケットに対する応答(リプライ)の場合と、他のホストから当ホストへのアドレス解決要求である場合がある。

  1. アドレス解決要求(ar_opがARPOP_REQUEST)の場合
    • ARP応答返送経路を検索(ip_route_input関数)する。
    • ARPキャッシュ(arp_tbl)を検索(neigh_evnet_ns関数)する。
    • アドレス解決要求の応答を返却する(arp_send(ARPOP_REPLY)関数)
  • アドレス解決応答(ar_opがARPOP_REPLY)の場合
    • ARPキャッシュ(arp_tbl)を検索(neigh_lookup関数)し、 ARPキャッシュを更新する(neigh_update関数)。
    • 送信が保留されていたパケットの送信を行う。 neighbour構造体のarp_queueメンバにリンクされている パケットを外し、ドライバへパケット送信(dev_queue_xmit関数)を行う。

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1