W_TCP_OFFLOAD_RECEIVE_HANDLER Rückruffunktion (ndischimney.h)
[Das TCP-Schornsteinauslagerungsfeature ist veraltet und sollte nicht verwendet werden.]
NDIS ruft die MiniportTcpOffloadReceive-Funktion auf, um Empfangsanforderungen (Empfangspuffer) für eine ausgeladene TCP-Verbindung zu posten.
Syntax
W_TCP_OFFLOAD_RECEIVE_HANDLER WTcpOffloadReceiveHandler;
NDIS_STATUS WTcpOffloadReceiveHandler(
[in] IN NDIS_HANDLE MiniportAdapterContext,
[in] IN PVOID MiniportOffloadContext,
[in] IN PNET_BUFFER_LIST NetBufferList
)
{...}
Parameter
[in] MiniportAdapterContext
Das Handle für einen kontextbezogenen Ablagezielbereich, in dem das Auslagerungsziel Zustandsinformationen zu diesem instance des Adapters verwaltet. Der Miniporttreiber hat dieses Handle für NDIS bereitgestellt, wenn er 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 Miniport-Auslagerungskontext, der das Zustandsobjekt für die TCP-Verbindung enthält, für die die Empfangsanforderungen gepostet werden. Das Auslagerungsziel hat diesen PVOID-Wert beim Ausladen des TCP-Verbindungszustandsobjekts angegeben.
[in] NetBufferList
Ein Zeiger auf eine NET_BUFFER_LIST-Struktur . Bei dieser Struktur kann es sich um eine eigenständige Struktur oder die erste Struktur in einer verknüpften Liste von NET_BUFFER_LIST Strukturen handeln. Jede NET_BUFFER_LIST Struktur in der Liste beschreibt eine NET_BUFFER Struktur. Die NET_BUFFER-Struktur wird einer Kette von Speicherdeskriptorlisten (MDLs) zugeordnet. Die NET_BUFFER_LIST und die zugeordneten Strukturen sind gesperrt, sodass sie im physischen Speicher verbleiben. Sie werden jedoch nicht dem Systemspeicher zugeordnet.
Rückgabewert
NDIS_STATUS_PENDING ist der einzige Zulässige Rückgabewert. Ein Auslagerungsziel schließt (gibt) gesendete Empfangsanforderungen immer asynchron ab (gibt zurück), indem es aufruft NdisTcpOffloadReceiveComplete.
Hinweise
Eine Clientanwendung kann Empfangsanforderungen für eine ausgeladene TCP-Verbindung posten. Das Auslagerungsziel verwendet diese Anforderungen, um Daten zu übertragen, die bei der Verbindung mit der Clientanwendung empfangen werden. Wenn Empfangsanforderungen für eine Verbindung gepostet werden, sollte das Auslagerungsziel diese immer verwenden, um Daten zu übertragen, die über die Verbindung empfangen werden. Weitere Informationen finden Sie unter Übermittlungsalgorithmus.
Das Auslagerungsziel stellt die bereitgestellten NET_BUFFER_LIST Strukturen in der FiFO-Reihenfolge (first in, first out) in die Warteschlange. Das Auslagerungsziel verwendet den MiniportReserved-Member jeder NET_BUFFER_LIST-Struktur, um die Struktur in die Warteschlange zu stellen.
Jeder NET_BUFFER_LIST Struktur, die an die MiniportTcpOffloadReceive-Funktion übergeben wird, ist nur eine NET_BUFFER Struktur zugeordnet.
Das Auslagerungsziel sollte Empfangsdaten in fifo-Reihenfolge in die bereitgestellten Empfangsanforderungen einfügen. Das heißt, Daten, die zuerst empfangen wurden, sollten in die erste bereitgestellte Empfangsanforderung eingefügt werden usw.
Der Hoststapel serialisiert Aufrufe der MiniportTcpOffloadReceive-Funktion pro Verbindung. Der Hoststapel ruft die MiniportTcpOffloadReceive-Funktion für eine Verbindung nicht auf, während ein Aufruf der MiniportTcpOffloadReceive-Funktion für diese Verbindung ausgeführt wird. Dadurch wird sichergestellt, dass Empfangsanforderungen immer in der richtigen Reihenfolge an die MiniportTcpOffloadReceive-Funktion eines Auslagerungsziels gesendet werden.
Beachten Sie jedoch, dass der Hoststapel die MiniportTcpOffloadReceive-Funktion für eine Verbindung aufrufen kann, bevor das Auslagerungsziel einen oder mehrere vorherige Aufrufe der MiniportTcpOffloadReceive-Funktion für dieselbe Verbindung abgeschlossen hat. Beachten Sie auch, dass der Hoststapel die MiniportTcpOffloadReceive-Funktion eines Auslagerungsziels für eine Verbindung aufrufen kann, während mindestens ein Aufruf der MiniportTcpOffloadReceive-Funktion für eine andere Verbindung ausgeführt wird.
Eine bereitgestellte Empfangsanforderung kann optional in einem der beiden Modi erfolgen:
- Pushmodus
- Nonpush-Modus
Um zu bestimmen, in welchem Modus sich ein Puffer befindet, ruft ein Auslagerungsziel das NET_BUFFER_LIST_INFO Makro auf, um den Wert von TcpReceiveNoPush abzurufen. Wenn der Wert TRUE ist, befindet sich die Empfangsanforderung im Nonpush-Modus.
Wenn sich die Empfangsanforderung im Pushmodus befindet, ruft das Auslagerungsziel den Wert von TcpReceiveBytesTransferred ab, indem das Makro NET_BUFFER_LIST_INFO aufgerufen wird. Wenn dieser Wert ungleich 0 ist, startet das Auslagerungsziel sofort den Pushtimer für die Verbindung. Wenn dieser Wert null ist, startet das Auslagerungsziel den Pushtimer für die Verbindung, sobald das Auslagerungsziel das erste Byte der Empfangsdaten in die Empfangsanforderung eingibt. Das Auslagerungsziel schließt ausgefüllte Empfangsanforderungen immer sofort ab. Das Auslagerungsziel schließt eine teilweise ausgefüllte Empfangsanforderung ab, die sich im Pushmodus befindet, wenn eine der folgenden Aktionen auftritt:
- Der Pushtimer läuft ab.
- Das Auslagerungsziel empfängt ein TCP-Segment für die Verbindung, für die das PSH-Bit festgelegt ist.
Wenn Daten bei einer ausgeladenen Verbindung empfangen werden, während der Pushtimer ausgeführt wird, muss das Auslagerungsziel den Pushtimer für diese Verbindung neu starten.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Windows |
Kopfzeile | ndischimney.h (include Ndischimney.h) |
IRQL | Beliebige Ebene |