Läs på engelska

Dela via


OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Varning

Viss information i det här avsnittet gäller förhyrda produkter, som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

RSSv2 är endast förhandsversion i Windows 10, version 1809.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID skickas till RSSv2-kompatibla miniportdrivrutiner för att utföra flyttningar av enskilda indirekta tabellposter. Den här OID:en är en synkron OID-, vilket innebär att den inte kan returnera NDIS_STATUS_PENDING. Den utfärdas endast som en metodbegäran på IRQL == DISPATCH_LEVEL.

Det här anropet använder startpunkten XxxSynchronousOidRequest, där Xxx antingen är Miniport eller Filter beroende på vilken typ av drivrutin som tar emot begäran. Den här startpunkten orsakar en systemfelkontroll om den ser en NDIS_STATUS_PENDING returstatus.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES använder den NDIS_RSS_SET_INDIRECTION_ENTRIES strukturen för att instruera ett miniportkort att synkront utföra en uppsättning åtgärder, där varje åtgärd flyttar en enda post i RSS-indirektionstabellen för en angiven VPort till en angiven processor.

Anmärkningar

Den här OID:en måste köras och slutföras i processorkontexten som utfärdade den. Miniportdrivrutiner måste köra den här OID:en fullständigt när NDIS_STATUS_SUCCESS returneras till det övre lagret. Det innebär att miniportdrivrutinen bör vara beredd att ta emot OID-begäranden från back-to-back för att flytta flera ITE:er på en ny processor omedelbart efter att det första steget har slutförts med NDIS_STATUS_SUCCESS.

Dricks

Att köra den här OID:en fullständigt innebär att miniportdrivrutinen måste vara redo att försöka utföra en annan åtgärd för att flytta en ITE. Det föreskriver inte var flygtrafik anges direkt efter köflytten, som antingen kan finnas på käll-CPU:en eller mål-CPU:en.

Protokoll på det övre lagret utfärdar OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES för att ställa in ITE:er och/eller de primära processorparametrarna och standardprocessorparametrarna så att de pekar på olika processorer.

Denna OID kan utfärdas för antingen aktiva eller inaktiva trafikstyrningsparametrar. Mer information om styrparametrar finns i Ta emot sidoskalning version 2 (RSSv2). För parametrar/ITE:er i inaktivt tillstånd bör miniportdrivrutinen verifiera och cachelagera målprocessorn till nästa relevanta RSS-tillståndsändring (aktivering eller inaktiverande). Då blir cachelagrade processornummer aktiva och används för att dirigera trafiken. Uppdateringar av aktiva parametrar (som också måste verifieras) bör börja gälla omedelbart för att dirigera trafiken.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES måste utfärdas till ett miniportkort med flaggan NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID avmarkerad. Detta beror på möjligheten att olika virtuella portar refereras av olika element i matrisen.

Den här OID:n anropas endast vid IRQL == DISPATCH_LEVEL.

Miniportdrivrutiner bör vara beredda att hantera minst lika många åtgärder för flytt av indirekta tabeller som de annonserar i NDIS_NIC_SWITCH_CAPABILITIES struktur. Detta definieras i NumberOfIndirectionTableEntriesPerNonDefaultPFVPort eller NumberOfIndirectionTableEntriesForDefaultVPort medlem i den strukturen, eller 128 i internt RSS-läge.

Miniportdrivrutiner bör försöka köra så många poster som möjligt och uppdatera EntryStatus medlem i varje NDIS_RSS_SET_INDIRECTION_ENTRY med resultatet av åtgärden.

OID-hanterare för OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

OID-hanteraren för OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES förväntas bete sig på följande sätt:

  • En retur av NDIS_STATUS_PENDING tillåts inte på grund av OID:s synkrona anropstyp.
  • Slutför alla inkommande ITE-rörelser som var avsedda för den aktuella processorn (som tidigare initierats på fjärrprocessorer).
  • Det rekommenderas starkt att miniportdrivrutiner utför ett fullständigt parameterverifieringspass. Om det inte är möjligt utför du en-i-ett-validering och körning av matrisposter. Miniportdrivrutiner bör specifikt kontrollera om alla refererade objekt är giltiga:
    • Det är inte tillåtet att returnera NDIS_STATUS_PENDING i fältet EntryStatus för en ITE.
    • Miniport-adaptern finns och är i ett bra tillstånd. Annars anger du fältet EntryStatus för posten till NDIS_STATUS_ADAPTER_NOT_FOUND, NDIS_STATUS_ADAPTER_NOT_READY osv.
    • Varje VPort finns och är i ett bra tillstånd. Annars anger du fältet EntryStatus för posten till NDIS_STATUS_INVALID_PORT, NDIS_STATUS_INVALID_PORT_STATE osv.
    • Varje postindex för indirekta tabeller ligger inom det konfigurerade intervallet. Det här intervallet är antingen 0xFFFF eller finns i intervallet [0...NumberOfIndirectionTableEntries - 1] som anges av OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 OID. Postindexen 0xFFFF och 0xFFFE har särskilda betydelser: 0xFFFF definierar standardprocessorn, medan 0xFFFE definierar den primära processorn. Vid fel anger hanteraren fältet EntryStatus för posten till NDIS_STATUS_INVALID_PARAMETER.
    • Det övre lagret och miniportdrivrutinen förväntar sig att ITE pekar på den aktuella processorn (aktörs-CPU) före flytten. Ite kan med andra ord inte omdirigeras via fjärranslutning. Om detta inte är sant anger du fältet EntryStatus för posten till NDIS_STATUS_NOT_ACCEPTED.
    • Alla målprocessorer är giltiga och ingår i MINIPORT-adapterns RSS-uppsättning. Annars anger du fältet EntryStatus för posten till NDIS_STATUS_INVALID_DATA.
  • Verifiera resurssituationen antingen senare eller som en del av parametervalideringspasset. Kontrollera att antalet köer som ska användas efter en fullständig batchflytt (evakuering) inte överskrider NumberOfQueues- som anges i NDIS_RECEIVE_SCALE_PARAMETERS_V2 struktur under en OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 begäran. Annars returneras NDIS_STATUS_NO_QUEUES. NDIS_STATUS_NO_QUEUES ska användas för alla villkor som utgör ett brott mot det konfigurerade antalet köer. NDIS_STATUS_RESOURCES bör endast användas för att ange tillfälliga minnesbrister.
  • Som en del av resurskontrollerna måste miniportdrivrutinen för varje skalningsentitet (till exempel VPort) hantera ett villkor när alla ITE:er som pekar på den aktuella processorn flyttas bort från den..

