NDIS_TCP_OFFLOAD_EVENT_INDICATE Rückruffunktion (ndischimney.h)

[Das TCP-Schornsteinauslagerungsfeature ist veraltet und sollte nicht verwendet werden.]

Ein Auslagerungsziel ruft die NdisTcpOffloadEventHandler-Funktion auf, um ein Ereignis anzugeben, das sich auf eine ausgeladene TCP-Verbindung bezieht.

Syntax

NDIS_TCP_OFFLOAD_EVENT_INDICATE NdisTcpOffloadEventIndicate;

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

Parameter

[in] NdisOffloadHandle

Ein Handle, das die ausgeladene TCP-Verbindung identifiziert, für die die Angabe erfolgt. Wenn die Verbindung entladen wurde, wurde dieses Handle im NdisOffloadHandle-Element des NDIS_MINIPORT_OFFLOAD_BLOCK_LIST Struktur, die dem Verbindungsstatus zugeordnet war.

[in] EventType

Das Ereignis, das als einer der folgenden TCP_OFFLOAD_EVENT_TYPE-Werte angegeben wird:

TcpIndicateDisconnect

Gibt an, dass der Remotehost eine ordnungsgemäße Trennung initiiert hat, indem er ein FIN-Segment für die Verbindung sendet.

TcpIndicateRetrieve

Gibt an, dass das Auslagerungsziel den Hoststapel anfordert, die Auslagerung einer TCP-Verbindung zu beenden.

TcpIndicateAbort

Gibt an, dass der Remotehost eine abgebrochene Trennung initiiert hat, indem ein akzeptables RST-Segment für die Verbindung gesendet wird.

TcpIndicateSendBacklogChange

Gibt eine Änderung der bevorzugten Größe des Sendebacklogs an.

[in] EventSpecificInformation

Gibt zusätzliche Informationen zu dem Ereignis an, das wie folgt angegeben wird:

TcpIndicateDisconnect

Nicht sinnvoll.

TcpIndicateRetrieve

Gibt den Grund für die Uploadanforderung als TCP_UPLOAD_REASON Wert an. Weitere Informationen finden Sie im Abschnitt Hinweise.

TcpIndicateAbort

Nicht sinnvoll.

TcpIndicateSendBacklogChange

Gibt die optimale Anzahl von Sendedatenbytes an, die der Hoststapel am Auslagerungsziel ausstehen soll.

Rückgabewert

Keine

Bemerkungen

Hinweis auf eine ordnungsgemäße Trennung

Ein Auslagerungsziel sollte nur dann auf eine ordnungsgemäße Trennung hinweisen, wenn:
  • Es hat ein FIN-Segment vom Remotehost empfangen.
  • Alle Daten, die vor dem Empfang des FIN-Segments über die Verbindung empfangen wurden, wurden von der Clientanwendung genutzt (d. h., es sind keine Empfangsdaten in der Verbindung anzugeben).
Das Auslagerungsziel darf die Ressourcen für die Verbindung erst freigeben, wenn der Hoststapel die Auslagerung der Verbindung beendet.

Beachten Sie, dass bei einer ordnungsgemäßen Trennung nur die Empfangshälfte der Verbindung heruntergefahren wird. Die Sendehälfte der Verbindung wird nicht beendet.

Hinweis auf eine abbruchende Trennung

Wenn ein Auslagerungsziel ein akzeptables RST-Segment für eine TCP-Verbindung empfängt, muss folgendes erforderlich sein:
  1. Markieren Sie in ihrem internen Zustand für die Verbindung die Verbindung als abgebrochen.
  2. Rufen Sie die NdisTcpOffloadEventHandler-Funktion mit einem EventType von TcpIndicateAbort auf.
    Hinweis Wenn der Miniport das TcpIndicateAbort-Ereignis angibt, beendet der TCP/IP-Stapel des Hosts die Auslagerung der Verbindung. Das Auslagerungsziel kann das TcpIndicateAbort-Ereignis angeben, sobald das RST-Segment eintrifft.
     
  3. Schließen Sie alle ausstehenden Sendeanforderungen ab, und trennen Sie die Verbindungsanforderungen mit NDIS_STATUS_REQUEST_ABORTED. Das Auslagerungsziel schreibt diesen status Wert in den Status-Member jeder NET_BUFFER_LIST-Struktur in der verknüpften Liste, die an die NdisTcpOffloadSendComplete-Funktion oder NdisTcpOffloadDisconnectComplete-Funktion .
Das Auslagerungsziel darf die Ressourcen für die Verbindung erst freigeben, wenn der Hoststapel die Auslagerung der Verbindung beendet.

Anfordern der Beendigung einer TCP-Verbindung

Das Auslagerungsziel gibt den Grund für die Beendigungsanforderung als TCP_UPLOAD_REASON Wert im EventSpecificInformation-Parameter an, den es an die NdisTcpOffloadEventHandler-Funktion übergibt. Als Antwort ruft der Hoststapel die MiniportTerminateOffload-Funktion des Auslagerungsziels auf.

