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


функция обратного вызова 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-подключения.

Прерывание отключения

Если для параметра Flags задано значение TCP_DISCONNECT_ABORTIVE_CLOSE, целевой объект разгрузки выполняет прерывание отключения, отправляя сегмент RST для указанного TCP-подключения.

Примечание Это единственный экземпляр, в котором целевой объект разгрузки может отправлять сегмент RST.
 
Перед вызовомФункция NdisTcpOffloadDisconnectComplete для завершения прерванного отключения. Целевой объект разгрузки должен завершить все незавершенные запросы на отправку в подключении со значением состояния NDIS_STATUS_REQUEST_ABORTED. Целевой объект разгрузки записывает это значение состояния в элемент Status каждой структуры NET_BUFFER_LIST в связанном списке, который он передает вФункция NdisTcpOffloadSendComplete.

Не имеет значения, завершает ли целевой объект разгрузки незавершенные запросы на отправку до или после отправки сегмента RST.

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

ПриTCP_DISCONNECT_ABORTIVE_CLOSEФлаги = структура NET_BUFFER, связанная со структурой NET_BUFFER_LIST, на которую ссылается указатель NetBufferList, не содержит данных. То есть элемент DataLength структуры NET_BUFFER_DATA в NetBufferHeader структуры NET_BUFFER равен нулю.

Корректное отключение

Если для параметра Flags задано значение TCP_DISCONNECT_GRACEFUL_CLOSE, целевой объект разгрузки выполняет корректное отключение, отправляя сегмент FIN в указанное TCP-подключение.

Если до сегмента FIN нет пользовательских данных, структура NET_BUFFER, связанная со структурой NET_BUFFER_LIST, на которую ссылается указатель NetBufferList , не содержит данных. При наличии пользовательских данных для отправки списки дескрипторов памяти (MDL), связанные со структурой NET_BUFFER, содержат отправляемые пользовательские данные.

Целевой объект разгрузки не должен ждать подтверждения передаваемых пользовательских данных перед отправкой сегмента FIN. Целевой объект разгрузки может отправить отдельный сегмент FIN после передачи пользовательских данных, или целевой объект разгрузки может задать бит FIN в заголовке TCP последнего сегмента пользовательских данных, который он отправляет.

С точки зрения целевого объекта разгрузки отправка сегмента FIN закрывает половину соединения отправки. Однако при отправке сегмента FIN не закрывается половина получающего подключения. Удаленный узел завершает получение половины подключения, отправляя одно из следующих компонентов в целевой объект разгрузки:

  • Сегмент FIN, который запрашивает корректное отключение.
  • Сегмент RST, который запрашивает прерывание отключения.
После отправки сегмента FIN целевой объект разгрузки может получать сегменты подключения до тех пор, пока удаленный узел не инициирует корректное или прерванное отключение или пока локальный узел не завершит разгрузку подключения или не инициирует прерывание отключения.

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

Обязательный ответ на запрос на отключение

Целевой объект разгрузки не должен завершать запрос на отключение, если только указанное TCP-подключение не передается или не прерывается (например, из-за того, что удаленный узел отправил сегмент RST для подключения). Если целевому объекту разгрузки не удается выполнить запрос на отключение, стек узлов не будет повторно вывести запрос на отключение позже.

Освобождение ресурсов подключения

Целевой объект разгрузки не должен освобождать ресурсы для подключения, для которого было выполнено прерывание или корректное отключение, пока стек узлов не завершит разгрузку подключения.

Требования

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

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

MiniportInitializeEx

MiniportTerminateOffload

NET_BUFFER

NET_BUFFER_DATA

NET_BUFFER_LIST

NET_BUFFER_LIST_INFO

NdisAdvanceNetBufferDataStart

NdisMSetMiniportAttributes

NdisTcpOffloadDisconnectComplete

NdisTcpOffloadSendComplete