Freigeben über


Angeben eines Paket-Koalescing-Empfangsfilters

Ein Überlastungstreiber kann einen oder mehrere Empfangsfilter für einen Miniporttreiber festlegen, der die NDIS-Paketkopplung unterstützt. Der überlastende Treiber kann bis zu der maximalen Anzahl von Empfangsfiltern angeben, die der Miniporttreiber im MaxPacketCoalescingFilters-Member der NDIS_RECEIVE_FILTER_CAPABILITIES-Struktur angegeben hat.

Hinweis Der überlastende Protokolltreiber ruft die NDIS_RECEIVE_FILTER_CAPABILITIES-Struktur innerhalb der NDIS_BIND_PARAMETERS-Struktur ab. Der überlastende Filtertreiber ruft die NDIS_RECEIVE_FILTER_CAPABILITIES-Struktur innerhalb der NDIS_FILTER_ATTACH_PARAMETERS-Struktur ab.

Der überlastende Treiber lädt Empfangen von Filtern in den Miniporttreiber herunter, indem OID-Methodenanforderungen von OID_RECEIVE_FILTER_SET_FILTER ausgegeben werden. Das InformationBuffer-Element der NDIS_OID_REQUEST-Struktur für diese OID-Anforderung enthält einen Zeiger auf einen vom Aufrufer zugewiesenen Puffer. Dieser Puffer ist so formatiert, dass er Folgendes enthält:

Angeben eines Empfangsfilters

Ein Überlastungstreiber gibt einen paketverknenden Empfangsfilter an, indem eine NDIS_RECEIVE_FILTER_PARAMETERS Struktur mit den Konfigurationsparametern für den Filter initialisiert wird. Wenn die NDIS_RECEIVE_FILTER_PARAMETERS-Struktur initialisiert wird, muss der überlastende Treiber die folgenden Regeln befolgen:

  • Das FilterType-Element muss auf den NDIS_RECEIVE_FILTER_TYPE Enumerationswert von NdisReceiveFilterTypePacketCoalescing festgelegt werden.

  • Das QueueId-Element muss auf NDIS_DEFAULT_RECEIVE_QUEUE_ID festgelegt werden.

    Hinweis Ab NDIS 6.30 wird der Paketkopplungs-Empfangsfilter nur in der Standard-Empfangswarteschlange des Netzwerkadapters unterstützt. Diese Empfangswarteschlange weist den Bezeichner NDIS_DEFAULT_RECEIVE_QUEUE_ID auf.

  • Wenn der überlastende Treiber einen neuen Empfangsfilter erstellt, muss er den FilterId-Member auf NDIS_DEFAULT_RECEIVE_FILTER_ID festlegen.

    Hinweis NDIS generiert einen eindeutigen Filterbezeichner (ID) für den Empfangsfilter, bevor die OID-Methodenanforderung von OID_RECEIVE_FILTER_SET_FILTER an den Miniporttreiber weitergeleitet wird.  

  • Wenn der überlastende Treiber einen vorhandenen Empfangsfilter ändert, muss er den FilterId-Member auf die nichtzero-Filter-ID des Empfangsfilters festlegen. Der überlastende Treiber ruft die Filter-ID für den Empfangsfilter ab, wenn er eine OID-Methodenanforderung von OID_RECEIVE_FILTER_ENUM_FILTERS ausgibt. Weitere Informationen zum Ändern eines Empfangsfilters finden Sie unter Ändern von Paketverknen von Empfangsfiltern.

  • Die Elemente FieldParametersArrayOffset, FieldParametersArrayNumElements und FieldParametersArrayElementSize der NDIS_RECEIVE_FILTER_PARAMETERS-Struktur müssen festgelegt werden, um das Array eines Feldparameters zu definieren. Jedes Element im Array ist eine NDIS_RECEIVE_FILTER_FIELD_PARAMETERS-Struktur , die die Parameter für einen Headerfeldtest eines Empfangsfilters angibt.

  • Das RequestedFilterIdBitCount-Element muss auf 0 festgelegt werden.

  • MaxCoalescingDelay muss auf die maximale Zeit (in Millisekundeneinheiten) festgelegt werden, die das erste Paket, das dem Empfangsfilter entspricht, gespeichert und auf dem Netzwerkadapter zusammengekoppelt wird. Sobald das erste Paket empfangen wird, das dem Filter entspricht, wird das Paket vom Netzwerkadapter zusammengelegt und ein Hardwaretimer gestartet, dessen Ablaufzeit auf den Wert des MaxCoalescingDelay-Elements festgelegt ist.

Der überlastende Treiber muss anordnen, dass die Headerfeldtests im Feldparameterarray in der gleichen Reihenfolge wie die zugeordneten MAC- und Protokollheader in einem Paket vorhanden wären.

