NG_SOCKET(4) | FreeBSD Kernel Interfaces Manual | NG_SOCKET(4) |
名称
ng_socket — netgraph ソケットノードタイプ解説
socket ノードは、 BSD ソケットと netgraph ノードの両方です。 ng_socket ノードタイプは、 BSD ソケットインタフェースを使用して、カーネル netgraph(4) ネットワーキングサブシステムにユーザモードプロセスが参加することを可能にします。そのプロセスは、netgraph ソケットを作成できるルート特権を持っていなければなりません。しかしながら、いったん作成されれば、それを持っているどんなプロセスもそれを使用することができます。新しい ng_socket ノードは、 socket(2) システムコールを使用して、プロトコルファミリ PF_NETGRAPH でタイプ NG_CONTROL の新しいソケットを作成することによって作成されます、ノードによって受信され、 NGM_SOCKET_COOKIE のクッキー値を持っていないどんなコントロールメッセージも recvfrom(2) を使用して、プロセスによって受信されます。ソケットアドレス引数は、送り手の netgraph アドレスを含む struct sockaddr_ng です。反対に、コントロールメッセージは、 struct sockaddr_ng の受け手のアドレスを供給して、 sendto(2) の呼び出しよって、どんなノードにも送ることができます。 bind(2) システムコールは、グローバルな netgraph 名をノードに割り当てるために使用することができます。
netgraph データパケットを送信し受信するために、 NG_DATA ソケットは、また、 socket(2) を使用することで作成され、 ng_socket ノードに関連づけなければなりません。 NG_DATA ソケットは、自動的にそれらに関連しているノードは持っていません。それらは、 connect(2) システムコールによって特定のノードに結び付けられます。アドレス引数は、既に作成された ng_socket ノードの netgraph アドレスです。いったんデータソケットがノードに関連するようになると、ノードによって受信されたどんなデータパケットも recvfrom(2) を使用して読み込まれ、ノードから送出されるどんなパケットも、 sendto(2) を使用して書き込まれます。データソケットの場合は、 struct sockaddr_ng は、データを受信されたかまたは送るべきである フック の名前を含んでいます。
特殊な場合として、netgraph データソケットが単純なプログラムで stdin または stdout として使用されることを可能にすること、 NULL sockaddr ポインタがある sendto(2), send(2) または write(2) は、ソケットノード (したがって、パスは、明白です) に取り付けられた ONE フックがまさにある場合に成功します。
netgraph ソケットを使用することで単純化するユーザライブラリがあります。 netgraph(3) を参照してください。
フック
このノードタイプは、(それらがユニークであるならば) 任意の名前でフックをサポートし、常にフック接続要求を受け付けます。コントロールメッセージ
このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:- NGM_SOCK_CMD_NOLINGER
- 最後のフックがこのノードから取り除かれるとき、まるで NGM_SHUTDOWN メッセージを受け取ったかのようにシャットダウンします。関連するソケットにアクセスする試みは、 ENOTCONN を返します。
- NGM_SOCK_CMD_LINGER
- これは、デフォルトのモードです。最後のフックが取り除かれるときも、ノードは、存続し、それが明らかにシャットダウンされるまで、新しいフックを受け入れる準備ができています。
NGM_SOCKET_COOKIE でも NGM_GENERIC_COOKIE でもない他のすべてのメッセージは、 NG_CONTROL ソケットを変更せずに渡されます。
シャットダウン
関連する NG_CONTROL と NG_DATA ソケットの両方がクローズされるか NGM_SHUTDOWN コントロールメッセージを受け取る時、このノードタイプは、シャットダウンし消滅します。後者の場合、まだオープンしているソケットに書き込む試みは、 ENOTCONN を返します。また、 NGM_SOCK_CMD_NOLINGER メッセージを受け取った場合、最後のフックのクローズは、ノードのシャットダウンを開始します。歴史
ng_socket ノードタイプは、 FreeBSD 4.0 で実装されました。作者
<julian@FreeBSD.org>バグ
フックの接続を拒絶することはできませんが、そのフックで受信されたどんなデータも確実に無視することができます。制御されたプロセスは、カーネル内のノードが、例えば、新しいフック、またはフックを取り除くことを通知するすべてのイベントを通知しません。いくつかのノード開始のメッセージは、(制御ソケットに送る) このために定義されるべきです。
January 19, 1999 | FreeBSD |