Sdílet prostřednictvím


OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Varování

Některé informace v tomto tématu se týkají předem připraveného produktu, který může být podstatně změněn před komerčním vydáním. Společnost Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, pokud jde o informace uvedené zde.

RSSv2 je ve verzi Preview jenom ve Windows 10 verze 1809.

Identifikátor OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES se odešle do RSSv2ovladače miniportu, které umožňují provádět přesuny jednotlivých položek nepřímých tabulek. Tento identifikátor OID je synchronníOID , což znamená, že nemůže vrátit NDIS_STATUS_PENDING. Vydává se pouze jako požadavek metody v irQL == DISPATCH_LEVEL.

Toto volání používá vstupní bod XxxSynchronousOidRequest, kde Xxx je miniport nebo filtr v závislosti na typu ovladače, který žádost přijímá. Tento vstupní bod způsobí kontrolu systémových chyb, pokud se zobrazí stav NDIS_STATUS_PENDING vrácení.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES pomocí struktury NDIS_RSS_SET_INDIRECTION_ENTRIES dá miniport adaptéru pokyn synchronně provést sadu akcí, kde každá akce přesune jednu položku tabulky zprostředkování RSS zadaného VPortu do cílového zadaného procesoru.

Poznámky

Tento identifikátor OID se musí spustit a dokončit v kontextu procesoru, který ho vydal. Ovladače miniportu musí po vrácení NDIS_STATUS_SUCCESS do horní vrstvy plně spustit tento identifikátor OID. To znamená, že ovladač miniportu by měl být připraven přijímat požadavky identifikátoru OID back-to-back, aby se několik ITE přesunulo na nový procesor hned po dokončení prvního přesunutí s NDIS_STATUS_SUCCESS.

Spropitné

Úplné spuštění tohoto identifikátoru OID znamená, že ovladač miniportu musí být připravený k úspěšnému pokusu o další akci pro přesunutí ITE. Nepředepisuje, kde je příchozí příjem provozu uveden přímo po přesunu fronty, což může být buď na zdrojovém procesoru, nebo cílovém procesoru.

Protokoly horní vrstvy vydávají OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES k nastavení ITE a/nebo primárních a výchozích parametrů procesoru tak, aby odkazy na různé procesory.

Tento identifikátor OID lze vydat buď pro aktivní, nebo pro neaktivní parametry řízení provozu. Další informace o parametrech řízení najdete v tématu škálování na straně příjmu verze 2 (RSSv2). U parametrů nebo ITE v neaktivním stavu by ovladač miniportu měl ověřit cílový procesor a uložit ho do mezipaměti až do další relevantní změny stavu RSS (povolení nebo zakázání). V tomto okamžiku se čísla procesoru v mezipaměti stanou aktivní a používají se k směrování provozu. Aktualizace aktivních parametrů (které musí být také ověřeny) by se měly okamžitě projevit, aby se provoz směroval.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES musí být vydán pro adaptér miniportu s příznakem NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID vymazán. Důvodem je možnost, že různé porty VPorts jsou odkazovány různými prvky v poli.

Tento identifikátor OID je vyvolán pouze v IRQL == DISPATCH_LEVEL.

Ovladače miniportu by měly být připravené na zpracování alespoň tolik akcí přesunutí nepřímých položek tabulky, které inzerují ve struktuře NDIS_NIC_SWITCH_CAPABILITIES. To je definováno v NumberOfIndirectionTableEntriesPerNonDefaultPFVPort nebo NumberOfIndirectionTableEntriesForDefaultVPort člen této struktury, nebo 128 v nativním režimu RSS.

Ovladače miniportu by se měly pokusit provést tolik položek, kolik mohou, a aktualizovat EntryStatus člen každého NDIS_RSS_SET_INDIRECTION_ENTRY s výsledkem operace.

