функция обратного вызова W_TCP_OFFLOAD_RECEIVE_HANDLER (ndischimney.h)
[Функция разгрузки tcp chimney является устаревшей и не должна использоваться.]
NDIS вызывает функцию MiniportTcpOffloadReceive для отправки запросов на получение (буферы получения) в разгруженном TCP-подключении.
Синтаксис
W_TCP_OFFLOAD_RECEIVE_HANDLER WTcpOffloadReceiveHandler;
NDIS_STATUS WTcpOffloadReceiveHandler(
[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 является единственным допустимым возвращаемым значением. Целевой объект разгрузки всегда асинхронно завершает (возвращает) опубликованные запросы на получение путем вызова NdisTcpOffloadReceiveComplete.
Комментарии
Клиентское приложение может отправлять запросы на получение в разгруженном TCP-подключении. Целевой объект разгрузки использует эти запросы для передачи данных, полученных при подключении, в клиентское приложение. Если запросы на получение отправляются по подключению, целевой объект разгрузки всегда должен использовать их для передачи данных, полученных по подключению. Дополнительные сведения см. в разделе Алгоритм доставки.
Целевой объект разгрузки помещает в очередь опубликованные структуры NET_BUFFER_LIST в порядке "первый вход", "первый выход" (FIFO). Целевой объект разгрузки использует элемент MiniportReserved каждой структуры NET_BUFFER_LIST для постановки структуры в очередь.
Каждая структура NET_BUFFER_LIST, передаваемая функции MiniportTcpOffloadReceive , имеет только одну NET_BUFFER структуру, связанную с ней.
Целевой объект разгрузки должен помещать данные получения в опубликованные запросы на получение в порядке FIFO. То есть данные, полученные первым, должны быть помещены в первый опубликованный запрос на получение и т. д.
Стек узла сериализует вызовы функции MiniportTcpOffloadReceive для каждого подключения. Стек узла не будет вызывать функцию MiniportTcpOffloadReceive для подключения, пока выполняется вызов функции MiniportTcpOffloadReceive для этого соединения. Это гарантирует, что запросы на получение всегда отправляются в правильном порядке в функцию MiniportTcpOffloadReceive целевого объекта разгрузки.
Однако обратите внимание, что стек узла может вызывать функцию MiniportTcpOffloadReceive для подключения до того, как целевой объект разгрузки завершит один или несколько предыдущих вызовов функции MiniportTcpOffloadReceive для этого же соединения. Обратите внимание также, что стек узла может вызывать функцию MiniportTcpOffloadReceive целевого объекта разгрузки при одном подключении, в то время как один или несколько вызовов функции MiniportTcpOffloadReceive выполняются по другому соединению.
При необходимости опубликованный запрос на получение может находиться в любом из двух режимов:
- Режим принудительной отправки
- Режим nonpush
Чтобы определить, в каком режиме находится буфер, целевой объект разгрузки вызывает макрос NET_BUFFER_LIST_INFO , чтобы получить значение TcpReceiveNoPush. Если значение равно TRUE, запрос на получение находится в режиме nonpush.
Если запрос на получение находится в режиме принудительной отправки, целевой объект разгрузки получает значение TcpReceiveBytesTransferred путем вызова макроса NET_BUFFER_LIST_INFO. Если это значение не равно нулю, целевой объект разгрузки немедленно запускает таймер отправки для подключения. Если это значение равно нулю, целевой объект разгрузки запускает таймер отправки для подключения, как только целевой объект разгрузки помещает первый байт данных получения в запрос на получение. Целевой объект разгрузки всегда немедленно завершает заполненные запросы на получение. Целевой объект разгрузки завершает частично заполненный запрос на получение, который находится в режиме отправки, если происходит одно из следующих действий:
- Истекает срок действия таймера отправки.
- Целевой объект разгрузки получает сегмент TCP для подключения, для которого задан бит PSH.
Если данные получены по разгруженным подключениям во время работы таймера отправки, целевой объект разгрузки должен перезапустить таймер отправки для этого подключения.
Требования
Требование | Значение |
---|---|
Целевая платформа | Windows |
Header | ndischimney.h (включая Ndischimney.h) |
IRQL | Любой уровень |