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


Функция NdisMIndicateReceiveNetBufferLists (ndis.h)

Драйверы минипорта вызывают функцию NdisMIndicateReceiveNetBufferLists , чтобы указать получение данных из сети.

Синтаксис

void NdisMIndicateReceiveNetBufferLists(
  [in] NDIS_HANDLE      MiniportAdapterHandle,
       PNET_BUFFER_LIST NetBufferList,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG            NumberOfNetBufferLists,
  [in] ULONG            ReceiveFlags
);

Параметры

[in] MiniportAdapterHandle

Дескриптор минипорта, переданный NDIS Функция MiniportInitializeEx .

NetBufferList

Связанный список NET_BUFFER_LIST структур, выделенных драйвером мини-порта.

[in] PortNumber

Номер порта, идентифицирующий порт адаптера мини-порта. Чтобы назначить номер порта адаптера мини-порта, вызовите функцию NdisMAllocatePort . Нулевое значение определяет порт адаптера минипорта по умолчанию. Используйте порт по умолчанию, если драйвер мини-порта не выделил порты для указанного адаптера.

[in] NumberOfNetBufferLists

Количество NET_BUFFER_LIST структур, которые находятся в связанном списке структур в NetBufferLists .

[in] ReceiveFlags

Флаги, определяющие атрибуты для операции отправки. Флаги можно объединить с операцией OR. Чтобы очистить все флаги, установите для этого элемента нулевое значение. Эта функция поддерживает следующие флаги:

NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL

Указывает, что текущий irQL DISPATCH_LEVEL. Дополнительные сведения об этом флаге см. в разделе Dispatch IRQL Tracking.

NDIS_RECEIVE_FLAGS_RESOURCES

Указывает, что драйвер мини-порта освобождает права владения NET_BUFFER_LIST структурами и любыми присоединенными NET_BUFFER структурами сразу после вызова NdisMIndicateReceiveNetBufferLists .

NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE

Указывает, что все структуры NET_BUFFER_LIST в списке в NetBufferLists имеют одинаковый тип протокола (EtherType).

Драйверы минипорта

NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE дополнительно задается драйверами минипорта, которые уверены, что все NBL в цепочке NBL имеют один и тот же EtherType. Устанавливая этот флаг, драйвер мини-порта информирует протоколы NDIS и верхнего уровня о том, что им не нужно проверять каждый пакет на наличие его EtherType, что повышает производительность. Драйверы минипорта никогда не требуются для установки этого флага.

Легкие фильтры (LWF)

При указании новых приемов легковесовой фильтр (LWF) также может при необходимости задать NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE если он уверен, что все библиотеки NBL в цепочке NBL имеют один и тот же EtherType. Однако, как и драйверы минипорта, LWF никогда не требуется устанавливать этот флаг в этом случае, и всегда может выбрать снятие флага.

Если LWF изменяет EtherType NBL при прохождении через метод receive из нижнего слоя, LWF должен снять флаг, если NBL больше не имеют такого же типа EtherType.

При передаче через приемы из нижнего слоя, если LWF изменяет EtherType NBL, LWF может задать при необходимости этот флаг, если он уверен, что все библиотеки NBL в цепочке NBL имеют одинаковый Тип EtherType. В этом случае LWF никогда не требуется для установки этого флага и всегда может удалить его.

При использовании получает из нижнего слоя, если этот флаг установлен, LWF может предположить, что каждый NBL в цепочке имеет один и тот же EtherType. LWF никогда не требуется для чтения этого флага и может выбрать всегда считывать EtherType из каждого NBL.

При объединении нескольких цепочек NBL LWF должен очистить этот флаг, если не будет уверен, что новая цепочка NBL имеет однородный EtherType.

Драйверы протоколов

При использовании получает из нижнего слоя, если задано NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE, протокол может предположить, что каждый NBL в цепочке имеет один и тот же EtherType. Протокол никогда не требуется для чтения этого флага. Вместо этого он может всегда считывать EtherType из каждого NBL.

NDIS_RECEIVE_FLAGS_SINGLE_VLAN

Указывает, что все структуры NET_BUFFER_LIST в списке в NetBufferLists принадлежат одной виртуальной локальной сети.

NDIS_RECEIVE_FLAGS_PERFECT_FILTERED

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

NDIS_RECEIVE_FLAGS_SINGLE_QUEUE

