ETHERSUBR(9)

名称
ethersubr, ether_ifattach, ether_addmulti, ether_delmulti, ETHER_FIRST_MULTI, ETHER_NEXT_MULTI, ETHER_IS_MULTICAST, fddi_ifattach, fddi_addmulti, fddi_delmulti - Ethernet と FDDI ドライバのサポートする関数とマクロ

書式
#include <net/if_ether.h> void ether_ifattach(struct ifnet *ifp, u_int8_t *lla) int ether_addmulti(struct ifrequest *ifr, struct ethercom *ec) int ether_delmulti(struct ifrequest *ifr, struct ethercom *ec) void ETHER_FIRST_MULTI(struct ether_multistep step, struct ethercom *ec, struct ether_multi *enm) void ETHER_NEXT_MULTI(struct ether_multistep step, struct ether_multi *enm) int ETHER_IS_MULTICAST(u_int8_t *addr) #include <net/if_fddi.h> void fddi_ifattach(struct ifnet *ifp, u_int8_t *lla) int fddi_addmulti(struct ifrequest *ifr, struct ethercom *ec) int fddi_delmulti(struct ifrequest *ifr, struct ethercom *ec)

解説
ethersubr 関数群は、 ethersubr モジュールと、Ethernet をサポートするネットワークドライバ間の インターフェイスを提供します。 ether ドライバは、 "files" (訳注: files とは sys/dev/isa/files.isa などのこと) での宣言で "ether" 属性を指定する必要があり、 下に記す関数を適切に呼ばなければなりません。

FDDI ドライバは、"files" での宣言で "fddi" 属性を指定する必要があり、 ether と違う代わりに "fddi_" や "FDDI_" で始まる関数を呼ばなければなりません。 いくつかのマクロは共有されています。

あなたのハードウェアで IPv4 をサポートするためには、 arp(9) についての知識も必要なことに注意してください。

ether_ifattach()
    デバイス非依存ですが、Ethernet 特有の初期化を、ポインタ ifp で指されるインターフェイスに対して行います。

    加えてやらなければいけないことは、これらの関数はインターフェイスの アドレスリストの中にリンクレベルアドレスを覚えておき、 リンクレベルアドレスを引数 lla が指し示すアドレスに記録することです。

    ドライバの attach ルーチンの中でこの関数を呼ばなければなりません。

fddi_ifattach()
    FDDI デバイスに対応する関数です。

ether_addmulti()

ether_delmulti()
    ポインタ ifr で示される (ネットワーク) アドレスを、 ec に属する Ethernet マルチキャストリストに加える (ether_addmulti()) 、または削除 (ether_delmulti()) します。

    これらの関数は、 SIOCADDMULTI と SIOCDELMULTI のリクエストを扱うためにハードウェア側のドライバの ioctl ルーチンから 呼ぶようにしなければなりません。これらの関数が、リターン値に ENETRESET を返すようであれば、デバイスドライバ側で マルチキャストフィルタを再初期化しなければなりません。

    これらの関数は、 AF_UNSPEC アドレスを受けつけ、それは Ethernet アドレスか AF_INET アドレスとして解釈されます。 後者では、 INADDR_ANY は、IPv4 のマルチキャストアドレスとして予約されている Ethernet アドレス空間 の全範囲と見なされてマップされます

    ether_addmulti() は、サポートされていないアドレスファミリが指定された時に EAFNOSUPPORT を返し、マルチキャストでないアドレスが指定された時は EINVAL を返します。また、マルチキャストリストが実際に変更され、ドライバが そのハードウェアフィルタをマルチキャストアドレスと同期すべき時には ENETRESET を返します。

    上記のエラーに加え、 ether_delmulti() は、指定されたアドレスがマルチキャストアドレスリストから見つからなかった場合に ENXIO を返します。

fddi_addmulti()

fddi_delmulti()
    FDDI デバイスに対応する関数です。

ETHER_NEXT_MULTI()
    これは、ether_multi レコードをぜんぶ辿るためのマクロで、 一回使う毎に ether_multi レコードを一つ辿ります。 現在の位置は step に記憶され、これは必ずマクロを呼び出す側で用意しなければなりません。

ETHER_FIRST_MULTI()
    これは、 step の初期化と、最初のレコードを得るために呼ばれなければいけないマクロです。 これら二つのマクロ (訳注: ETHER_NEXT_MULTI と ETHER_FIRST_MULTI) は、 残りレコードが無い場合には enm に NULL を返します。

ETHER_IS_MULTICAST()
    addr が Ethernet/FDDI マルチキャスト (もしくはブロードキャスト) アドレスを 指している場合に 1 を返します。マクロにより実装されています。

関連項目
arp(9)

作者
UCB CSRG (最初の実装)
Ignatios Souvatzis (new ARP システムのサポート)

コード参照
Ethernet がサポートしている関数は <net/if_ether.h> において宣言され、 /usr/src/sys/net/if_ethersubr.c の中で (マクロで実装されているもの以外は) 定義されています。

FDDI がサポートしている関数は <net/if_fddi.h> において宣言され、 /usr/src/sys/net/if_fddisubr.c の中で (マクロで実装されているもの以外は) 定義されています。

歴史
NetBSD 1.3 において、new ARP システムを attach するように書きなおされました。