EN JA
IFNET(9)
IFNET(9) FreeBSD Kernel Developer's Manual IFNET(9)

名称

ifnet, ifaddr, ifqueue, if_dataネットワークインタフェースを操作するためのカーネルインタフェース

書式

#include < sys/param.h>
#include < sys/time.h>
#include < sys/socket.h>
#include < net/if.h>
#include < net/if_var.h>
#include < net/if_types.h>

インタフェース操作関数

struct ifnet *
if_alloc( u_char type);

void
if_attach( struct ifnet *ifp);

void
if_detach( struct ifnet *ifp);

void
if_free( struct ifnet *ifp);

void
if_free_type( struct ifnet *ifp, u_char type);

void
if_down( struct ifnet *ifp);

int
ifioctl( struct socket *so, u_long cmd, caddr_t data, struct thread *td);

int
ifpromisc( struct ifnet *ifp, int pswitch);

int
if_allmulti( struct ifnet *ifp, int amswitch);

struct ifnet *
ifunit( const char *name);

struct ifnet *
ifunit_ref( const char *name);

void
if_up( struct ifnet *ifp);

インタフェースアドレス関数

struct ifaddr *
ifaddr_byindex( u_short idx);

struct ifaddr *
ifa_ifwithaddr( struct sockaddr *addr);

struct ifaddr *
ifa_ifwithdstaddr( struct sockaddr *addr);

struct ifaddr *
ifa_ifwithnet( struct sockaddr *addr, int ignore_ptp);

struct ifaddr *
ifaof_ifpforaddr( struct sockaddr *addr, struct ifnet *ifp);

void
ifa_ref( struct ifaddr *ifa);

void
ifa_free( struct ifaddr *ifa);

インタフェースマルチキャストアドレス関数

int
if_addmulti( struct ifnet *ifp, struct sockaddr *sa, struct ifmultiaddr **ifmap);

int
if_delmulti( struct ifnet *ifp, struct sockaddr *sa);

struct ifmultiaddr *
if_findmulti( struct ifnet *ifp, struct sockaddr *sa);

出力キューマクロ

IF_DEQUEUE( struct ifqueue *ifq, struct mbuf *m);

struct ifnet メンバ関数

void
(*if_input)( struct ifnet *ifp, struct mbuf *m);

int
(*if_output)( struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst, struct route *ro);

void
(*if_start)( struct ifnet *ifp);

int
(*if_transmit)( struct ifnet *ifp, struct mbuf *m);

void
(*if_qflush)( struct ifnet *ifp);

int
(*if_ioctl)( struct ifnet *ifp, u_long cmd, caddr_t data);

void
(*if_init)( void *if_softc);

int
(*if_resolvemulti)( struct ifnet *ifp, struct sockaddr **retsa, struct sockaddr *addr);

struct ifaddr メンバ関数

void
(*ifa_rtrequest)( int cmd, struct rtentry *rt, struct rt_addrinfo *info);

グローバル変数

extern struct ifnethead ifnet;
extern int if_index;
extern int ifqmaxlen;

データ構造体

ネットワークインタフェースの操作のためのカーネルメカニズムは、主として < net/if.h>< net/if_var.h>ifnet, if_data, ifaddrifmultiaddr 構造体に存在しま、上記で指定された関数は、 /sys/net/if.c に定義されています。ユーザプログラムによって使用されることを目的としている、それらのインタフェースは、 < net/if.h> で定義されています。これらは、インタフェースフラグ、 if_data 構造体、 route(4) ルーティング (経路制御) ソケットと sysctl(3) でのインタフェース関連のメッセージの外観を定義する構造体を含んでいます。ヘッダファイル < net/if_var.h> は、 ifnet, ifaddrifmultiaddr 構造体とそれらを操作する関数を含む、カーネル内部のインタフェースを定義しています。いくつかのユーザプログラムは、 < netinet/if_ether.h> のようなある他のヘッダファイルの必要条件であるので、 < net/if_var.h> を必要とします。特にそれらの 2 つのファイルのほとんどの参照は、 < net/ethernet.h> によって置き換えることができます。

システムは、 queue(3) で定義された TAILQ マクロを使用してインタフェースのリンクリストを保持します。このリストは、 ifnet と呼ばれる struct ifnethead によってリストの先頭とされます。このリストの要素は、タイプ struct ifnet があり、そういうものとしてインタフェースを操作するほとんどのカーネルルーチンは、に受け付けるか、これらの構造体へのポインタを返します。それぞれのインタフェース構造体は、統計と情報のために使用される if_data 構造体を含んでいます。また、各インタフェースには、 ifaddr 構造体によって記述されたインタフェースアドレスの TAILQ があります。 (もしあるなら) インタフェースによって実装されたリンクレイヤについて記述している AF_LINK アドレス ( link_addr(3)) 参照) は、 ifaddr_byindex() 関数または if_addr 構造体によってアクセスされます。 (いくつかのささいなインタフェースは、何のもリンクレイヤアドレス、インタフェース名とインデックスを識別するためだけにまだ存在し、供給されるこの構造体を提供しません。)

最終的に、マルチキャストデータグラムの受信をサポートするそれらのインタフェースは、 ifmultiaddr 構造体によって記述されたマルチキャストグループメンバシップの TAILQ があります。これらのメンバシップは、参照によってカウントされます。

また、インタフェースは、 struct ifqueue として定義された出力キューに関連しています。この構造体は、インタフェースが他に送信するプロセスがある間に、パケットを保持するために使用されます。

ifnet Ss 構造体

