수신 필터링 기능 결정

이 항목에서는 NDIS 및 지나치게 많은 드라이버가 SR-IOV(단일 루트 I/O 가상화)를 지원하는 네트워크 어댑터의 수신 필터링 기능을 결정하는 방법을 설명합니다. 이 항목에는 다음과 같은 정보가 포함되어 있습니다.

MiniportInitializeEx 중 보고 수신 필터링 기능

드라이버를 오버리싱하여 수신 필터링 기능 쿼리

참고 SR-IOV 네트워크 어댑터의 PCI Express(PCIe) PF(물리적 함수)에 대한 미니포트 드라이버만 수신 필터링 기능을 보고할 수 있습니다. PCIe VF(Virtual Functions)용 미니포트 드라이버는 SR-IOV 어댑터의 수신 필터링 기능을 보고해서는 안 됩니다.

MiniportInitializeEx 중 보고 수신 필터링 기능

NDIS가 PF 미니포트 드라이버의 MiniportInitializeEx 함수를 호출하면 드라이버는 다음과 같은 수신 필터링 기능을 제공합니다.

  • 전체 하드웨어는 네트워크 어댑터가 지원할 수 있는 필터링 기능을 수신합니다.

  • 네트워크 어댑터에서 현재 사용하도록 설정된 인터페이스에 대한 수신 필터링 기능입니다.

미니포트 드라이버는 다음과 같은 방법으로 초기화된 NDIS_RECEIVE_FILTER_CAPABILITIES 구조를 통해 기본 네트워크 어댑터의 전체 하드웨어 수신 필터링 기능을 보고합니다.

  1. 미니포트 드라이버는 헤더 멤버를 초기화합니다. 드라이버는 헤더Type 멤버를 NDIS_OBJECT_TYPE_DEFAULT 설정합니다.

    NDIS 6.30부터 미니포트 드라이버는 HeaderRevision 멤버를 NDIS_RECEIVE_FILTER_CAPABILITIES_REVISION_2, Size 멤버를 NDIS_SIZEOF_RECEIVE_FILTER_CAPABILITIES_REVISION_2 설정합니다.

  2. 미니포트 드라이버는 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체의 다른 멤버를 SR-IOV 네트워크 어댑터의 수신 필터링 기능에 대한 값 범위로 설정합니다. 예를 들어 미니포트 드라이버는 SupportedFilterTests 에서 적절한 플래그를 설정하여 미니포트 드라이버가 지원하는 필터 테스트 작업을 지정합니다.

  3. SR-IOV 외에도 수신 필터링은 다음 인터페이스에서도 사용됩니다.

    미니포트 드라이버가 이러한 인터페이스를 지원하는 경우 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체의 멤버를 인터페이스와 관련된 수신 필터링 기능 값 범위로 설정해야 합니다. 예를 들어 드라이버가 NDIS 패킷 병합 및 SR-IOV를 지원하는 경우 SupportedQueueProperties 멤버에서 NDIS_RECEIVE_FILTER_PACKET_COALESCING_SUPPORTED_ON_DEFAULT_QUEUE 플래그를 설정해야 합니다.

미니포트 드라이버는 다음과 같은 방식으로 초기화된 NDIS_RECEIVE_FILTER_CAPABILITIES 구조를 통해 기본 네트워크 어댑터의 현재 사용 가능한 수신 필터링 기능을 보고합니다.

  1. 미니포트 드라이버는 헤더 멤버를 초기화합니다. 드라이버는 헤더Type 멤버를 NDIS_OBJECT_TYPE_DEFAULT 설정합니다.

    NDIS 6.30부터 미니포트 드라이버는 HeaderRevision 멤버를 NDIS_RECEIVE_FILTER_CAPABILITIES_REVISION_2, Size 멤버를 NDIS_SIZEOF_RECEIVE_FILTER_CAPABILITIES_REVISION_2 설정합니다.

  2. 미니포트 드라이버는 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체의 다른 멤버를 현재 사용하도록 설정된 인터페이스의 수신 필터링 기능에 대한 값 범위로 설정합니다. 예를 들어 NDIS 패킷 병합을 사용하는 경우 드라이버는 이 기술과 관련된 멤버만 설정해야 합니다.

    수신 필터링을 사용하는 인터페이스는 표준화된 INF 키워드를 통해 사용하거나 사용하지 않도록 설정됩니다. NDIS 패킷 병합을 사용하는 방법에 대한 자세한 내용은 패킷 병합에 대한 표준화된 INF 키워드를 참조하세요. SR-IOV 및 VMQ를 사용하도록 설정하는 방법에 대한 자세한 내용은 SR-IOV, VMQ 및 RSS 표준화된 INF 키워드 처리를 참조하세요.

