インスタンスやプロトコルの処理が動的であるのと同様に、各プロトコル下で行われるイベントの処理も動的です。この API では、ネットワークインタフェースイベントとパケットイベントの 2 種類のイベントがサポートされています。
次の関数では、IPv4 のインバウンドパケットのイベントが存在することの通知についてチェックされます。通知があると、hook_t 構造体が割り当てられ、インバウンド IPv4 パケットごとに呼び出される関数が記述されます。
static int mynewevent(hook_notify_cmd_t cmd, void *arg, const char *parent, const char *event, const char *hook) { mytype_t *ctx = arg; char buffer[32]; hook_t *h; if ((strcmp(event, NH_PHYSICAL_IN) == 0) && (strcmp(parent, NHF_INET) == 0)) { sprintf(buffer, "mypkthook_%s_%s", parent, event); h = hook_alloc(HOOK_VERSION); h->h_hint = HH_NONE; h->h_arg = s; h->h_name = strdup(buffer); h->h_func = mypkthook; s->hook_in = h; net_hook_register(ctx->inet, (char *)event, h); } else { h = NULL; } return (0); }
mynewevent() 関数は、追加および削除されるイベントごとに呼び出されます。次のイベントを使用できます。
イベント名 |
データ構造体 |
コメント |
---|---|---|
NH_PHYSICAL_IN |
hook_pkt_event_t |
このイベントは、ネットワークプロトコルに到達し、ネットワークインタフェースドライバから受信されたパケットごとに生成されます。 |
NH_PHYSICAL_OUT |
hook_pkt_event_t |
このイベントは、ネットワークプロトコル層から送信するために、ネットワークインタフェースドライバに配信する前に、パケットごとに生成されます。 |
NH_FORWARDING |
hook_pkt_event_t |
このイベントは、システムで受信されて別のネットワークインタフェースに送信されるすべてのパケットに対して生成されます。このイベントが発生するのは NH_PHYSICAL_IN の後と NH_PHYSICAL_OUT の前です。 |
NH_LOOPBACK_IN |
hook_pkt_event_t |
このイベントは、ループバックインタフェースで受信されるパケット、またはネットワークインスタンスを大域ゾーンと共有しているゾーンで受信されるパケットに対して生成されます。 |
NH_LOOPBACK_OUT |
hook_pkt_event_t |
このイベントは、ループバックインタフェースで送信されるパケット、またはネットワークインスタンスを大域ゾーンと共有しているゾーンで送信されているパケットに対して生成されます。 |
NH_NIC_EVENTS |
hook_nic_event_t |
このイベントは、ネットワークインタフェースの状態の特定の変更に対して生成されます。 |
パケットイベントの場合、IP スタックの特定のポイントごとに固有のイベントが 1 つあります。これは、パケットのフローにおいてパケットを傍受する正確な位置を選択できるようにするためであり、カーネル内で発生するすべてのパケットイベントを検査して過負荷状態になるのを避けることができます。ネットワークインタフェースイベントの場合、モデルは異なります。これは、1 つにはイベントの量が少ないためであり、また、必要とされるイベントが 1 つではなく複数であることが多いためです。
ネットワークインタフェースイベントは、次のイベントのいずれかを通知します。
インタフェースが作成 (NE_PLUMB) または破棄 (NE_UNPLUMB) されます。
インタフェースの状態がアップ (NE_UP) またはダウン (NE_DOWN) に変更します。
インタフェースにアドレスの変更 (NE_ADDRESS_CHANGE) があります。
今後、新しいネットワークインタフェースイベントが追加される可能性があるので、コールバック関数が受信した不明なイベントや認識できないイベントに対しては、常に 0 を返してください。