struct ifnet のフィールドは、次の通りです:
if_softc
( void *) ドライバのプライベート状態のブロックへのポインタ。 (ドライバによって初期化されます。)
if_l2com
( void *) インタフェースのレイヤ (層) 2 プロトコルのための一般的なデータへのポインタ。 ( if_alloc() によって初期化されます。)
if_vnet
( struct vnet *) 仮想ネットワークスタックのインスタンスへのポインタ。 ( if_attach() によって初期化される。)
if_home_vnet
( struct vnet *) この struct ifnet が生じるところで、親の仮想ネットワークスタックへのポインタ。 ( if_attach() によって初期化される。)
if_link
( TAILQ_ENTRY( ifnet)) queue(3) マクログルー。
if_xname
( char *) インタフェースの名前、(例えば、“ fxp0”または“ lo0)。” ((通常、 if_initname() を通して) ドライバによって初期化されます。)
if_dname
( const char *) ドライバの名前。 ((通常、 if_initname() を通して) ドライバによって初期化されます。)
if_dunit
( int) 特定のドライバによって管理されている各インタフェースに割り当てられたユニークな数。ドライバは、ユニット番号がデバイスに関連していないなら、 IF_DUNIT_NONE にこれを設定することを選ぶかもしれません。 ((通常、 if_initname() を通して) ドライバによって初期化されます。)
if_refcount
( u_int) 参照 (reference) カウント。 ( if_alloc() によって初期化される。)
if_addrhead
( struct ifaddrhead) このインタフェースに割り当てられたアドレスのリストを含む queue(3) TAILQ の先頭。
if_pcount
( int) 参照カウント IFF_PROMISC フラグに使用されるこのインタフェースでの無差別のリスナ (接続受け付け者) のカウント。
if_carp
( struct carp_if *) CARP インタフェース構造体 carp(4) へのポインタ。 (ドイラバ特有の if_ioctl() ルーチンによって初期化される。)
if_bpf
( struct bpf_if *) パケットフィルタ bpf(4) のための不透明な (サイズ及び形がわからない) インタフェース毎のデータ。 ( bpf_attach() よって初期化されます。)
if_index
( u_short) アタッチされるものとして順に各インタフェースに割り当てられたユニークな数。この番号は、インデックス ( link_addr(3) 参照) によって特定のインタフェースを参照するために struct sockaddr_dl で使用することができます。 ( if_alloc() によって初期化されます。)
if_vlantrunk
( struct ifvlantrunk *) 802.1Q トランク構造体 vlan(4) へのポインタ。 (ドイラバ特有の if_ioctl() ルーチンによって初期化される。)
if_flags
( int) このインタフェースの操作上のパラメータを説明するフラグ (下記参照)。 (一般的なコードによって操作されます。)
if_drv_flags
( int) このインタフェースの操作上の状態を説明するフラグ (下記参照)。 (ドライバによって操作されます。)
if_capabilities
( int) インタフェースがサポートするケイパビリティについて説明するフラグ (下記参照)。
if_capenable
( int) インタフェースの有効にされたケイパビリティについて説明するフラグ (下記参照)。
if_linkmib
( void *) ifmib(4) によってエクスポートされたインタフェース特有の MIB 構造体へのポインタ。 (ドライバによって初期化されます。)
if_linkmiblen
( size_t) 前述の構造体のサイズ。 (ドライバによって初期化されます。)
if_data
( struct if_data) より多くの統計と情報については、下記の if_data 構造体 を参照してください。 (ドライバと一般的なコードの両方によって操作されたドライバによって初期化されます。)
if_multiaddrs
( struct ifmultihead) このインタフェースへ割り当てられたマルチキャストアドレスのリストを含んでいる queue(3) TAILQ の先頭。
if_amcount
( int) IFF_ALLMULTI フラグを参照カウントするために使用される、このインタフェースのマルチキャスト要求の数。
if_addr
( struct ifaddr *) リンクレベルインタフェースアドレスへのポインタ。 ( if_alloc() によって初期化される。)
if_snd
( struct ifaltq) 出力キュー。 (ドライバによって操作されます。)
if_broadcastaddr
( const u_int8_t *) 可変アドレス長があるプロトコルのためのリンクレベルブロードキャスト (同報通信) のバイト文字列。
if_bridge
( void *) ブリッジインタフェース構造体、 if_bridge(4) へのポインタ。 (ドイラバ特有の if_ioctl() ルーチンによって初期化される。)
if_label
( struct label *) MAC フレームワークラベル構造体、 mac(4) へのポインタ。 ( if_alloc() によって初期化される。)
if_afdata
( void *) アドレスファミリ依存のデータ領域。
if_afdata_initialized
( int) アドレスファミリの初期化の現在の状態を追跡するために使用されます。
if_afdata_lock
( struct rwlock) 内部の if_afdata を保護するために使用される rwlock(9) ロック。
if_linktask
( struct task) インタフェースのリンク状態変更のイベントのためにスケジュールされた taskqueue(9) タスク。
if_addr_lock
( struct rwlock) インタフェース関連のアドレスリストを保護するために使用される rwlock(9) ロック。
if_clones
( LIST_ENTRY( ifnet)) クローン可能なネットワークインタフェースのリストのための queue(3) マクログルー (glue)。
if_groups
( TAILQ_HEAD( , ifg_list)) インタフェースごとのグループのリストを含んでいる queue(3) TAILQ の先頭。
if_pf_kif
( void *) pf(4) によってインタフェースの抽象化のために使用される構造体へのポインタ。
if_lagg
( void *) lagg(4) インタフェース構造体へのポインタ。
if_alloctype
( u_char) その割り付けの時点でのインタフェースのタイプ。 if_alloc() に渡されたタイプをキャッシュするために使用されますが、 if_type と異なり、ドライバによって変更されません。

