функция обратного вызова MINIPORT_SEND_NET_BUFFER_LISTS (ndis.h)
NDIS вызывает функцию MiniportSendNetBufferLists для передачи сетевых данных, содержащихся в связанном списке NET_BUFFER_LIST структур.
Синтаксис
MINIPORT_SEND_NET_BUFFER_LISTS MiniportSendNetBufferLists;
void MiniportSendNetBufferLists(
[in] NDIS_HANDLE MiniportAdapterContext,
[in] PNET_BUFFER_LIST NetBufferList,
[in] NDIS_PORT_NUMBER PortNumber,
[in] ULONG SendFlags
)
{...}
Параметры
[in] MiniportAdapterContext
Дескриптор контекстной области, выделенной драйвером мини-порта в функции MiniportInitializeEx . Драйвер мини-порта использует эту область контекста для хранения сведений о состоянии адаптера.
[in] NetBufferList
Указатель на первую структуру NET_BUFFER_LIST в связанном списке NET_BUFFER_LIST структур. Каждая NET_BUFFER_LIST структура в списке описывает список NET_BUFFER структур. Каждая NET_BUFFER структура в списке сопоставляется с цепочкой MDL. Многомерные списки содержат сетевые данные.
[in] PortNumber
Номер порта, идентифицирующий порт адаптера мини-порта. Чтобы назначить номер порта адаптера мини-порта, вызовите функцию NdisMAllocatePort . Нулевое значение определяет порт адаптера мини-порта по умолчанию.
[in] SendFlags
Флаги, определяющие атрибуты для операции отправки. Флаги можно объединить с операцией OR. Чтобы очистить все флаги, установите для этого элемента нулевое значение. Эта функция поддерживает следующие флаги:
NDIS_SEND_FLAGS_DISPATCH_LEVEL
Указывает, что текущий irQL DISPATCH_LEVEL. Дополнительные сведения об этом флаге см. в разделе Dispatch IRQL Tracking.
NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK
Указывает, что NDIS должна проверка для замыкания на себя. По умолчанию NDIS не выполняет цикловую обратную передачу данных в драйвер, отправляющий запрос на отправку. Переопределяющий драйвер может переопределить это поведение, установив этот флаг. Если этот флаг установлен, NDIS определяет все NET_BUFFER структуры, содержащие данные, соответствующие критериям получения привязки. NDIS указывает, NET_BUFFER структуры, которые соответствуют критериям для вышеопределяющего драйвера. Этот флаг не влияет на проверку замыкания на себя или циклов в других привязках.
Возвращаемое значение
None
Remarks
MiniportSendNetBufferLists — это обязательная функция для драйверов мини-портов. Когда драйвер с избыточной областью вызывает функцию NdisSendNetBufferLists , NDIS вызывает функцию MiniportSendNetBufferLists связанного драйвера miniport.
При передаче сетевых данных, передаваемых NDIS в параметре NetBufferLists , драйвер мини-порта должен следовать следующим рекомендациям:
- Порядок структур NET_BUFFER в каждой NET_BUFFER_LIST структуре должен быть сохранен.
- Порядок NET_BUFFER_LIST структур должен быть сохранен, если они должны передаваться по одному и тому же соединению.
-
Если NET_BUFFER_LIST структуры должны передаваться по разным подключениям, их можно разделить на несколько очередей передачи, если используются следующие функции. В этом случае необходимо сохранить порядок NET_BUFFER_LIST структур для каждого соединения.
- Масштабирование на стороне получения (RSS) (значение хэша RSS в структуре NET_BUFFER_LIST можно использовать в качестве индекса в таблице косвенного обращения RSS.)
- Очередь виртуальных машин (VMQ) (идентификатор очереди исходящей очереди задается в сведениях об OOB NetBufferListFilteringInfo . Дополнительные сведения см. в разделе Путь передачи VMQ.)
- Ieee 802.1 Data Center Bridging (DCB) (вы можете отключиться от класса трафика (TC).)
- IEEE 802.1p (вы можете отключить теги 802.1p без DCB.)
Драйверы мини-портов принимают все запросы на отправку, выполняемые NDIS, путем вызова функции MiniportSendNetBufferLists . Если драйвер мини-порта не может выполнить запрос на отправку немедленно, драйвер должен держать запрос в очереди, пока он не сможет завершить запрос. Пока запрос на отправку находится в состоянии ожидания, драйвер мини-порта сохраняет права владения NET_BUFFER_LIST структурами и всеми ресурсами, выделенными протоколом, связанными с NET_BUFFER_LIST структурами.
Драйвер мини-порта должен вызватьФункция NdisMSendNetBufferListsComplete для выполнения запросов на отправку для всех NET_BUFFER_LIST структур. Чтобы повысить производительность системы, драйвер может создать связанный список, содержащий структуры NET_BUFFER_LIST из нескольких запросов на отправку. Затем драйвер может передать такой связанный список в одном вызове NdisMSendNetBufferListsComplete.NET_BUFFER_LIST структуры и другие связанные ресурсы должны рассматриваться как недоступные драйвером мини-порта, как только драйвер вызывает NdisMSendNetBufferListsComplete.
Функция MiniportSendNetBufferLists должна синхронизировать доступ к внутренним очередям сетевых данных с другими функциями Драйвера MiniportXxx, которые обращаются к тем же очередям. Драйвер мини-порта может использовать спин-блокировки для синхронизации доступа к очередям.
Драйверы протокола отвечают за определение необходимых сетевых данных на основе среднего типа, выбранного привязанным драйвером мини-порта. Однако драйвер протокола может предоставлять сетевые данные, указывающие пакеты, которые меньше минимального размера пакета для выбранного носителя. В этом случае MiniportSendNetBufferLists должен заполнять пакеты нулями, если выбранная среда накладывает требование минимальной длины к размеру передаваемого пакета.
Если драйвер мини-порта устанавливает флаг NDIS_MAC_OPTION_NO_LOOPBACK при запросе NDIS OID_GEN_MAC_OPTIONS OID, драйвер мини-порта не должен пытаться зацикливать сетевые данные. NDIS обеспечивает поддержку программного замыкания на себя для такого драйвера.
NDIS вызывает MiniportSendNetBufferLists по адресу IRQL<= DISPATCH_LEVEL.
Примеры
Чтобы определить функцию MiniportSendNetBufferLists , необходимо сначала предоставить объявление функции, определяющее тип определяемой функции. Windows предоставляет набор типов функций для драйверов. Объявление функции с помощью типов функций помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.Например, чтобы определить функцию MiniportSendNetBufferLists с именем MySendNetBufferLists, используйте тип MINIPORT_SEND_NET_BUFFER_LISTS , как показано в следующем примере кода:
MINIPORT_SEND_NET_BUFFER_LISTS MySendNetBufferLists;
Затем реализуйте функцию следующим образом:
_Use_decl_annotations_
VOID
MySendNetBufferLists(
NDIS_HANDLE MiniportAdapterContext,
PNET_BUFFER_LIST NetBufferList,
NDIS_PORT_NUMBER PortNumber,
ULONG SendFlags
)
{...}
Тип функции MINIPORT_SEND_NET_BUFFER_LISTS определен в файле заголовка Ndis.h. Чтобы более точно определить ошибки при запуске средств анализа кода, не забудьте добавить заметку Use_decl_annotations в определение функции. Заметка Use_decl_annotations гарантирует использование заметок, которые применяются к типу функции MINIPORT_SEND_NET_BUFFER_LISTS в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в статье Объявление функций с помощью типов ролей функций для драйверов NDIS.
Сведения о Use_decl_annotations см. в статье Поведение функции с заметками.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Поддерживается в NDIS 6.0 и более поздних версиях. |
Целевая платформа | Windows |
Header | ndis.h (включая Ndis.h) |
IRQL | <= DISPATCH_LEVEL |
Правила соответствия DDI | NdisTimedDataHang, NdisTimedDataSend |