Das Auslagerungsziel kann nur die Beendigung einer TCP-Verbindung pro Aufruf von NdisTcpOffloadEventHandler anfordern. Das Auslagerungsziel kann nicht die Beendigung eines benachbarten Zustandsobjekts oder eines Pfadzustandsobjekts anfordern. Nur der Hoststapel kann die Beendigung eines Nachbar- oder Pfadzustandsobjekts initiieren.

In der folgenden Tabelle werden Ereignisse oder Umstände beschrieben, die dazu führen können, dass ein Auslagerungsziel die Beendigung der Auslagerung einer TCP-Verbindung angibt.

Die Spalte ganz rechts gibt für jede TCP_UPLOAD_REASON an, ob der Hoststapel die Verbindung immer hochlädt (obligatorisch) oder ob die Verbindung hochgeladen werden kann (optional). In den obligatorischen Fällen setzt ein Auslagerungsziel die Verarbeitung der ausgeladenen Verbindung nicht fort. In den optionalen Fällen muss ein Auslagerungsziel in der Lage sein, die Verarbeitung für die ausgeladene Verbindung fortzusetzen, wenn der Hoststapel die Auslagerung dieser Verbindung nicht beendet.

Ereignis/Umstand TCP_UPLOAD_REASON Beenden der TCP-Verbindung durch den Hoststapel
Der Hardwarezustand, der zum Nachverfolgen der Verbindung verwendet wird, ist beschädigt. HardwareFailure Obligatorisch.
Das Ziel hat versucht, Daten über eine TCP-Verbindung zu senden, die von einem ungültigen Zustandsobjekt abhängt. InvalidState Obligatorisch.
Das Auslagerungsziel empfängt ein Segment, in dem das URG-Bit im TCP-Header festgelegt ist. Beachten Sie, dass das Auslagerungsziel keine ACK sendet, um die dringenden Daten zu bestätigen. ReceivedUrgentData Obligatorisch.
Für die TCP-Verbindung ist ein Timeout aufgetreten. TimeoutExpiration Obligatorisch.
Das Auslagerungsziel fordert aus einem nicht angegebenen Grund einen Upload an. UploadRequested Obligatorisch.
Das Auslagerungsziel hat erkannt, dass zu viele Übertragungssegmente auf der TCP-Verbindung abgelegt werden. HighDropRate Optional
Das Auslagerungsziel hat erkannt, dass zu viele Fragmente für die TCP-Verbindung empfangen werden. HighFragmentation Optional
Das Auslagerungsziel hat zu viele Out-of-Order-Segmente für die TCP-Verbindung empfangen. HighOutofOrderPackets Optional
Die Aktivität (sendet/empfängt) für die TCP-Verbindung ist zu niedrig. LowActivity Optional
Es gibt keine vorab bereitgestellten Empfangspuffer für die TCP-Verbindung. NoBufferProposting Optional
Die empfangenen Puffer, die für die TCP-Verbindung bereitgestellt werden, sind zu klein. SmallIO Optional
 

Das Auslagerungsziel darf die Beendigung einer halb geschlossenen TCP-Verbindung nicht initiieren, wenn sich diese Verbindung in einem der folgenden Zustände befindet:

  • FIN_WAIT1: Der lokale Hoststapel hat die TCP-Verbindung geschlossen, aber die Verbindung empfängt möglicherweise weiterhin Daten vom Remoteendpunkt.
  • FIN_WAIT2: Der lokale Host hat die TCP-Verbindung geschlossen und einen ACK für das gesendete FIN-Segment empfangen, aber die entladene Verbindung empfängt möglicherweise weiterhin Daten vom Remotehost.
  • CLOSE_WAIT: Der lokale Host sendet möglicherweise weiterhin Daten.
Ein Auslagerungsziel kann die Beendigung aller TCP-Verbindungen anfordern, die an dieses entladen wurden. Weitere Informationen finden Sie unter NdisMOffloadEventIndicate.

Angeben einer Änderung der Größe des Sendebacklogs

Die Größe des Sendebacklogs kann eine Funktion der Roundtripzeit (RTT) für die Verbindung, die Schnittstellenbandbreite und andere Parameter sein. Die spezifischen Variablen und der Algorithmus, die das Auslagerungsziel verwendet, um die Größe des Sendebacklogs zu berechnen, sind implementierungsspezifisch. Ein Auslagerungsziel könnte beispielsweise das Minimum des Bandbreitenverzögerungsprodukts und das angekündigte Empfangsfenster als Algorithmus verwenden. Beachten Sie jedoch, dass die Größe des Sendebacklogs nicht abhängig von der Anzahl der Datenbytes variiert, die derzeit für die Übertragung über die Verbindung gebucht werden.

Das Auslagerungsziel sollte einen Drosselungsmechanismus implementieren, um sicherzustellen, dass das Auslagerungsziel kein SendBacklogSize-Ereignis angibt, wenn sich der Wert für SendBacklogSize zu häufig oder zu klein ändert. Dadurch wird verhindert, dass ein Sturm von Ereignisanzeigen auftritt.

Anforderungen

Anforderung Wert
Zielplattform Universell
Header ndischimney.h (include Ndischimney.h)
IRQL DISPATCH_LEVEL

Weitere Informationen

Angeben von TCP-Chimney-Specific-Ereignissen

MiniportInitiateOffload

MiniportTerminateOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

Reagieren auf den Empfang eines FIN- oder RST-Segments