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

[Функция разгрузки tcp chimney является устаревшей и не должна использоваться.]

NDIS вызывает функцию MiniportTcpOffloadSend для передачи данных в разгруженном TCP-подключении.

Синтаксис

W_TCP_OFFLOAD_SEND_HANDLER WTcpOffloadSendHandler;

NDIS_STATUS WTcpOffloadSendHandler(
  [in] IN NDIS_HANDLE MiniportAdapterContext,
  [in] IN PVOID MiniportOffloadContext,
  [in] IN PNET_BUFFER_LIST NetBufferList
)
{...}

Параметры

[in] MiniportAdapterContext

Дескриптор выделенной области контекста целевого объекта разгрузки, в которой целевой объект разгрузки хранит сведения о состоянии этого экземпляра адаптера. Целевой объект разгрузки предоставил этот дескриптор NDIS при вызове NdisMSetMiniportAttributes из егоФункция MiniportInitializeEx.

[in] MiniportOffloadContext

Указатель на расположение памяти, содержащее значение PVOID. Это значение PVOID ссылается на контекст разгрузки минипорта, содержащий объект состояния для TCP-подключения, по которому передаются данные. Целевой объект разгрузки предоставил это значение PVOID при разгрузке объекта состояния tcp-подключения.

[in] NetBufferList

Указатель на структуру NET_BUFFER_LIST . Эта структура может быть автономной или первой структурой в связанном списке NET_BUFFER_LIST структур. Каждая NET_BUFFER_LIST структура в списке описывает список NET_BUFFER структур. Каждая NET_BUFFER структура в списке сопоставляется с цепочкой списков дескрипторов памяти (MDL). Многомерные списки содержат передаваемые данные. NET_BUFFER_LIST и связанные структуры блокируются, чтобы они оставались в физической памяти. Однако они не сопоставляются с системной памятью.

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

NDIS_STATUS_PENDING является единственным допустимым возвращаемым значением. Целевой объект разгрузки всегда асинхронно завершает запрос на отправку путем вызова NdisTcpOffloadSendComplete.

Комментарии

Целевой объект разгрузки должен передавать данные в порядке fifo. Порядок связанного списка NET_BUFFER_LIST структур, которые NDIS передает в NetBufferList , представляет порядок, в котором целевой объект разгрузки должен передавать сетевые данные. Кроме того, целевой объект разгрузки должен отправлять данные, полученные от нескольких вызовов, в MiniportTcpOffloadSend в том порядке, в котором были размещены данные.

Целевой объект разгрузки должен принимать все запросы на отправку, сделанные в функцию MiniportTcpOffloadSend . Если целевому объекту разгрузки не удается завершить запрос на отправку немедленно, целевой объект разгрузки должен ставить запрос в очередь до тех пор, пока он не сможет его завершить. Целевой объект разгрузки должен использовать элемент MiniportReserved структуры NET_BUFFER_LIST для отправки запросов в очередь. Пока запрос на отправку находится в состоянии ожидания, целевой объект разгрузки сохраняет права владения NET_BUFFER_LIST структурами и всеми ресурсами, связанными с NET_BUFFER_LIST структурами.

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

Однако обратите внимание, что стек узла может вызывать функцию MiniportTcpOffloadSend для подключения до того, как целевой объект разгрузки завершит один или несколько предыдущих вызовов функции MiniportTcpOffloadSend для этого же подключения. Обратите внимание, что стек узла может вызывать функцию MiniportTcpOffloadSend целевого объекта разгрузки при одном подключении, в то время как один или несколько вызовов функции MiniportTcpOffloadSend выполняются при другом подключении.

Функция MiniportTcpOffloadSend должна синхронизировать доступ к своим внутренним очередям сетевых данных с другими функциями MiniportXxxx , которые обращаются к тем же очередям целевого объекта разгрузки. Целевой объект разгрузки может использовать спиновые блокировки для синхронизации доступа к очередям.

Целевой объект разгрузки должен (но не обязательно) задавать бит PSH на каждой границе NET_BUFFER_LIST. Рекомендуется задать бит PSH в последнем сегменте, созданном на основе данных, связанных с каждой NET_BUFFER_LIST структурой (то есть данными, описанными NET_BUFFER структурами, связанными со структурой NET_BUFFER_LIST). Кроме того, целевой объект разгрузки может задать бит PSH в последнем оставшемся сегменте в очереди отправки до очистки очереди отправки.

Стек узла не будет запрашивать целевой объект разгрузки для отправки срочных данных.

Требования

Требование Значение
Целевая платформа Windows
Header ndischimney.h (включая Ndischimney.h)
IRQL Любой уровень

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

MiniportInitializeEx

NET_BUFFER_LIST

NdisMSetMiniportAttributes

NdisTcpOffloadSendComplete