Estructuras de NET_BUFFER_LIST fragmentadas
Un controlador NDIS puede crear una estructura de NET_BUFFER_LIST fragmentada a partir de una estructura de NET_BUFFER_LIST existente. La estructura fragmentada hace referencia a un conjunto de estructuras de NET_BUFFER que hacen referencia a los datos originales; sin embargo, los datos se dividen en unidades que no superan un tamaño máximo. Los controladores pueden usar este tipo de estructura para dividir eficazmente los búferes grandes en búferes más pequeños.
En la ilustración siguiente se muestra la relación entre una estructura de NET_BUFFER_LIST primaria y un elemento secundario fragmentado.
La ilustración anterior contiene una estructura de NET_BUFFER_LIST primaria y una estructura secundaria derivada de ese elemento primario. La estructura primaria tiene una estructura NET_BUFFER_LIST_CONTEXT y una estructura NET_BUFFER con MDL adjuntas. El puntero primario de la estructura primaria es NULL que indica que no es una estructura derivada.
La estructura NET_BUFFER_LIST secundaria tiene tres estructuras de NET_BUFFER con MDL adjuntas. La estructura NET_BUFFER_LIST secundaria tiene un puntero a la estructura primaria. El valor NULL donde un puntero de estructura NET_BUFFER_LIST_CONTEXT indicaría que el elemento secundario no tiene ninguna estructura NET_BUFFER_LIST_CONTEXT.
Los controladores NDIS llaman a la función NdisAllocateFragmentNetBufferList para crear una nueva estructura de NET_BUFFER_LIST fragmentada basada en los datos de una estructura de NET_BUFFER_LIST existente. NDIS asigna nuevas estructuras de NET_BUFFER y MDL para la estructura de NET_BUFFER_LIST fragmentada. NDIS no asigna una estructura de NET_BUFFER_LIST_CONTEXT para la estructura fragmentada. El fragmento NET_BUFFER estructuras y MDL describen los mismos datos que la estructura primaria. Los datos no se copian.
NdisAllocateFragmentNetBufferList crea los fragmentos, empezando desde el principio del espacio de datos usado en cada estructura NET_BUFFER primaria y desplazamiento por el valor especificado en el parámetro StartOffset .
NdisAllocateFragmentNetBufferList divide el espacio de datos usado en cada estructura de origen NET_BUFFER en fragmentos. La longitud del espacio de datos usado de cada fragmento es menor o igual que el valor especificado en el parámetro MaximumLength . El espacio de datos usado del último fragmento puede ser menor que MaximumLength . El desplazamiento de datos de las nuevas estructuras de NET_BUFFER se retira por el número de bytes especificados en el parámetro DataOffsetDelta .
Si hay varias estructuras de NET_BUFFER en la estructura NET_BUFFER_LIST primaria (no se muestra en la ilustración), el proceso de fragmentación de cada estructura NET_BUFFER es el mismo que para una sola estructura. Por ejemplo, si la última parte de datos de cualquier estructura de NET_BUFFER primaria es menor que el tamaño máximo, NDIS no combina dichos datos con los datos al principio de la siguiente estructura de NET_BUFFER.
Los controladores NDIS llaman a la función NdisFreeFragmentNetBufferList para liberar una estructura de NET_BUFFER_LIST y todas las estructuras de NET_BUFFER asociadas y cadenas MDL asignadas anteriormente mediante una llamada a NdisAllocateFragmentNetBufferList.