Condividi tramite


OID_GEN_RSS_edizione Standard T_INDIRECTION_TABLE_ENTRIES

Avviso

Alcune informazioni contenute in questo argomento riguardano il prodotto non definitiva, che potrebbe essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

RSSv2 è disponibile in anteprima solo in Windows 10 versione 1809.

L'OID OID_GEN_RSS_edizione Standard T_INDIRECTION_TABLE_ENTRIES viene inviato ai driver miniport che supportano RSSv2 per eseguire spostamenti di singole voci di tabella di riferimento indiretto. Questo OID è un OID sincrono, ovvero non può restituire NDIS_STATUS_PENDING. Viene emesso solo come richiesta di metodo, in IRQL == DISPATCH_LEVEL.

Questa chiamata usa il punto di ingresso XxxSynchronousOidRequest , dove Xxx è Miniport o Filter a seconda del tipo di driver che riceve la richiesta. Questo punto di ingresso causa un controllo del bug di sistema se rileva uno stato restituito NDIS_STATUS_PENDING.

OID_GEN_RSS_edizione Standard T_INDIRECTION_TABLE_ENTRIES usa la struttura NDIS_RSS_edizione Standard T_INDIRECTION_ENTRIES per indicare a un adattatore miniport di eseguire in modo sincrono un set di azioni, in cui ogni azione sposta una singola voce della tabella di riferimento indiretto RSS di un VPort specificato in una CPU specificata.

Osservazioni:

Questo OID deve essere eseguito e completato nel contesto del processore che lo ha emesso. I driver Miniport devono eseguire completamente questo OID al momento della restituzione di NDIS_STATUS_SUCCESS al livello superiore. Ciò significa che il driver miniport deve essere pronto a ricevere richieste OID back-to-back per spostare più ITE in un nuovo processore subito dopo il completamento del primo spostamento con NDIS_STATUS_SUCCESS.

Suggerimento

L'esecuzione completa di questo OID significa che il driver miniport deve essere pronto per tentare correttamente un'altra azione per spostare un ite. Non prevede dove il traffico di ricezione in anteprima è indicato subito dopo lo spostamento della coda, che può trovarsi nella CPU di origine o nella CPU di destinazione.

I protocolli di livello superiore emettono OID_GEN_RSS_edizione Standard T_INDIRECTION_TABLE_ENTRIES per impostare gli ITE e/o i parametri del processore primario e predefinito in modo che puntino a processori diversi.

Questo OID può essere emesso per i parametri di spostamento del traffico attivo o inattivo . Per altre informazioni sui parametri di spostamento, vedere Receive side scaling version 2 (RSSv2).For more information about steering parameters, see Receive side scaling version 2 (RSSv2). Per i parametri/ITE nello stato inattivo , il driver miniport deve convalidare e memorizzare nella cache il processore di destinazione fino alla successiva modifica dello stato RSS pertinente (abilitazione o disabilitazione). A questo punto, i numeri del processore memorizzati nella cache diventano attivi e vengono usati per indirizzare il traffico. Aggiornamenti ai parametri attivi (che devono essere convalidati) devono essere immediatamente applicati per indirizzare il traffico.

OID_GEN_RSS_edizione Standard T_INDIRECTION_TABLE_ENTRIES deve essere rilasciato a un adattatore miniport con il flag NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID cancellato. Ciò è dovuto alla possibilità di fare riferimento a VPort diversi da elementi diversi nella matrice.

Questo OID viene richiamato solo in IRQL == DISPATCH_LEVEL.

I driver miniport devono essere preparati a gestire almeno tutte le azioni di spostamento delle voci di tabella indirette che annunciano nella struttura NDIS_NIC_SWITCH_CAPABILITIES . Questo valore viene definito nel membro NumberOfIndirectionTableEntriesPerNonDefaultPFVPort o NumberOfIndirectionTableEntriesForDefaultVPort della struttura o 128 in modalità RSS nativa.

I driver Miniport devono tentare di eseguire tutte le voci che possono e aggiornare il membro EntryStatus di ogni NDIS_RSS_edizione Standard T_INDIRECTION_ENTRY con il risultato dell'operazione.