ifnet 構造体への参照は、 if_ref() 関数を呼び出すことによって獲得され、 if_rele() 関数を呼び出すことによって解放されます。それらは、 ifnet 構造体の安定をまだ保持する ifnet ロックを解放する、カーネルコードウォーキング (walking) グローバルインタフェースリストを許可するために使用されます。

さらに、ドライバが一般的なインタフェースレイヤ (層) とのインタフェースを完了するために初期化しなければならない多くの関数ポインタがあります:

if_input()
パケットのリンクレイヤヘッダから決定されるパケットを適切な上位の層に渡します。このルーチンは、割り込みハンドラから呼び出されるか、またはこのインタフェースにおけるパケットの受信をエミュレートするために使用されます。 if_input() を実装するただ一つの関数は、同じリンクレイヤフレーム、例えばイーサネット、を利用している複数のドライバの中で共有することができます。
if_output()
インタフェース ifp でパケットを出力するか、またはインタフェースが既にアクティブであるなら、出力キューでそれをキューに入れます。
if_transmit()
インタフェースでパケットを送信するか、またはインタフェースが使用中であるなら、それをキューに入れます。この関数は、デバイスのソフトウェアとハードウェアのキューがともに満杯であるなら、 ENOBUFS を返します。この関数は、デフォルトの実装を上書きするために if_attach() の後に、インストールされなければなりません。
if_qflush()
インタフェースがダウンとマークされたとき、内部的に管理されたキューの mbuf を解放します。この関数は、デフォルトの実装を上書きするために、 if_attach() の後に、インストールされなければなりません。この関数は、ドライバがそれら自体のキュー管理することができ、 ifq への頻繁に根拠のないエンキューとデキューの組によって生じるレイテンシ (待ち時間) を減少することができる手段として公開されています。提案された内部のソフトウェアキューメカニズムは、buf_ring です。
if_start()
インタフェースでキューに入れられた出力を開始します。この関数は、すべてのドライバの中で if_output() を共有するためにいくつかのインタフェースのクラスを規定するために公開されます。 if_start() は、 IFF_DRV_OACTIVE フラグが設定されないときだけ、呼び出されるかもしれません。 (したがって、 IFF_DRV_OACTIVE は、出力がアクティブであることを文字通り意味しませんが、むしろ、デバイスの内部の出力キューが満杯であることを意味します。) この関数は、まもなく廃止される可能性があることに注意してください。
if_ioctl()
インタフェース関連の ( < sys/sockio.h> で定義される) ioctl(2) 要求を処理します。予備の処理は、適切な特権、操作されるインタフェースの場所、とフラグを回転させて、キューをフラッシュするような特定の一般的な操作の実行をチェックするために一般的なルーチン ifioctl() によって行われます。詳しい情報に関しては、以下の ifioctl() の説明を参照してください。
if_init()
ハードウェアを初期化して、立ち上げます、例えば、チップをリセットし、受信側ユニットを有効にします。インタフェースが実行中であるとマークするべきですが、アクティブではありません ( IFF_DRV_RUNNING, ~IIF_DRV_OACTIVE)。
if_resolvemulti()
正しいか、要求されたマルチキャストグループメンバシップ、 addr をチェックし、必要なら、 *retsa で返されるそのアドレスに一致しているリンクレイヤグループを計算します。成功すれば 0 を返すか、または失敗すればエラーコードを返します。

インタフェースフラグ

インタフェースフラグは、多くの異なった目的に使用されます。いくつかのフラグは、単にインタフェースのタイプとそのケイパビリティに関する情報を示します。他のものは、インタフェースの現在の状態を反映するために動的に操作されます。前の種類のフラグは、このテーブルで<S>とマークされます。後者は、<D>とマークされます。“IFF_DRV_”で始まるフラグは、 if_drv_flags に格納されます。他のすべてのフラグは、 if_flags に格納されます。

マクロ IFF_CANTCHANGE は、 ioctl(2)SIOCSIFFLAGS コマンドを使用してユーザプログラムによって設定することができないビットを定義します。これらは、次のリストでアスタリスク (‘ *’) で示されます。

IFF_UP
<D>インタフェースは、ユーザレベルコードによって設定されました。
IFF_BROADCAST
<S*>インタフェースは、ブロードキャスト (同報通信) をサポートしています。
IFF_DEBUG
<D>ドライバのデバッグがコードを有効/無効にするために使用します。
IFF_LOOPBACK
<S>インタフェースは、ループバックデバイスです。
IFF_POINTOPOINT
<S*>インタフェースは、ポイントツーポイントです。“broadcast” (同報通信) アドレスは、実際に相手のアドレスです。
IFF_SMART
<S*>インタフェースは、 if_up() と if_down() の一般的なコードを使用するのではなく、それ自体のルート (経路) を管理します。これは、恐らくシリアルラインに対して役に立ちます。
IFF_DRV_RUNNING
<D*>インタフェースが設定され、成功すれば動的にリソースが割り付けられます。たぶん内部でのみ役に立つインタフェースです。
IFF_NOARP
<D>このインタフェースでネットワークアドレスの解決を無効にします。
IFF_PROMISC
<D*>このインタフェースは、プロミシャス (無差別) モードです。
IFF_PPROMISC
<D>このインタフェースは、永久に ( IFF_PROMISC の意味を含んだ) プロミシャス (無差別) モードです。
IFF_ALLMULTI
<D*>このインタフェースは、(マルチキャストルータで使用される) オールマルチキャストモードです。
IFF_DRV_OACTIVE
<D*>インタフェースのハードウェア出力キュー (もしあれば) が満杯です。出力パケットは、キューに入れられます。
IFF_SIMPLEX
<S*>インタフェースは、それ自体の転送を聞くことができません。訳注: 「聞く」は、listen (接続を受け付け) の意味と思われる。
IFF_LINK0
IFF_LINK1
IFF_LINK2
<D>リンクレイヤのための制御フラグ。 (現在いくつかのデバイス上の複数の物理的な層の中での選択が悪用されています。)
IFF_MULTICAST
<S*>このインタフェースは、マルチキャストをサポートします。
IFF_CANTCONFIG
<S*>インタフェースは、意味のある方法で設定可能ではありません。インタフェースリストで登記された IFT_USB インタフェースのために主として役に立ちます。
IFF_MONITOR
<D>このインタフェースは、パケットの送信をブロックし、BPF 処理の後に着信パケットを廃棄します。ネットワークトラフィックをモニタするために使用されますが、問題のネットワークと情報をやりとりをしません。
IFF_STATICARP
<D>このインタフェースで ARP 要求を有効にする/無効にするために使用されます。
IFF_DYING
<D*>このインタフェースの ifnet 構造が解放されていて、まだ if_refcount 参照があるとき、設定されます。
IFF_RENAMING
<D*>このインタフェースが改名されているとき、設定されます。

