EN JA
NG_KSOCKET(4)
NG_KSOCKET(4) FreeBSD Kernel Interfaces Manual NG_KSOCKET(4)

名称

ng_ksocketカーネルソケット netgraph ノードタイプ

書式

#include < sys/types.h>
#include < netgraph/ng_ksocket.h>

解説

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_INETPF_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 Cobbs <archie@FreeBSD.org>
January 9, 2012 FreeBSD