NDIS パケットのループ バック
NblFlags メンバー (NET_BUFFER_LIST 構造体内) の NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET フラグが設定されている場合、パケットはループバック パケットです。 プロトコル ドライバーとフィルター ドライバーは、このフラグをチェックして、パケットがループバック パケットであるかどうかを判断できます。
次の 3 つの条件がすべて満たされている場合、NDIS はパケットをループバックします。
基盤のミニポート アダプター メディア タイプが NdisMedium802_3 または NdisMedium802_5 である。
次の 3 つの条件のいずれかが満たされる。
プロトコル バインドが、パケット フィルターを指定するよう OID_GEN_CURRENT_PACKET_FILTER OID で NDIS_PACKET_TYPE_PROMISCUOUS 設定を設定し (また、Windows 8 以降では、同じ OID で NDIS_PACKET_TYPE_NO_LOCAL を設定せず)、次のいずれかが当てはまる。
- ミニポート アダプターに複数のバインドがある。
- ミニポート アダプターにアタッチされているフィルター モジュールが 1 つあり、そのフィルター モジュールは受信ハンドラーを登録している。
プロトコル バインディングが、パケット フィルターを指定するよう OID_GEN_CURRENT_PACKET_FILTER 設定で NDIS_PACKET_TYPE_ALL_LOCAL を設定し、次のいずれかが当てはまる。
- ミニポート アダプターに複数のバインドがある。
- ミニポート アダプターにアタッチされているフィルター モジュールが 1 つあり、そのフィルター モジュールは受信ハンドラーを登録している。
呼び出し元が、SendFlags パラメーター (NdisSendNetBufferLists 関数) で NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK を設定する。
パケットが、ミニポート アダプターの OID_GEN_CURRENT_PACKET_FILTER OID で設定されたパケット フィルターによって決定されたとおりに許容される。 次はその例です。
- パケットが直接パケットの場合、パケット内の宛先アドレスはミニポート アダプターの MAC アドレスと一致する必要があります。
- パケットがマルチキャスト パケットの場合、パケット フィルターが NDIS_PACKET_TYPE_ALL_MULTICAST に設定されているか、宛先アドレスがミニポート アダプターのマルチキャスト アドレス リストのマルチキャスト アドレスのいずれかと一致し、パケット フィルターが NDIS_PACKET_TYPE_MULTICAST に設定されていることが必要です。
- パケットがブロードキャスト パケットの場合、ミニポート アダプターのパケット フィルターは NDIS_PACKET_TYPE_BROADCAST に設定されていることが必要です。
- ミニポート アダプターのパケット フィルターは、NDIS_PACKET_TYPE_PROMISCUOUS 設定か NDIS_PACKET_TYPE_ALL_LOCAL に設定されています。
プロトコル バインディングは、次のいずれかが該当する場合にループバック パケットを受信します。
プロトコル バインディングはパケットの元のセンダーであり、NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK が設定されます。
プロトコル バインドは、パケット フィルターで NDIS_PACKET_TYPE_NO_LOCAL を設定しません。
次のいずれかが該当する場合、プロトコル バインディングはループバック パケットを受信しません。
プロトコル バインドは、パケット フィルターで NDIS_PACKET_TYPE_NO_LOCAL を設定し、それはパケットの元のセンダーではありません。
プロトコル バインディングは元のセンダーですが、NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK は SendFlags パラメーターでNdisSendNetBufferLists 関数への呼び出しにおいて設定されません。
次の図は、ループバック アルゴリズムのロジック フローを示しています。