インタフェースケーパビリティフラグ

インタフェースケイパビリティは、インタフェースがサポートするかどうかわからない特殊化している機能です。これらのケイパビリティは、たいへんハードウェアに特有であり、インタフェースへ特定のネットワーク処理をオフロードするか、または他のカーネルの部品によって使用するために特別の機能を提供するために有効にされるとき、可能になります。

ケイパビリティが完全に制御できないか (すなわち、それを無効にする方法なしで常に有効にされたままとなる)、またはそれ自体の制限された制御を許すことができることを (例えば、別のケイパビリティの状態に依存する) 強調されるべきです。そのような特性は、特定のインタフェースのハードウェアとドライバによって単に決定されます。ドライバは、どのようにインタフェースケイパビリティが制御することができるかどうかの知識を唯一所有しています。その結果として、 if_capenable のケイパビリティフラグは、インタフェースドライバ以外のカーネルコードによって決して直接変更されるべきではありません。 ifioctl() へのコマンド SIOCSIFCAP は、インタフェースで if_capenable を変更することを試みる専用の手段です。ユーザランドのコードは、当然 ioctl(2) を使用します。

次のケイパビリティは、現在、システムによってサポートされています:

IFCAP_RXCSUM
このインタフェースは、データを受信するときのチェックサムの検証ができます。いくつかのインタフェースには、特定 MTU サイズを越えるフレームを格納する十分なバッファ記憶域がありません。インタフェースのためのドライバは、MTU が決め打ちされた制限を超えて設定されるなら、ハードウェアチェックサムの検証を無効にするかもしれません。
IFCAP_TXCSUM
このインタフェースは、データを転送するときのチェックサムの計算ができます。
IFCAP_HWCSUM
( IFCAP_RXCSUM | IFCAP_TXCSUM) の省略形。
IFCAP_NETCONS
このインタフェースをネットワークコンソールとすることができます。
IFCAP_VLAN_MTU
vlan(4) ドライバは、 vlan(4) インタフェースの MTU を 1500 バイト以下に減少させる必要なしで、ソフトウェアタグ付けモードでこのインタフェース上で動作することができます。これは、このインタフェースの能力がイーサネット仕様によって許されるよりいくらか長いフレームでうまく処理することを意味します。
IFCAP_VLAN_HWTAGGING
このインタフェースは、出力のときに VLAN タグ付けを行い、入力のときにそれらの VLAN タグによってフレームをデマルチプレックス (逆多重化) することができます。
IFCAP_JUMBO_MTU
このイーサネットインタフェースは、フレームを 9000 バイト長まで送受信することができます。
IFCAP_POLLING
このインタフェースは、 polling(4) をサポートします。詳細についてては、下記を参照してください。
IFCAP_VLAN_HWCSUM
このインタフェースは、 vlan(4) インタフェース ( IFCAP_HWCSUM を意味する) のデータの送信と受信の両方でチェックサムの計算を行うことができます。
IFCAP_TSO4
このイーサネットインタフェースは、TCP4 セグメンテーションオフローディング (offloading) をサポートします。
IFCAP_TSO6
このイーサネットインタフェースは、TCP6 セグメンテーションオフローディング (offloading) をサポートします。
IFCAP_TSO
( IFCAP_TSO4 | IFCAP_TSO6) の省略形。
IFCAP_TOE4
このイーサネットインタフェースは、TCP オフローディング (offloading) をサポートします。
IFCAP_TOE6
このイーサネットインタフェースは、TCP6 オフローディング (offloading) をサポートします。
IFCAP_TOE
( IFCAP_TOE4 | IFCAP_TOE6) の省略形。
IFCAP_WOL_UCAST
このイーサネットインタフェースは、任意のユニキャスト (unicast) パケットのウェークアップ (waking up) をサポートします。
IFCAP_WOL_MCAST
このイーサネットインタフェースは、任意のマルチキャスト (Multicast) パケットのウェークアップ (waking up) をサポートします。
IFCAP_WOL_MAGIC
このイーサネットインタフェースは、 wake(8) によって送信されるような任意のマジック (Magic) パケットのウェークアップ (waking up) をサポートします。
IFCAP_WOL
( IFCAP_WOL_UCAST | IFCAP_WOL_MCAST | IFCAP_WOL_MAGIC) の省略形。
IFCAP_TOE4
このイーサネットインタフェースは、TCP4 Offload Engine をサポートします。
IFCAP_TOE6
このイーサネットインタフェースは、TCP6 Offload Engine をサポートします。
IFCAP_TOE
( IFCAP_TOE4 | IFCAP_TOE6). の省略形。
IFCAP_VLAN_HWFILTER
このインタフェースは、 vlan(4) インタフェースのハードウェアでフレームのフィルタリングをサポートします。
IFCAP_POLLING_NOCOUNT
処理されたパケットの数のために返された値は、このインタフェースのためにスキップされるべきです。
IFCAP_VLAN_HWTSO
このインタフェースは、 vlan(4) インタフェース ( IFCAP_TSO を意味する) の TCP セグメンテーションオフローディング (Segmentation offloading) をサポートします。
IFCAP_LINKSTATE
このイーサネットインタフェースは、ダイナミックリンク状態変更をサポートします。

