レイヤー 2 フィルターの使用
レイヤー 2 フィルタリングは、Windows 8 以降のバージョンの Windows でサポートされています。
この WFP 機能を使用すると、レイヤー 2 MACヘッダーのフィールドをフィルタリングできます。 これらのレイヤーは、ホスト マシンによって送受信されるすべてのパケットに対してパケットごとに呼び出されます。 レイヤーは、受信パスでのパケットの再構成の前と、送信パスでのパケットの断片化の後に呼び出されます。 これらのレイヤーは、NDIS ライトウェイト フィルター(LWF)ドライバーからアクセスします。
Note
コールアウトは、そのレイヤーに対応するフィルターがまだない場合は、レイヤーにパケットを挿入しないでください。 NET_BUFFER_LIST 構造体の挿入は、対応するレイヤーにフィルターが存在する場合にのみ挿入するように、フィルターの追加と削除を調整する必要があります。 また、プロバイダーは、他のプロバイダーに属するフィルターを削除しないでください。
ここでは、次のトピックについて説明します。
MAC フレームの挿入
コールバック ドライバーは FwpsInjectMacReceiveAsync0 関数を呼び出して、以前に吸収された MAC フレーム (またはフレームの複製) をインターセプトされたレイヤー 2 の受信データ パスに再挿入するか、または受信データ パスに生成された MAC フレームを挿入します。
コールバック ドライバーは FwpsInjectMacSendAsync0 関数を呼び出して、以前に吸収された MAC フレーム (またはフレームの複製) をインターセプトされたレイヤー 2 の送信データ パスに再挿入するか、または送信データ パスに生成された MAC フレームを挿入します。
netBufferLists パラメーターは NET_BUFFER_LIST チェーンである可能性があります。 しかし、完了関数は、チェーンのセグメント (または単一の NET_BUFFER_LIST) を完了して、それぞれ複数回呼び出すことができます。
挿入されたフレームは、パケットが最初に分類されたものと同じフィルターと一致する場合、再度分類される可能性があります。 そのため、IP レイヤーのコールアウトと同様に、レイヤー 2 のコールアウトも FwpsQueryPacketInjectionState0 を呼び出すことによって、無限パケット検査から保護する必要があります。
また、挿入するレイヤーにコールアウトが必要です。 それ以外の場合、挿入された NET_BUFFER_LIST は完了関数によって完了せず、NET_BUFFER_LIST はスタックのさらに上に移動します。 この場合、NDIS はスタック内の次のコンポーネントに挿入された NET_BUFFER_LIST を渡そうとするため、動作は未定義です。
NET_BUFFER_LISTStatus メンバーには、スタック挿入の状態の結果が含まれます。 スタック インジェクションの状態の結果は、WFP インジェクション関数が STATUS_SUCCESS を返した後に、スタックが NET_BUFFER_LIST に設定する状態です。 NT_SUCCESS マクロを使用して、Status メンバー内のスタック挿入の状態を確認する必要があります。 Status の値が STATUS_SUCCESS である場合、注入は成功しましたが、それ以上の情報はありません。 STATUS_SUCCESS より大きい Status メンバーの値は、挿入が成功したことを意味しますが、考慮する必要がある挿入に関する詳細情報が存在する可能性があります。 STATUS_SUCCESS 未満の Status メンバーの値は、Status メンバーで指定された理由で挿入が失敗したことを意味します。
チェーン ネットワーク バッファー リストの分類
デフォルトでは、コールアウト ドライバーは、ネットワーク バッファーの一覧を個別にのみ分類できます。 ただし、コールアウト ドライバーは、次の両方を行う場合、パフォーマンスを向上させるために NET_BUFFER_LIST チェーンを分類できます:
- FWPS_CALLOUT2 構造体の Flags メンバー内の FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY フラグを指定します。
- NET_BUFFER_LIST チェーンを分類できる classifyFn2 関数を登録します。
警告
ただし、コールアウト ドライバーが FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY フラグを設定する場合は、次の関数を使用して NET_BUFFER_LISTs を変更することはできません。
- FwpsReferenceNetBufferList0
- FwpsDereferenceNetBufferList0
- FwpsAllocateCloneNetBufferList0
- FwpsFreeCloneNetBufferList0
このフラグを設定すると、FwpsAllocateCloneNetBufferList0 は常に INVALID_PARAMETER エラーを返します。 これにより、サードパーティ製のコールアウト ドライバーが NET_BUFFER_LISTs の参照カウントの管理に失敗し、送受信操作が停止する可能性があります。
WFP レイヤー 2 のレイヤーとフィールド
仮想スイッチ フィルタリングの実行時フィルタリング レイヤー識別子は次のとおりです:
FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE
FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE
仮想スイッチ フィルタリングのデータ フィールド識別子は以下が含まれます:
FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET
FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET