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


функция обратного вызова MINIPORT_SEND_NET_BUFFER_LISTS (ndis.h)

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

Примечание Функцию необходимо объявить с помощью типа MINIPORT_SEND_NET_BUFFER_LISTS . Дополнительные сведения см. в следующем разделе Примеры.
 

Синтаксис

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 , драйвер мини-порта должен следовать следующим рекомендациям:

  1. Порядок структур NET_BUFFER в каждой NET_BUFFER_LIST структуре должен быть сохранен.
  2. Порядок NET_BUFFER_LIST структур должен быть сохранен, если они должны передаваться по одному и тому же соединению.
  3. Если 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

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

MiniportInitializeEx

NET_BUFFER

NET_BUFFER_LIST

NdisMAllocatePort

NdisMSendNetBufferListsComplete

NdisSendNetBufferLists

OID_GEN_MAC_OPTIONS