ホスト CPU からボードまでの特定のコンピュータのタスクをオフロードする高度なネットワークインタフェースの能力は、大部分 TCP/IP に制限されます。したがって、インタフェース (下記の ifnet.if_data.ifi_hwassist 参照) に関連している別々のフィールドは、TCP/IP 処理に特有の有効にされたケイパビリティの詳細な記述を保持します。 TCP/IP モジュールは、インタフェースによって 発信 パケットで、どのタスクを行うことができるかを確認するためにフィールドを調べます。すなわち、そのフィールドのために定義されたフラグは、 mbuf.m_pkthdr.csum_flags のためのそれらのスーパセットです:

CSUM_IP
インタフェースは、IP チェックサムを計算します。
CSUM_TCP
インタフェースは、TCP チェックサムを計算します。
CSUM_UDP
インタフェースは、UDP チェックサムを計算します。
CSUM_IP_FRAGS
インタフェースは、ホスト CPU によって断片化されたパケットのために TCP または UDP チェックサムを計算することができます。 CSUM_TCP または CSUM_UDP と一緒にだけに意味があります。
CSUM_FRAGMENT
必要なら、インタフェースは、IP パケットの断片化を行います。ホスト CPU は、それを通して転送するパケットが IP であり、ハードウェアバッファのサイズを超えない限り、このインタフェースの MTU を心配する必要はありません。

インタフェースは、パケットを含む mbuf chain のフィールド mbuf.m_pkthdr.csum_flags で対応するフラグを設定することによって 着信 パケットで実行した前者のタスクに関する TCP/IP モジュールに通知します。詳細に関しては、 mbuf(9) を参照してください。

polling(4) モードで動作するためのネットワークインタフェースのケイパビリティは、異なったグローバル変数とインタフェース毎のフィールドでいくつかのフラグを必要とします。ケイパビリティフラグ IFCAP_POLLING は、特定のインタフェースで polling(4) のサポートを示す、インタフェースの if_capabilities に設定します。 if_capabilities に設定されるなら、 ifioctl() 内でインタフェースの if_capenable で同じフラグをマークするかクリアすることができます、その結果、それぞれ polling(4) モードまたは割り込みモードへのインタフェースの切り替えを開始します。実際のモード変更は、ドライバに特有の if_ioctl() ルーチンによって管理されます。 polling ハンドラは、処理されたパケットの数を返します。

if_data Ss 構造体

if_data 構造体は、管理プログラムによって使用される統計と識別する情報を含んでいて、 sysctl(3) MIB の ifmib(4) ブランチを経由してユーザプログラムにエクスポートされます。 if_data 構造体の次の要素は、インタフェースによって初期化され、通常の操作の経過を著しく変更することは期待されません:
ifi_type
( u_char) < net/if_types.h> で定義されるインタフェースのタイプは、以下の インタフェースタイプ セクションで説明されます。
ifi_physical
( u_char) 1 つ以上をサポートするデバイスで物理的な層の選択を表現することを目的としています。いまだに実装されてません。
ifi_addrlen
( u_char) このデバイスでリンクレイヤアドレスの長さ、または、ないならい、0 です。このインタフェースを参照する sockaddr_dl 構造体のアドレス長のフィールドを初期化するために使用します。
ifi_hdrlen
( u_char) 転送の前のパケットにドライバによって先頭に追加される任意のリンクレイヤヘッダの最大の長さ。一般的なコードは、すべてのインタフェースにわたって最大を計算して、追加 mbuf を割り付けないでリンクレイヤヘッダを先頭に追加するために十分な空間が常にあることを保証することを試みるために mbuf のデータの配置が影響する値を使用します。
ifi_datalen
( u_char) if_data 構造体の長さ。 struct ifdata の長さの増加に直面してルーティングソケット ABI の何らかの安定化を許します。
ifi_mtu
( u_long) 任意のリンクレイヤオーバヘッドを除いて、媒体の最大の転送単位。
ifi_metric
( u_long) ユーザモードルーティングプロセスによって解釈される無次元のメトリック。
ifi_baudrate
( u_long) ビット/秒 (BPS) 単位の、インタフェースのライン速度。
ifi_hwassist
( u_long) 発信 パケットのためのコンピュータのタスクをオフロードするケイパビリティの詳細な解釈。インタフェースドライバは、このフィールドを if_capenable の現在の値に一致して保持しなければなりません。
ifi_epoch
( time_t) インタフェースがアタッチされるか、下記の統計がリセットされたときからのシステムアップタイム。これは、SNMP 変数 ifCounterDiscontinuityTime を設定するために使用することを目的としています。また、同じインデックスのインタフェースのための 2 つの連続した問い合わせが同じインタフェースのために返された結果があるかどうかを決定するために使用されます。

構造体は、さらに、さまざまな異なったインタフェースタイプに適切な一般的な統計値を含んでいます (注意を除いて、すべてのメンバは、タイプ u_long です):