Gestore OID per OID_GEN_RSS_edizione Standard T_INDIRECTION_TABLE_ENTRIES

Il gestore OID per OID_GEN_RSS_edizione Standard T_INDIRECTION_TABLE_ENTRIES dovrebbe comportarsi nel modo seguente:

  • La restituzione di NDIS_STATUS_PENDING non è consentita a causa del tipo di chiamata sincrona dell'OID.
  • Finalizzare tutti gli spostamenti ITE in ingresso destinati alla CPU corrente (avviata in precedenza nei processori remoti).
  • È consigliabile che i driver miniport eseguano un passaggio di convalida dei parametri completo. Se non è possibile, eseguire una convalida uno per uno e l'esecuzione di voci di matrice. I driver Miniport devono verificare specificamente se tutti gli oggetti a cui si fa riferimento sono validi:
    • La restituzione di NDIS_STATUS_PENDING nel campo EntryStatus per un ite non è consentita.
    • L'adattatore miniport esiste ed è in uno stato valido. In caso contrario, impostare il campo EntryStatus della voce su NDIS_STATUS_ADAPTER_NOT_FOUND, NDIS_STATUS_ADAPTER_NOT_READY e così via.
    • Ogni VPort esiste ed è in uno stato valido. In caso contrario, impostare il campo EntryStatus della voce su NDIS_STATUS_INVALID_PORT, NDIS_STATUS_INVALID_PORT_STATE e così via.
    • Ogni indice di voce della tabella di riferimento indiretto rientra nell'intervallo configurato. Questo intervallo è 0xFFFF o si trova nell'intervallo [0...NumberOfIndirectionTableEntries - 1] impostato dall'OID OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 . Gli indici di immissione 0xFFFF e 0xFFFE hanno significati speciali: 0xFFFF definisce il processore predefinito, mentre 0xFFFE definisce il processore primario. In caso di errore, il gestore imposta il campo EntryStatus della voce su NDIS_STATUS_INVALID_PARAMETER.
    • Il livello superiore e il driver miniport prevedono che l'ITE punti al processore corrente (CPU attore) prima dello spostamento. In altre parole, l'ITE non può essere reindirizzato in remoto. Se non è true, impostare il campo EntryStatus della voce su NDIS_STATUS_NOT_ACCEPTED.
    • Tutti i processori di destinazione sono validi e fanno parte del set RSS dell'adattatore miniport. In caso contrario, impostare il campo EntryStatus della voce su NDIS_STATUS_INVALID_DATA.
  • Successivamente o come parte del passaggio di convalida dei parametri, convalidare la situazione della risorsa. Verificare che il numero di code da usare dopo uno spostamento in batch completo (evacuazione) non superi il NumeroOfQueues impostato nella struttura NDIS_RECEIVE_SCALE_PARAMETERS_V2 durante una richiesta di OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 . In caso contrario, viene restituito NDIS_STATUS_NO_QUEUES. NDIS_STATUS_NO_QUEUES deve essere usato per tutte le condizioni che rappresentano una violazione del numero di code configurato. NDIS_STATUS_RESOURCES deve essere usato solo per designare condizioni temporanee di memoria insufficiente.
  • Come parte dei controlli delle risorse, per ogni entità di ridimensionamento (ad esempio, VPort), il driver miniport deve gestire una condizione quando tutti gli ITE che puntano alla CPU corrente vengono spostati da esso.

Se tutti i controlli precedenti superano, il driver miniport deve essere in grado di applicare in modo incondizionato la nuova configurazione e deve impostare il campo EntryStatus di ogni voce su NDIS_STATUS_SUCCESS.

In generale, il gestore per questo OID deve essere molto leggero. Non deve chiamare servizi NDIS o del sistema operativo diversi da per le possibili operazioni di sincronizzazione, ad esempio spinlock e NdisMConfigMSIXTableEntry.

Il driver miniport non deve chiamare NDIS per indicare gli eventi di stato o PnP.

Anche il driver miniport non deve usare indicazioni complete di ricezione/trasmissione nel contesto di questo gestore OID, in quanto ciò comporta la ricorsione. Il livello superiore può richiamare questo OID dal contesto di ricezione o trasmissione delle indicazioni.

