ACCEPT_FILTER(9) | FreeBSD Kernel Developer's Manual | ACCEPT_FILTER(9) |
名称
accept_filter, accept_filt_add, accept_filt_del, accept_filt_generic_mod_event, accept_filt_get — 入力接続フィルタ書式
#include < sys/types.h>#include < sys/module.h>
#include < sys/socket.h>
#define ACCEPT_FILTER_MOD
#include < sys/socketvar.h>
int
accept_filt_add( struct accept_filter *filt);
int
accept_filt_del( char *name);
int
accept_filt_generic_mod_event( module_t mod, int event, void *data);
struct accept_filter *
accept_filt_get( char *name);
解説
accept フィルタは、カーネルが入力接続を前処理することを、アプリケーションが要求することを可能にします。 accept フィルタは、 SO_ACCEPTFILTER の optname で渡すことで、 setsockopt(2) システムコールを介して要求されます。実装に関する注
accept フィルタになりたいモジュールは、システムに struct accept_filter 構造体を提供しなければなりません。
struct accept_filter { char accf_name[16]; void (*accf_callback)(struct socket *so, void *arg, int waitflag); void * (*accf_create)(struct socket *so, char *arg); void (*accf_destroy)(struct socket *so); SLIST_ENTRY(accept_filter) accf_next; /* リストの次のエントリ */ };
そのモジュールは、 malloc(9) で割当てられた struct accept_filter 構造体へのポインタを渡す関数 accept_filt_add() を使用して、それを登録するべきです。
struct accept_filter のフィールドは以下の通りです。
- accf_name
- フィルタの名前です。これはユーザ領域からアクセスされる方法です。
- accf_callback
- 接続が確立されたときにカーネルが実行するコールバックです。これは socket upcall と同等で、そのコールバックがソケットのフラグを変更しない限りは、接続が確立したとき、またソケットに新しいデータが届くたびに、呼出されます。
- accf_create
- 監視しているソケット上に setsockopt(2) がフィルタをインストールするたびに呼出されます。
- accf_destroy
- ユーザがそのソケット上の accept フィルタを取り除くたびに呼出されます。
accept_filt_add() 関数を使用して登録されたときに accept_filter.accf_name に使用された同じ文字列が accept_filt_del() に渡されると、その後カーネルはそれ以上のユーザ領域のそのフィルタの使用を禁じます。
accept_filt_get() 関数は setsockopt(2) システムコールを介して使用されるための accept フィルタを見つけるために内部で使用されます。
accept_filt_generic_mod_event() 関数は自分自身をロードおよびアンロードするための引数フィールドを使用しない accept フィルタのために、コードの重複を避ける単純な方法を提供します。この関数は、 DECLARE_MODULE(9) マクロのために moduledata_t 構造体の中で使用されることが可能です。
歴史
accept フィルタ機構は FreeBSD 4.0 で導入されました。作者
このマニュアルページは , および によって書かれました。accept フィルタの構想は Yahoo! の
によって開拓され、 によってローダブルモジュールシステムに改良されました。June 25, 2000 | FreeBSD |