패킷 병합 수신 필터 지정

지나치게 많이 사용하는 드라이버는 NDIS 패킷 병합을 지원하는 미니포트 드라이버에서 하나 이상의 수신 필터를 설정할 수 있습니다. 오버리싱 드라이버는 미니포트 드라이버가 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체의 MaxPacketCoalescingFilters 멤버에 지정된 최대 수신 필터 수를 지정할 수 있습니다.

참고 지나치게 많은 프로토콜 드라이버는 NDIS_BIND_PARAMETERS 구조 내에서 NDIS_RECEIVE_FILTER_CAPABILITIES 구조를 가져옵니다. 오버리싱 필터 드라이버는 NDIS_FILTER_ATTACH_PARAMETERS 구조 내에서 NDIS_RECEIVE_FILTER_CAPABILITIES 구조를 가져옵니다.

오버리싱 드라이버 다운로드는 OID_RECEIVE_FILTER_SET_FILTER OID 메서드 요청을 실행하여 미니포트 드라이버에 필터를 받습니다. 이 OID 요청에 대한 NDIS_OID_REQUEST 구조체의 InformationBuffer 멤버는 호출자가 할당한 버퍼에 대한 포인터를 포함합니다. 이 버퍼는 다음을 포함하도록 형식이 지정됩니다.

수신 필터 지정

오버리싱 드라이버는 필터에 대한 구성 매개 변수를 사용하여 NDIS_RECEIVE_FILTER_PARAMETERS 구조를 초기화하여 패킷 병합 수신 필터를 지정합니다. NDIS_RECEIVE_FILTER_PARAMETERS 구조를 초기화할 때 오버리싱 드라이버는 다음 규칙을 따라야 합니다.

  • FilterType 멤버는 NdisReceiveFilterTypePacketCoalescingNDIS_RECEIVE_FILTER_TYPE 열거형 값으로 설정해야 합니다.

  • QueueId 멤버는 NDIS_DEFAULT_RECEIVE_QUEUE_ID 설정해야 합니다.

    참고 NDIS 6.30부터 패킷 병합 수신 필터는 네트워크 어댑터의 기본 수신 큐에서만 지원됩니다. 이 수신 큐에는 NDIS_DEFAULT_RECEIVE_QUEUE_ID 식별자가 있습니다.

  • 오버리싱 드라이버가 새 수신 필터를 만드는 경우 FilterId 멤버를 NDIS_DEFAULT_RECEIVE_FILTER_ID 설정해야 합니다.

    참고 NDIS는 OID_RECEIVE_FILTER_SET_FILTER OID 메서드 요청을 미니포트 드라이버에 전달하기 전에 수신 필터에 대한 고유 필터 식별자(ID)를 생성합니다.  

  • 오버리싱 드라이버가 기존 수신 필터를 수정하는 경우 FilterId 멤버를 수신 필터의 0이 아닌 필터 ID로 설정해야 합니다. 오버리싱 드라이버는 OID_RECEIVE_FILTER_ENUM_FILTERS OID 메서드 요청을 발급할 때 수신 필터에 대한 필터 ID를 가져옵니다. 수신 필터를 수정하는 방법에 대한 자세한 내용은 패킷 병합 수신 필터 수정을 참조하세요.

  • 필드 매개 변수의 배열을 정의하려면 NDIS_RECEIVE_FILTER_PARAMETERS 구조체의 FieldParametersArrayOffset, FieldParametersArrayNumElementsFieldParametersArrayElementSize 멤버를 설정해야 합니다. 배열의 각 요소는 수신 필터의 헤더 필드 테스트에 대한 매개 변수를 지정하는 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조체입니다.

  • RequestedFilterIdBitCount 멤버를 0으로 설정해야 합니다.

  • MaxCoalescingDelay는 수신 필터와 일치하는 첫 번째 패킷이 네트워크 어댑터에 저장되고 병합되는 최대 시간(밀리초 단위)으로 설정해야 합니다. 필터와 일치하는 첫 번째 패킷이 수신되는 즉시 네트워크 어댑터는 패킷을 병합하고 만료 시간이 MaxCoalescingDelay 멤버의 값으로 설정된 하드웨어 타이머를 시작합니다.

