OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES
Waarschuwing
Sommige informatie in dit onderwerp heeft betrekking op vooraf uitgebracht product, dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt vrijgegeven. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
RSSv2 is alleen preview in Windows 10, versie 1809.
De OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID wordt verzonden naar RSSv2--compatibele minipoortstuurprogramma's om verplaatsingen van afzonderlijke indirectietabelvermeldingen uit te voeren. Deze OID is een synchrone OID-, wat betekent dat deze NDIS_STATUS_PENDING niet kan retourneren. Het wordt alleen uitgegeven als een methodeaanvraag, bij IRQL == DISPATCH_LEVEL.
Deze aanroep maakt gebruik van het XxxSynchronousOidRequest toegangspunt, waarbij Xxx ofwel Miniport of Filter is, afhankelijk van het type stuurprogramma dat de aanvraag ontvangt. Dit invoerpunt zorgt ervoor dat er een systeemfoutcontrole wordt uitgevoerd als er een NDIS_STATUS_PENDING retourstatus wordt weergegeven.
OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES gebruikt de NDIS_RSS_SET_INDIRECTION_ENTRIES structuur om een minipoortadapter te instrueren een reeks acties synchroon uit te voeren, waarbij elke actie één vermelding van de RSS-indirectietabel van een opgegeven VPort naar een opgegeven DOEL-CPU verplaatst.
Opmerkingen
Deze OID moet worden uitgevoerd en voltooid in de processorcontext die deze heeft uitgegeven. Minipoortstuurprogramma's moeten deze OID volledig uitvoeren bij het retourneren van NDIS_STATUS_SUCCESS naar de bovenste laag. Dit betekent dat het minipoortstuurprogramma moet worden voorbereid op het ontvangen van back-to-back OID-aanvragen om meerdere IT's op een nieuwe processor te verplaatsen direct nadat de eerste verplaatsing is voltooid met NDIS_STATUS_SUCCESS.
Fooi
Het volledig uitvoeren van deze OID betekent dat het minipoortstuurprogramma gereed moet zijn om een andere actie uit te voeren om een ITE te verplaatsen. Het schrijft niet voor waar binnenkomend verkeer wordt aangegeven direct na de verplaatsing van de wachtrij, die zich op de bron-CPU of de doel-CPU kan bevinden.
Probleem met protocollen in de bovenste laag OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES om IT-it's en/of de primaire en standaardprocessorparameters in te stellen om naar verschillende processors te verwijzen.
Deze OID kan worden uitgegeven voor actieve of inactieve stuurparameters voor verkeer. Zie voor meer informatie over stuurparameters schalen aan de ontvangstzijde versie 2 (RSSv2). Voor parameters/IT's in de status inactieve moet het minipoortstuurprogramma de doelprocessor valideren en in de cache opslaan totdat de volgende relevante RSS-statuswijziging (in- of uitschakelen) wordt uitgevoerd. Op dat moment worden processornummers in de cache actieve en gebruikt voor het omleiden van het verkeer. Updates voor actieve parameters (die ook moeten worden gevalideerd) moeten onmiddellijk van kracht worden om het verkeer te leiden.
OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES moet worden uitgegeven aan een minipoortadapter met de vlag NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID gewist. Dit komt doordat naar verschillende VPorts wordt verwezen door verschillende elementen in de matrix.
Deze OID wordt alleen aangeroepen bij IRQL == DISPATCH_LEVEL.
Miniportstuurprogramma's moeten worden voorbereid voor het verwerken van minstens zoveel acties voor het verplaatsen van indirecte tabellen als ze adverteren in de NDIS_NIC_SWITCH_CAPABILITIES structuur. Dit wordt gedefinieerd in het NumberOfIndirectionTableEntriesPerNonDefaultPFVPort of NumberOfIndirectionTableEntriesForDefaultVPort lid van die structuur of 128 in de systeemeigen RSS-modus.
Miniportstuurprogramma's moeten proberen zoveel mogelijk vermeldingen uit te voeren en de EntryStatus lid van elke NDIS_RSS_SET_INDIRECTION_ENTRY bij te werken met het resultaat van de bewerking.
OID-handler voor OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES
De OID-handler voor OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES werkt naar verwachting als volgt:
- Een retour van NDIS_STATUS_PENDING is niet toegestaan vanwege het synchrone aanroeptype van de OID.
- Voltooi alle binnenkomende ITE-verplaatsingen die bestemd waren voor de huidige CPU (eerder geïnitieerd op externe processors).
- Het wordt sterk aanbevolen voor minipoortstuurprogramma's om een volledige parametervalidatiepas uit te voeren. Als dit niet mogelijk is, voert u één voor één validatie en uitvoering van matrixvermeldingen uit. Miniportstuurprogramma's moeten specifiek controleren of alle objecten waarnaar wordt verwezen geldig zijn:
- Het retourneren van NDIS_STATUS_PENDING in het EntryStatus veld voor een ITE is niet toegestaan.
- De minipoortadapter bestaat en heeft een goede status. Stel anders het veld EntryStatus van de vermelding in op NDIS_STATUS_ADAPTER_NOT_FOUND, NDIS_STATUS_ADAPTER_NOT_READY, enzovoort.
- Elke VPort bestaat en heeft een goede status. Stel anders het veld EntryStatus van de vermelding in op NDIS_STATUS_INVALID_PORT, NDIS_STATUS_INVALID_PORT_STATE, enzovoort.
- Elke index voor de invoertabel indirection bevindt zich binnen het geconfigureerde bereik. Dit bereik is 0xFFFF of bevindt zich in het bereik [0...NumberOfIndirectionTableEntries - 1] dat is ingesteld door de OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 OID. De 0xFFFF- en 0xFFFE invoerindexen hebben speciale betekenissen: 0xFFFF definieert de standaardprocessor, terwijl 0xFFFE de primaire processor definieert. Bij een fout stelt de handler het veld EntryStatus van de vermelding in op NDIS_STATUS_INVALID_PARAMETER.
- De bovenste laag en het minipoortstuurprogramma verwachten dat de ITE vóór de verplaatsing verwijst naar de huidige processor (actor CPU). Met andere woorden, de ITE kan niet extern worden omgeleid. Als dit niet het geval is, stelt u het veld EntryStatus van de vermelding in op NDIS_STATUS_NOT_ACCEPTED.
- Alle doelprocessors zijn geldig en maken deel uit van de RSS-set van de minipoortadapter. Stel anders het veld EntryStatus van de vermelding in op NDIS_STATUS_INVALID_DATA.
- Valideer vervolgens of als onderdeel van de parametervalidatiepas de resourcesituatie. Controleer of het aantal wachtrijen dat moet worden gebruikt na een volledige batchplaatsing (evacuatie) niet groter is dan de NumberOfQueues ingesteld in de NDIS_RECEIVE_SCALE_PARAMETERS_V2 structuur tijdens een OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 aanvraag. Anders wordt NDIS_STATUS_NO_QUEUES geretourneerd. NDIS_STATUS_NO_QUEUES moet worden gebruikt voor alle voorwaarden die een schending van het geconfigureerde aantal wachtrijen vertegenwoordigen. NDIS_STATUS_RESOURCES mag alleen worden gebruikt om tijdelijke out-of-memory-omstandigheden aan te wijzen.
- Als onderdeel van resourcecontroles moet het minipoortstuurprogramma voor elke schaalentiteit (bijvoorbeeld VPort) een voorwaarde afhandelen wanneer alle IT's die naar de huidige CPU verwijzen, worden verwijderd.
Als alle bovenstaande controles worden doorgegeven, moet het minipoortstuurprogramma de nieuwe configuratie voorwaardelijke kunnen toepassen en het EntryStatus veld van elke vermelding instellen op NDIS_STATUS_SUCCESS.
Over het algemeen moet de handler voor deze OID zeer licht zijn. Er mogen geen NDIS- of besturingssysteemservices worden aangeroepen, behalve voor mogelijke synchronisatiebewerkingen zoals spinlocks en NdisMConfigMSIXTableEntry.
Het minipoortstuurprogramma mag NDIS niet aanroepen om status- of PnP-gebeurtenissen aan te geven.
Het minipoortstuurprogramma mag ook geen volledige aanwijzingen voor ontvangst/verzending gebruiken in de context van deze OID-handler, omdat dit leidt tot recursie. De bovenste laag kan deze OID aanroepen vanuit de context van ontvangst- of verzendindicaties.
Alle items in de indirectietabel verplaatsen
Miniportstuurprogramma's moeten een speciale aanvraag herkennen en afhandelen waarmee alle indirecte tabelvermeldingen worden verwijderd van de huidige CPU. Omdat RSSv2 werkt met afzonderlijke ITE-verplaatsingen, moeten minipoortstuurprogramma's de atomiciteit van de algehele bewerking garanderen. Als er een fout optreedt in het midden van een batch tijdens het verwerken van de bijbehorende matrix met verplaatsingsopdrachten, moet het minipoortstuurprogramma alle opdrachten die al zijn uitgevoerd, herstellen en alle opdrachten markeren als mislukt in het veld EntryStatus veld. In het protocol van de bovenste laag wordt altijd verwacht dat de batch 'alle IT's verplaatsen' alle opdrachten bevat die zijn gemarkeerd als 'geslaagd', of alle opdrachten die zijn gemarkeerd als 'mislukt'. Hierbij wordt ervan uitgegaan dat verkeer voldoet aan de resulterende status (vóór of na de verplaatsing). Als de bovenste laag alleen enkele vermeldingen ziet die zijn gemarkeerd als 'mislukt', controleert het systeem en wijst het minipoortstuurprogramma aan als de oorzaak.
Om de verwerking van de minipoortstuurprogramma van de opdracht 'alle IT's verplaatsen' te helpen en om impasses te voorkomen, worden opdrachten in de batch verplaatst in paren van SwitchId + VPortId velden, zoals:
- Opdrachten die de bovenste laag samen willen uitvoeren, als onderdeel van de opdracht Alles verplaatsen, worden voor dezelfde VPort opeenvolgend in de algehele batch geplaatst.
- Het minipoortstuurprogramma mag niet proberen de algemene opdrachtbatch uit te voeren, die mogelijk op verschillende VPorts is gericht, op een 'alles verplaatsen'-manier. Alleen de groep opdrachten die zijn gericht op dezelfde VPort (getagd met dezelfde SwitchId + VPortId paar) moeten worden uitgevoerd overeenkomstig de semantiek 'alles verplaatsen'.
- Wanneer de bovenste laag niet om alle semantiek gaat, kunnen opdrachten in dezelfde VPort worden geplaatst met opdrachten naar verschillende VPort(s). In dit geval, als de tweede groep opdrachten naar dezelfde VPort niet kan worden uitgevoerd vanwege een schending van een 'aantal wachtrijen', markeert het minipoortstuurprogramma die groep met de bijbehorende statuscode (NDIS_STATUS_NO_QUEUES) en de bovenste laag neemt de verantwoordelijkheid voor het herstellen.
Als het protocol van de bovenste laag bijvoorbeeld een reeks opdrachten als volgt interleaseert:
VPort=1 ITE[0,1]
VPort=2 ITE[0]
VPort=1 ITE[2]
Het minipoortstuurprogramma hoeft niet alle vier de verplaatsingsopdrachten atomisch uit te voeren, of alle drie de verplaatsingsopdrachten voor VPort=1
(ITE[0,1,2]
). Het hoeft alleen de VPort=1 ITE[0,1]
groep op 'alles verplaatsen' uit te voeren, vervolgens de VPort=2 ITE[0]
groep en vervolgens VPort=1 ITE[2]
. Alle drie de opdrachtgroepen kunnen een ander resultaat hebben. De groepen voor VPort=1 ITE[0,1]
en VPort=2 ITE[0]
kunnen bijvoorbeeld slagen en de VPort=1 ITE[2]
groep kan mislukken. Het resultaat moet worden weergegeven in de bijbehorende EntryStatus lid van elke opdrachtstructuur. Op deze manier hoeft het minipoortstuurprogramma geen voorzorgsmaatregelen te nemen voor het veilig uitvoeren van de algehele batch (bijvoorbeeld de hele adapter vergrendelen). Alleen opdrachten die gericht zijn op een specifieke VPort moeten worden geserialiseerd, fijnmazige per-VPort-vergrendeling kunnen worden gebruikt en bepaalde impasses worden vermeden.
Notitie
De hele groep van de opdrachtvermeldingen moet worden gemarkeerd met dezelfde invoerstatus.
Foutcodes en statuscodes
Deze OID retourneert de volgende statuscodes wanneer er een fout optreedt:
Statuscode | Foutvoorwaarde |
---|---|
NDIS_STATUS_INVALID_LENGTH | De OID was ongeldig. |
NDIS_STATUS_INVALID_PARAMETER | Andere velden, in de koptekst of in de OID zelf (maar niet in afzonderlijke opdrachtvermeldingen), bevatten ongeldige waarden. |
Eisen
versie: Windows 10, versie 1709 Header: Ntddndis.h (inclusief Ndis.h)