Udostępnij za pośrednictwem


Ustawianie filtru VMQ

Po przydzieleniu kolejki odbierania, sterowniki nadrzędne mogą ustawiać filtry w tej kolejce. Tylko sterownik, który przydzielił kolejkę odbierania, może ustawić filtr w tej kolejce.

Uwaga Ponieważ domyślna kolejka odbierania (NDIS_DEFAULT_RECEIVE_QUEUE_ID) zawsze istnieje, nadmierne sterowniki zawsze mogą ustawić filtr odbierania w kolejce domyślnej. Sterowniki nadrzędne nie posiadają kolejki domyślnej. W związku z tym wszystkie sterowniki protokołu powiązane z kartą sieciową mogą używać kolejki domyślnej.

Ustawianie filtru w kolejce odbierania

Aby ustawić filtr w kolejce odbierania z początkowym zestawem parametrów konfiguracji, nadrzędny sterownik wystawia żądanie metodą identyfikatora obiektu (OID) OID_RECEIVE_FILTER_SET_FILTER. Element członkowski InformationBuffer struktury NDIS_OID_REQUEST początkowo zawiera wskaźnik do struktury NDIS_RECEIVE_FILTER_PARAMETERS. Po zakończeniu zapytania metody OID, element InformationBuffer struktury NDIS_OID_REQUEST zawiera wskaźnik do struktury NDIS_RECEIVE_FILTER_PARAMETERS z nowym identyfikatorem filtru.

Nadrzędny sterownik inicjuje strukturę NDIS_RECEIVE_FILTER_PARAMETERS z następującymi parametrami konfiguracji filtru dla kolejki odbiorczej.

  • Typ filtru, który jest określony za pomocą wartości wyliczeniowej NDIS_RECEIVE_FILTER_TYPE.

    Uwaga Począwszy od NDIS 6.20, obsługiwane są tylko typy filtrów NdisReceiveFilterTypeVMQueue dla interfejsu kolejki maszyn wirtualnych (VMQ).

  • Identyfikator kolejki.

  • Jeden lub więcej parametrów testu polowego, które sformatowane są jako struktury NDIS_RECEIVE_FILTER_FIELD_PARAMETERS. Dla maszyny wirtualnej VMQ zdefiniowano następujące parametry testu pola.

    • Adres kontroli dostępu do nośnika docelowego (MAC) w pakiecie jest równy określonemu adresowi MAC.

    • Identyfikator wirtualnej sieci LAN (VLAN) w pakiecie jest równy określonemu identyfikatorowi sieci VLAN.

Struktura NDIS_RECEIVE_FILTER_PARAMETERS jest używana z identyfikatorem OID OID_RECEIVE_FILTER_PARAMETERS i identyfikatorem OID OID_RECEIVE_FILTER_SET_FILTER do określenia parametrów konfiguracji filtru.

FieldParametersArrayOffset, FieldParametersArrayNumElementsi FieldParametersArrayElementSize członkowie struktury NDIS_RECEIVE_FILTER_PARAMETERS definiują tablicę struktur NDIS_RECEIVE_FILTER_FIELD_PARAMETERS. Każda struktura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS w tablicy ustawia kryterium testowania filtru dla jednego pola w nagłówku sieci.

Flags element członkowski struktury NDIS_RECEIVE_FILTER_FIELD_PARAMETERS określa akcje, które mają być wykonywane dla filtru odbierania. Do flagi NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO mają zastosowanie następujące punkty:

  • Jeśli flaga NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO jest ustawiona w Flags elementu struktury NDIS_RECEIVE_FILTER_FIELD_PARAMETERS, karta sieciowa musi informować tylko o odebranych pakietach spełniających wszystkie poniższe kryteria testowe:

    • Pakiet z pasującym adresem MAC.

    • Pakiet, który nie ma tagu sieci VLAN lub ma identyfikator sieci VLAN o wartości zero.

    Jeśli ustawiono flagę NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO, karta sieciowa nie powinna wskazywać pakietów, które mają zgodny adres MAC i niezerowy identyfikator sieci VLAN.

    Uwaga Jeśli przełącznik rozszerzalny Hyper-V ustawia filtr adresu MAC i nie skonfigurowano filtru identyfikatora sieci VLAN w OID_RECEIVE_FILTER_SET_FILTER, przełącznik ustawia również flagę NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO.

  • Jeśli flaga NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO nie jest ustawiona i nie ma filtru identyfikatora VLAN skonfigurowanego przez żądanie ustawienia OID OID_RECEIVE_FILTER_SET_FILTER, sterownik miniportu musi wykonać jedną z następujących czynności:

    • Jeśli sterownik miniportu obsługuje NDIS 6.20, musi zwrócić stan niepowodzenia dla żądania identyfikatora OID OID_RECEIVE_FILTER_SET_FILTER.

    • Jeśli sterownik miniportu obsługuje NDIS 6.30 lub nowsze wersje NDIS, musi skonfigurować kartę sieciową do sprawdzania i filtrowania określonych pól adresów MAC. Jeśli tag sieci VLAN znajduje się w odebranym pakiecie, karta sieciowa musi usunąć go z danych pakietu. Sterownik miniportu musi umieścić tag sieci VLAN w NDIS_NET_BUFFER_LIST_8021Q_INFO, który jest powiązany z NET_BUFFER_LIST strukturą pakietu.

  • Jeśli sterownik protokołu ustawia filtr adresu MAC i filtr identyfikatora sieci VLAN za pomocą identyfikatora OID_RECEIVE_FILTER_SET_FILTER, nie ustawia flagi NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO w żadnym z pól filtru. W takim przypadku sterownik miniportu powinien wskazywać pakiety zgodne zarówno z określonym adresem MAC, jak i identyfikatorem sieci VLAN. Oznacza to, że sterownik miniportu nie powinien wskazywać pakietów z pasującym adresem MAC, które mają zerowy identyfikator sieci VLAN lub są pakietami bez tagów.