오버리싱 드라이버는 필드 매개 변수 배열의 헤더 필드 테스트를 연결된 MAC 및 프로토콜 헤더가 패킷에 있는 순서와 동일한 순서로 정렬해야 합니다.

예를 들어 오버리싱 드라이버가 IP 버전 4(IPv4) 프로토콜 필드에 대한 필터 매개 변수를 지정하기 전에 먼저 MAC 헤더 프로토콜 필드(NdisMacHeaderFieldProtocol)에 대한 필터 매개 변수를 지정해야 합니다. 이러한 방식으로 드라이버는 필드가 IPv4 패킷에 대해 올바른 EtherType 값(0x0800)으로 설정되어 있는지 확인하는 헤더 필드 테스트를 지정합니다. 테스트가 실패하는 경우 어댑터는 IPV4 프로토콜 필드의 테스트를 수행할 필요가 없습니다.

헤더 필드 테스트 지정

각 수신 필터는 하나 이상의 테스트 조건(헤더 필드 테스트)을 지정할 수 있습니다. 네트워크 어댑터는 이러한 테스트를 수행하여 수신된 패킷을 어댑터의 하드웨어 병합 버퍼에서 병합해야 하는지 여부를 확인합니다. 또한 오버리싱 드라이버는 다양한 MAC(미디어 액세스 제어), IP 버전 4(IPv4) 및 IP 버전 6(IPv6) 헤더 필드에 대해 별도의 필터 테스트를 지정할 수 있습니다.

네트워크 어댑터에서 필터링을 최적화하기 위해 헤더 필드 테스트는 패킷 데이터 내에서 바이트 오프셋/길이 사양 대신 표준화된 헤더 필드 이름을 기반으로 합니다. 네트워크 어댑터의 하드웨어 또는 펌웨어는 헤더/필드 이름을 사용하여 수신된 패킷에서 여러 헤더 필드 테스트를 수행하는 방법을 최적화할 수 있습니다.

각 수신 필터에는 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조에서 지정한 하나 이상의 헤더 필드 테스트가 포함될 수 있습니다. 각 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조체는 NDIS_RECEIVE_FILTER_PARAMETERS 구조체FieldParametersArrayOffset, FieldParametersArrayNumElementsFieldParametersArrayElementSize 멤버에서 참조하는 필드 매개 변수 배열의 요소입니다.

미니포트 드라이버는 OID_RECEIVE_FILTER_SET_FILTER OID 메서드 요청을 처리할 때 다음 지침을 따라야 합니다.

  • NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 플래그가 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 구조의 Flags 멤버에 설정된 경우 네트워크 어댑터는 일치하는 MAC 주소가 있는 수신된 패킷과 VLAN 식별자가 0인 태그가 지정되지 않은 패킷 또는 패킷만 표시해야 합니다. 즉, 네트워크 어댑터는 일치하는 MAC 주소와 0이 아닌 VLAN 식별자가 있는 패킷을 나타내서는 안 됩니다.

  • 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 태그를 배치해야 합니다.

  • 오버리싱 드라이버가 NDIS_RECEIVE_FILTER_PARAMETERS 구조에서 MAC 주소 필터 및 VLAN 식별자 필터를 설정하는 경우 필터 필드 중 하나에서 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 플래그를 설정하지 않습니다. 이 경우 미니포트 드라이버는 지정된 MAC 주소와 VLAN 식별자와 일치하는 패킷을 나타내야 합니다. 즉, 미니포트 드라이버는 VLAN 식별자가 없거나 태그가 지정되지 않은 MAC 주소가 일치하는 패킷을 나타내서는 안 됩니다.