OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES
Warnung
Einige Informationen in diesem Thema beziehen sich auf die Vorabversion, die vor der kommerziellen Freigabe möglicherweise wesentlichen Änderungen unterliegt. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
RSSv2 ist in Windows 10, Version 1809, nur als Vorschau verfügbar.
Die OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID wird an RSSv2-fähige Miniporttreiber gesendet, um Verschiebungen einzelner Dereferenzierungstabelleneinträge (ITEs) durchzuführen. Diese OID ist eine synchrone OID, was bedeutet, dass sie NDIS_STATUS_PENDING nicht zurückgeben kann. Sie wird nur als Methodenanforderung bei IRQL == DISPATCH_LEVEL ausgegeben.
Dieser Aufruf verwendet den XxxSynchronousOidRequest-Einstiegspunkt, wobei Xxx entweder Miniport oder Filter ist, je nach Typ des Treibers, der die Anforderung empfängt. Dieser Einstiegspunkt verursacht bei einem NDIS_STATUS_PENDING-Rückgabestatus eine Systemfehlerüberprüfung.
OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES verwendet die NDIS_RSS_SET_INDIRECTION_ENTRIES-Struktur, um einen Miniportadapter zum synchronen Ausführen einer Reihe von Aktionen anzuweisen. Dabei verschiebt jede Aktion einen einzelnen Eintrag der RSS-Dereferenzierungstabelle eines angegebenen VPorts zu einer angegebenen CPU.
Hinweise
Diese OID muss in dem Prozessorkontext, in dem sie ausgegeben wurde, ausgeführt und abgeschlossen werden. Miniporttreiber müssen diese OID bei der Rückgabe von NDIS_STATUS_SUCCESS an die obere Ebene vollständig ausführen. Dies bedeutet, dass der Miniporttreiber auf den Empfang mehrerer aufeinanderfolgender OID-Anforderungen vorbereitet sein sollte, sodass er mehrere ITEs sofort auf einen neuen Prozessor verschieben kann, nachdem die erste Verschiebung mit NDIS_STATUS_SUCCESS abgeschlossen wurde.
Tipp
Die vollständige Ausführung dieser OID bedeutet, dass der Miniporttreiber bereit sein muss, um erfolgreich eine weitere Aktion zum Verschieben eines ITE vorzunehmen. Sie gibt nicht vor, wo der aktive Datenverkehr direkt nach der Warteschlangenverschiebung angegeben wird, was auf der Quell- oder der Ziel-CPU stattfinden kann.
Protokolle der oberen Ebene geben OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES aus, um ITEs und/oder die primären und Standardprozessorparameter festzulegen, die auf verschiedene Prozessoren verweisen.
Diese OID kann entweder für aktive oder inaktive Verkehrssteuerungsparameter ausgegeben werden. Weitere Informationen zu Steuerungsparametern finden Sie unter Receive Side Scaling Version 2 (RSSv2). Für Parameter/ITEs im inaktiven Zustand sollte der Miniporttreiber den Zielprozessor bis zur nächsten relevanten RSS-Statusänderung (Aktivierung oder Deaktivierung) überprüfen und zwischenspeichern. An diesem Punkt werden zwischengespeicherte Prozessornummern aktiv und werden zum Steuern des Datenverkehrs verwendet. Aktualisierungen aktiver Parameter (die ebenfalls überprüft werden müssen) sollten sofort zur Steuerung des Datenverkehrs eingesetzt werden.
OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES müssen an einen Miniportadapter mit deaktiviertem NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID-Flag ausgegeben werden. Dies liegt daran, dass verschiedene VPorts von verschiedenen Elementen im Array referenziert werden.
Diese OID wird nur bei IRQL == DISPATCH_LEVEL aufgerufen.
Miniporttreiber sollten bereit sein, mindestens so viele Verschiebungen für die Dereferenzierungstabelle zu verarbeiten, wie sie in der NDIS_NIC_SWITCH_CAPABILITIES-Struktur ankündigen. Dies ist im NumberOfIndirectionTableEntriesPerNonDefaultPFVPort- oder NumberOfIndirectionTableEntriesForDefaultVPort-Element dieser Struktur oder in 128 im nativen RSS-Modus definiert.
Miniporttreiber sollten versuchen, so viele Einträge wie möglich auszuführen und das EntryStatus-Element jedes NDIS_RSS_SET_INDIRECTION_ENTRY mit dem Ergebnis des Vorgangs zu aktualisieren.
OID-Handler für OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES
Vom OID-Handler für OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES wird Folgendes erwartet:
- Eine Rückgabe von NDIS_STATUS_PENDING ist aufgrund des synchronen Aufruftyps der OID nicht zulässig.
- Alle eingehenden ITE-Verschiebungen werden abgeschlossen, die für die aktuelle CPU bestimmt waren (zuvor auf Remoteprozessoren initiiert).
- Es wird dringend empfohlen, dass Miniporttreiber eine vollständige Überprüfung für Parameter ausführen. Andernfalls erfolgt eine 1:1-Überprüfung und Ausführung von Arrayeinträgen. Miniporttreiber sollten insbesondere überprüfen, ob alle referenzierten Objekte gültig sind:
- Das Rückgabe von NDIS_STATUS_PENDING im EntryStatus-Feld für einen ITE ist nicht zulässig.
- Der Miniportadapter ist vorhanden und in gutem Zustand. Andernfalls wird das EntryStatus-Feld des Eintrags auf NDIS_STATUS_ADAPTER_NOT_FOUND, NDIS_STATUS_ADAPTER_NOT_READY usw. festgelegt.
- Jeder VPort ist vorhanden und in gutem Zustand. Andernfalls wird das EntryStatus-Feld des Eintrags auf NDIS_STATUS_INVALID_PORT, NDIS_STATUS_INVALID_PORT_STATE usw. festgelegt.
- Jeder ITE-Index liegt innerhalb des konfigurierten Bereichs. Dieser Bereich ist entweder 0xFFFF oder ist im Bereich [0...NumberOfIndirectionTableEntries - 1], der von der OID_GEN_RECEIVE_SCALE_PARAMETERS_V2-OID festgelegt wird. Die Eintragsindizes 0xFFFF und 0xFFFE haben eine spezielle Bedeutung: 0xFFFF definiert den Standardprozessor und 0xFFFE den primären Prozessor. Bei einem Fehler legt der Handler das EntryStatus-Feld des Eintrags auf NDIS_STATUS_INVALID_PARAMETER fest.
- Die obere Ebene und der Miniporttreiber erwarten, dass der ITE vor dem Verschieben auf den aktuellen Prozessor (Actor CPU) zeigt. Der ITE kann also nicht remote umgeleitet werden. Ist dies nicht der Fall, wird das EntryStatus-Feld des Eintrags auf NDIS_STATUS_NOT_ACCEPTED festgelegt.
- Alle Zielprozessoren sind gültig und Teil des RSS-Satzes des Miniportadapters. Andernfalls wird das EntryStatus-Feld des Eintrags auf NDIS_STATUS_INVALID_DATA festgelegt.
- Anschließend oder im Rahmen der Parameterüberprüfung wird die Ressourcensituation überprüft. Die nach einer vollständigen Batchverschiebung (Evakuierung) zu verwendende Anzahl von Warteschlagen NumberOfQueues, festgelegt in der NDIS_RECEIVE_SCALE_PARAMETERS_V2-Struktur während einer OID_GEN_RECEIVE_SCALE_PARAMETERS_V2-Anforderung, darf nicht überschritten werden. Andernfalls wird NDIS_STATUS_NO_QUEUES zurückgegeben. NDIS_STATUS_NO_QUEUES sollte für alle Bedingungen verwendet werden, die gegen die konfigurierte Anzahl von Warteschlangen verstoßen. Mit NDIS_STATUS_RESOURCES sollte nur vorübergehende Out-of-Memory-Bedingungen bestimmt werden.
- Bei der Ressourcenüberprüfungen muss der Miniporttreiber für jede Skalierungsentität (z. B. VPort) eine Bedingung verarbeiten, wenn alle ITEs, die auf die aktuelle CPU verweisen, daraus entfernt werden.
Werden alle oben genannten Prüfungen bestanden, sollte der Miniporttreiber bedingungslos die neue Konfiguration anwenden können und das EntryStatus-Feld jedes Eintrags auf NDIS_STATUS_SUCCESS festlegen.
Generell sollte der Handler für diese OID sehr einfach sein. NDIS- oder Betriebssystemdienste sollten nicht aufgerufen werden, außer für mögliche Synchronisierungsvorgänge wie Spinlocks und NdisMConfigMSIXTableEntry.
Der Miniporttreiber sollte NDIS nicht zum Anzeigen von Status- oder PnP-Ereignisse aufrufen.
Der Miniporttreiber sollte auch keine vollständigen Empfangs-/Übertragungsanzeigen im Kontext dieses OID-Handlers verwenden, da dies zu Rekursion führt. Die obere Ebene kann diese OID aus dem Kontext der Empfangs- oder Übertragungsanzeigen aufrufen.
Verschieben aller Dereferenzierungstabelleneinträge (ITEs)
Miniporttreiber sollten eine spezielle Anforderung erkennen und verarbeiten, die alle ITEs von der aktuellen CPU weg verschiebt. Da RSSv2 mit einzelnen ITE-Verschiebungen arbeitet, müssen Miniporttreiber die Atomarität des Gesamtvorgangs garantieren. Wenn bei der Verarbeitung des entsprechenden Arrays von Verschiebungsbefehlen mitten im Batch ein Fehler auftritt, sollte der Miniporttreiber alle bereits ausgeführten Befehle rückgängig machen und alle Befehle im Feld EntryStatus als „fehlgeschlagen“ kennzeichnen. Das Protokoll der oberen Ebene erwartet immer, dass im Batch „Alle ITEs verschieben“ alle Befehle entweder als „erfolgreich“ oder als „fehlgeschlagen“ gekennzeichnet sind, und es geht davon aus, dass der Datenverkehr dem resultierenden Zustand (vor oder nach der Verschiebung) entspricht. Wenn die obere Ebene als „fehlgeschlagen“ gekennzeichnete Einträge erkennt, wird das System überprüft und als Ursache auf den Miniporttreiber verweisen.
Für eine einfachere Behandlung des Befehls „Alle ITEs verschieben“ durch den Miniporttreiber und um Deadlocks zu vermeiden, gruppieren Protokolle der oberen Ebene Verschiebungsbefehle im Batch in Feldpaaren: SwitchId + VPortId. Folge:
- Befehle, die der oberen Ebene zufolge im Rahmen von „Alle verschieben“ für denselben VPort zusammen auszuführen sind, werden im Batch nacheinander platziert.
- Der Miniporttreiber sollte nicht auf „Alle verschieben“-Art den gesamten Befehlsbatch ausführen, da dieser auf verschiedene VPorts ausgerichtet sein kann. Nur die Gruppe von Befehlen, die auf denselben VPort abzielen (mit demselben SwitchId + VPortId-Paar markiert), müssen gemäß „Alle verschieben“-Semantik ausgeführt werden.
- Wenn die obere Ebene die „Alle verschieben“-Semantik nicht beachtet, werden möglicherweise Befehle an denselben VPort mit Befehlen an unterschiedliche VPorts verschachtelt. Wenn in diesem Fall die zweite Befehlsgruppe an denselben VPort wegen einer Verletzung der Warteschlangenanzahl nicht ausgeführt werden kann, markiert der Miniporttreiber diese Gruppe mit dem entsprechenden Statuscode (NDIS_STATUS_NO_QUEUES) und die obere Ebene übernimmt die Wiederherstellung.
Angenommen, das Protokoll der oberen Ebene verschachtelt einige Befehle wie folgt:
VPort=1 ITE[0,1]
VPort=2 ITE[0]
VPort=1 ITE[2]
Der Miniporttreiber muss nicht versuchen, alle vier Verschiebungsbefehle alle drei Verschiebungsbefehle für VPort=1
(ITE[0,1,2]
) atomisch auszuführen. Er muss nur die VPort=1 ITE[0,1]
-Gruppe als „Alle verschieben“ ausführen, dann die VPort=2 ITE[0]
-Gruppe und dann VPort=1 ITE[2]
. Alle drei Befehlsgruppen können ein anderes Ergebnis liefern. So können z. B. die Gruppen VPort=1 ITE[0,1]
und VPort=2 ITE[0]
erfolgreich sein, während die VPort=1 ITE[2]
-Gruppe vielleicht fehlschlägt. Das Ergebnis sollte im entsprechenden EntryStatus-Element jeder Befehlsstruktur wiedergegeben werden. Auf diese Weise muss der Miniporttreiber keine Vorkehrungen für die sichere Ausführung des Gesamtbatches treffen (z. B. den gesamten Adapter sperren). Nur die Befehle, die auf einen bestimmten VPort ausgerichtet sind, müssen serialisiert werden. Eine präzisere VPort-Sperre kann verwendet werden, und bestimmte Deadlocks werden vermieden.
Hinweis
Die gesamte Gruppe der Befehlseinträge muss mit demselben Eintragsstatus gekennzeichnet sein.
Fehlerbedingungen und Statuscodes
Diese OID gibt bei einem Fehler die folgenden Statuscodes zurück:
Statuscode | Fehlerbedingung |
---|---|
NDIS_STATUS_INVALID_LENGTH | Das OID war nicht wohlgeformt. |
NDIS_STATUS_INVALID_PARAMETER | Andere Felder, im Header oder in der OID selbst (aber nicht in einzelnen Befehlseinträgen), enthalten ungültige Werte. |
Anforderungen
Version: Windows 10, Version 1709 Header: Ntddndis.h (include Ndis.h)