NDIS_TCP_OFFLOAD_EVENT_INDICATE回呼函式 (ndischimney.h)
[TCP chimney 卸除功能已被取代,不應使用。
卸除目標會呼叫 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
指定主機堆疊在卸除目標上應具有未處理的最佳傳送數據位元組數目。
傳回值
無
備註
指出正常中斷連線
卸除目標應該只有在:- 它已從遠端主機收到 FIN 區段。
- 在接收 FIN 區段之前,在連線上接收的所有數據都已由用戶端應用程式取用 (,也就是說,連線) 上沒有要指出的接收數據。
請注意,正常中斷連線只會關閉連線的接收一半。 它不會關閉連線的傳送一半。
指出中止中斷連線
卸除目標在 TCP 連線上收到可接受的 RST 區段時,它必須:- 在連線的內部狀態中,將聯機標示為已中止。
-
使用 EventType of TcpIndicateAbort 呼叫 NdisTcpOffloadEventHandler 函式。注意 當迷你埠指出 TcpIndicateAbort 事件時,主機 TCP/IP 堆疊將會終止連線的卸除。 卸除目標是免費的,以在 RST 區段送達時指出 TcpIndicateAbort 事件。
- 使用 NDIS_STATUS_REQUEST_ABORTED 完成連線上所有未完成的傳送要求和中斷連線要求。 卸除目標會將此狀態值寫入至連結清單中每個NET_BUFFER_LIST結構的狀態成員,該成員會傳遞至 NdisTcpOffloadSendComplete 函式 或 NdisTcpOffloadDisconnectComplete 函式 。
要求 TCP 連線終止
卸除目標會將終止要求指定為 EventSpecificInformation 參數中傳遞至 NdisTcpOffloadEventHandler 函式TCP_UPLOAD_REASON值的原因。 回應中,主機堆疊會呼叫卸除目標的 MiniportTerminateOffload 函式。卸除目標每個呼叫 NdisTcpOffloadEventHandler 時,只能要求終止一個 TCP 連線。 卸除目標無法要求終止鄰近狀態物件或路徑狀態物件。 只有主機堆疊可以起始鄰近或路徑狀態對象的終止。
下表描述可能導致卸除目標要求 TCP 連線卸除終止的事件或情況。
最右邊的數據行會指出每個TCP_UPLOAD_REASON,主機堆疊一律會上傳連線 ( 強制) ,或可能不上傳連線 (選擇性) 。 在必要情況下,卸除目標不會繼續處理卸除的連線。 在選擇性的情況下,如果主機堆疊未終止該連線的卸除,卸除目標必須能夠繼續處理卸除連線。
事件/情況 | TCP_UPLOAD_REASON | 主機堆疊的 TCP 連線終止 |
---|---|---|
用來追蹤連線的硬體狀態已損毀。 | HardwareFailure | 強制性 |
卸除目標嘗試在相依於無效狀態物件的 TCP 連線上傳送數據。 | InvalidState | 強制性 |
卸除目標會接收一個區段,並在 TCP 標頭中設定了一個分頁。 請注意,卸除目標不會傳送 ACK 來確認緊急數據。 | ReceivedUrgentData | 強制性 |
TCP 連線發生逾時。 | TimeoutExpiration | 強制性 |
卸除目標會基於未指定的原因要求上傳。 | UploadRequested | 強制性 |
卸除目標偵測到 TCP 連線上已卸除太多傳輸區段。 | HighDropRate | 選擇性 |
卸除目標偵測到 TCP 連線上收到太多片段。 | HighFragmentation | 選擇性 |
卸除目標在 TCP 連線上收到太多順序錯亂區段。 | HighOutofOrderPackets | 選擇性 |
活動 (TCP 連線上的傳送/接收) 太低。 | LowActivity | 選擇性 |
TCP 連線沒有預先布建的接收緩衝區。 | NoBufferProposting | 選擇性 |
針對 TCP 連線張貼的接收緩衝區太小。 | SmallIO | 選擇性 |
卸除目標在連線處於下列其中一種狀態時,不得起始半關閉 TCP 連線的終止:
- FIN_WAIT1--本機主機堆疊已關閉 TCP 連線,但連線可能仍會從遠端端點接收數據。
- FIN_WAIT2--本機主機已關閉 TCP 連線,並收到其所傳送 FIN 區段的 ACK,但卸除連線可能仍會從遠端主機接收數據。
- CLOSE_WAIT--本機主機可能仍會傳送數據。
指出傳送待辦專案大小的變更
傳送待辦專案大小可以是連線、介面頻寬和其他參數 (RTT) 來回時間的函式。 卸除目標用來計算傳送待辦專案大小的特定變數和演算法是實作特定的。 例如,卸除目標可以使用頻寬延遲產品下限和公告的接收窗口作為演算法。 不過請注意,傳送待辦專案大小不會根據目前在連線上傳送的數據位元組數目而有所不同。卸除目標應該實作節流機制,以確保如果 SendBacklogSize 的值太頻繁或太小,卸除目標不會指出 SendBacklogSize 事件。 這可防止發生事件指示的暴風雨。
規格需求
需求 | 值 |
---|---|
目標平台 | Universal |
標頭 | ndischimney.h (包含 Ndischimney.h) |
IRQL | DISPATCH_LEVEL |