Festlegen eines VMQ-Filters
Nachdem eine Empfangswarteschlange zugewiesen wurde, können überlastende Treiber Filter für die Empfangswarteschlange festlegen. Nur der Treiber, der eine Empfangswarteschlange zugeordnet hat, kann einen Filter für diese Warteschlange festlegen.
Hinweis Da die Standard-Empfangswarteschlange (NDIS_DEFAULT_RECEIVE_QUEUE_ID) immer vorhanden ist, können überlastende Treiber immer einen Empfangsfilter für die Standardwarteschlange festlegen. Überlastende Treiber besitzen nicht die Standardwarteschlange. Daher können alle Protokolltreiber, die an einen Netzwerkadapter gebunden sind, die Standardwarteschlange verwenden.
Festlegen eines Filters für eine Empfangswarteschlange
Um einen Filter für eine Empfangswarteschlange mit einem anfänglichen Satz von Konfigurationsparametern festzulegen, stellt ein übersteigender Treiber eine OID_RECEIVE_FILTER_SET_FILTER OID-Anforderung (Method Object Identifier) aus. Das InformationBuffer-Element der NDIS_OID_REQUEST-Struktur enthält zunächst einen Zeiger auf eine NDIS_RECEIVE_FILTER_PARAMETERS-Struktur . Nach erfolgreicher Rückgabe der OID-Methodenanforderung enthält das InformationBuffer-Element der NDIS_OID_REQUEST-Struktur einen Zeiger auf eine NDIS_RECEIVE_FILTER_PARAMETERS-Struktur mit einem neuen Filterbezeichner.
Der überlastende Treiber initialisiert die NDIS_RECEIVE_FILTER_PARAMETERS-Struktur mit den folgenden Filterkonfigurationsparametern für die Empfangswarteschlange:
Der Filtertyp, der über einen NDIS_RECEIVE_FILTER_TYPE Enumerationswert angegeben wird.
Hinweis Ab NDIS 6.20 werden nur NdisReceiveFilterTypeVMQueue-Filtertypen für die VMQ-Schnittstelle (VMQ) unterstützt.
Der Warteschlangenbezeichner.
Mindestens ein Feldtestparameter, die als NDIS_RECEIVE_FILTER_FIELD_PARAMETERS-Strukturen formatiert sind. Für VMQ werden die folgenden Feldtestparameter definiert.
Die MAC-Adresse (Zielmedienzugriffssteuerung) im Paket entspricht der angegebenen MAC-Adresse.
Der VLAN-Bezeichner (Virtual LAN) im Paket entspricht dem angegebenen VLAN-Bezeichner.
Die NDIS_RECEIVE_FILTER_PARAMETERS-Struktur wird mit der OID_RECEIVE_FILTER_PARAMETERS OID und der OID_RECEIVE_FILTER_SET_FILTER OID verwendet, um die Konfigurationsparameter eines Filters anzugeben.
Die Elemente FieldParametersArrayOffset, FieldParametersArrayNumElements und FieldParametersArrayElementSize der NDIS_RECEIVE_FILTER_PARAMETERS Struktur definieren ein Array von NDIS_RECEIVE_FILTER_FIELD_PARAMETERS Strukturen. Jede NDIS_RECEIVE_FILTER_FIELD_PARAMETERS Struktur im Array legt das Filtertestkriterium für ein Feld in einem Netzwerkheader fest.
Das Flags-Element der NDIS_RECEIVE_FILTER_FIELD_PARAMETERS-Struktur gibt Aktionen an, die für den Empfangsfilter ausgeführt werden sollen. Die folgenden Punkte gelten für das NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO-Flag :
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 angeben, die allen folgenden Testkriterien entsprechen:
Ein Paket mit einer übereinstimmenden MAC-Adresse.
Ein Paket, das kein VLAN-Tag oder einen VLAN-Bezeichner von 0 aufweist.
Wenn das Flag NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO festgelegt ist, darf der Netzwerkadapter keine Pakete angeben, die eine übereinstimmende MAC-Adresse und einen nichtzero-VLAN-Bezeichner aufweisen.
Hinweis Wenn der erweiterbare Hyper-V-Schalter den MAC-Adressfilter festlegt und in OID_RECEIVE_FILTER_SET_FILTER kein VLAN-Bezeichnerfilter konfiguriert ist, legt der Switch auch das flag NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO fest.
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 ein Protokolltreiber einen MAC-Adressfilter und einen VLAN-Bezeichnerfilter mit der OID_RECEIVE_FILTER_SET_FILTER OID 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.
Verwenden des Filterbezeichners
NDIS weist einen Filterbezeichner im FilterId-Member der NDIS_RECEIVE_FILTER_PARAMETERS-Struktur zu und übergibt die OID-Methodenanforderung von OID_RECEIVE_FILTER_SET_FILTER an den zugrunde liegenden Miniporttreiber. Jeder Filter, der für eine Empfangswarteschlange festgelegt ist, verfügt über einen eindeutigen Filterbezeichner für einen Netzwerkadapter. Das heißt, die Filterbezeichner werden nicht in verschiedenen Warteschlangen dupliziert, die der Netzwerkadapter verwaltet.
Der überlastende Treiber muss den Filterbezeichner verwenden, den NDIS in späteren OID-Anforderungen bereitstellt. beispielsweise, um die Filterparameter zu ändern oder einen Filter frei zu geben.
Wenn NDIS eine OID-Anforderung empfängt, um einen Filter für eine Empfangswarteschlange festzulegen, überprüft es die Filterparameter. Nachdem NDIS die erforderlichen Ressourcen und den Filterbezeichner zugewiesen hat, sendet es die OID-Anforderung an den zugrunde liegenden Netzwerkadapter. Wenn der Netzwerkadapter die erforderlichen Software- und Hardwareressourcen für den Filter erfolgreich zuordnen kann, schließt er die OID-Anforderung mit NDIS_STATUS_SUCCESS ab.
Der Miniporttreiber muss die Filterbezeichner für die zugeordneten Empfangsfilter beibehalten. NDIS verwendet den Filterbezeichner eines Filters mit späteren OID-Anforderungen, um die Empfangsfilterparameter zu ändern oder den Empfangsfilter zu löschen. Weitere Informationen zum Ändern von Parametern und Löschen von Filtern finden Sie unter Abrufen und Aktualisieren von VM-Warteschlangenparametern und Löschen eines VMQ-Filters.
Behandeln des Filters in einer Empfangswarteschlange
Der Miniporttreiber programmiert den Netzwerkadapter basierend auf den Filtern wie folgt:
Alle Feldtestparameter für einen bestimmten Filter müssen übereinstimmen, um der Warteschlange ein Paket zuzuweisen.
Mehrere Filter können in einer Warteschlange festgelegt werden.
Pakete müssen der Empfangswarteschlange zugewiesen werden, wenn einer der Filter erfolgreich ist.
Der Netzwerkadapter kombiniert die Ergebnisse aller Feldtests mit einem logischen AND-Vorgang . Das heißt, wenn ein Feldtest, der im Array der NDIS_RECEIVE_FILTER_FIELD_PARAMETERS-Strukturen enthalten ist, fehlschlägt, erfüllt das Netzwerkpaket das angegebene Filterkriterium nicht.
Wenn ein Netzwerkadapter ein empfangenes Paket anhand dieser Filterkriterien testet, muss er alle Felder im Paket ignorieren, für die keine Testkriterien angegeben sind.
Empfangen von Paketen aus einer Empfangswarteschlange
Nachdem ein Miniporttreiber eine OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE-Anforderung empfängt und filtert, die für die Warteschlange festgelegt sind, befindet sich die Warteschlange im Status "Ausgeführt" . Während sich die Warteschlange in diesem Zustand befindet, kann der Miniporttreiber Pakete in der Warteschlange anzeigen. Weitere Informationen zu Warteschlangenzuständen finden Sie unter Warteschlangenzustände und Vorgänge.
Wenn der Miniporttreiber eine OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID-Anforderung für eine Warteschlange erhalten hat, aber keine Filter für die Warteschlange festgelegt sind, darf der Miniporttreiber keine Empfangspakete für diese Warteschlange angeben. In diesem Fall kann der Miniporttreiber, wenn er eine OID_RECEIVE_FILTER_SET_FILTER OID-Anforderung für die Warteschlange empfängt und möglicherweise bevor er die OID-Anforderung abgeschlossen hat, Pakete in dieser Warteschlange angeben. Wenn der Miniporttreiber pakete in einer Warteschlange angibt, während er eine OID_RECEIVE_FILTER_SET_FILTER OID-Anforderung verarbeitet, muss der Miniporttreiber die OID_RECEIVE_FILTER_SET_FILTER Anforderung mit einem NDIS_STATUS_SUCCESS Rückgabecode abschließen.