NG_KSOCKET(4) | FreeBSD Kernel Interfaces Manual | NG_KSOCKET(4) |
名称
ng_ksocket — カーネルソケット netgraph ノードタイプ解説
ksocket ノードは、netgraph ノードと BSD ソケットの両方です。 ng_ksocket ノードタイプは、カーネル中でソケットをオープンすることを許可し、netgraph ノードとして現れます。 ng_ksocket ノードタイプは、ソケットノードタイプの逆です ( ng_socket(4) を参照): ソケットノードタイプは、通常のカーネルレベルエンティティ (関連する netgraph ノード) の (ソケットによって) ユーザレベル操作を有効にする一方、 ng_ksocket ノードタイプは、通常のユーザレベルエンティティ (関連するソケット) の (netgraph ノードによって) カーネルレベル操作を有効にします。ng_ksocket ノードは、多くても 1 つのフック接続を許します。ノードに接続することは関連ソケットをオープンするのと同等です。フックに与えられた名前は、どういうソケットノードをオープンするかを決定します (下記を参照)。フックが切断されるか/またはノードがシャットダウンされるとき、関連するソケットは、クローズされます。
フック
このノードタイプは、一度に 1 つのフックの接続をサポートします。フックの名前は、 <family>/<type>/<proto> 形式となっていなければなりません。ここで、 family, type, proto は、 socket(2) への同じ引数と 10 進数で同等です。代わりに、共通に使われる値の別名は、同様に受け付けられます。例えば、 inet/dgram/udp は、同等な形の 2/2/17 をより読みやすくしたものです。ソケットに受信されたデータは、フックを通して送出されます。フック上に受信されたデータは、ソケットが接続されているなら ( NGM_KSOCKET_CONNECT は、その前にノードに送信されます) ソケットから送出されます。ソケットが接続されていないなら、宛先 (終点) struct sockaddr は、データにアタッチされたクッキー NGM_KSOCKET_COOKIE とタイプ NG_KSOCKET_TAG_SOCKADDR で mbuf タグ中に供給しなければなりません。そうでなければ、 ng_ksocket は、 ENOTCONN を送信側に返します。
コントロールメッセージ
このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:- NGM_KSOCKET_BIND ( bind)
- この関数は、 bind(2) システムコールと寸分違いません。 struct sockaddr ソケットアドレスパラメータは、引数として提供されるべきです。
- NGM_KSOCKET_LISTEN ( listen)
- この関数は、 listen(2) システムコールと寸分違いません。予備パラメータ (単一の 32 ビットの int) は、引数として提供されるべきです。
- NGM_KSOCKET_CONNECT ( connect)
- この関数は、 connect(2) システムコールと寸分違いません。 struct sockaddr 宛先アドレスパラメータは、引数として提供されるべきです。
- NGM_KSOCKET_ACCEPT ( accept)
-
非ブロッキングソケットでの
accept(2) システムコールに同等です。キューに保留中 (pending) の接続があるなら、新しいソケットと対応するクローンのノードが作成されます。クローンのノードの ID と (
struct sockaddr として) ピア名が返されます。保留中の接続がないなら、このコントロールメッセージは、何も返しません、そして、接続ノードは、接続が確立されているとき、上記のメッセージを非同期に受信します。
クローンのノードは、任意の名前で単一のフックをサポートをします。接続されていないなら、親ノードが破壊されるとき、ノードは、消滅します。いったん接続されると、それは、独立したノードになります。
- NGM_KSOCKET_GETNAME ( getname)
- getsockname(2) システムコールと同等です。名前は、返信の引数フィールドで struct sockaddr として返されます。
- NGM_KSOCKET_GETPEERNAME ( getpeername)
- getpeername(2) システムコールと同等です。名前は、返信の引数フィールドで struct sockaddr として返されます。
- NGM_KSOCKET_SETOPT ( setopt)
- オプション名、レベルと値が struct ng_ksocket_sockopt で渡されることを除いて、 setsockopt(2) システムコールと同等です。
- NGM_KSOCKET_GETOPT ( getopt)
- オプションが struct ng_ksocket_sockopt で渡されることを除いて、 getsockopt(2) システムコールと同等です。このコマンドを送信するとき、 value フィールドは、空であるべきです。リターン時は、それは、検索して取得された値を含みます。
ASCII フォームコントロールメッセージ
引数フィールドで struct sockaddr を渡すコントロールメッセージについては、 C 構造体と等価な通常の ASCII は、受け付けできるフォームです。 PF_INET と PF_LOCAL アドレスファミリに関しては、より便利なフォームが使われます。それは、プロトコルファミリ名にスラッシュが続き、そして絶対番地が続きます。 PF_INET に関しては、アドレスは、IP アドレスにオプションのコロンとポート番号が続きます。 PF_LOCAL に関しては、アドレスは、二重引用符の文字列になっているパス名です。例:
- PF_LOCAL
- local/"/tmp/foo.socket"
- PF_INET
- inet/192.168.1.1:1234
- その他
- { family=16 len=16 data=[0x70 0x00 0x01 0x23] }
struct ng_ksocket_sockopt を渡すコントロールメッセージに関しては、その構造体のための通常の ASCII フォームが使用されます。将来、より一般的なソケットオプションのより便利なコード化は、サポートされるかもしれません。
ソケットオプションを設定する例は、次の通りです:
- Set FIB 2 for a socket (SOL_SOCKET, SO_SETFIB):
- setopt { level=0xffff name=0x1014 data=[ 2 ] }
シャットダウン
このノードは、 NGM_SHUTDOWN コントロールメッセージを受け取るか、フックが切断されている時、シャットダウンします。ノードのシャットダウンは、関連するソケットをクローズします。歴史
ng_ksocket ノードタイプは、 FreeBSD 4.0 で実装されました。作者
<archie@FreeBSD.org>January 9, 2012 | FreeBSD |