W_TCP_OFFLOAD_DISCONNECT_HANDLER Rückruffunktion (ndischimney.h)
[Das TCP-Schornsteinauslagerungsfeature ist veraltet und sollte nicht verwendet werden.]
Die MiniportTcpOffloadDisconnect-Funktion schließt die Sendehälfte einer ausgeladenen TCP-Verbindung. Wenn es sich bei der durchzuführenden Trennung um eine ordnungsgemäße Trennung handelt, kann NDIS außerdem Anwendungsdaten an die MiniportTcpOffloadDisconnect-Funktion bereitstellen, die die Funktion vor dem Senden eines FIN-Segments übertragen muss.
Syntax
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
)
{...}
Parameter
[in] MiniportAdapterContext
Das Handle für einen kontextbezogenen Ablagezielbereich, in dem das Auslagerungsziel Zustandsinformationen zu diesem instance des Adapters verwaltet. Das Auslagerungsziel hat dieses Handle für NDIS bereitgestellt, wenn es aufgerufen hat. NdisMSetMiniportAttributes aus MiniportInitializeEx-Funktion .
[in] MiniportOffloadContext
Ein Zeiger auf einen Speicherort, der einen PVOID-Wert enthält. Dieser PVOID-Wert verweist auf den Miniportauslagerungskontext, der das Zustandsobjekt für die zu trennende TCP-Verbindung enthält. Das Auslagerungsziel hat diesen PVOID-Wert beim Ausladen des TCP-Verbindungszustandsobjekts angegeben.
[in] NetBufferList
Ein Zeiger auf eine einzelne NET_BUFFER_LIST-Struktur . Dieser NET_BUFFER_LIST-Struktur ist nur eine NET_BUFFER-Struktur zugeordnet.
[in] Flags
Als einer der folgenden Werte ist der Typ der Trennung, den das Auslagerungsziel ausführen muss:
TCP_DISCONNECT_ABORTIVE_CLOSE
Das Auslagerungsziel muss eine abgebrochene Trennung durchführen, indem ein RST-Segment gesendet wird.
TCP_DISCONNECT_GRACEFUL_CLOSE
Das Auslagerungsziel muss eine ordnungsgemäße Trennung durchführen, indem ein FIN-Segment gesendet wird.
Rückgabewert
Die MiniportTcpOffloadDisconnect-Funktion gibt immer NDIS_STATUS_PENDING zurück. Das Auslagerungsziel schließt die Verbindungsanforderung asynchron ab, indem es aufruft. NdisTcpOffloadDisconnectComplete.
Hinweise
Abhängig von der Flags-Einstellung führt die MiniportTcpOffloadDisconnect-Funktion eine abgebrochene Trennung oder eine ordnungsgemäße Trennung für die angegebene TCP-Verbindung aus.
Abbrechen der Trennung
Wenn Flags auf TCP_DISCONNECT_ABORTIVE_CLOSE festgelegt ist, führt das Auslagerungsziel eine abgebrochene Trennung durch, indem ein RST-Segment für die angegebene TCP-Verbindung gesendet wird.
Es spielt keine Rolle, ob das Auslagerungsziel die ausstehenden Sendeanforderungen vor oder nach dem Senden des RST-Segments beendet.
Wenn es ausstehende Empfangs- oder Ereignisanzeigen für die Verbindung gibt, darf das Auslagerungsziel nicht warten, bis diese Hinweise abgeschlossen sind, bevor ein RST-Segment gesendet wird. Das Auslagerungsziel muss die Verarbeitung von Empfangssegmenten für die Verbindung sofort beenden und keine Empfangssegmente bestätigen, einschließlich der angegebenen Empfangsdaten, die nicht von der Clientanwendung verwendet wurden.
Wenn Flags = TCP_DISCONNECT_ABORTIVE_CLOSE, enthält die NET_BUFFER-Struktur, die der NET_BUFFER_LIST-Struktur zugeordnet ist, auf die der NetBufferList-Zeiger verweist, keine Daten. Das heißt, das DataLength-Element der NET_BUFFER_DATA-Struktur im NetBufferHeader der NET_BUFFER-Struktur ist null.
Ordnungsgemäße Trennung
Wenn Flags auf TCP_DISCONNECT_GRACEFUL_CLOSE festgelegt ist, führt das Auslagerungsziel eine ordnungsgemäße Trennung durch, indem ein FIN-Segment für die angegebene TCP-Verbindung gesendet wird.
Wenn vor dem FIN-Segment keine Benutzerdaten gesendet werden sollen, enthält die NET_BUFFER-Struktur, die der NET_BUFFER_LIST-Struktur zugeordnet ist, auf die der NetBufferList-Zeiger verweist, keine Daten. Wenn Benutzerdaten gesendet werden sollen, enthalten die speicherdeskriptor-Listen (MDLs), die der NET_BUFFER-Struktur zugeordnet sind, die zu sendenden Benutzerdaten.
Das Auslagerungsziel sollte nicht auf eine Bestätigung der übertragenen Benutzerdaten warten, bevor ein FIN-Segment gesendet wird. Das Auslagerungsziel kann nach der Übertragung der Benutzerdaten ein separates FIN-Segment senden, oder das Auslagerungsziel kann das FIN-Bit im TCP-Header des letzten gesendeten Segments von Benutzerdaten festlegen.
Aus Sicht des Auslagerungsziels schließt das Senden eines FIN-Segments die Sendehälfte der Verbindung. Das Senden eines FIN-Segments schließt jedoch nicht die Empfangshälfte der Verbindung. Der Remotehost beendet die Empfangshälfte der Verbindung, indem er eine der folgenden Aktionen an das Auslagerungsziel sendet:
- Ein FIN-Segment, das eine ordnungsgemäße Trennung anfordert.
- Ein RST-Segment, das eine abgebrochene Trennung anfordert.
Vor dem Auslagern des Zielaufrufs NdisTcpOffloadDisconnectComplete muss alle ausstehenden Sendeanforderungen für die Verbindung in derselben Reihenfolge abschließen, in der sie an das Auslagerungsziel übermittelt wurden.
Obligatorische Antwort auf eine Trennungsanforderung
Bei einem Auslagerungsziel darf eine Verbindungsanforderung nicht fehlschlagen, es sei denn, die angegebene TCP-Verbindung wird hochgeladen oder abgebrochen (z. B. weil der Remotehost ein RST-Segment für die Verbindung gesendet hat). Wenn ein Auslagerungsziel eine Trennungsanforderung fehlschlägt, führt der Hoststapel die Verbindungsanforderung später nicht erneut aus.
Freigeben von Verbindungsressourcen
Das Auslagerungsziel darf keine Ressourcen für die Verbindung freigeben, für die es entweder eine abgebrochene oder ordnungsgemäße Trennung ausgestellt hat, bis der Hoststapel die Auslagerung der Verbindung beendet.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Windows |
Kopfzeile | ndischimney.h (include Ndischimney.h) |
IRQL | Beliebige Ebene |