Share via


Descrittori e estensioni dei pacchetti

In NetAdapterCx i descrittori dei pacchetti sono strutture piccole, compattate ed estendibili di runtime che descrivono un pacchetto di rete. Ogni pacchetto richiede quanto segue:

  • Un descrittore core
  • Uno o più descrittori di frammento
  • Zero o più estensioni di pacchetti

Il descrittore principale del pacchetto è la struttura NET_PACKET . Contiene solo i metadati più di base applicabili a tutti i pacchetti, ad esempio il layout di frame di un determinato pacchetto e l'indice al primo descrittore del frammento del pacchetto.

Ogni pacchetto deve avere anche uno o più descrittori di frammento o NET_FRAGMENT strutture, che descrivono la posizione all'interno della memoria di sistema in cui risiedono i dati del pacchetto.

Le estensioni sono facoltative e contengono metadati per pacchetto o per frammento per funzionalità specifiche dello scenario. Ad esempio, le estensioni dei pacchetti possono contenere informazioni di offload per checksum, offload di invio di grandi dimensioni (LSO) e ricezione del segmento di coalescence (RSC) oppure possono contenere dettagli specifici dell'applicazione. Le estensioni del frammento possono contenere informazioni sull'indirizzo virtuale, informazioni sull'indirizzo DMA logico o altre informazioni per il frammento.

Insieme, questi descrittori e estensioni contengono tutti i metadati relativi a un pacchetto di rete. Ecco due esempi di come descrivono un pacchetto. La prima figura mostra uno scenario in cui l'intero pacchetto viene archiviato all'interno di un singolo frammento di memoria e l'offload checksum è stato attivato.

Diagramma che mostra un layout di pacchetti con 1 frammento e 1 estensione.

La seconda figura mostra un pacchetto archiviato tra due frammenti di memoria, con RSC e checksum offload abilitato.

Diagramma che mostra un layout di pacchetti con 2 frammenti e 2 estensioni.

Archiviazione e accesso ai descrittori dei pacchetti

I descrittori dei pacchetti e i descrittori di frammento sono entrambi archiviati nelle strutture di NET_RING . Un driver client della scheda di interfaccia di rete accede agli anelli di rete ed esegue operazioni su di essi chiamando l'interfaccia iteratore net ring, che consente al driver di lavorare con NetAdapterCx per pubblicare i dati di rete nell'hardware e svuotare i dati completati al sistema operativo.

Per altre informazioni sugli anelli di rete e sull'interfaccia iteratore dell'anello net, vedere Introduzione agli anelli di rete.

Estendibilità del descrittore di pacchetti

Estendibilità è una funzionalità principale del descrittore di pacchetti NetAdapterCx, che costituisce la base per la compatibilità e le prestazioni del descrittore. In fase di esecuzione, il sistema operativo alloca tutti i pacchetti descrittori per ogni coda di pacchetti in un blocco contiguo, insieme a qualsiasi estensione avaiable. Ogni blocco di estensione si trova immediatamente dietro il descrittore principale, come illustrato nella figura seguente:

Diagramma che mostra il layout del descrittore di pacchetti NetAdapterCx con 3 blocchi di estensione.

I driver client della scheda di interfaccia di rete non sono consentiti per eseguire il hardcode dell'offset in qualsiasi blocco di estensione. Invece, devono eseguire query in fase di esecuzione per l'offset in qualsiasi estensione specifica. Ad esempio, un driver potrebbe eseguire una query sull'offset su Extension B e recuperare 70 byte come nella figura seguente:

Diagramma che mostra l'esecuzione di query sull'offset in un'estensione del descrittore del pacchetto di base.

Una volta creata una coda di pacchetti e i relativi descrittori, tutti gli offset di estensione sono garantiti dal sistema per essere costanti, quindi i driver non devono eseguire nuovamente le query di offset spesso. Inoltre, poiché tutte le estensioni vengono pre-allocate dal sistema in un blocco al momento dell'inizializzazione della coda di pacchetti, non è necessario eseguire l'allocazione di runtime di blocchi, cercare un elenco per un descrittore specifico o dover archiviare puntatori a ogni estensione del pacchetto.