Spostamento di tutte le voci della tabella di riferimento indiretto

I driver Miniport devono riconoscere e gestire una richiesta speciale che sposta tutte le voci della tabella di riferimento indiretto lontano dalla CPU corrente. Poiché RSSv2 opera con singoli spostamenti ITE, i driver miniport devono garantire l'atomicità dell'operazione complessiva. Se si verifica un errore al centro di un batch durante l'elaborazione della matrice corrispondente di comandi di spostamento, il driver miniport deve ripristinare tutti i comandi già eseguiti e contrassegnare tutti i comandi come "non riusciti" nel campo EntryStatus per ogni comando. Il protocollo di livello superiore prevede sempre che il batch "move all ITEs" contenga tutti i comandi contrassegnati come "succeeded" o tutti i comandi contrassegnati come "non riusciti" e presupporrà che il traffico obbedisce allo stato risultante (prima o dopo lo spostamento). Se il livello superiore vede solo alcune voci contrassegnate come "non riuscite", verificherà il sistema e punterà al driver miniport come causa.

Per facilitare la gestione del driver miniport del comando "Spostare tutti gli ITE" e per evitare deadlock, i comandi di spostamento dei protocolli di livello superiore nel batch in coppie di campi SwitchId + VPortId , in modo che:

  • I comandi che il livello superiore vuole eseguire insieme, come parte del comando "sposta tutto", per lo stesso VPort vengono inseriti consecutivamente nel batch complessivo.
  • Il driver miniport non deve tentare di eseguire il batch di comandi complessivo, che può avere come destinazione vPort diversi, in modo da "spostare tutto". Solo il gruppo di comandi destinati allo stesso VPort (contrassegnato con la stessa coppia SwitchId + VPortId ) deve essere eseguito conforme alla semantica "move all".
  • Quando il livello superiore non si preoccupa della semantica "sposta tutto", potrebbe interleavere i comandi allo stesso VPort con comandi a VPort diversi. In questo caso, se il secondo gruppo di comandi alla stessa VPort non può essere eseguito a causa di una violazione di "numero di code", il driver miniport contrassegna tale gruppo con il codice di stato corrispondente (NDIS_STATUS_NO_QUEUES) e il livello superiore assume la responsabilità del ripristino.

Ad esempio, se il protocollo di livello superiore interleave una serie di comandi simili al seguente:

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

Il driver miniport non deve tentare di eseguire in modo atomico tutti e quattro i comandi di spostamento o tutti e tre i comandi di spostamento per VPort=1 (ITE[0,1,2]). Deve solo eseguire il VPort=1 ITE[0,1] gruppo in modo "sposta tutto", quindi il VPort=2 ITE[0] gruppo, quindi VPort=1 ITE[2]. Tutti e tre i gruppi di comandi potrebbero avere un risultato diverso. Ad esempio, i gruppi per VPort=1 ITE[0,1] e VPort=2 ITE[0] potrebbero avere esito positivo e il VPort=1 ITE[2] gruppo potrebbe non riuscire. Il risultato deve essere riportato nel membro EntryStatus corrispondente di ogni struttura di comando. In questo modo, il driver miniport non deve adottare precauzioni per l'esecuzione sicura del batch complessivo (ad esempio, bloccare l'intero adattatore). È possibile usare solo i comandi destinati a un VPort specifico, con granularità più fine per ogni blocco VPort ed evitare determinati deadlock.

Nota

L'intero gruppo delle voci di comando deve essere contrassegnato con lo stesso stato di immissione.

Condizioni di errore e codici di stato

Questo OID restituisce i codici di stato seguenti quando si verifica un errore:

Codice di stato Condizione di errore
NDIS_STATUS_INVALID_LENGTH L'OID non è valido.
NDIS_STATUS_INVALID_PARAMETER Altri campi, nell'intestazione o nell'OID stesso (ma non nelle singole voci di comando) contengono valori non validi.

Requisiti

Versione: Windows 10, versione 1709 Intestazione: Ntddndis.h (include Ndis.h)

Vedi anche