Obslužná rutina OID pro OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Očekává se, že obslužná rutina OID pro OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES se bude chovat takto:

  • Návrat NDIS_STATUS_PENDING není povolen kvůli synchronnímu typu volání OID.
  • Dokončete všechny příchozí přesuny ITE určené pro aktuální procesor (dříve zahájené na vzdálených procesorech).
  • Důrazně doporučujeme, aby ovladače miniportu prováděly úplné ověření parametrů. Pokud není to možné, proveďte ověřování po jednom a provádění položek pole. Ovladače miniportu by měly konkrétně zkontrolovat, jestli jsou všechny odkazované objekty platné:
    • Vrácení NDIS_STATUS_PENDING v poli EntryStatus pro ITE není povoleno.
    • Adaptér miniportu existuje a je v dobrém stavu. Jinak nastavte pole EntryStatus položky na NDIS_STATUS_ADAPTER_NOT_FOUND, NDIS_STATUS_ADAPTER_NOT_READY atd.
    • Každý VPort existuje a je v dobrém stavu. Jinak nastavte pole EntryStatus položky na NDIS_STATUS_INVALID_PORT, NDIS_STATUS_INVALID_PORT_STATE atd.
    • Každý index pro zadávání nepřímých tabulek je v nakonfigurované oblasti. Tato oblast je buď 0xFFFF, nebo je v rozsahu [0...NumberOfIndirectionTableEntries – 1] nastaveným OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 identifikátorem. Indexy položek 0xFFFF a 0xFFFE mají zvláštní význam: 0xFFFF definuje výchozí procesor, zatímco 0xFFFE definuje primární procesor. Při chybě obslužná rutina nastaví pole EntryStatus položky na NDIS_STATUS_INVALID_PARAMETER.
    • Horní vrstva a ovladač miniportu očekávají, že ITE před přesunem odkazuje na aktuální procesor (procesor objektu actor). Jinými slovy, ITE se nedá vzdáleně přesměrovat. Pokud to není pravda, nastavte pole EntryStatus položky na NDIS_STATUS_NOT_ACCEPTED.
    • Všechny cílové procesory jsou platné a jsou součástí sady RSS adaptéru miniportu. Jinak nastavte pole EntryStatus položky na NDIS_STATUS_INVALID_DATA.
  • Následně nebo jako součást ověření parametru ověřte situaci prostředku. Ověřte, že počet front, které se mají použít po úplném přesunu dávky (evakuace), nepřekračuje NumberOfQueues nastavenou ve struktuře NDIS_RECEIVE_SCALE_PARAMETERS_V2 během požadavku OID_GEN_RECEIVE_SCALE_PARAMETERS_V2. V opačném případě se vrátí NDIS_STATUS_NO_QUEUES. NDIS_STATUS_NO_QUEUES by se měly používat pro všechny podmínky, které představují porušení nakonfigurovaného počtu front. NDIS_STATUS_RESOURCES by měly být použity pouze k určení přechodných podmínek nedostatku paměti.
  • V rámci kontrol prostředků musí ovladač miniportu pro každou entitu škálování (například VPort) zpracovat podmínku, když se od ní přesunou všechny ITe, které odkazují na aktuální procesor.

Pokud všechny výše uvedené kontroly projdou, ovladač miniportu by měl být schopen bezpodmínečně použít novou konfiguraci a musí nastavit EntryStatus pole každé položky na NDIS_STATUS_SUCCESS.

Obecně platí, že obslužná rutina tohoto identifikátoru by měla být velmi lehká. Neměl by volat služby NDIS nebo operačního systému jiné než pro možné synchronizační operace, jako jsou spinlocks a NdisMConfigMSIXTableEntry.

Ovladač miniportu by neměl NDIS volat, aby označil stav nebo události PnP.

Ovladač miniportu by také neměl v kontextu této obslužné rutiny OID používat úplné indikace příjmu a přenosu, protože to vede k rekurzi. Horní vrstva může vyvolat tento identifikátor OID z kontextu příjmu nebo přenosu indikací.

Přesunutí všech položek tabulky nepřímých výrazů