Указывает, что все структуры NET_BUFFER_LIST в списке в NetBufferLists принадлежат к одной очереди виртуальных машин. Драйвер мини-порта должен установить этот флаг для всех указаний получения в очереди, если флаг NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION установлен в элементе Flags NDIS_RECEIVE_QUEUE_PARAMETERS структуру при выделении очереди.

NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID

Указывает, что все структуры NET_BUFFER_LIST в списке в NetBufferLists содержат допустимые сведения о общей памяти. Если этот флаг установлен для полученного NET_BUFFER_LIST, NDIS обрабатывает сведения об общей памяти как допустимые. Если этот флаг не задан, NDIS и драйверы игнорируют сведения об общей памяти. Например, промежуточные драйверы, которые изменяют данные пакета, могут использовать этот флаг для определения необходимости копирования данных. Драйверы мини-порта могут использовать флаг , чтобы определить, как освободить память, связанную с очередью виртуальных машин, при удалении очереди.

NDIS_RECEIVE_FLAGS_MORE_NBLS

Зарезервировано.

Возвращаемое значение

None

Remarks

Драйвер мини-порта обычно вызывает функцию NdisMIndicateReceiveNetBufferLists из своей функции MiniportInterruptDPC . Когда драйвер мини-порта вызывает NdisMIndicateReceiveNetBufferLists, он указывает список NET_BUFFER_LIST структур в параметре NetBufferLists . NDIS передает структуры NET_BUFFER_LIST в Функция ProtocolReceiveNetBufferLists привязанных драйверов протокола.

Драйверы miniport должны задать для элемента SourceHandle каждой структуры NET_BUFFER_LIST то же значение, что и для параметра MiniportAdapterHandle .

Если драйвер минипорта вызывает NdisMIndicateReceiveNetBufferLists и очищает флаг NDIS_RECEIVE_FLAG_RESOURCES в параметре ReceiveFlags , NDIS возвращает указанные структуры NET_BUFFER_LIST драйверу мини-порта. Функция MiniportReturnNetBufferLists . В этом случае драйвер минипорта не должен возвращать NET_BUFFER_LIST структуры до тех пор, пока NDIS не вернет структуры NET_BUFFER_LIST в функцию MiniportReturnNetBufferLists .

Если драйвер мини-порта вызывает NdisMIndicateReceiveNetBufferLists и устанавливает флаг NDIS_RECEIVE_FLAG_RESOURCES в параметре ReceiveFlags , это означает, что драйвер минипорта должен немедленно вернуть себе права владения NET_BUFFER_LIST структурами. В этом случае NDIS не вызывает функцию MiniportReturnNetBufferLists драйвера miniport для возврата NET_BUFFER_LIST структур. Вместо этого NDIS возвращает NET_BUFFER_LIST структуры в драйвер мини-порта при возвращении из NdisMIndicateReceiveNetBufferLists. Драйвер мини-порта должен вернуть NET_BUFFER_LIST структуры сразу после возврата NdisMIndicateReceiveNetBufferLists . Чтобы освободить NET_BUFFER_LIST структуры, водитель минипорта может вызвать свой собственный Функция MiniportReturnNetBufferLists .

Установка флага NDIS_RECEIVE_FLAG_RESOURCES в параметре ReceiveFlags заставляет драйверы протокола копировать сетевые данные и освобождать структуры NET_BUFFER_LIST в драйвере мини-порта. Авторы драйверов должны проектировать свои драйверы минипорта с достаточным количеством предварительно выделение NET_BUFFER_LIST структур, чтобы избежать ненужного копирования.

Вызывающий объект NdisMIndicateReceiveNetBufferLists должен правильно инициализировать NET_BUFFER_LIST структуры, присоединенные NET_BUFFER структуры и все присоединенные многомерные списки.

Требования

Требование Значение
Минимальная версия клиента Поддерживается в NDIS 6.0 и более поздних версиях.
Целевая платформа Универсальное
Верхняя часть ndis.h (включая Ndis.h)
Библиотека Ndis.lib
IRQL <= DISPATCH_LEVEL
Правила соответствия DDI Irql_SendRcv_Function(ndis)

См. также раздел

MiniportInitializeEx

MiniportInterruptDPC

MiniportReturnNetBufferLists

NDIS_RECEIVE_QUEUE_PARAMETERS

NET_BUFFER

NET_BUFFER_LIST

NdisMAllocatePort

ProtocolReceiveNetBufferLists