Ange ett VMQ-filter

När en mottagningskö har allokerats kan överliggande drivrutiner ange filter på mottagningskön. Endast den drivrutin som allokerade en mottagningskö kan ange ett filter för kön.

Observera Eftersom standardkön för mottagning (NDIS_DEFAULT_RECEIVE_QUEUE_ID) alltid finns kan överliggande drivrutiner alltid ange ett mottagningsfilter i standardkön. Överliggande drivrutiner äger inte standardkön. Därför kan alla protokolldrivrutiner som är bundna till ett nätverkskort använda standardkön.

Ange ett filter i en mottagningskö

Om du vill ange ett filter i en mottagningskö med en inledande uppsättning konfigurationsparametrar, utfärdar en överliggande drivrutin en OID_RECEIVE_FILTER_SET_FILTER OID-begäran (metodobjektidentifierare). InformationBuffer fältet i NDIS_OID_REQUEST-strukturen innehåller inledningsvis en pekare till NDIS_RECEIVE_FILTER_PARAMETERS-strukturen. Efter en lyckad retur från OID-metodbegäran innehåller InformationBuffer-medlemmen i NDIS_OID_REQUEST-strukturen en pekare till en NDIS_RECEIVE_FILTER_PARAMETERS struktur med en ny filteridentifierare.

Den överliggande drivrutinen initierar en NDIS_RECEIVE_FILTER_PARAMETERS struktur med följande filterkonfigurationsparametrar för mottagningskön.

  • Den filtertyp som anges via ett NDIS_RECEIVE_FILTER_TYPE uppräkningsvärde.

    Observera att från och med NDIS 6.20 stöds endast NdisReceiveFilterTypeVMQueue-filtertyper för VMQ-gränssnittet (virtual machine queue).

  • Köidentifieraren.

  • En eller flera fälttestparametrar som är formaterade som NDIS_RECEIVE_FILTER_FIELD_PARAMETERS strukturer. För VMQ definieras följande fälttestparametrar.

    • Mac-adressen (Destination Media Access Control) i paketet är lika med den angivna MAC-adressen.

    • Den virtuella LAN-identifieraren (VLAN) i paketet är lika med den angivna VLAN-identifieraren.

Den NDIS_RECEIVE_FILTER_PARAMETERS strukturen används med OID_RECEIVE_FILTER_PARAMETERS OID och OID_RECEIVE_FILTER_SET_FILTER OID för att ange konfigurationsparametrarna för ett filter.

FieldParametersArrayOffset, FieldParametersArrayNumElements och FieldParametersArrayElementSize-medlemmar i NDIS_RECEIVE_FILTER_PARAMETERS-strukturen definierar en matris med NDIS_RECEIVE_FILTER_FIELD_PARAMETERS strukturer. Varje NDIS_RECEIVE_FILTER_FIELD_PARAMETERS struktur i matrisen anger filtertestkriteriet för ett fält i ett nätverkshuvud.

Flags-medlemmen i NDIS_RECEIVE_FILTER_FIELD_PARAMETERS-strukturen anger åtgärder som ska utföras för mottagningsfiltret. Följande punkter gäller för flaggan NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO :

  • Om flaggan NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO är inställd i Flags-medlemmen i NDIS_RECEIVE_FILTER_FIELD_PARAMETERS-strukturen måste nätverkskortet endast indikera mottagna paket som matchar alla följande testvillkor:

    • Ett paket med en matchande MAC-adress.

    • Ett paket som inte har någon VLAN-tagg eller som har en VLAN-identifierare på noll.

    Om flaggan NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO är satt får nätverkskortet inte indikera paket som har en motsvarande MAC-adress och en VLAN-identifierare som inte är noll.

    Notera Om den Hyper-V utökningsbara växeln anger MAC-adressfiltret och inget VLAN-identifieringsfilter har konfigurerats i OID_RECEIVE_FILTER_SET_FILTER, anger växeln även flaggan NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO.

  • Om flaggan NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO inte har angetts och det inte finns något VLAN-identifierarfilter konfigurerat av en OID-konfigurationsbegäran för OID_RECEIVE_FILTER_SET_FILTERmåste miniportdrivrutinen göra en av följande åtgärder:

    • Om miniportdrivrutinen stöder NDIS 6.20 måste den returnera en misslyckad status för OID-begäran för OID_RECEIVE_FILTER_SET_FILTER.

    • Om miniportdrivrutinen stöder NDIS 6.30 eller senare versioner av NDIS måste den konfigurera nätverkskortet för att inspektera och filtrera de angivna MAC-adressfälten. Om en VLAN-tagg finns i det mottagna paketet måste nätverkskortet ta bort den från paketdata. Miniportdrivrutinen måste placera VLAN-taggen i en NDIS_NET_BUFFER_LIST_8021Q_INFO som är associerad med paketets NET_BUFFER_LIST struktur.

  • Om en protokolldrivrutin anger ett MAC-adressfilter och ett VLAN-identifierarfilter med OID_RECEIVE_FILTER_SET_FILTER OID, anger den inte flaggan NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO i något av filterfälten. I det här fallet bör miniportdrivrutinen ange paket som matchar både den angivna MAC-adressen och VLAN-identifieraren. Det innebär att miniportdrivrutinen inte ska ange paket med en matchande MAC-adress som har en noll VLAN-identifierare eller som är otaggade paket.