Descrittore di pacchetti

Il descrittore di pacchetti core di NetAdapterCx può essere facilmente esteso nelle versioni future aggiungendo nuovi campi alla fine, ad esempio nella figura seguente:

Diagramma che mostra il descrittore del pacchetto core NetAdapterCx.

I driver client più recenti che conoscono i campi V2 possono accedervi, mentre i driver V1 precedenti useranno gli offset di estensione per ignorare i campi V2 in modo che possano accedere ai campi che capiscono. Inoltre, ogni estensione può essere versione nello stesso modo, come illustrato nella figura seguente:

Diagramma che mostra il controllo delle versioni delle estensioni dei pacchetti NetAdapterCx.

Un driver client che riconosce la nuova estensione può usarla. Altri driver client possono ignorare i nuovi campi. Ciò consente la versione indipendente di parti diverse del descrittore di pacchetti.

Descrittori di pacchetti e prestazioni del percorso dati

La funzionalità di estendibilità descritta in precedenza offre vantaggi per aiutare i driver client a soddisfare i requisiti di prestazioni delle schede di interfaccia di rete che sono capabable di centinaia di gigabit al secondo, con migliaia di code:

  1. I descrittori dei pacchetti vengono mantenuti il più compatto possibile per migliorare i risultati della cache della CPU, come funzionalità ed estensioni che non vengono usate occupano 0 byte di spazio nei descrittori.
  2. Non esiste una dereferenza del puntatore, ma solo l'aritmetica di offset perché le estensioni sono in linea, che non solo salvano spazio, ma aiutano anche con i riscontri della cache della CPU.
  3. Le estensioni vengono allocate al momento della creazione della coda, quindi i driver non devono allocare e deallocare memoria nel percorso dati attivo o gestire elenchi lookaside di blocchi di contesto.

Uso delle estensioni dei pacchetti

Importante

Attualmente, i driver client sono limitati alle estensioni di pacchetti preesistenti definite dal sistema operativo.

Registrazione delle estensioni dei pacchetti

Il primo passaggio nell'uso delle estensioni dei pacchetti nel driver client della scheda di interfaccia di rete consiste nel dichiarare i carichi di offload hardware supportati. Quando si annuncia il supporto per gli offload, ad esempio checksum e LSO, NetAdapterCx registra automaticamente le estensioni dei pacchetti associate per conto dell'utente.

Per un esempio di codice di offload hardware pubblicitario, vedere Introduzione agli offload hardware.

Query degli offset delle estensioni dei pacchetti per le code del percorso dati

Dopo aver registrato le estensioni dei pacchetti dichiarando il supporto di offload hardware, è necessario che gli offset di estensione accingino a ognuno di essi durante l'elaborazione dei pacchetti. Per ridurre le chiamate al di fuori del driver e migliorare le prestazioni, è possibile eseguire query sugli offset per le estensioni durante la funzione evtNetAdapterCreateTx(Rx)Queue callback e archiviare le informazioni di offset nel contesto della coda.

Per un esempio di offset di estensione di query e archiviazione nel contesto della coda, vedere Trasmettere e ricevere code.

Recupero delle estensioni dei pacchetti in fase di esecuzione

