Condividi tramite


Strutture NET_BUFFER_LIST frammentate

Un driver NDIS può creare una struttura di NET_BUFFER_LIST frammentata da una struttura NET_BUFFER_LIST esistente. La struttura frammentata fa riferimento a un set di strutture NET_BUFFER che fanno riferimento ai dati originali; tuttavia, i dati sono suddivisi in unità che non superano una dimensione massima. I driver possono usare questo tipo di struttura per suddividere in modo efficiente i buffer di grandi dimensioni in buffer più piccoli.

Nella figura seguente viene illustrata la relazione tra una struttura padre NET_BUFFER_LIST e un elemento figlio frammentato.

Diagramma che mostra la relazione tra una struttura padre NET_BUFFER_LIST e la relativa struttura figlio frammentata.

La figura precedente contiene una struttura padre NET_BUFFER_LIST e una struttura figlio derivata da tale padre. La struttura padre ha una struttura NET_BUFFER_LIST_CONTEXT e una struttura NET_BUFFER con MDLs collegata. Il puntatore padre della struttura padre è NULL che indica che non è una struttura derivata.

La struttura figlio NET_BUFFER_LIST dispone di tre strutture NET_BUFFER con MDLs associate. La struttura figlio NET_BUFFER_LIST ha un puntatore alla struttura padre. Null in cui un puntatore NET_BUFFER_LIST_CONTEXT struttura indica che l'elemento figlio non ha una struttura NET_BUFFER_LIST_CONTEXT.

I driver NDIS chiamano la funzione NdisAllocateFragmentNetBufferList per creare una nuova struttura NET_BUFFER_LIST frammentata basata sui dati in una struttura NET_BUFFER_LIST esistente. NDIS alloca nuove strutture NET_BUFFER e MDLs per la struttura NET_BUFFER_LIST frammentata. NDIS non alloca una struttura NET_BUFFER_LIST_CONTEXT per la struttura frammentata. Il frammento NET_BUFFER strutture e mdls descrivono gli stessi dati della struttura padre. I dati non sono copiati.

NdisAllocateFragmentNetBufferList crea i frammenti, a partire dall'inizio dello spazio dati usato in ogni struttura NET_BUFFER padre e offset dal valore specificato nel parametro StartOffset .

NdisAllocateFragmentNetBufferList divide lo spazio dati usato in ogni struttura di origine NET_BUFFER in frammenti. La lunghezza dello spazio dati usato di ogni frammento è minore o uguale al valore specificato nel parametro MaximumLength . Lo spazio dati usato dell'ultimo frammento può essere minore di MaximumLength . L'offset dei dati delle nuove strutture di NET_BUFFER viene ritirato dal numero di byte specificati nel parametro DataOffsetDelta .

Se nella struttura padre NET_BUFFER_LIST sono presenti più strutture NET_BUFFER (non visualizzate nell'illustrazione) il processo di frammentazione per ogni struttura NET_BUFFER è uguale a per una singola struttura. Ad esempio, se l'ultima parte di dati in qualsiasi struttura NET_BUFFER padre è inferiore alla dimensione massima, NDIS non combina tali dati con i dati all'inizio della struttura di NET_BUFFER successiva.

I driver NDIS chiamano la funzione NdisFreeFragmentNetBufferList per liberare una struttura NET_BUFFER_LIST e tutte le strutture NET_BUFFER associate e le catene MDL assegnate in precedenza chiamando NdisAllocateFragmentNetBufferList.

Strutture NET_BUFFER_LIST derivate