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

[Функция разгрузки дымохода TCP является нерекомендуемой и не должна использоваться.]

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

Синтаксис

NDIS_TCP_OFFLOAD_EVENT_INDICATE NdisTcpOffloadEventIndicate;

void NdisTcpOffloadEventIndicate(
  [in] IN NDIS_HANDLE NdisOffloadHandle,
  [in] IN ULONG EventType,
  [in] IN ULONG EventSpecificInformation
)
{...}

Параметры

[in] NdisOffloadHandle

Дескриптор, идентифицирующий разгруженное TCP-подключение, для которого производится указание. При разгрузке подключения этот дескриптор был указан в члене NdisOffloadHandle NDIS_MINIPORT_OFFLOAD_BLOCK_LIST структуры, связанной с состоянием подключения.

[in] EventType

Событие, указываемое как одно из следующих TCP_OFFLOAD_EVENT_TYPE значений :

TcpIndicateDisconnect

Указывает, что удаленный узел инициировал корректное отключение, отправив сегмент FIN для подключения.

TcpIndicateRetrieve

Указывает, что целевой объект разгрузки запрашивает стек узлов для прекращения разгрузки TCP-подключения.

TcpIndicateAbort

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

TcpIndicateSendBacklogChange

Указывает изменение предпочтительного размера невыполненной работы по отправке.

[in] EventSpecificInformation

Указывает дополнительные сведения о событии, указываемом следующим образом:

TcpIndicateDisconnect

Не имеет смысла.

TcpIndicateRetrieve

Указывает причину запроса на отправку в качестве значения TCP_UPLOAD_REASON . Дополнительные сведения см. в разделе "Примечания".

TcpIndicateAbort

Не имеет смысла.

TcpIndicateSendBacklogChange

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

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

None

Remarks

Указание корректного отключения

Целевой объект разгрузки должен указывать на корректное отключение только в том случае, если:
  • Он получил сегмент FIN от удаленного узла.
  • Все данные, полученные при подключении до получения сегмента FIN, были использованы клиентским приложением (то есть данные о получении не указываются на подключении).
Целевой объект разгрузки не должен освобождать ресурсы для подключения, пока стек узлов не завершит разгрузку подключения.

Обратите внимание, что корректное отключение завершает работу только получающей половины подключения. Он не завершает отправку половины подключения.

Указание прерванного отключения

Когда целевой объект разгрузки получает допустимый сегмент RST в TCP-подключении, он должен:
  1. Во внутреннем состоянии подключения пометьте подключение как прерванное.
  2. Вызовите функцию NdisTcpOffloadEventHandler с типом событияTcpIndicateAbort.
    Примечание Когда мини-порт указывает событие TcpIndicateAbort , стек TCP/IP узла завершит разгрузку подключения. Целевой объект разгрузки позволяет указать событие TcpIndicateAbort сразу после поступления сегмента RST.
     
  3. Выполняйте все незавершенные запросы на отправку и отключайте запросы на подключение с помощью NDIS_STATUS_REQUEST_ABORTED. Целевой объект разгрузки записывает это значение состояния в элемент Status каждой структуры NET_BUFFER_LIST в связанном списке, который он передает в Функция NdisTcpOffloadSendComplete или дляФункция NdisTcpOffloadDisconnectComplete.
Целевой объект разгрузки не должен освобождать ресурсы для подключения, пока стек узлов не завершит разгрузку подключения.

Запрос завершения TCP-подключения

Целевой объект разгрузки указывает причину запроса на завершение в качестве значения TCP_UPLOAD_REASON в параметре EventSpecificInformation , который передается функции NdisTcpOffloadEventHandler . В ответ стек узла вызывает функцию MiniportTerminateOffload целевого объекта разгрузки.

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

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

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

Событие или обстоятельства TCP_UPLOAD_REASON Завершение TCP-подключения стека узла
Состояние оборудования, используемое для отслеживания подключения, повреждено. HardwareFailure Обязательный
Цель разгрузки попыталась отправить данные по TCP-подключению, которое зависит от объекта состояния, признанного недействительным. InvalidState Обязательный
Целевой объект разгрузки получает сегмент с битом URG, заданным в заголовке TCP. Обратите внимание, что целевой объект разгрузки не отправляет ACK для подтверждения срочных данных. ReceivedUrgentData Обязательный
Для TCP-подключения истекло время ожидания. TimeoutExpiration Обязательный
Целевой объект разгрузки запрашивает отправку по неопределенной причине. UploadRequested Обязательный
Целевой объект разгрузки обнаружил, что в TCP-подключении удаляется слишком много сегментов передачи. HighDropRate Необязательно
Целевой объект разгрузки обнаружил, что в TCP-подключении получено слишком много фрагментов. HighFragmentation Необязательно
Целевой объект разгрузки получил слишком много неупорядоченных сегментов в TCP-подключении. HighOutofOrderPackets Необязательно
Слишком низкая активность (отправка и получение) в TCP-подключении. Низкий уровень активности Необязательно
Предварительно размещенные буферы получения для TCP-подключения отсутствуют. NoBufferProposting Необязательно
Полученные буферы, размещенные для TCP-подключения, слишком малы. SmallIO Необязательно
 

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

  • FIN_WAIT1 — стек локальных узлов закрыл TCP-подключение, но может по-прежнему получать данные из удаленной конечной точки.
  • FIN_WAIT2 — локальный узел закрыл TCP-подключение и получил ACK для отправляемого сегмента FIN, но разгруженное подключение может по-прежнему получать данные от удаленного узла.
  • CLOSE_WAIT — локальный узел может по-прежнему отправлять данные.
Целевой объект разгрузки может запросить завершение всех tcp-подключений, которые были выгружены в него. Дополнительные сведения см. в разделе NdisMOffloadEventIndicate.

Указание изменения в размере невыполненной работы

Размер невыполненной работы по отправке может быть функцией времени кругового пути (RTT) для подключения, пропускной способности интерфейса и других параметров. Конкретные переменные и алгоритм, которые целевой объект разгрузки использует для вычисления размера невыполненной работы по отправке, зависят от реализации. Например, целевой объект разгрузки может использовать в качестве алгоритма минимум продукта с задержкой пропускной способности и объявленного окна получения. Однако обратите внимание, что размер невыполненной работы по отправке не зависит от количества байтов данных, которые в настоящее время отправляются для передачи по подключению.

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

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть ndischimney.h (включая Ndischimney.h)
IRQL DISPATCH_LEVEL

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

Указание событий Chimney-Specific TCP

MiniportInitiateOffload

MiniportTerminateOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

Реагирование на получение сегмента FIN или RST