ifi_link_state
( u_char) イーサネットインタフェースの現在のリンク状態。可能な値に関しては、 インタフェースリンク状態 セクションを参照しください。
ifi_ipackets
受信されたパケットの数。
ifi_ierrors
検出された受信エラーの数 (例えば、FCS エラー、DMA オーバラン、など)。より詳細な故障は、リンク特有の MIB の方法によってしばしば手に入ります。
ifi_opackets
転送されたパケットの数。
ifi_oerrors
検出された出力エラーの数 (例えば、レイトコリジョン、DMA オーバラン、など)。より詳細な故障は、リンク特有の MIB の方法によってしばしば手に入ります。
ifi_collisions
CSMA インタフェースで出力で検出されたコリジョンの合計数。 (時々このメンバは、他の出力エラーカウントのためのインタフェースの他のタイプによって[不正]使用されます。)
ifi_ibytes
受信されたトラフィックのバイト単位の合計。
ifi_obytes
転送されたトラフィックのバイト単位の合計。
ifi_imcasts
リンクレイヤマルチキャストによって送信される受信されたパケットの数。
ifi_omcasts
リンクレイヤマルチキャストによって送信されたパケットの数。
ifi_iqdrops
入力時に落されたパケットの数。めったに実装されません。
ifi_noproto
未知のネットワークレイヤプロトコルで受信されたパケットの数。
ifi_lastchange
( struct timeval) (SNMP の必要に応じて) インタフェースへの最後の管理変更の時間。

インタフェースタイプ

ヘッダファイル < net/if_types.h> は、インタフェースの多くの異なったタイプのためのシンボリック定数を定義します。最も共通であるのは、次の通りです:

IFT_OTHER
以下のいずれでもない
IFT_ETHER
イーサネット
IFT_ISO88023
ISO 8802-3 CSMA/CD
IFT_ISO88024
ISO 8802-4 Token Bus
IFT_ISO88025
ISO 8802-5 Token Ring
IFT_ISO88026
ISO 8802-6 DQDB MAN
IFT_FDDI
FDDI
IFT_PPP
インターネットポイントツーポイントプロトコル ( ppp(8))
IFT_LOOP
ループバック ( lo(4)) インタフェース
IFT_SLIP
シリアルライン (Serial Line) IP
IFT_PARA
パラレルポート (Parallel-port) IP (“PLIP”)
IFT_ATM
非同期通信モード
IFT_USB
USB インタフェース

インタフェースリンク状態

次のリンク状態が現在、定義されています:

LINK_STATE_UNKNOWN
リンクは、無効または未知の状態です。
LINK_STATE_DOWN
リンクは、ダウン。
LINK_STATE_UP
リンクは、アップ。

ifaddr Ss 構造体

あらゆるインタフェースは、インタフェース構造体の if_addrlist メンバをルートにして、アドレスのリスト (または、むしろ TAILQ) に関連しています。このリストの最初の要素は、常にインタフェース自体を示す AF_LINK アドレスです。マルチアクセスネットワークドライバは、 if_attach() を呼び出した後に、それらのリンクレイヤアドレスに書き込むすることによって、この構造体を完成するべきです。構造の他のメンバは、適切なプロトコルファミリのソケット上で呼び出される ioctl(2) への SIOCAIFADDR コマンドを用いて設定されたネットワークレイヤアドレスを示します。このリストの要素は、 ifaddr 構造体から成ります。ほとんどのプロトコルは、それら自体のプロトコル特有のインタフェースアドレス構造体を宣言しますが、すべてのプロトコルにわたって通常必要である機能性を提供する struct ifaddr ですべては始まります。インタフェースアドレスは、参照カウントされます

struct ifaddr のメンバは、次の通りです:

ifa_addr
( struct sockaddr *) インタフェースのローカルアドレス。
ifa_dstaddr
( struct sockaddr *) ポイントツーポイントインタフェースのリモートアドレスとブロードキャスト (同報通信) インタフェースのブロードキャストアドレス。 ( ifa_broadaddr は、 ifa_dstaddr のためのマクロです。)
ifa_netmask
( struct sockaddr *) マルチアクセスインタフェースのためのネットワークマスクとポイントツーポイントインタフェースのための混乱発生器。
ifa_ifp
( struct ifnet *) インタフェース構造体へのリンク。
ifa_link
( TAILQ_ENTRY( ifaddr)) 各インタフェースでのアドレスのリストのための queue(3) グルー (glue)。
ifa_rtrequest
下記参照。
ifa_flags
( u_short) ルートテーブルのこのアドレスを表すルートに使用されるいくつかのフラグ。
ifa_refcnt
( short) 参照カウント。
ifa_metric
( int) 何らかの外部のルーティングプロトコルの使用のための、このインタフェースアドレスに関連しているメトリック。

ifaddr 構造体への参照は、 ifa_ref() 関数を呼び出すことによって獲得され、 ifa_free() 関数を呼び出すことによって解放されます。

ifa_rtrequest() は、追加、または削除ルーチンへの要求でのリンクレイヤ特有の動作を実行する、ルーティングコード ( rtrequest()) からコールアウトを受信する関数へのポインタです。 cmd 引数は、質問の要求を示します: RTM_ADD または RTM_DELETE です。 rt 引数は、問題になっているルートです。 info 引数は、操作されている特定の宛先を含んでいます。

関数

一般的なインタフェースコードによって提供される関数は、2 つのグループに分割することができます: インタフェースを操作するものとインタフェースアドレスを操作するもの。また、これらの関数に加えて、異なったハードウェアで特定のリンクレイヤを実装する多くのドライバによって使用されるリンクレイヤサポートルーチンがあります。より詳細なそのリンクレイヤについては、文書を参照してください。

