функция обратного вызова 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-подключении, он должен:- Во внутреннем состоянии подключения пометьте подключение как прерванное.
-
Вызовите функцию NdisTcpOffloadEventHandler с типом событияTcpIndicateAbort.Примечание Когда мини-порт указывает событие TcpIndicateAbort , стек TCP/IP узла завершит разгрузку подключения. Целевой объект разгрузки позволяет указать событие TcpIndicateAbort сразу после поступления сегмента RST.
- Выполняйте все незавершенные запросы на отправку и отключайте запросы на подключение с помощью 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 — локальный узел может по-прежнему отправлять данные.
Указание изменения в размере невыполненной работы
Размер невыполненной работы по отправке может быть функцией времени кругового пути (RTT) для подключения, пропускной способности интерфейса и других параметров. Конкретные переменные и алгоритм, которые целевой объект разгрузки использует для вычисления размера невыполненной работы по отправке, зависят от реализации. Например, целевой объект разгрузки может использовать в качестве алгоритма минимум продукта с задержкой пропускной способности и объявленного окна получения. Однако обратите внимание, что размер невыполненной работы по отправке не зависит от количества байтов данных, которые в настоящее время отправляются для передачи по подключению.Целевой объект разгрузки должен реализовать механизм регулирования, чтобы гарантировать, что если значение SendBacklogSize изменяется слишком часто или слишком мало, целевой объект разгрузки не указывает на событие SendBacklogSize . Это предотвратит бурю признаков событий.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | ndischimney.h (включая Ndischimney.h) |
IRQL | DISPATCH_LEVEL |
См. также раздел
Указание событий Chimney-Specific TCP
NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete