функция обратного вызова W_TCP_OFFLOAD_RECEIVE_HANDLER (ndischimney.h)
[Функция разгрузки дымохода TCP не рекомендуется и не должна использоваться.]
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 сопоставляется с цепочкой списков дескрипторов памяти (MDLs). 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, запрос на получение находится в режиме, отличном от push.
Если запрос получения находится в режиме отправки, целевой объект разгрузки извлекает значение TcpReceiveBytesTransferred путем вызова макроса NET_BUFFER_LIST_INFO. Если это значение не равно нулю, целевой объект разгрузки немедленно запускает таймер отправки для подключения. Если это значение равно нулю, целевой объект разгрузки запускает таймер отправки подключения, как только целевой объект разгрузки помещает первый байт получения данных в запрос на получение. Целевой объект разгрузки всегда завершает заполненные запросы на получение немедленно. Целевой объект разгрузки завершает частично заполненный запрос на получение, который находится в режиме принудительной отправки, если происходит одно из следующих действий:
- Срок действия таймера push-уведомлений истекает.
- Целевой объект разгрузки получает сегмент TCP для подключения с набором битов PSH.
Если данные получены при отключенном подключении во время выполнения таймера отправки, целевой объект разгрузки должен перезапустить таймер отправки для этого подключения.
Требования
Требование | Ценность |
---|---|
целевая платформа | Виндоус |
заголовка | ndischimney.h (включая Ndischimney.h) |
IRQL | Любой уровень |