Condividi tramite


Strutture NET_BUFFER_LIST frammentate

Un driver NDIS può creare una struttura NET_BUFFER_LIST frammentata da una struttura di 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 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 figlia 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 collegate. Il puntatore della superstruttura è NULL, il che indica che non è una struttura derivata.

La struttura NET_BUFFER_LIST figlia dispone di tre strutture NET_BUFFER con MDLs collegati. La struttura NET_BUFFER_LIST figlio ha un puntatore alla struttura padre. Il NULL, dove normalmente ci sarebbe un puntatore alla struttura NET_BUFFER_LIST_CONTEXT, 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 di NET_BUFFER_LIST esistente. NDIS alloca nuove strutture NET_BUFFER e MDLs per la struttura frammentata di NET_BUFFER_LIST. NDIS non alloca una struttura NET_BUFFER_LIST_CONTEXT per la struttura frammentata. Le strutture NET_BUFFER e MDL descrivono gli stessi dati della struttura padre. I dati non sono stati copiati.

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

NdisAllocateFragmentNetBufferList divide il usato spazio dati in ogni struttura di NET_BUFFER di origine in frammenti. La lunghezza del utilizzato spazio dati 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 NET_BUFFER viene ridotto del numero di byte specificato nel parametro DataOffsetDelta.

Se sono presenti più strutture NET_BUFFER nella struttura padre NET_BUFFER_LIST (non illustrata nell'illustrazione) il processo di frammento per ogni struttura NET_BUFFER è uguale a quello di una singola struttura. Ad esempio, se l'ultima parte di dati in una struttura padre NET_BUFFER è inferiore alla dimensione massima, NDIS non combina tali dati con i dati all'inizio della struttura 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 precedentemente allocate chiamando NdisAllocateFragmentNetBufferList.

strutture NET_BUFFER_LIST derivate