Använda filteridentifieraren

NDIS tilldelar en filteridentifierare i FilterId-medlemmen i NDIS_RECEIVE_FILTER_PARAMETERS-strukturen och skickar OID-metodbegäran för OID_RECEIVE_FILTER_SET_FILTER till den underliggande miniportdrivrutinen. Varje filter som anges i en mottagningskö har en unik filteridentifierare för ett nätverkskort. Det vill säga: filteridentifierarna dupliceras inte på olika köer som nätverkskortet hanterar.

Den överliggande drivrutinen måste använda den filteridentifierare som NDIS tillhandahåller vid senare OID-begäranden, till exempel om man vill ändra filterparametrarna eller frigöra ett filter.

När NDIS tar emot en OID-begäran om att ange ett filter i en mottagningskö verifierar den filterparametrarna. När NDIS har allokerat nödvändiga resurser och filteridentifieraren skickar den OID-begäran till det underliggande nätverkskortet. Om nätverkskortet kan allokera nödvändiga programvaru- och maskinvaruresurser för filtret slutför det OID-begäran med NDIS_STATUS_SUCCESS.

Miniportdrivrutinen måste behålla filteridentifierarna för de allokerade mottagarfiltren. NDIS använder filteridentifieraren för ett filter med senare OID-begäranden för att ändra parametrarna för mottagningsfiltret eller rensa mottagarfiltret. Mer information om hur du ändrar parametrar och rensar filter finns i Hämta och uppdatera vm-köparametrar och Rensa ett VMQ-filter.

Hantera filtret i en mottagningskö

Miniportdrivrutinen programmerar nätverkskortet baserat på filtren på följande sätt:

  • Alla fälttestparametrar för ett visst filter måste matcha för att tilldela ett paket till kön.

  • Flera filter kan ställas in i en kö.

  • Paket måste tilldelas mottagarkön om något av filtren godkänns.

Nätverkskortet kombinerar resultaten från alla fälttester med en logisk AND-åtgärd . Om ett fälttest som ingår i matrisen med NDIS_RECEIVE_FILTER_FIELD_PARAMETERS strukturer misslyckas, uppfyller inte nätverkspaketet det angivna filterkriteriet.

När ett nätverkskort testar ett mottaget paket mot dessa filtervillkor måste det ignorera alla fält i paketet som inte har några angivna testvillkor.

Ta emot paket från en mottagningskö

När en miniportdrivrutin tar emot en OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE begäran och har filter som har angetts i kön är kön i tillståndet Körs . När kön är i det här tillståndet kan miniportdrivrutinen indikera paket i kön. Mer information om kötillstånd finns i Kötillstånd och åtgärder.

Om miniportdrivrutinen har tagit emot en OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID-begäran för en kö men om inga filter har ställts in på kön, får miniportdrivrutinen inte ange några mottagningspaket i den kön. I det här fallet när miniportdrivrutinen tar emot en OID_RECEIVE_FILTER_SET_FILTER OID-begäran för kön, och eventuellt innan den slutför OID-begäran, kan den ange paket i kön. Om miniportdrivrutinen anger paket i en kö medan den bearbetar en OID_RECEIVE_FILTER_SET_FILTER OID-begäran, måste miniportdrivrutinen slutföra OID_RECEIVE_FILTER_SET_FILTER begäran som har en NDIS_STATUS_SUCCESS returkod.