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

名称

domain_add, pfctlinput, pfctlinput2, pffinddomain, pffindproto, pffindtype, DOMAIN_SETネットワークドメイン管理

書式

#include < sys/param.h>
#include < sys/kernel.h>
#include < sys/protosw.h>
#include < sys/domain.h>

void
domain_add( void *data);

void
pfctlinput( int cmd, struct sockaddr *sa);

void
pfctlinput2( int cmd, struct sockaddr *sa, void *ctlparam);

struct domain *
pffinddomain( int family);

struct protosw *
pffindproto( int family, int protocol, int type);

struct protosw *
pffindtype( int family, int type);

void
DOMAIN_SET( name);

解説

システムにインストールされたネットワークプロトコルは、呼び出されるドメイン (例えば、 inetdomainlocaldomain) 内で維持されます。

struct domain { 
 int dom_family;  /* AF_xxx */ 
 char *dom_name; 
 void (*dom_init)  /* ドメインデータ構造を初期化 */ 
  (void); 
 void (*dom_destroy)  /* 構造体 / 状態をクリーンアップ */ 
  (void); 
 int (*dom_externalize) /* アクセス権を外部化する */ 
  (struct mbuf *, struct mbuf **); 
 void (*dom_dispose)  /* 内面化した権限を処理する */ 
  (struct mbuf *); 
 struct protosw *dom_protosw, *dom_protoswNPROTOSW; 
 struct domain *dom_next; 
 int (*dom_rtattach)  /* 経路制御テーブルを初期化 */ 
  (void **, int); 
 int dom_rtoffset;       /* ビット単位の rtattach への引数 */ 
 int dom_maxrtkey;  /* 経路制御レイヤ (層) のために */ 
 void *(*dom_ifattach)(struct ifnet *); 
 void (*dom_ifdetach)(struct ifnet *, void *); 
     /* ifnet の af-依存データ */ 
};

各ドメインは、サポートされた各ソケットあたり 1 つのプロトコルスイッチ構造体 ( struct protosw *) を含んでいます。

struct protosw { 
 short pr_type;  /* 使用されるソケットタイプ */ 
 struct domain *pr_domain; /* メンバのドメインプロトコル */ 
 short pr_protocol;  /* プロトコル番号 */ 
 short pr_flags;  /* 下記参照 */ 
/* プロトコル-プロトコルフック */ 
 pr_input_t *pr_input;  /* プロトコルへの入力 (下方から) */ 
 pr_output_t *pr_output;  /* プロトコルへの出力 (上方から) */ 
 pr_ctlinput_t *pr_ctlinput; /* 制御入力 (下方から) */ 
 pr_ctloutput_t *pr_ctloutput; /* 制御出力 (上方から) */ 
/* ユーティリティフック */ 
 pr_init_t *pr_init; 
 pr_destroy_t *pr_destroy; 
 pr_fasttimo_t *pr_fasttimo; /* 速いタイムアウト (200ms) */ 
 pr_slowtimo_t *pr_slowtimo; /* 遅いタイムアウト (500ms) */ 
 pr_drain_t *pr_drain;  /* 可能なあらゆる余分な空間を 
        フラッシュ */ 
 
 struct pr_usrreqs *pr_usrreqs; /* pr_usrreq() にとって代わる */ 
};

次の関数は、新しいドメインの登録、それらのドメイン中の特定のプロトコルとプロトコルタイプの検索、およびシステムからの操作コントロールメッセージを取り扱います。

pfctlinput() は、すべてのドメインに影響するかもしれないイベントが起こるときは、いつも、システムによって呼び出されます。イベントのそのようなタイプの例は、ルーティング (経路制御) テーブル変更、インタフェースのシャットダウン、または特定の ICMP メッセージタイプです。呼び出されるとき、 pfctlinput() は、すべてのドメインで定義されたものがあるので各プロトコルのためにプロトコル特有の pr_ctlinput() 関数を呼び出します。

pfctlinput2() は、 pfctlinput() と同じ機能性を提供しますが、いくつかの追加チェックとプロトコルの pr_ctlinput() 関数に直接渡される、新しい void * 引数があります。 pfctlinput() と異なって、 pfctlinput2() は、 saNULL でないことを検証し、 sa と同じプロトコルファミリだけ、それらの pr_ctlinput() 関数呼び出しがあります。

domain_add() は、新しいプロトコルドメインをシステムに追加します。引数 data は、関数中で直接 struct domain * にキャスト (cast) されますが、新しいドメインが SYSINIT() で登録されるとき、コンパイラの警告を防ぐために void * と宣言されます。ほとんどの場合、 domain_add() は、直接呼び出されないで、代わりに、 DOMAIN_SET() が使用されます。

新しいドメインが初期化ルーチンを定義したなら、それは、 domain_add() によって呼び出されます。また、初期化ルーチンを定義したドメイン中のそれぞれのプロトコルは、それらの呼び出しがあります。

いったんドメインが追加されると、それをアンロードすることができません。これは、そのドメイン中でソケットからのなんらかの活発な参照があるかを決定するための適切な参照カウントシステムがないからです。

pffinddomain() は、ファミリによってドメインを見つけます。ドメインを見つけることができないなら、 NULL が返されます。

pffindtype() と pffindproto() は、その番号かそのタイプによってでプロトコルを検索します。ほとんどのの場合、プロトコルまたはタイプが見つけることができないなら、 NULL を返しますが、 pffindproto() は、要求されたタイプが SOCK_RAW であり、 SOCK_RAW のプロトコルスイッチタイプが見つけられて、ドメインにデフォルトの生のプロトコルがあるなら、デフォルトを返します。

両方の関数は、現在作成されるソケットのためのプロトコルを解決するために socreate() によって呼び出されます。

DOMAIN_SET() は、 SYSINIT() を通してドメインの登録を簡素化するマクロです。マクロから生じるコードは、“ namedomain”と名前が付けられたドメイン構造体であると予想します、ここで name は、 DOMAIN_SET() への引数です:

struct domain localdomain = 
{ AF_LOCAL, "local", unp_init, unp_externalize, unp_dispose, 
  localsw, &localsw[sizeof(localsw)/sizeof(localsw[0])] }; 
 
DOMAIN_SET(local);

戻り値

pffindtype() と pffindproto() の両方は、要求されたプロトコルのために struct protosw * を返します。プロトコルまたはソケットタイプが見つけられないなら、 NULL が返されます。 pffindproto() の場合には、ドメインにデフォルトの生のプロトコルがあるなら、 SOCK_RAW タイプのためにデフォルトプロトコルを返します。

関連項目

socket(2)

作者

このマニュアルページは、 Chad David <davidc@acns.ab.ca>によって書かれました。
December 7, 2012 FreeBSD