Функция 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) |