структура NET_BUFFER_LIST (ndis/nbl.h)
Структура NET_BUFFER_LIST задает связанный список NET_BUFFER структур.
Синтаксис
typedef struct _NET_BUFFER_LIST {
union {
struct {
NET_BUFFER_LIST *Next;
NET_BUFFER *FirstNetBuffer;
};
SLIST_HEADER Link;
NET_BUFFER_LIST_HEADER NetBufferListHeader;
};
NET_BUFFER_LIST_CONTEXT *Context;
NET_BUFFER_LIST *ParentNetBufferList;
NDIS_HANDLE NdisPoolHandle;
PVOID NdisReserved[2];
PVOID ProtocolReserved[4];
PVOID MiniportReserved[2];
PVOID Scratch;
NDIS_HANDLE SourceHandle;
ULONG NblFlags;
LONG ChildRefCount;
ULONG Flags;
union {
NDIS_STATUS Status;
ULONG NdisReserved2;
};
PVOID NetBufferListInfo[MaxNetBufferListInfo];
} NET_BUFFER_LIST, *PNET_BUFFER_LIST;
Члены
Next
Следующая NET_BUFFER_LIST структура в цепочке.
Драйверы не должны обращаться к этому элементу напрямую. Вместо этого они должны вызвать макрос NET_BUFFER_LIST_NEXT_NBL .
FirstNetBuffer
Первый NET_BUFFER на этом NET_BUFFER_LIST.
Драйверы не должны обращаться к этому элементу напрямую. Вместо этого они должны вызвать макрос NET_BUFFER_LIST_FIRST_NB .
Link
Зарезервировано для NDIS.
NetBufferListHeader
Структура NET_BUFFER_LIST_HEADER .
Context
Указатель на структуру NET_BUFFER_LIST_CONTEXT . Драйверы протоколов и мини-портов используют эту структуру для хранения сведений о структуре NET_BUFFER_LIST. Сведения, хранящиеся в структуре NET_BUFFER_LIST_CONTEXT, непрозрачны для NDIS и других драйверов в стеке.
Используйте следующие функции и макросы для доступа к данным в структуре NET_BUFFER_LIST_CONTEXT:
NdisAllocateNetBufferListContext NdisFreeNetBufferListContext NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZEParentNetBufferList
Если эта NET_BUFFER_LIST структура является клоном другой структуры NET_BUFFER_LIST, этот элемент указывает указатель на родительскую NET_BUFFER_LIST структуру. В противном случае этот параметр имеет значение NULL. Драйвер использует Функция NdisAllocateCloneNetBufferList для создания клона.
NdisPoolHandle
Дескриптор пула, определяющий NET_BUFFER_LIST пул, из которого была выделена структура NET_BUFFER_LIST.
NdisReserved[2]
Зарезервировано для использования NDIS.
ProtocolReserved[4]
Зарезервировано для использования драйверами протокола.
MiniportReserved[2]
Зарезервировано для использования драйверами минипорта.
Scratch
Данные, определенные текущим владельцем структуры NET_BUFFER_LIST. Текущий владелец, NDIS или драйвер NDIS, может использовать этот элемент в своих целях. При первоначальном выделении структуры NET_BUFFER_LIST этот элемент имеет значение NULL. После того как текущий владелец откажет права владения, NDIS или другой драйвер может перезаписать этот элемент.
SourceHandle
Дескриптор, предоставленный NDIS драйверу в операции привязки или присоединения с помощью одной из следующих процедур, предоставляемых драйвером:
Драйвер мини-порта
Драйвер протокола
Драйвер фильтра
NDIS использует SourceHandle для возврата структуры NET_BUFFER_LIST драйверу, который отправил структуру NET_BUFFER_LIST.
NblFlags
Этот элемент содержит флаги, которые можно объединить с побитовой операцией ИЛИ.
Используйте макросы NdisTestNblFlag, NdisTestNblFlags, NdisSetNblFlag и NdisClearNblFlag для доступа к флагам.
Промежуточные драйверы и драйверы фильтров могут устанавливать следующие флаги, если они не изменяют данные, связанные с NET_BUFFER_LIST. Например, если данные не изменились, NDIS может повторно использовать исходную информацию, из которой был создан NET_BUFFER_LIST.
NDIS_NBL_FLAGS_SEND_READ_ONLY
Если задано значение , структура NET_BUFFER_LIST и ее данные доступны только для чтения для операций отправки.
NDIS_NBL_FLAGS_RECV_READ_ONLY
Если задано значение , структура NET_BUFFER_LIST и ее данные доступны только для чтения для операций получения.
Драйвер может установить следующие флаги, даже если он не разделяет связанный кадр Ethernet:
NDIS_NBL_FLAGS_IS_IPV4
Все кадры Ethernet в этой NET_BUFFER_LIST структуре являются кадрами IPv4. Если этот флаг установлен, поставщик разделения данных заголовка не должен устанавливать флаг NDIS_NBL_FLAGS_IS_IPV6.
NDIS_NBL_FLAGS_IS_IPV6
Все кадры Ethernet в этой NET_BUFFER_LIST структуре являются кадрами IPv6. Если этот флаг установлен, поставщик разделения заголовков и данных не должен устанавливать флаг NDIS_NBL_FLAGS_IS_IPV4.
NDIS_NBL_FLAGS_IS_TCP
Все кадры Ethernet в этой NET_BUFFER_LIST структуре являются кадрами TCP. Если этот флаг установлен, поставщик разделения данных заголовков не должен устанавливать флаг NDIS_NBL_FLAGS_IS_UDP, а поставщик должен установить флаг NDIS_NBL_FLAGS_IS_IPV4 или флаг NDIS_NBL_FLAGS_IS_IPV6.
NDIS_NBL_FLAGS_IS_UDP
Все кадры Ethernet в этой NET_BUFFER_LIST структуре являются кадрами UDP. Если этот флаг установлен, поставщик разделения заголовков и данных не должен устанавливать флаг NDIS_NBL_FLAGS_IS_TCP, а поставщик должен установить флаг NDIS_NBL_FLAGS_IS_IPV4 или флаг NDIS_NBL_FLAGS_IS_IPV6.
NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET
Все пакеты, связанные с этой NET_BUFFER_LIST структурой, являются пакетами замыкания на себя.
Если поставщик разделения заголовков и данных не разделяет связанный кадр Ethernet, драйвер мини-порта должен указать структуру NET_BUFFER_LIST с снятыми следующими флагами:
NDIS_NBL_FLAGS_HD_SPLIT
Заголовок и данные разделяются на все кадры Ethernet, связанные с этой NET_BUFFER_LIST структурой.
NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER
Все кадры Ethernet в этом NET_BUFFER_LIST разделены в начале заголовка протокола верхнего уровня. Если этот флаг установлен, поставщик разделения заголовков и данных должен установить флаг NDIS_NBL_FLAGS_IS_IPV4 или флаг NDIS_NBL_FLAGS_IS_IPV6. Кроме того, поставщик может задать флаг NDIS_NBL_FLAGS_IS_TCP или флаг NDIS_NBL_FLAGS_IS_UDP, но поставщик не должен устанавливать флаг NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD.
NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD
Все кадры Ethernet в этой NET_BUFFER_LIST структуре разделяются в начале полезных данных TCP или UDP. Если этот флаг установлен, поставщик разделения заголовков и данных должен установить флаг NDIS_NBL_FLAGS_IS_IPV4 или флаг NDIS_NBL_FLAGS_IS_IPV6. Кроме того, поставщик должен установить флаг NDIS_NBL_FLAGS_IS_TCP или флаг NDIS_NBL_FLAGS_IS_UDP, но поставщик не должен устанавливать флаг NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER.
ChildRefCount
Если эта NET_BUFFER_LIST структура содержит клоны (является родительским), этот элемент указывает количество незадаченных клонов. В противном случае этот элемент равен нулю.
Flags
Атрибуты структуры NET_BUFFER_LIST. Следующие определения указывают битовую маску для набора флагов:
NBL_FLAGS_PROTOCOL_RESERVED
Этот набор зарезервирован для драйверов протокола.
NBL_FLAGS_MINIPORT_RESERVED
Этот набор зарезервирован для драйверов минипорта.
NBL_FLAGS_SCRATCH
Текущий владелец структуры NET_BUFFER_LIST( NDIS или драйвер NDIS) может использовать этот набор. Когда текущий владелец откажет права владения, NDIS или другой драйвер может перезаписать эти флаги.
NBL_FLAGS_NDIS_RESERVED
Этот набор зарезервирован для NDIS.
Status
Окончательное состояние завершения операции с сетевыми данными в этой NET_BUFFER_LIST структуре. Драйверы минипорта записывают это значение перед вызовом Функция NdisMSendNetBufferListsComplete . Драйверы miniport указывают одно из следующих значений:
NDIS_STATUS_SUCCESS
Все сетевые данные, описанные NET_BUFFER структурами, связанными с этой NET_BUFFER_LIST структурой, успешно переданы по сети.
NDIS_STATUS_INVALID_LENGTH
Размер данных в некоторых NET_BUFFER структурах, связанных с этой NET_BUFFER_LIST структурой, был слишком велик для базовой сетевой карты.
NDIS_STATUS_RESOURCES
Сбой запроса на отправку для этой структуры NET_BUFFER_LIST из-за нехватки ресурсов.
NDIS_STATUS_FAILURE
Этот запрос на отправку для этой структуры NET_BUFFER_LIST завершился сбоем по какой-либо причине, отличной от указанных в предыдущих трех значениях.
NDIS_STATUS_SEND_ABORTED
NDIS вызвал функцию MiniportCancelSend для отмены операции отправки для этой NET_BUFFER_LIST структуры.
NDIS_STATUS_RESET_IN_PROGRESS
Драйвер мини-порта прервал запрос на отправку из-за сброса.
NDIS_STATUS_PAUSED
Если драйвер должен отклонять запросы на отправку, так как он приостановлен, он устанавливает полное состояние в каждом затронутом NET_BUFFER_LIST NDIS_STATUS_PAUSED.
NdisReserved2
Зарезервировано для NDIS.
NetBufferListInfo[MaxNetBufferListInfo]
Массив значений, содержащий сведения, общие для всех NET_BUFFER структур в списке. Эту информацию часто называют "данными внеполосного диапазона (OOB).
Вы можете использовать кнопку NDIS_NET_BUFFER_LIST_INFO значения перечисления с помощью макроса NET_BUFFER_LIST_INFO для задания и получения значений в массиве NetBufferListInfo .
Комментарии
Драйверы NDIS могут вызывать любую из следующих функций для выделения и инициализации структуры NET_BUFFER_LIST:
NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferListВсе NET_BUFFER структуры, связанные со структурой NET_BUFFER_LIST, имеют атрибуты, заданные элементами NetBufferListInfo и Context .
Когда драйвер вызывает функцию NdisSendNetBufferLists или NdisFSendNetBufferLists , он теряет право владения:
- Указанная структура NET_BUFFER_LIST.
- Присоединенные NET_BUFFER структуры и многомерные списки.
- Все присоединенные NDIS_REQUEST_CONTROLs.
- Все данные NetBufferListInfo , связанные с NET_BUFFER_LIST структурой.
Список NET_BUFFER_LIST структур представляет собой простой по отдельности связанный список, заканчивающийся со значением NULL. Чтобы переместить структуру NET_BUFFER_LIST в другой список, внесите соответствующие изменения в следующие элементы как в исходном, так и в целевом списках.
Чтобы получить доступ к членам структуры NET_BUFFER_LIST, используйте следующие макросы и функции:
NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferListДополнительные сведения об использовании чистых буферов см. в разделе Архитектура NET_BUFFER.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Поддерживается в NDIS 6.0 и более поздних версиях. |
Верхняя часть | ndis/nbl.h (включая ndis.h) |