VMQ 필터 설정
수신 큐가 할당되면 지나치게 많은 드라이버가 수신 큐에 필터를 설정할 수 있습니다. 수신 큐를 할당한 드라이버만 해당 큐에 필터를 설정할 수 있습니다.
참고 기본 수신 큐(NDIS_DEFAULT_RECEIVE_QUEUE_ID)가 항상 존재하기 때문에 오버리딩 드라이버는 항상 기본 큐에서 수신 필터를 설정할 수 있습니다. 지나치게 많은 드라이버는 기본 큐를 소유하지 않습니다. 따라서 네트워크 어댑터에 바인딩된 모든 프로토콜 드라이버는 기본 큐를 사용할 수 있습니다.
수신 큐에서 필터 설정
초기 구성 매개 변수 집합을 사용하여 수신 큐에 필터를 설정하려면 오버리싱 드라이버가 OID_RECEIVE_FILTER_SET_FILTER 메서드 OID(개체 식별자) 요청을 발급합니다. NDIS_OID_REQUEST 구조체의 InformationBuffer 멤버는 처음에 NDIS_RECEIVE_FILTER_PARAMETERS 구조체에 대한 포인터를 포함합니다. OID 메서드 요청에서 성공적으로 반환된 후 NDIS_OID_REQUEST 구조체의 InformationBuffer 멤버에는 새 필터 식별자가 있는 NDIS_RECEIVE_FILTER_PARAMETERS 구조체에 대한 포인터가 포함됩니다.
오버리싱 드라이버는 수신 큐에 대해 다음 필터 구성 매개 변수를 사용하여 NDIS_RECEIVE_FILTER_PARAMETERS 구조를 초기화합니다.
NDIS_RECEIVE_FILTER_TYPE 열거형 값을 통해 지정된 필터 형식입니다.
참고 NDIS 6.20부터 VMQ(가상 머신 큐) 인터페이스에 대해 NdisReceiveFilterTypeVMQueue 필터 형식만 지원됩니다.
큐 식별자입니다.
NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조체로 형식이 지정된 하나 이상의 필드 테스트 매개 변수입니다. VMQ의 경우 다음 필드 테스트 매개 변수가 정의됩니다.
패킷의 MAC(대상 미디어 액세스 제어) 주소는 지정된 MAC 주소와 같습니다.
패킷의 VLAN(가상 LAN) 식별자는 지정된 VLAN 식별자와 같습니다.
NDIS_RECEIVE_FILTER_PARAMETERS 구조는 OID_RECEIVE_FILTER_PARAMETERS OID 및 OID_RECEIVE_FILTER_SET_FILTER OID와 함께 필터의 구성 매개 변수를 지정하는 데 사용됩니다.
NDIS_RECEIVE_FILTER_PARAMETERS 구조체의 FieldParametersArrayOffset, FieldParametersArrayNumElements 및 FieldParametersArrayElementSize 멤버는 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조체의 배열을 정의합니다. 배열의 각 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조체는 네트워크 헤더의 한 필드에 대한 필터 테스트 조건을 설정합니다.
NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조체의 Flags 멤버는 수신 필터에 대해 수행할 작업을 지정합니다. 다음 점은 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 플래그에 적용됩니다.
NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 플래그가 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조의 Flags 멤버에 설정된 경우 네트워크 어댑터는 다음 모든 테스트 조건과 일치하는 수신된 패킷만 표시해야 합니다.
일치하는 MAC 주소가 있는 패킷입니다.
VLAN 태그가 없거나 VLAN 식별자가 0인 패킷입니다.
NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 플래그가 설정된 경우 네트워크 어댑터는 일치하는 MAC 주소와 0이 아닌 VLAN 식별자가 있는 패킷을 나타내지 않아야 합니다.
참고 Hyper-V 확장 가능 스위치가 MAC 주소 필터를 설정하고 OID_RECEIVE_FILTER_SET_FILTER VLAN 식별자 필터가 구성되지 않은 경우 스위치는 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 플래그도 설정합니다.
NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 플래그가 설정되지 않고 OID_RECEIVE_FILTER_SET_FILTER OID 집합 요청으로 구성된 VLAN 식별자 필터가 없는 경우 미니포트 드라이버는 다음 중 하나를 수행해야 합니다.
미니포트 드라이버가 NDIS 6.20을 지원하는 경우 OID_RECEIVE_FILTER_SET_FILTER OID 요청에 대해 실패한 상태 반환해야 합니다.
미니포트 드라이버가 NDIS 6.30 이상 버전의 NDIS를 지원하는 경우 네트워크 어댑터를 구성하여 지정된 MAC 주소 필드를 검사하고 필터링해야 합니다. VLAN 태그가 수신된 패킷에 있는 경우 네트워크 어댑터는 패킷 데이터에서 제거해야 합니다. 미니포트 드라이버는 패킷의 NET_BUFFER_LIST 구조와 연결된 NDIS_NET_BUFFER_LIST_8021Q_INFO VLAN 태그를 배치해야 합니다.
프로토콜 드라이버가 OID_RECEIVE_FILTER_SET_FILTER OID를 사용하여 MAC 주소 필터 및 VLAN 식별자 필터를 설정하는 경우 필터 필드 중 하나에서 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 플래그를 설정하지 않습니다. 이 경우 미니포트 드라이버는 지정된 MAC 주소와 VLAN 식별자와 일치하는 패킷을 나타내야 합니다. 즉, 미니포트 드라이버는 VLAN 식별자가 없거나 태그가 지정되지 않은 MAC 주소가 일치하는 패킷을 나타내서는 안 됩니다.
필터 식별자 사용
NDIS는 NDIS_RECEIVE_FILTER_PARAMETERS 구조체의 FilterId 멤버에 필터 식별자를 할당하고 OID_RECEIVE_FILTER_SET_FILTER OID 메서드 요청을 기본 미니포트 드라이버에 전달합니다. 수신 큐에 설정된 각 필터에는 네트워크 어댑터에 대한 고유한 필터 식별자가 있습니다. 즉, 필터 식별자는 네트워크 어댑터가 관리하는 다른 큐에서 중복되지 않습니다.
오버리싱 드라이버는 NDIS가 이후 OID 요청에서 제공하는 필터 식별자를 사용해야 합니다. 예를 들어 필터 매개 변수를 수정하거나 필터를 해제합니다.
NDIS가 수신 큐에서 필터를 설정하는 OID 요청을 받으면 필터 매개 변수를 확인합니다. NDIS는 필요한 리소스와 필터 식별자를 할당한 후 기본 네트워크 어댑터에 OID 요청을 제출합니다. 네트워크 어댑터가 필터에 필요한 소프트웨어 및 하드웨어 리소스를 성공적으로 할당할 수 있는 경우 NDIS_STATUS_SUCCESS 사용하여 OID 요청을 완료합니다.
미니포트 드라이버는 할당된 수신 필터에 대한 필터 식별자를 유지해야 합니다. NDIS는 수신 필터 매개 변수를 변경하거나 수신 필터를 지우기 위해 이후 OID 요청이 있는 필터의 필터 식별자를 사용합니다. 매개 변수를 변경하고 필터를 지우는 방법에 대한 자세한 내용은 VM 큐 매개 변수 가져오기 및 업데이트 및 VMQ필터 지우기를 참조하세요.
수신 큐에서 필터 처리
미니포트 드라이버는 다음과 같은 방법으로 필터를 기반으로 네트워크 어댑터를 프로그래밍합니다.
큐에 패킷을 할당하려면 특정 필터에 대한 모든 필드 테스트 매개 변수가 일치해야 합니다.
큐에 여러 필터를 설정할 수 있습니다.
필터가 전달되는 경우 패킷을 수신 큐에 할당해야 합니다.
네트워크 어댑터는 모든 필드 테스트의 결과를 논리적 AND 작업과 결합합니다. 즉, NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조 배열에 포함된 필드 테스트가 실패하면 네트워크 패킷이 지정된 필터 조건을 충족하지 않습니다.
네트워크 어댑터가 이러한 필터 조건에 대해 수신된 패킷을 테스트하는 경우 지정된 테스트 조건이 없는 패킷의 모든 필드를 무시해야 합니다.
수신 큐에서 패킷 수신
미니포트 드라이버가 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE 요청을 수신하고 큐에 설정된 필터가 있으면 큐가 실행 중 상태가 됩니다. 큐가 이 상태인 동안 미니포트 드라이버는 큐의 패킷을 나타낼 수 있습니다. 큐 상태에 대한 자세한 내용은 큐 상태 및 작업을 참조하세요.
미니포트 드라이버가 큐에 대한 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID 요청을 받았지만 큐에 설정된 필터가 없는 경우 미니포트 드라이버는 해당 큐의 수신 패킷을 나타내지 않아야 합니다. 이 경우 미니포트 드라이버가 큐에 대한 OID_RECEIVE_FILTER_SET_FILTER OID 요청을 수신하고 OID 요청을 완료하기 전에 해당 큐의 패킷을 나타낼 수 있습니다. 미니포트 드라이버가 OID_RECEIVE_FILTER_SET_FILTER OID 요청을 처리하는 동안 큐의 패킷을 나타내는 경우 미니포트 드라이버는 NDIS_STATUS_SUCCESS 반환 코드가 있는 OID_RECEIVE_FILTER_SET_FILTER 요청을 완료해야 합니다.