Dopo aver archiviato gli offset di estensione nel contesto della coda, è possibile usarli ogni volta che sono necessarie informazioni in un'estensione. Ad esempio, è possibile chiamare il metodo NetExtensionGetPacketChecksum mentre i descrittori di programma in hardware per una coda di trasmissione:

    // Get the extension offset from the device context
    PMY_TX_QUEUE_CONTEXT queueContext = GetMyTxQueueContext(txQueue);
    NET_EXTENSION checksumExtension = queueContext->ChecksumExtension;

    // Get the checksum info for this packet
    NET_PACKET_CHECKSUM* checksumInfo = NetExtensionGetPacketChecksum(checksumExtension, packetIndex);

    // Do work with the checksum info
    if (packet->Layout.Layer3Type == NET_PACKET_LAYER3_TYPE_IPV4_NO_OPTIONS ||
        packet->Layout.Layer3Type == NET_PACKET_LAYER3_TYPE_IPV4_WITH_OPTIONS ||
        packet->Layout.Layer3Type == NET_PACKET_LAYER3_TYPE_IPV4_UNSPECIFIED_OPTIONS)
    {
        if(checksumInfo->Layer4 == NET_PACKET_TX_CHECKSUM_REQUIRED)
        {
            ...
        }
    }
    ...

Costanti di estensione del pacchetto predefinite e metodi helper

NetAdapterCx fornisce definizioni per costanti di estensione del pacchetto note.

Costante Definizione
NET_PACKET_EXTENSION_INVALID_OFFSET Protegge dalle dimensioni di offset non valide.
NET_PACKET_EXTENSION_CHECKSUM_NAME NET_PACKET_EXTENSION_CHECKSUM_VERSION_1 Nome e versione dell'estensione del pacchetto checksum.
NET_PACKET_EXTENSION_LSO_NAME NET_PACKET_EXTENSION_LSO_VERSION_1 Nome e versione dell'estensione del pacchetto LSO (Send Offload) di grandi dimensioni.
NET_PACKET_EXTENSION_RSC_NAME NET_PACKET_EXTENSION_RSC_VERSION_1 Nome e versione dell'estensione del pacchetto del segmento di ricezione (RSC).

NetAdapterCx fornisce inoltre metodi helper che fungono da wrapper intorno al metodo NetExtensionGetData . Ognuno di questi metodi restituisce un puntatore al tipo di struttura appropriato.

Metodo Struttura
NetExtensionGetPacketChecksum NET_PACKET_CHECKSUM
NetExtensionGetGso NET_PACKET_GSO
NetExtensionGetPacketRsc NET_PACKET_RSC

Uso delle estensioni del frammento

Importante

Attualmente, i driver client sono limitati alle estensioni di frammento preesistenti definite dal sistema operativo.

Registrazione delle estensioni del frammento

NetAdapterCx registra automaticamente la maggior parte delle estensioni di frammento interpretando le funzionalità espresse di un driver. Ad esempio, se il driver esprime il supporto di DMA, il framework aggiungerà automaticamente l'estensione NET_FRAGMENT_LOGICAL_ADDRESS necessaria per la programmazione DMA.

Query degli offset dell'estensione del frammento per le code di datapath

Per accedere alle estensioni del frammento, è possibile seguire lo stesso processo per accedere alle estensioni dei pacchetti descritte in Offset dell'estensione del pacchetto di query per le code di datapath.

Costanti di estensione del frammento predefinite

NetAdapterCx fornisce definizioni per costanti di estensione del frammento note.

Costante Definizione
NET_FRAGMENT_EXTENSION_DATA_BUFFER_NAME NET_FRAGMENT_EXTENSION_DATA_BUFFER_VERSION_1 Nome e versione dell'estensione del frammento del buffer di dati.
NET_FRAGMENT_EXTENSION_LOGICAL_ADDRESS_NAME NET_FRAGMENT_EXTENSION_LOGICAL_ADDRESS_VERSION_1 Nome e versione dell'estensione del frammento di indirizzo logico.
NET_FRAGMENT_EXTENSION_MDL_NAME NET_FRAGMENT_EXTENSION_MDL_VERSION_1 Nome e versione dell'estensione del frammento MDL.
NET_FRAGMENT_EXTENSION_RETURN_CONTEXT_NAME NET_FRAGMENT_EXTENSION_RETURN_CONTEXT_VERSION_1 Nome e versione dell'estensione del frammento di contesto restituito.
NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_NAME NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_VERSION_1 Nome e versione dell'estensione del frammento di indirizzo virtuale.