Korzystanie z identyfikatora filtru

NDIS przypisuje identyfikator filtru w FilterId składnika struktury NDIS_RECEIVE_FILTER_PARAMETERS i przekazuje żądanie metody OID OID_RECEIVE_FILTER_SET_FILTER do sterownika miniportu warstwy dolnej. Każdy filtr ustawiony w kolejce odbiorczej ma unikalny identyfikator filtru dla karty sieciowej. Oznacza to, że identyfikatory filtrów nie są duplikowane w różnych kolejkach zarządzanych przez kartę sieciową.

Sterownik nakładający się musi użyć identyfikatora filtru, który NDIS udostępnia w kolejnych żądaniach OID, na przykład, aby zmodyfikować parametry filtru lub zwolnić filtr.

Gdy usługa NDIS odbiera żądanie identyfikatora OID w celu ustawienia filtru w kolejce odbierania, weryfikuje parametry filtru. Po przydzieleniu niezbędnych zasobów i identyfikatora filtru, NDIS przesyła żądanie OID do bazowej karty sieciowej. Jeśli karta sieciowa może pomyślnie przydzielić niezbędne zasoby oprogramowania i sprzętu dla filtru, finalizuje żądanie OID za pomocą NDIS_STATUS_SUCCESS.

Sterownik miniportu musi zachować identyfikatory filtrów dla przydzielonych filtrów odbiorczych. NDIS używa identyfikatora filtru w późniejszych żądaniach OID w celu zmiany parametrów filtru odbierania lub wyczyszczenia filtru odbierania. Aby uzyskać więcej informacji na temat zmieniania parametrów i czyszczenia filtrów, zobacz Uzyskiwanie i aktualizowanie parametrów kolejki maszyny wirtualnej i Czyszczenie filtru VMQ.

Obsługa filtru w kolejce odbierania

Sterownik miniportu programuje kartę sieciową na podstawie filtrów w następujący sposób:

  • Wszystkie parametry testu pola dla określonego filtru muszą być zgodne w celu przypisania pakietu do kolejki.

  • W kolejce można ustawić wiele filtrów.

  • Pakiety muszą być przyporządkowane do kolejki odbierania, jeśli którykolwiek z filtrów przejdzie.

Adapter sieciowy łączy wyniki ze wszystkich testów w polu za pomocą operacji logicznej i. Oznacza to, że jeśli jakikolwiek test pola uwzględniony w tablicy struktur NDIS_RECEIVE_FILTER_FIELD_PARAMETERS zakończy się niepowodzeniem, pakiet sieciowy nie spełnia określonego kryterium filtru.

Gdy karta sieciowa testuje odebrany pakiet pod kątem tych kryteriów filtrowania, musi zignorować wszystkie pola w pakiecie, które nie mają określonych kryteriów filtrowania.

Odbieranie pakietów z kolejki odbierania

Po tym jak sterownik miniportu odbierze żądanie OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE i ustawi filtry na kolejce, kolejka znajduje się w stanie Uruchomiona. Gdy kolejka jest w tym stanie, sterownik miniportu może wskazywać pakiety w kolejce. Aby uzyskać więcej informacji na temat stanów kolejki, zobacz Queue States and Operations.

Jeśli sterownik miniportu otrzymał żądanie OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID dla kolejki, ale nie ma żadnych filtrów ustawionych w kolejce, sterownik miniportu nie powinien sygnalizować odbieranych pakietów w tej kolejce. W takim przypadku, gdy sterownik miniportu otrzymuje żądanie OID dla kolejki OID_RECEIVE_FILTER_SET_FILTER, i prawdopodobnie zanim ukończy to żądanie OID, może wskazywać pakiety w tej kolejce. Jeśli sterownik miniportu wskazuje pakiety w kolejce podczas przetwarzania żądania identyfikatora OID OID_RECEIVE_FILTER_SET_FILTER, sterownik miniportu musi zakończyć żądanie OID_RECEIVE_FILTER_SET_FILTER, które ma kod zwrotny NDIS_STATUS_SUCCESS.