ARP(9)

名称
arp, arp_ifinit, arpresolve, arpintr - 外部公開の ARP 関数群

書式
#include <netinet/if_inarp.h> void arp_ifinit(struct ifnet *ifp, struct ifaddr *ifa) int arpresolve(struct ifnet *ifp, struct rtentry *rt, struct mbuf *m, struct sockaddr *dst, u_char *desten) void arpintr()

解説
arp 関数群は、 arp 機能を必要とするネットワークドライバと arp モジュール間のインタフェースを提供します。 それらのドライバは、"files" の定義中で arp 属性を要求しておく必要があります。

arp_ifinit()
    ifa 内の arp のためのフィールドを準備します。さらに、 ifp へ無意味な arp リクエストを発行します。それによって、他のマシンへ (新規の) アドレスが 追加されたことを知らせ、またアドレスの重複を検出することができます。

    ドライバの ioctl 関数の AF_INET アドレスファミリの SIOCSIFADDR リクエストでは、これを呼び出す必要があります。

arpresolve()
    はネットワーク出力関数が IPv4 のアドレス変換 をするために使います。 rt が指定されなければ、空いているものを探すか、新たに生成します。 指定した、あるいは割り当てた rt に有効な ゲートウエイリンクレベルのアドレス がなければ、 m 内のパケットへのポインタをその時点でのパケットを置き換えて route エントリ に保存し、 arp リクエストを発行します。 arp 応答を受け取ると、その保存したパケットの送出を行います。 そうでなければ、検索されたアドレスが返るので、 desten の指す位置に書き込みます。 arpresolve() は、有効なアドレスを desten に書き込んだ場合には 1 を返し、その場合すぐにパケットを送出できます。 そうでなければ 0 を返します。

arpintr()
    ネットワークドライバ (クラス) の入力割込ハンドラは、 arp パケットを受け取るとそのパケットを arpintrq キューに追加し、 arpintr() ソフトウエア割込コールバックを要求します。 arpintr() はパケットをキューから取り出し、正常性チェックを行い、 in_arpinput() 関数を呼び出します (現状唯一サポートしている IPv4 の arp パケット用です)。 in_arpinput() はまた、リクエストパケットの応答を生成し、該当する経路エントリが 見つかった場合には発行元のアドレス変換をルーティングテーブルに 追加します。保持しているパケットへのポインタがその経路エントリに 存在していれば、そのパケットはそのパケットは送出済みです。

関連項目
ifattach(9), ether_ifattach(9), fddi_ifattach(9), arc_ifattach(9)
Plummer, D., "RFC826", An Ethernet Address Resolution Protocol.

作者
UCB CSRG (最初の実装)
Ignatios Souvatzis (非イーサネットのサポート)

コード参照
ARP コードは、 sys/net/if_arp.h, sys/netinet/if_inarp.h, sys/netinet/if_arp.c に実装されています。

規格
RFC 826

歴史
NetBSD 1.3 でイーサネットリンクレベルアドレス以外をサポートするよう書きなおされました。