Bevor der überlastende Treiber beispielsweise die Filterparameter für ein IP-Protokollfeld der Version 4 (IPv4) angibt, muss er zuerst die Filterparameter für ein MAC-Headerprotokollfeld (NdisMacHeaderFieldProtocol) angeben. Auf diese Weise gibt der Treiber einen Headerfeldtest an, der überprüft, ob das Feld auf den richtigen EtherType-Wert (0x0800) für IPv4-Pakete festgelegt ist. Wenn der Test fehlschlägt, muss der Adapter den Test des IPV4-Protokollfelds nicht durchführen.

Angeben von Headerfeldtests

Jeder Empfangsfilter kann ein oder mehrere Testkriterien (Headerfeldtests) angeben. Der Netzwerkadapter führt diese Tests durch, um zu bestimmen, ob ein empfangenes Paket in einem Hardware-Koalescingpuffer auf dem Adapter vereint werden soll. Darüber hinaus kann der überlastende Treiber separate Filtertests für verschiedene Mac- (Media Access Control), IP Version 4 (IPv4) und IP Version 6 (IPv6)-Headerfelder angeben.

Um die Filterung nach dem Netzwerkadapter zu optimieren, basieren Headerfeldtests auf standardisierten Headerfeldnamen anstelle von Byteoffset-/Längenspezifikationen innerhalb der Paketdaten. Mithilfe von Header-/Feldnamen kann die Hardware oder Firmware des Netzwerkadapters optimieren, wie mehrere Headerfeldtests für ein empfangenes Paket ausgeführt werden.

Jeder Empfangsfilter kann einen oder mehrere Headerfeldtests enthalten, die durch eine NDIS_RECEIVE_FILTER_FIELD_PARAMETERS-Struktur angegeben werden. Jede NDIS_RECEIVE_FILTER_FIELD_PARAMETERS Struktur ist ein Element des Feldparameterarrays, auf das die Elemente FieldParametersArrayOffset, FieldParametersArrayNumElements und FieldParametersArrayElementSize der NDIS_RECEIVE_FILTER_PARAMETERS-Struktur verweisen.

Der Miniporttreiber muss die folgenden Richtlinien befolgen, wenn er eine OID-Methodenanforderung von OID_RECEIVE_FILTER_SET_FILTER verarbeitet:

  • Wenn das NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO-Flag im Flags-Element der NDIS_RECEIVE_FILTER_FIELD_PARAMETERS-Struktur festgelegt ist, darf der Netzwerkadapter nur empfangene Pakete mit einer übereinstimmenden MAC-Adresse und enttagte Pakete oder Pakete mit einem VLAN-Bezeichner von 0 angeben. Das heißt, der Netzwerkadapter darf keine Pakete mit einer übereinstimmenden MAC-Adresse und einem nichtzero-VLAN-Bezeichner angeben.

  • Wenn das NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO-Flag nicht festgelegt ist und kein VLAN-Bezeichnerfilter durch eine OID-Satzanforderung von OID_RECEIVE_FILTER_SET_FILTER konfiguriert ist, muss der Miniporttreiber eine der folgenden Aktionen ausführen:

    • Wenn der Miniporttreiber NDIS 6.20 unterstützt, muss eine fehlerhafte status für die OID-Anforderung von OID_RECEIVE_FILTER_SET_FILTER zurückgegeben werden.

    • Wenn der Miniporttreiber NDIS 6.30 oder höhere Versionen von NDIS unterstützt, muss er den Netzwerkadapter so konfigurieren, dass die angegebenen MAC-Adressfelder überprüft und gefiltert werden. Wenn im empfangenen Paket ein VLAN-Tag vorhanden ist, muss es vom Netzwerkadapter aus den Paketdaten entfernt werden. Der Miniporttreiber muss das VLAN-Tag in einem NDIS_NET_BUFFER_LIST_8021Q_INFO platzieren, das der NET_BUFFER_LIST Struktur des Pakets zugeordnet ist.

  • Wenn der überlastende Treiber einen MAC-Adressfilter und einen VLAN-Bezeichnerfilter in der NDIS_RECEIVE_FILTER_PARAMETERS-Struktur festlegt, wird das NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO-Flag in keinem der Filterfelder festgelegt. In diesem Fall sollte der Miniporttreiber Pakete angeben, die sowohl der angegebenen MAC-Adresse als auch dem VLAN-Bezeichner entsprechen. Das heißt, der Miniporttreiber sollte keine Pakete mit einer übereinstimmenden MAC-Adresse angeben, die einen VLAN-Bezeichner null aufweisen oder nicht markierte Pakete sind.