Hinzufügen von Zielportdaten für den erweiterbaren Switch zu einem Paket
In diesem Thema wird beschrieben, wie Erweiterungen für die Hyper-V-Erweiterungsswitchweiterleitung die Übermittlung von Paketen an einen oder mehrere Zielports angeben können. Diese Erweiterungen können auch Pakete an einzelne physische Netzwerkadapter weiterleiten, die an den erweiterbaren externen Switch-Netzwerkadapter gebunden sind.
Hinweis Nur eine Weiterleitungserweiterung oder der Switch selbst kann Pakete an erweiterbare Switchports oder einzelne Netzwerkadapter weiterleiten.
Die folgende Abbildung zeigt den Datenpfad für Paketdatenverkehr über den erweiterbaren Switchtreiberstapel für NDIS 6.40 (Windows Server 2012 R2) und höher. Beide Abbildungen zeigen auch den Datenpfad für den Paketdatenverkehr zu oder von den Netzwerkadaptern, die mit erweiterbaren Switchports verbunden sind.
Die folgende Abbildung zeigt den Datenpfad für Paketdatenverkehr über den erweiterbaren Switchtreiberstapel für NDIS 6.30 (Windows Server 2012).
Jeder erweiterbare Switchzielport wird von einem NDIS_SWITCH_PORT_DESTINATION-Element innerhalb der NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY-Struktur angegeben. Dieses Array ist im Out-of-Band-Weiterleitungskontext (OOB) der NET_BUFFER_LIST-Struktur des Pakets enthalten. Weitere Informationen zu diesem Kontext finden Sie unter Hyper-V Extensible Switch Forwarding Context.For more information on this context, see Hyper-V Extensible Switch Forwarding Context.
Wenn eine Weiterleitungserweiterung im erweiterbaren Switchtreiberstapel gebunden und aktiviert ist, ist sie für die Bestimmung der Zielports für jedes Paket verantwortlich, das aus dem erweiterbaren Switch-Eingangsdatenpfad abgerufen wird, es sei denn, es handelt sich bei dem Paket um ein NVGRE-Paket. Weitere Informationen zu diesem Datenpfad finden Sie unter Übersicht über den Datenpfad des erweiterbaren Hyper-V-Switches. Weitere Informationen zu NVGRE-Paketen finden Sie unter HybridWeiterleitung.
Hinweis Wenn eine Weiterleitungserweiterung im Treiberstapel nicht gebunden oder aktiviert ist, bestimmt der erweiterbare Switch die Zielports für Pakete, die er aus dem Eingangsdatenpfad abruft.
Die Weiterleitungserweiterung muss diese Richtlinien befolgen, wenn sie die Zielports für ein Paket bestimmt, das im Eingangsdatenpfad abgerufen wurde:
Die Erweiterung muss eine NDIS_SWITCH_PORT_DESTINATION-Struktur innerhalb der NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY-Struktur mit den Zielportinformationen initialisieren.
Wenn der Zielport nicht mit dem externen Netzwerkadapter verbunden ist, muss die Erweiterung den NicIndex-Member der NDIS_SWITCH_PORT_DESTINATION-Struktur auf NDIS_SWITCH_DEFAULT_NIC_INDEX festlegen.
Wenn der Zielport mit dem externen Netzwerkadapter für den erweiterbaren Switch verbunden ist, kann die Erweiterung den Index eines zugrunde liegenden physischen Netzwerkadapters angeben, an den die Sendeanforderung weitergeleitet werden soll. Dazu legt die Erweiterung den NicIndex-Member auf den wert ungleich null NDIS_SWITCH_NIC_INDEX des Zielnetzwerkadapters fest, der an den externen Netzwerkadapter gebunden ist.
Weitere Informationen finden Sie unter Weiterleiten von Paketen an physische Netzwerkadapter.
Die Erweiterung muss den OOB-Daten eines Pakets Nur für ports mit aktiven Netzwerkadapterverbindungen Zielports hinzufügen. Wenn die Erweiterung eine OID_SWITCH_NIC_DISCONNECT-Anforderung weitergeleitet hat, darf sie keinen Zielport hinzufügen, der dem getrennten Netzwerkadapter zugeordnet ist.
Um die Leistung zu verbessern, darf die Erweiterung nur Portziele hinzufügen, die für die Paketübermittlung gültig sind. In diesem Fall muss die Erweiterung den IsExcluded-Member der NDIS_SWITCH_PORT_DESTINATION-Struktur des Zielports auf FALSE festlegen.
Um die 802.1Q-VLAN-Daten (Virtual Local Area Network) in einem Paket beizubehalten, bevor sie an einen Port übermittelt werden, legt die Erweiterung das PreserveVLAN-Element auf TRUE fest.
Um die 802.1Q-VLAN-Daten (Virtual Local Area Network) in einem Paket zu entfernen, bevor sie an einen Port übermittelt werden, legt die Erweiterung das PreserveVLAN-Element auf FALSE fest.
Um die 802.1Q-Prioritätsdaten in einem Paket beizubehalten, bevor sie an einen Port übermittelt werden, legt die Erweiterung den PreservePriority-Member auf TRUE fest.
Um die 802.1Q-Prioritätsdaten in einem Paket zu entfernen, bevor sie an einen Port übermittelt werden, legt die Erweiterung den PreservePriority-Member auf FALSE fest.
Wenn die Weiterleitungserweiterung mehrere Zielports für ein Paket hinzufügt, müssen die folgenden Schritte ausgeführt werden:
Die Erweiterung greift zunächst mithilfe des makros NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL auf die NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO-Struktur des Pakets zu. Die Erweiterung liest dann den NumAvailableDestinations-Member , um zu bestimmen, wie viele nicht verwendete Zielportelemente im Zielportarray verfügbar sind. Wenn die Erweiterung mehr Zielports erfordert, als im Array verfügbar sind, muss sie die Funktion GrowNetBufferListDestinations aufrufen, um Speicherplatz für zusätzliche Zielports im Array zuzuweisen.
Wenn die Erweiterung GrowNetBufferListDestinations aufruft, wird der Parameter NumberOfNewDestinations auf die Anzahl der neuen Zielports festgelegt, die dem Paket hinzugefügt werden sollen.
Die Erweiterung legt auch den NetBufferLists-Parameter auf einen Zeiger auf die NET_BUFFER_LIST-Struktur des Pakets fest.
Hinweis Wenn im Array Zielports verfügbar sind, sollte die Erweiterung growNetBufferListDestinations nicht aufrufen.
Wenn die Funktion GrowNetBufferListDestinations erfolgreich zurückgegeben wird, wurden die zusätzlichen Zielports am Ende des Zielarrays in der NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY-Struktur hinzugefügt. Im Destinations-Parameter wird ein Zeiger auf diese Struktur zurückgegeben.
Hinweis Wenn die Funktion GrowNetBufferListDestinations die angeforderte Anzahl von Zielports nicht zuordnen kann, gibt sie NDIS_STATUS_RESOURCES zurück.
Die Erweiterung gibt neue Zielportelemente in der NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY-Struktur an. Die Erweiterung initialisiert jeden neuen Zielport als NDIS_SWITCH_PORT_DESTINATION-Struktur .
Die Erweiterung initialisiert neue Zielports für das Array ab dem NumDestinations-Offset . NumDestinations ist ein Element der NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY-Struktur .
Nachdem die Erweiterung das Hinzufügen oder Ändern von Zielportelementen abgeschlossen hat, muss sie UpdateNetBufferListDestinations aufrufen, um diese Änderungen zu committen.
Wenn die Erweiterung einen einzelnen Zielport für ein Paket hinzufügt, müssen die folgenden Schritte ausgeführt werden:
Die Erweiterung initialisiert die Zielportinformationen für das Paket in einer durch die Erweiterung zugewiesenen NDIS_SWITCH_PORT_DESTINATION-Struktur .
Die Erweiterung ruft AddNetBufferListDestination auf, um die Änderungen an die NET_BUFFER_LIST-Struktur für das Paket zu committen. Die Erweiterung übergibt die Adresse der NDIS_SWITCH_PORT_DESTINATION-Struktur im Destination-Parameter .
Hinweis Die Erweiterung sollte die UpdateNetBufferListDestinations-Funktion nicht aufrufen, um die Änderungen an ein Paket mit nur einem Zielport zu committen.
Wenn die Weiterleitungserweiterung AddNetBufferListDestination oder UpdateNetBufferListDestinations aufruft , um die Änderungen für Zielports zu committen, löscht die erweiterbare Switchschnittstelle nicht die erweiterbaren Switchports, die in den Elementen der NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY-Struktur angegeben sind. Nachdem der Sende- oder Empfangsvorgang des Pakets abgeschlossen ist, kann die Schnittstelle den Port bei Bedarf löschen.
Hinweis Nachdem die Weiterleitungserweiterung die Änderungen für Zielports in den Weiterleitungskontext committet hat, können Zielports nicht entfernt werden, und nur das IsExcluded-Element der NDIS_SWITCH_PORT_DESTINATION-Struktur eines Zielports kann geändert werden. Weitere Informationen finden Sie unter Ausschließen der Paketübermittlung an erweiterbare Switch-Zielports.
Die Weiterleitungserweiterung muss die Verarbeitung von OID-Set-Anforderungen (Object Identifier) von OID_SWITCH_NIC_DISCONNECT mit ihrem Code synchronisieren, der Zielports für den getrennten Netzwerkadapter hinzufügt.
Wenn filterOidRequest der Weiterleitungserweiterung für eine OID_SWITCH_NIC_DISCONNECT-Anforderung aufgerufen wird, kann die Erweiterung eine der folgenden Aktionen ausführen:
Wenn die Erweiterung NdisFOidRequest heißt, um diese OID-Anforderung weiterzuleiten, darf sie den Port mit dem getrennten Netzwerkadapter nicht als Zielport für das Paket angeben.
Hinweis Wenn der einzige Zielport für das Paket der mit dem getrennten Netzwerkadapter ist, muss die Erweiterung das Paket löschen.
Die Erweiterung kann NDIS_STATUS_PENDING zurückgeben, um die Anforderung asynchron abzuschließen. Dadurch kann die Erweiterung den Port mit dem getrennten Netzwerkadapter als Zielport für das Paket hinzufügen. Dadurch kann die Erweiterung auch AddNetBufferListDestination oder UpdateNetBufferListDestinations aufrufen und das Hinzufügen von Zielports zu einem Paket abschließen.
Die Erweiterung kann dies für Pakete tun, die sie an einen Port weiterleiten muss, bevor sie abgerissen wird.
Hinweis Wenn die Erweiterung NDIS_STATUS_PENDING zurückgibt, kann sie auch ReferenceSwitchPort aufrufen, um den Verweiszähler für den Port mit dem getrennten Netzwerkadapter zu erhöhen. Die Erweiterung kann die OID-Anforderung jedoch erst weiterleiten, nachdem Sie DereferenceSwitchPort aufgerufen hat, um den Verweiszähler für den Port zu dekrementieren.
Wenn die Anzahl der Zielports null ist, muss die Weiterleitungserweiterung NdisMSendNetBufferListsComplete aufrufen, um das Paket zu löschen. Die Erweiterung muss auch ReportFilteredNetBufferLists aufrufen, um die erweiterbare Switchschnittstelle über das gelöschte Paket zu benachrichtigen.
Hinweis Wenn die Weiterleitungserweiterung eine verknüpfte Liste von NET_BUFFER_LIST Strukturen für mehrere Pakete aus dem Eingangsdatenpfad abgerufen hat, sollte eine separate Liste gelöschter Pakete erstellt werden. Auf diese Weise kann die Erweiterung NdisMSendNetBufferListsComplete und ReportFilteredNetBufferLists nur einmal aufrufen.
Wenn die Anzahl der Zielports größer als 0 (null) ist, muss die Weiterleitungserweiterung NdisFSendNetBufferLists aufrufen, um das Paket über den Eingangsdatenpfad an den Miniportrand des erweiterbaren Switches weiterzuleiten.
Hinweis Wenn die Weiterleitungserweiterung eine verknüpfte Liste von NET_BUFFER_LIST Strukturen für mehrere Pakete aus dem Eingangsdatenpfad abgerufen hat, sollte eine separate Liste weitergeleiteter Pakete erstellt werden. Auf diese Weise kann die Erweiterung NdisFSendNetBufferLists nur einmal aufrufen, um die Liste der Pakete weiterzuleiten. Darüber hinaus sollte die Erweiterung separate Listen verwalten, um Pakete mit denselben Zielports weiterzuleiten. Weitere Informationen finden Sie unter Hyper-V Extensible Switch Send and Receive Flags.For more information, see Hyper-V Extensible Switch Send and Receive Flags.