Поделиться через


Фрагментированные структуры NET_BUFFER_LIST

Драйвер NDIS может создать фрагментированную структуру NET_BUFFER_LIST из существующей NET_BUFFER_LIST структуры. Фрагментированная структура ссылается на набор NET_BUFFER структур, ссылающихся на исходные данные; однако данные делятся на единицы, которые не превышают максимальный размер. Драйверы могут использовать этот тип структуры для эффективного разбиения больших буферов на меньшие буферы.

На следующем рисунке показана связь между родительской NET_BUFFER_LIST структурой и фрагментарным дочерним элементом.

схема, показывающая связь между родительской NET_BUFFER_LIST структурой и его фрагментированной дочерней структурой.

На предыдущем рисунке содержится родительская структура NET_BUFFER_LIST и дочерняя структура, производная от этой родительской структуры. Родительская структура имеет одну структуру NET_BUFFER_LIST_CONTEXT и одну структуру NET_BUFFER с присоединёнными MDL. Родительский указатель родительской структуры NULL, указывающий, что она не является производной структурой.

Дочерняя структура NET_BUFFER_LIST содержит три структуры NET_BUFFER с прикрепленными MDL. У дочерней NET_BUFFER_LIST структуры есть указатель на родительскую структуру. NULL, где должен быть указан указатель структуры NET_BUFFER_LIST_CONTEXT, указывает, что дочерний элемент не имеет этой структуры.

Драйверы NDIS вызывают функцию NdisAllocateFragmentNetBufferList, чтобы создать новую фрагментированную структуру NET_BUFFER_LIST, основанную на данных в существующей NET_BUFFER_LIST структуре. NDIS выделяет новые структуры NET_BUFFER и списки дескрипторов памяти для фрагментированной структуры NET_BUFFER_LIST. NDIS не выделяет NET_BUFFER_LIST_CONTEXT структуру для фрагментированной структуры. Структуры фрагментов NET_BUFFER и MDL описывают те же данные, что и родительская структура. Данные не копируются.

NdisAllocateFragmentNetBufferList создает фрагменты, начиная с начала пространства данных в каждой структуре родительского NET_BUFFER и смещает по значению, указанному в параметре StartOffset.

NdisAllocateFragmentNetBufferList разделяет используемое пространство данных в каждой исходной структуре NET_BUFFER на фрагменты. Длина используемого пространства данных каждого фрагмента меньше или равно значению, указанному в параметре MaximumLength. пространство данных, используемое последним фрагментом, может быть меньше максимальной длины . Смещение данных новых структур NET_BUFFER уменьшается на количество байтов, указанных в параметре DataOffsetDelta.

Если NET_BUFFER в родительской NET_BUFFER_LIST структуры (не показана иллюстрация), процесс фрагментирования для каждой NET_BUFFER структуры совпадает с одной структурой. Например, если последний фрагмент данных в любой родительской NET_BUFFER структуре меньше максимального размера, NDIS не объединяет такие данные с данными в начале следующей NET_BUFFER структуры.

Драйверы NDIS вызывают функцию NdisFreeFragmentNetBufferList, чтобы освободить структуру NET_BUFFER_LIST и все связанные структуры NET_BUFFER и цепочки MDL, которые ранее были выделены путем вызова NdisAllocateFragmentNetBufferList.

Производные структуры NET_BUFFER_LIST