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

名称

netisrカーネルネットワークディスパッチ (dispatch) サービス

書式

#include < net/netisr.h>

void
netisr_register( const struct netisr_handler *nhp);

void
netisr_unregister( const struct netisr_handler *nhp);

int
netisr_dispatch( u_int proto, struct mbuf *m);

int
netisr_dispatch_src( u_int proto, uintptr_t source, struct mbuf *m);

int
netisr_queue( u_int proto, struct mbuf *m);

int
netisr_queue_src( u_int proto, uintptr_t source, struct mbuf *m);

void
netisr_clearqdrops( const struct netisr_handler *nhp);

void
netisr_getqdrops( const struct netisr_handler *nhp, uint64_t *qdropsp);

void
netisr_getqlimit( const struct netisr_handler *nhp, u_int *qlimitp);

int
netisr_setqlimit( const struct netisr_handler *nhp, u_int qlimit);

u_int
netisr_default_flow2cpu( u_int flowid);

u_int
netisr_get_cpucount( void);

u_int
netisr_get_cpuid( u_int cpunumber);

解説

netisr カーネルインタフェーススイート (一連のソフト) によって、デバイスドライバ (と、他のパケットソース) は、直接ディスパッチされるか、または延期された処理のためのプロトコルにパケットを向けることができます。プロトコル登録と作業ストリーム統計は、 netstat(1) を使用してモニタされます。

プロトコル登録

プロトコルは、 netisr_register() と netisr_unregister() を使用してハンドラを登録して、登録解除し、また netisr_clearqdrops(), netisr_getqdrops(), netisr_getqlimit() と netisr_setqlimit() を使用して、キューの制限と統計を管理します。

netisr は、ハンドラのマルチプロセッサ実行をサポートし、ソース順序とプロトコル特有の順序の組み合わせと、1 つ以上の作業スレッドの向こう側に仕事をどのように配布するかを決定する作業配置 (work-placement) ポリシに依存します。プロトコルを登録すると、3 つのポリシの 1 つを宣言します:

NETISR_POLICY_SOURCE
netisr は、プロトコルからのアドバイスなしでソースの順序を維持するべきです。 netisr は、作業配置 (work placement) の目的のための mbuf ヘッダに存在するすべてのフロー ID を無視します。
NETISR_POLICY_FLOW
netisr は、 mbuf ヘッダフロー ID フィールドによって定義されるように、フロー順序を維持するべきです。プロトコルが nh_m2flow を実装するなら、 netisr は、 mbuf に、ソース順序を当てにするフロー ID がない場合に、プロトコルを問い合わせます。
NETISR_POLICY_CPU
netisr は、各パケットのために nh_m2cpuid に問い合わせ、プロトコルへのすべての作業配置 (work placement) 決定を完全に委譲します。

登録は、フィールドが次の通り定義される struct netisr_handler を使用して宣言されます:

const char * nh_name
sysctl(2) MIB 名に含まれる、プロトコルのユニークな文字列名、空白を含むべきではありません。
netisr_handler_t nh_handler
プロトコルのために受信された各パケット上で呼び出されるプロトコルハンドラ関数。
netisr_m2flow_t nh_m2flow
フロー ID を生成し、 M_FLOWID が定義されている netisr に入らないパケットのための M_FLOWID を設定するためのオプションのプロトコル関数。 NETISR_POLICY_FLOW 付きだけで使用されます。
netisr_m2cpuid_t nh_m2cpuid
パケットがどのような CPU に処理されるべきであるか決定するためのプロトコル関数。 NETISR_POLICY_CPU 付きだけで使用されます。
netisr_drainedcpu_t nh_drainedcpu
CPU ごとのキューが使い果たされたとき、呼び出されるオプションのコールバック。それは、直接ディスパッチされたパケットに対して決して発火しません。完全に理解しているわけではないなら、この特殊目的の関数を使用するべきではありません。
u_int nh_proto
netisr へのそれら自体を識別するための両方のプロトコルによって、およびどのようなハンドラがパケットを処理するために使用されるかを選択するためのパケットソースによって使用されるプロトコル番号。サポートしているプロトコル番号のテーブルは、下記に現れます。実装の理由に関して、15 より大きいプロトコル番号は、現在サポートされていません。
u_int nh_qlimit
プロトコルのための最大の CPU ごとのキューの深さ。内部の実装の詳細のために、有効なキューの深さは、ほぼこの数の 2 倍となります。
u_int nh_policy
以前に説明されたように、プロトコルのための順序と作業配置 (work placement) ポリシ。

パケットソースインタフェース

ネットワークインタフェースのような、パケットソースは、 netisr_dispatch() と netisr_queue() インタフェースを使用してプロトコル処理を要求します。プロトコル番号と mbuf 引数の両方を受け付けますが、 netisr_queue() が延期されたコンテキストで非同期にプロトコルハンドラを常に実行する間に、 netisr_dispatch() は、グローバルでプロトコルごとのポリシによって許可されるなら、オプションで直接ディスパッチします。

また、追加のロードバランスとフロー情報を提供するために、パケットソースは、また、 netisr_dispatch_src() と netisr_queue_src() 変異型を使用して、実際には、ネットワークインタフェース番号またはソケットポインタであるかもしれない、不透明なソース識別子を指定します。

プロトコル番号定数

次のプロトコル番号が現在定義されています:
NETISR_IP
IPv4
NETISR_IGMP
IGMPv3 loopback
NETISR_ROUTE
Routing socket loopback
NETISR_AARP
Appletalk AARP
NETISR_ATALK1
Appletalk phase 1
NETISR_ATALK2
Appletalk phase 2
NETISR_ARP
ARP
NETISR_IPX
IPX/SPX
NETISR_IPV6
IPv6
NETISR_NATM
ATM
NETISR_EPAIR
netstat(1), epair(4)

作者

このマニュアルページと netisr の実装は、 Robert N. M. Watson によって書かれました。
February 22, 2010 FreeBSD