функция обратного вызова W_TCP_OFFLOAD_DISCONNECT_HANDLER (ndischimney.h)
[Функция разгрузки дымохода TCP не рекомендуется и не должна использоваться.]
Функция MiniportTcpOffloadDisconnect закрывает половину отключенного TCP-подключения. Кроме того, если необходимо выполнить отключение, NDIS может предоставить данные приложения MiniportTcpOffloadDisconnect функцию, которую функция должна передавать перед отправкой сегмента FIN.
Синтаксис
W_TCP_OFFLOAD_DISCONNECT_HANDLER WTcpOffloadDisconnectHandler;
NDIS_STATUS WTcpOffloadDisconnectHandler(
[in] IN NDIS_HANDLE MiniportAdapterContext,
[in] IN PVOID MiniportOffloadContext,
[in] IN PNET_BUFFER_LIST NetBufferList,
[in] IN ULONG Flags
)
{...}
Параметры
[in] MiniportAdapterContext
Дескриптор выделенной области контекста для разгрузки, в которой целевой объект разгрузки сохраняет сведения о состоянии этого экземпляра адаптера. Целевой объект разгрузки предоставил этот дескриптор NDIS при вызове NdisMSetMiniportAttributes из нее функция MiniportInitializeEx.
[in] MiniportOffloadContext
Указатель на расположение памяти, содержащее значение PVOID. Это значение PVOID ссылается на контекст разгрузки мини-порта, который содержит объект состояния для подключения TCP, который должен быть отключен. Целевой объект разгрузки предоставил это значение PVOID при разгрузке объекта состояния TCP-подключения.
[in] NetBufferList
Указатель на одну NET_BUFFER_LIST структуру. С этой NET_BUFFER_LIST связана только одна NET_BUFFER структура.
[in] Flags
Как одно из следующих значений, тип отключения, который должен выполнять целевой объект разгрузки:
TCP_DISCONNECT_ABORTIVE_CLOSE
Целевой объект разгрузки должен выполнить прерывание, отправив сегмент RST.
TCP_DISCONNECT_GRACEFUL_CLOSE
Целевой объект разгрузки должен выполнять корректное отключение, отправляя сегмент FIN.
Возвращаемое значение
Функция MiniportTcpOffloadDisconnect всегда возвращает NDIS_STATUS_PENDING. Целевой объект разгрузки завершает запрос на отключение асинхронно путем вызова NdisTcpOffloadDisconnectComplete.
Замечания
В зависимости от параметра Флаги функция MiniportTcpOffloadDisconnect выполняет прерывание или корректное отключение для указанного TCP-подключения.
прерывание отключения
Если флагов задано значение TCP_DISCONNECT_ABORTIVE_CLOSE, целевой объект разгрузки выполняет прерывание, отправив сегмент RST для указанного TCP-подключения.
Не имеет значения, завершает ли целевой объект разгрузки невыполненные запросы на отправку до или после отправки сегмента RST.
Если в соединении имеются неопубликованные признаки получения или события, целевой объект разгрузки не должен ожидать завершения этих указаний перед отправкой сегмента RST. Целевой объект разгрузки должен немедленно прекратить обработку сегментов получения подключения и не подтвердить какие-либо сегменты получения, включая указанные данные о получении, которые не были использованы клиентским приложением.
При флагов = TCP_DISCONNECT_ABORTIVE_CLOSEструктура NET_BUFFER, связанная со структурой NET_BUFFER_LIST, на которую ссылается указатель netBuffer List, не содержит данных. То есть элемент DataLength структуры NET_BUFFER_DATA в NetBufferHeaderHeader структуры NET_BUFFER равен нулю.
корректное отключение
Если для флагов задано значение TCP_DISCONNECT_GRACEFUL_CLOSE, целевой объект разгрузки выполняет корректное отключение, отправив сегмент FIN в указанном TCP-подключении.
Если до сегмента FIN нет пользовательских данных, NET_BUFFER структура, связанная с структурой NET_BUFFER_LIST, на которую ссылается указатель NetBuffer List, не содержит данных. При отправке пользовательских данных списки дескрипторов памяти (MDLs), связанные с структурой NET_BUFFER, содержат отправленные пользовательские данные.
Целевой объект разгрузки не должен ожидать подтверждения передаваемых пользовательских данных перед отправкой сегмента FIN. Целевой объект разгрузки может отправлять отдельный сегмент FIN после передачи пользовательских данных или целевой объект разгрузки может задать бит FIN в заголовке TCP последнего сегмента пользовательских данных, которые он отправляет.
С точки зрения целевого объекта разгрузки отправка сегмента FIN закрывает половину подключения. Однако отправка сегмента FIN не закрывает половину подключения. Удаленный узел завершает получение половины подключения, отправив любой из следующих элементов в целевой объект разгрузки:
- Сегмент FIN, который запрашивает корректное отключение.
- Сегмент RST, который запрашивает прерывание отключения.
Перед вызовами целевого объекта разгрузки NdisTcpOffloadDisconnectComplete, он должен завершить все невыполненные запросы на отправку подключения в том же порядке, в котором они были доставлены в целевой объект разгрузки.
обязательный ответ на запрос на отключение
Целевой объект разгрузки не должен завершаться сбоем запроса на отключение, если только указанное TCP-подключение не передается или прерывается (например, так как удаленный узел отправил сегмент RST в соединении). Если целевой объект разгрузки завершается сбоем запроса на отключение, стек узлов не переиздает запрос отключения позже.
освобождение ресурсов подключения
Целевой объект разгрузки не должен освобождать ресурсы для подключения, на котором оно выпустило прерывание или корректное отключение, пока стек узлов не завершит разгрузку подключения.
Требования
Требование | Ценность |
---|---|
целевая платформа | Виндоус |
заголовка | ndischimney.h (включая Ndischimney.h) |
IRQL | Любой уровень |