NDIS가 미니포트 드라이버의 MiniportInitializeEx 함수를 호출하면 드라이버는 다음 단계에 따라 네트워크 어댑터의 수신 필터링 기능을 등록합니다.

  1. 미니포트 드라이버는 NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 구조를 초기화합니다.

    미니포트 드라이버는 HardwareReceiveFilterCapabilities 멤버를 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체의 주소로 설정합니다. 이 구조는 이전에 네트워크 어댑터의 전체 하드웨어 수신 필터링 기능으로 초기화되었습니다.

  2. VMQ, SR-IOV 및 NDIS 패킷 병합이 네트워크 어댑터에서 모두 비활성화된 경우 미니포트 드라이버는 CurrentReceiveFilterCapabilities 멤버를 NULL로 설정합니다.

  3. VMQ, SR-IOV 또는 NDIS 패킷 병합이 현재 네트워크 어댑터에서 사용하도록 설정된 경우 미니포트 드라이버는 다음을 수행해야 합니다.

    • 미니포트 드라이버는 네트워크 어댑터에서 현재 사용하도록 설정된 인터페이스에 대한 현재 수신 필터링 기능을 사용하여 다른 NDIS_RECEIVE_FILTER_CAPABILITIES 구조를 초기화해야 합니다.

      SR-IOV 인터페이스를 사용하는 경우 미니포트 드라이버가 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체의 멤버를 동일하거나 다른 값으로 설정해야 하는 상황이 있습니다. SR-IOV 인터페이스는 VMQ와 유사한 큐 메커니즘을 제공하지만 VM 수신 큐 대신 VPort(가상 포트)를 사용하기 때문입니다.

      예를 들어 미니포트 드라이버는 VMQ 또는 SR-IOV 인터페이스를 사용하는 경우 EnabledFilterTypes 멤버에서 NDIS_RECEIVE_FILTER_VMQ_FILTERS_ENABLED 플래그를 설정해야 합니다. 그러나 미니포트 드라이버는 SR-IOV 인터페이스가 활성화된 경우 NumQueues 멤버를 0으로 설정하고 VMQ 인터페이스를 사용하는 경우 0이 아닌 값을 설정해야 합니다.

    • 미니포트 드라이버는 CurrentReceiveFilterCapabilities 멤버를 현재 사용 가능한 인터페이스에 대한 현재 수신 필터링 기능을 포함하는 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체의 주소로 설정합니다.

  4. VMQ, SR-IOV 또는 NDIS 패킷 병합이 현재 네트워크 어댑터에서 사용하도록 설정된 경우 미니포트 드라이버는 HardwareReceiveFilterCapabilities 멤버를 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체의 주소로 설정합니다. 이 구조는 네트워크 어댑터의 현재 사용 가능한 수신 필터링 기능으로 이전에 초기화되었습니다.

  5. 드라이버는 NdisMSetMiniportAttributes를 호출하고 MiniportAttributes 매개 변수를 NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 구조체에 대한 포인터로 설정합니다.

어댑터 초기화 프로세스에 대한 자세한 내용은 미니포트 어댑터 초기화를 참조하세요.

드라이버를 오버리싱하여 수신 필터링 기능 쿼리

NDIS는 네트워크 어댑터의 현재 사용 가능한 수신 필터링 기능을 다음과 같은 방법으로 네트워크 어댑터에 바인딩하는 지나치게 많은 드라이버에 전달합니다.

  • NDIS가 지나치게 많은 필터 드라이버의 FilterAttach 함수를 호출하면 NDIS는 AttachParameters 매개 변수를 통해 네트워크 어댑터의 NIC 스위치 기능을 전달합니다. 이 매개 변수는 NDIS_FILTER_ATTACH_PARAMETERS 구조체에 대한 포인터를 포함합니다. 이 구조체의 ReceiveFilterCapabilities 멤버에는 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체에 대한 포인터가 포함되어 있습니다.

  • NDIS가 지나치게 많은 프로토콜 드라이버의 ProtocolBindAdapterEx 함수를 호출하면 NDIS는 BindParameters 매개 변수를 통해 네트워크 어댑터의 NIC 스위치 기능을 전달합니다. 이 매개 변수는 NDIS_FILTER_ATTACH_PARAMETERS 구조체에 대한 포인터를 포함합니다. 이 구조체의 ReceiveFilterCapabilities 멤버에는 NDIS_RECEIVE_FILTER_CAPABILITIES 구조체에 대한 포인터가 포함되어 있습니다.

또한 NDIS는 프로토콜 또는 필터 드라이버를 과도하게 사용하여 발급된 OID_RECEIVE_FILTER_CURRENT_CAPABILITIES 및 OID_RECEIVE_FILTER_HARDWARE_CAPABILITIES 대한 OID(개체 식별자) 쿼리 요청을 처리할 때 NDIS_RECEIVE_FILTER_CAPABILITIES 구조를 반환합니다.