ifmultiaddr Ss 構造体

あらゆるマルチキャスト可能なインタフェースは、低レベルで、リンクレイヤマルチキャストアドレス (もしあるならば) が受け付けられるべきであるかを示し、高レベルで、ネットワークレイヤマルチキャストグループユーザプロセスは、関心を寄せられるかを示す、マルチキャストグループメンバシップのリストに関連しています。

構造体の要素は、次の通りです:

ifma_link
( LIST_ENTRY( ifmultiaddr)) queue(3) マクログルー (macro glue)。
ifma_addr
( struct sockaddr *) このレコードが表すアドレスへのポインタ。様々なアドレスファミリのためのメンバシップは、順序不同で格納されます。
ifma_lladdr
( struct sockaddr *) もしあれば、 ifma_addr のネットワークレイヤマルチキャストアドレスがマップされるリンクレイヤマルチキャストアドレスへのポインタ、さもなければ、NULL ポインタ。また、この要素が NULL でないなら、このメンバシップは、そのリンクレイヤアドレスのための別のメンバシップの目に見えない参照を保持します。
ifma_refcount
( u_int) この特定のメンバシップのための要求の参照カウント。

インタフェース操作関数

if_alloc()
struct ifnet を割り付けて、初期化します。初期設定は、インタフェースインデックスの割り付けを含み、 if_l2com での type 特有の構造体の割り付けを含みます。
if_attach()
指定されたインタフェース ifp をネットワークインタフェースのリストにリンクします。また、そのインタフェースのアドレスのリストを初期化し、そのリストの最初の要素になるようにリンクレイヤ ifaddr 構造体を作成します。 (このアドレス構造体へのポインタは、 ifnet 構造体に保存され、 ifaddr_byindex() 関数によってアクセスされるものとします。) ifp は、 if_alloc() によって割り付けられなければなりません。
if_detach()
インタフェースリストからの指定された ifp をシャットダウンし、アンリンクします。
if_free()
与えられた ifp をシステムに戻すために解放します。インタフェースは、これまでにアタッチされていたなら、前もってデタッチされなければなりません。
if_free_type()
与えられた type が、 if_type のタイプの代わりに if_l2com を解放するために使用されることを除いて、 if_free() と同一です。これは、それらのインタフェースタイプを変更するドライバで使用を対象としています。
if_down()
インタフェース ifp をダウン (すなわち、 IFF_UP が設定されない) とマークし、その出力キューをフラッシュし、変換のプロトコルに通知し、そして、 route(4) ルーティングソケットからメッセージを生成します。
if_up()
インタフェース ifp をアップとマークし、変換のプロトコルに通知し、そして、 route(4) ルーティングソケットからメッセージを生成します。
ifpromisc()
ifp のプロミシャス (無差別) な参照を追加するかまたは削除します。 pswitch が真であるなら、参照を追加します。それが偽であるら、参照を削除します。 0 から 1 までと 1 から 0 への参照カウントを変換するとき、適切に IFF_PROMISC フラグを設定し、そして、必要なモードにインタフェースをセットアップするために if_ioctl() を呼び出します。
if_allmulti()
ifpromisc() として、プロミシャス (無差別) フラグの代わりにオールマルチキャスト ( IFF_ALLMULTI) フラグを除いて。
ifunit()
name と名前が付けられたインタフェースのための ifnet ポインタを返します。
ifunit_ref()
name と名前が付けられたインタフェースのための ( ifa_ref() によって) 参照カウント ifnet ポインタを返します。これは、 ifunit() よりも好ましい関数です。呼び出し側は、ifnet を終了するとき、 if_rele() との参照を解放することに責任があります。
ifioctl()
データパラメータ data でスレッド td によってソケット so で発行された ioctl 要求 cmd を処理します。これは、ユーザモードからのすべてのインタフェース設定要求を取り扱うためのメインルーチンです。通常、それは、ソケットレイヤ ioctl(2) ハンドラからのみ、とクラス‘ i’でコマンドでのみで呼び出されます。任意の認識されていないコマンドは、さらなる解釈のためにソケット so のプロトコルまで伝えられます。次のコマンドは、 ifioctl() によって取り扱われます:

SIOCGIFCONF
OSIOCGIFCONF
インタフェース設定を取得します。 (ドライバを非難しません。)

SIOCSIFNAME
インタフェース名を設定します。 RTM_IFANNOUNCE 出発と到着メッセージは、インタフェース名を信頼するルーティングコードがインタフェースリストを更新できるように、送信されます。呼び出し側には、適切な特権がなければなりません。 (ドライバを非難しません。)
SIOCGIFCAP
SIOCGIFFIB
SIOCGIFFLAGS
SIOCGIFMETRIC
SIOCGIFMTU
SIOCGIFPHYS
インタフェースのケイパビリティ、FIB、フラグ、メトリック、MTU、メディアの選択を取得します。 (ドライバを非難しません。)

SIOCSIFCAP
インタフェースのケイパビリティを有効、または無効にします。呼び出し側には、適切な特権がなければなりません。ドライバ特有の if_ioctl() ルーチンへの呼び出しの前に、有効にされたケイパビリティのための要求されたマスクは、インタフェース if_capabilities によってサポートされたケイパビリティのマスクに対してチェックされます。サポートされないケイパビリティを有効にする要求は、無効です。適切に if_capenableif_data.ifi_hwassist を更新することを含んで、ドライバによって残りは行われるはずです。