Ovladače miniportu by měly rozpoznat a zpracovat zvláštní požadavek, který přesune všechny položky tabulky nepřímých dat od aktuálního procesoru. Vzhledem k tomu, že RSSv2 pracuje s jednotlivými přesuny ITE, musí ovladače miniportu zaručit nedělitelnost celkové operace. Pokud při zpracování odpovídajícího pole příkazů přesunutí dojde k chybě uprostřed dávky, ovladač miniportu by měl vrátit všechny příkazy, které už byly provedeny, a označit všechny příkazy jako "neúspěšné" v poli EntryStatus EntryStatus. Protokol horní vrstvy vždy očekává, že dávka "přesunout všechny ITE" bude obsahovat buď všechny příkazy označené jako "úspěšné", nebo všechny příkazy označené jako "neúspěšné", a předpokládá se, že provoz dodržuje výsledný stav (buď před nebo po přesunutí). Pokud horní vrstva uvidí jenom některé položky označené jako "neúspěšné", zkontroluje systém a ukáže jako příčinu na ovladač miniportu.

Aby ovladač miniportu zpracovával příkaz "přesunout všechny ITE" a aby se zabránilo zablokování, protokoly horní vrstvy seskupují příkazy v dávce v dávkách ve dvojicích SwitchId + VPortId polí, aby:

  • Příkazy, které horní vrstva chce spustit společně jako součást příkazu "přesunout vše" pro stejný VPort, se umístí po sobě do celkové dávky.
  • Ovladač miniportu by se neměl pokoušet spustit celkovou dávku příkazů, která může cílit na různé virtuální sítě, a to způsobem "přesunout vše". Musí se provést pouze skupina příkazů, které cílí na stejný VPort (označené stejným SwitchId + VPortId páru), které odpovídají sémantice "move all".
  • Pokud horní vrstva nezajímá sémantiku "přesunout vše", může prokládání příkazů do stejného VPortu s příkazy do různých VPortů. V takovém případě, pokud se druhá skupina příkazů do stejného VPortu nedá spustit kvůli porušení "počtu front", miniport ovladač označí tuto skupinu s odpovídajícím stavovým kódem (NDIS_STATUS_NO_QUEUES) a horní vrstva zodpovídá za obnovení.

Pokud například protokol horní vrstvy prolíná řadu příkazů, například takto:

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

Ovladač miniportu se nemusí pokoušet atomicky spouštět všechny čtyři příkazy přesunutí nebo všechny tři příkazy přesunutí pro VPort=1 (ITE[0,1,2]). Stačí spustit skupinu VPort=1 ITE[0,1] pouze "přesunout vše" a pak skupinu VPort=2 ITE[0] a pak VPort=1 ITE[2]. Všechny tři skupiny příkazů můžou mít jiný výsledek. Skupiny pro VPort=1 ITE[0,1] a VPort=2 ITE[0] můžou být například úspěšné a skupina VPort=1 ITE[2] může selhat. Výsledek by se měl promítnout do odpovídající EntryStatus člen každé struktury příkazů. Tímto způsobem nemusí ovladač miniportu provádět bezpečnostní opatření pro bezpečné spuštění celkové dávky (například uzamknout celý adaptér). Pouze ty příkazy, které cílí na konkrétní VPort, musí být serializovány, jemně odstupňované zamykání na VPort lze použít a určité zablokování se vyhnete.

Poznámka

Celá skupina položek příkazu musí být označena stejným stavem položky.

Chybové stavy a stavové kódy

Tento identifikátor OID vrátí následující stavové kódy, pokud dojde k chybě:

Stavový kód Chybový stav
NDIS_STATUS_INVALID_LENGTH Identifikátor OID byl poškozený.
NDIS_STATUS_INVALID_PARAMETER Jiná pole, buď v záhlaví, nebo v samotném identifikátoru OID (ale ne v jednotlivých položkách příkazů) obsahují neplatné hodnoty.

Požadavky

verze: Windows 10 verze 1709 Header: Ntddndis.h (včetně Ndis.h)

Viz také