共用方式為


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 區段時,它必須:
  1. 在連線的內部狀態中,將聯機標示為已中止。
  2. 使用 EventType of TcpIndicateAbort 呼叫 NdisTcpOffloadEventHandler 函式。
    注意 當迷你埠指出 TcpIndicateAbort 事件時,主機 TCP/IP 堆疊將會終止連線的卸除。 卸除目標是免費的,以在 RST 區段送達時指出 TcpIndicateAbort 事件。
     
  3. 使用 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--本機主機可能仍會傳送數據。
卸除目標可以要求終止已卸除的所有 TCP 連線。 如需詳細資訊,請參閱 NdisMOffloadEventIndicate

指出傳送待辦專案大小的變更

傳送待辦專案大小可以是連線、介面頻寬和其他參數 (RTT) 來回時間的函式。 卸除目標用來計算傳送待辦專案大小的特定變數和演算法是實作特定的。 例如,卸除目標可以使用頻寬延遲產品下限和公告的接收窗口作為演算法。 不過請注意,傳送待辦專案大小不會根據目前在連線上傳送的數據位元組數目而有所不同。

卸除目標應該實作節流機制,以確保如果 SendBacklogSize 的值太頻繁或太小,卸除目標不會指出 SendBacklogSize 事件。 這可防止發生事件指示的暴風雨。

規格需求

需求
目標平台 Universal
標頭 ndischimney.h (包含 Ndischimney.h)
IRQL DISPATCH_LEVEL

另請參閱

指出 TCP Chimney-Specific 事件

MiniportInitiateOffload

MiniportTerminateOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

回應 FIN 或 RST 區段的接收