SIOCSIFFIB
インタフェース FIB を設定します。呼び出し側には、適切な特権がなければなりません。 FIB 値は、0 から始まり、 net.fibs 以上の値は、無効と見なされます。
SIOCSIFFLAGS
インタフェースフラグを変更します。呼び出し側には、適切な特権がなければなりません。 IFF_UP フラグへの変更が要求されるなら、 if_up() または if_down() が必要に応じて呼び出されます。 IFF_CANTCHANGE にリストされたフラグは、マスクを外され、インタフェース構造体のフィールド if_flags は、更新されます。最後に、ドライバ if_ioctl() ルーチンは、要求された任意のセットアップを実行するために呼び出されます。

SIOCSIFMETRIC
SIOCSIFPHYS
呼び出し側には、適切な特権がなければなりません。

SIOCSIFMTU
インタフェース MTU を変更します。呼び出し側には、適切な特権がなければなりません。 72 未満か、または 65535 を越える MTU 値は、無効であると見なされます。ドライバ if_ioctl() ルーチンは、変更を実装するために呼び出されます。それは、なんらかの追加のサニティ (正気) チェックと、インタフェース構造体で MTU を実際に変更することに対して責任があります。

SIOCADDMULTI
SIOCDELMULTI
インタフェースでの永久的なマルチキャストグループメンバシップを追加するか、または削除します。呼び出し側には、適切な特権がなければなりません。 if_addmulti() または if_delmulti() 関数は、操作を実行するために呼び出されます。 qq.v.

SIOCAIFADDR
SIOCDIFADDR
ソケットのプロトコル規制ルーチンは、要求された動作を実装するために呼び出されます。

OSIOCGIFADDR
OSIOCGIFDSTADDR
OSIOCGIFBRDADDR
OSIOCGIFNETMASK
ソケットのプロトコル規制ルーチンは、要求された動作を実装するために呼び出されます。返り時に、 sockaddr 構造体は、古いスタイル ( sa_len メンバがない) に変換されます。

if_down(), ifioctl(), ifpromisc() と if_up() は、 splnet() または、それ以上で呼び出されなければなりません。

インタフェースアドレス関数

アドレスを与えてインタフェースアドレス構造体を検索するためのいくつかの関数があります。 ifa_ifwithaddr() は、パラメータ addr に正確に適合している、ローカルアドレスか、ブロードキャスト (同報通信) アドレスのいずれかのインタフェースアドレスを返します。 ifa_ifwithdstaddr() は、リモート (“destination”) アドレスが addr であるポイントツーポイントインタフェースのインタフェースアドレスを返します。

ifa_ifwithnet() は、指定されたアドレスに適合する最も特定のインタフェースアドレス、設定されたネットマスクに従って addr、または、それが見つけられるなら、リモートアドレスが addr であるポイントツーポイントインタフェースアドレスを返します。 ignore_ptp が真であるなら、ポイントツーポイントインタフェースアドレスをスキップします。

ifaof_ifpforaddr() は、設定されたネットマスクに従ってアドレス addr に適合するインタフェース ifp で設定される最も特定のアドレス、を返します。インタフェースがポイントツーポイントであるなら、リモートアドレスが正確に addr であるインタフェースアドレスだけが返されます。

ifaddr_byindex() は、与えられたインデックス idx とのインタフェースをとるリンクレベルアドレスを返します。

これらの関数のすべては、そのようなアドレスを見つけることができないなら、 NULL ポインタを返します。

インタフェースマルチキャストアドレス関数

if_addmulti(), if_delmulti() と if_findmulti() 関数は、それぞれ、マルチキャストグループメンバシップの要求と放棄、およびインタフェースのメンバシップリストを問い合わせのサポートを行います。 if_addmulti() 関数は、インタフェース ifp へのポインタ、と一般的なアドレス sa を取ります。また、それは、成功して返るときにグループメンバシップ制御ブロックのアドレスで書き込まれた struct ifmultiaddr * へのポインタを取ります。 if_addmulti() 関数は、次の 4 つのステップの処理を実行します:
  1. リンクレイヤアドレスを決定するためにインタフェースの if_resolvemulti() エントリポイントを呼び出し、もしあるなら、このメンバシップ要求に対応し、そして、また、そう望んでいる場合には、このメンバシップ要求する拒否する機会をリンクレイヤに与えます。
  2. このグループのために前もって存在するメンバシップのためのインタフェースのグループメンバシップリストをチェックします。見つけられないなら、新しいものを割り付けます。そうであるなら、参照カウントを増加します。
  3. if_resolvemulti() ルーチンがグループに対応するリンクレイヤアドレスを返したなら、同様に、そのアドレスのための前のステップを繰り返します。
  4. インタフェースのマルチキャストアドレスフィルタが、新しいメンバシップが追加されたために、変更される必要があるなら、それがそうすることを要求するために、インタフェースの if_ioctl() ルーチンを ( SIOCADDMULTIcmd 引数で) 呼び出します。

if_delmulti() 関数は、インタフェース ifp とこの処理をを逆にするアドレス sa を与えます。両方の関数は、成功すれば 0 を返すか、または失敗すれば標準エラー番号を返します。

if_findmulti() 関数は、 sa に適合するアドレスのためにインタフェース ifp のメンバシップリストを調べて、見つけられるなら、その struct ifmultiaddr へのポインタを返し、さもなければ NULL ポインタを返します。

関連項目

ioctl(2), link_addr(3), queue(3), sysctl(3), bpf(4), ifmib(4), lo(4), netintro(4), polling(4), config(8), ppp(8), mbuf(9), rtentry(9) Gary R. Wright and W. Richard Stevens, TCP/IP Illustrated, Vol. 2, Addison-Wesley, ISBN 0-201-63354-X.

作者

このマニュアルページは、 Garrett A. Wollman によって書かれました。
April 26, 2013 FreeBSD