Om alla ovanstående kontroller godkänns bör miniportdrivrutinen villkorslöst kunna tillämpa den nya konfigurationen och måste ange fältet EntryStatus för varje post till NDIS_STATUS_SUCCESS.

I allmänhet bör hanteraren för denna OID vara mycket låg vikt. Den bör inte anropa andra NDIS- eller operativsystemtjänster än för möjliga synkroniseringsåtgärder som spinlocks och NdisMConfigMSIXTableEntry.

Miniportdrivrutinen bör inte anropa NDIS för att ange status eller PnP-händelser.

Miniportdrivrutinen bör inte heller använda fullständiga indikationer för mottagning/överföring i samband med denna OID-hanterare, eftersom detta leder till rekursion. Det övre lagret kan anropa denna OID från kontexten för mottagning eller överföring av indikationer.

Flytta alla poster i indirekta tabeller

Miniportdrivrutiner bör känna igen och hantera en särskild begäran som flyttar alla indirekta tabellposter bort från den aktuella processorn. Eftersom RSSv2 fungerar med enskilda ITE-rörelser måste miniportdrivrutiner garantera atomiteten i den övergripande åtgärden. Om det uppstår ett fel mitt i en batch när motsvarande matris med flyttkommandon bearbetas, bör miniportdrivrutinen återställa alla kommandon som redan har utförts och markera alla kommandon som "misslyckade" i fältet per kommando EntryStatus. Det övre skiktprotokollet förväntar sig alltid att batchen "flytta alla ITE:er" innehåller antingen alla kommandon som markerats som "lyckades" eller alla kommandon som markerats som "misslyckade", och det förutsätter att trafiken följer det resulterande tillståndet (antingen före eller efter flytten). Om det övre lagret bara ser vissa poster markerade som "misslyckades" felkontrollerar det systemet och pekar på miniportdrivrutinen som orsak.

För att underlätta miniportdrivrutinens hantering av kommandot "flytta alla ITE:er" och för att undvika dödlägen grupperar protokoll i det övre lagret kommandon i batchen i par med fälten SwitchId + VPortId, så att:

  • Kommandon som det övre lagret vill köras tillsammans, som en del av kommandot "flytta alla", för samma VPort placeras i följd i den övergripande batchen.
  • Miniportdrivrutinen bör inte försöka köra den övergripande kommandobatchen, som kan rikta in sig på olika VPorts, på ett "flytta alla"-sätt. Endast den grupp med kommandon som riktar sig mot samma VPort (taggade med samma SwitchId + VPortId par) behöver köras enligt semantiken "flytta alla".
  • När det övre lagret inte bryr sig om "flytta alla" semantik kan det mellanlagrar kommandon till samma VPort med kommandon till olika virtuella portar. I det här fallet om den andra gruppen med kommandon till samma VPort inte kan köras på grund av ett "antal köer"-överträdelse markerar miniportdrivrutinen den gruppen med motsvarande statuskod (NDIS_STATUS_NO_QUEUES) och det övre lagret tar ansvar för återställning.

Om till exempel det övre skiktprotokollet mellanläser en serie kommandon så här:

  • VPort=1 ITE[0,1]
  • VPort=2 ITE[0]
  • VPort=1 ITE[2]

Miniportdrivrutinen behöver inte försöka köra alla fyra flyttkommandon atomiskt, eller alla tre flyttkommandona för VPort=1 (ITE[0,1,2]). Den behöver bara köra gruppen VPort=1 ITE[0,1] på ett "flytta alla"-sätt, sedan VPort=2 ITE[0]-gruppen och sedan VPort=1 ITE[2]. Alla tre kommandogrupperna kan ha ett annat resultat. Grupperna för VPort=1 ITE[0,1] och VPort=2 ITE[0] kan till exempel lyckas och gruppen VPort=1 ITE[2] misslyckas. Resultatet bör återspeglas i motsvarande EntryStatus medlem i varje kommandostruktur. På så sätt behöver miniportdrivrutinen inte vidta försiktighetsåtgärder för säker körning av den övergripande batchen (till exempel låsa hela adaptern). Endast de kommandon som riktar sig mot en specifik VPort måste serialiseras, finare låsning per VPort kan användas och vissa dödlägen undviks.

Anteckning

Hela gruppen med kommandoposterna måste markeras med samma poststatus.

Felvillkor och statuskoder

Den här OID:en returnerar följande statuskoder när ett fel inträffar:

Statuskod Feltillstånd
NDIS_STATUS_INVALID_LENGTH OID var felaktigt.
NDIS_STATUS_INVALID_PARAMETER Andra fält, antingen i huvudet eller i själva OID (men inte i enskilda kommandoposter) innehåller ogiltiga värden.

Krav

Version: Windows 10, version 1709 Header: Ntddndis.h (inkludera Ndis.h)

Se även