계층 2 필터링 사용

계층 2 필터링은 Windows 8 이상 버전의 Windows에서 지원됩니다.

이 WFP 기능을 사용하면 계층 2 MAC 헤더의 필드를 필터링할 수 있습니다. 이러한 계층은 호스트 머신에서 보내거나 받는 모든 패킷에 대해 패킷별로 호출됩니다. 계층은 인바운드 경로에서 패킷 재어셈블리를 수행하기 전과 아웃바운드 경로의 패킷 조각화 후에 호출됩니다. 이러한 계층은 NDIS LWF(경량 필터) 드라이버에서 액세스합니다.

참고

설명선은 해당 계층에 해당 필터가 아직 없는 경우 계층에 패킷을 삽입해서는 안 됩니다. 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_LIST상태 멤버에는 스택 삽입의 상태 결과가 포함됩니다. 스택 삽입의 상태 결과는 WFP 삽입 함수가 STATUS_SUCCESS 반환한 후 스택이 NET_BUFFER_LIST 배치하는 상태. NT_SUCCESS 매크로를 사용하여 상태 멤버에서 스택 삽입의 상태 검사 합니다. Status 값이 STATUS_SUCCESS 경우 추가 정보 없이 삽입이 성공했습니다. STATUS_SUCCESS 보다 큰 상태 멤버 값은 삽입이 성공했음을 의미하지만 고려해야 하는 삽입에 대한 자세한 정보가 있을 수 있습니다. STATUS_SUCCESS 미만인 상태 멤버 값은 Status 멤버에 지정된 이유로 삽입이 실패했음을 의미합니다.

연결된 네트워크 버퍼 목록 분류

기본적으로 콜아웃 드라이버는 네트워크 버퍼 목록만 개별적으로 분류할 수 있습니다. 그러나 설명선 드라이버는 다음 두 가지를 모두 수행하는 경우 성능 향상을 위해 NET_BUFFER_LIST 체인을 분류할 수 있습니다.

경고

그러나 설명선 드라이버가 FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY 플래그를 설정하는 경우 다음 함수를 사용하여 NET_BUFFER_LISTs 수정할 수 없습니다.

이 플래그를 설정하면 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

FWPS_FIELDS_INBOUND_MAC_FRAME_NATIVE

FWPS_FIELDS_OUTBOUND_MAC_FRAME_NATIVE