OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Avviso

Alcune informazioni contenute in questo argomento riguardano il prodotto in versione non definitiva, che può essere modificato in modo sostanziale prima che venga rilasciato in commercio. 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_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID 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 viene visualizzato un NDIS_STATUS_PENDING stato restituito.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES usa la struttura NDIS_RSS_SET_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.

Commenti

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 preparato per 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 viene indicato subito dopo lo spostamento della coda, che può trovarsi nella CPU di origine o nella CPU di destinazione.

I protocolli di livello superiore generano OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES per impostare ite e/o i parametri del processore primario e predefinito in modo che puntino a processori diversi.

Questo OID può essere emesso per parametri di spostamento del traffico attivo o inattivo . Per altre informazioni sui parametri di spostamento, vedere Ricevere il ridimensionamento laterale versione 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_SET_INDIRECTION_TABLE_ENTRIES devono essere rilasciati a un adattatore miniport con il flag NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID deselezionato. Ciò è dovuto alla possibilità di riferimenti 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 di tale 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_SET_INDIRECTION_ENTRY con il risultato dell'operazione.

Gestore OID per OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Il gestore OID per OID_GEN_RSS_SET_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 eventuali spostamenti ITE in ingresso destinati alla CPU corrente (avviata in precedenza su processori remoti).
  • È consigliabile che i driver miniport eseguano un passaggio di convalida completo dei parametri. Se non è possibile, eseguire la convalida uno per uno e l'esecuzione di voci di matrice. I driver Miniport devono verificare in modo specifico 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 è compreso 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 voce 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 utilizzare dopo uno spostamento completo in batch (evacuazione) non superi il numero di code impostate 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 configurato di code. NDIS_STATUS_RESOURCES devono essere usati 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 NDIS o servizi del sistema operativo diversi da per le operazioni di sincronizzazione possibili, ad esempio spinlock e NdisMConfigMSIXTableEntry.

Il driver miniport non deve chiamare NDIS per indicare lo stato o gli eventi 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 rileva un errore nel corso 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 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 "failed" e presuppone che il traffico obbedi allo stato risultante (prima o dopo lo spostamento). Se il livello superiore vede solo alcune voci contrassegnate come "non riuscite", verifica il sistema e punta al driver miniport come causa.

Per facilitare la gestione del driver miniport del comando "move all ITEs" e per evitare deadlock, i comandi di spostamento del gruppo di 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 "move all", 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 diversi VPort, 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 riguarda la semantica "sposta tutto", potrebbe interleave i comandi nello stesso VPort con comandi a VPort diversi. In questo caso, se il secondo gruppo di comandi dello stesso 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 interlea una serie di comandi come segue:

  • 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 riflessa nel membro EntryStatus corrispondente di ogni struttura di comando. In questo modo, il driver miniport non deve prendere precauzioni per l'esecuzione sicura del batch complessivo (ad esempio, bloccare l'intero adattatore). È possibile usare solo i comandi destinati a un VPort specifico, è possibile usare un blocco granulare per ogni VPort e alcuni deadlock vengono evitati.

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 stato Condizione di errore
NDIS_STATUS_INVALID_LENGTH L'OID è in formato 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