Share via


Klonen von Paketdatenverkehr

In diesem Thema wird beschrieben, wie erweiterbare Hyper-V-Switcherweiterungen Pakete klonen oder duplizieren und in den erweiterbaren Switchdatenpfad einfügen. Weitere Informationen zum Klonen von Paketen finden Sie unter Geklonte NET_BUFFER_LIST Strukturen.

Hinweis Auf dieser Seite wird davon ausgegangen, dass Sie mit den Informationen und Diagrammen unter Übersicht über den Hyper-V-Erweiterbaren Switch und die Hybridweiterleitung vertraut sind.

Hinweis In der erweiterbaren Switch-Schnittstelle werden NDIS-Filtertreiber als erweiterbare Switcherweiterungen bezeichnet, und der Treiberstapel wird als erweiterbarer Switchtreiberstapel bezeichnet. Weitere Informationen zu den Erweiterungen finden Sie unter Hyper-V Extensible Switch Extensions.

Erweiterbare Switchfilterungs- und Weiterleitungserweiterungen können geklonte Pakete in den ein- oder ausgehenden Datenpfad des erweiterbaren Switches einfügen, indem Sie die folgenden Richtlinien befolgen:

  • Die Erweiterung muss zunächst eine NET_BUFFER_LIST-Struktur für das geklonte Paket zuordnen. Die Erweiterung muss dann die Paketdaten aus dem ursprünglichen Paket in das geklonte Paket kopieren. Weitere Informationen zum Klonen von Paketen finden Sie unter Abgeleitete NET_BUFFER_LIST Strukturen.

  • Nachdem die Erweiterung eine NET_BUFFER_LIST-Struktur zugewiesen hat, muss sie die AllocateNetBufferListForwardingContext-Handlerfunktion aufrufen, um den erweiterbaren Switchweiterleitungskontext für das Paket zuzuweisen.

    Der Weiterleitungskontext befindet sich in den Out-of-Band-Daten (OOB) des Pakets. Sie enthält Weiterleitungsinformationen für das Paket, z. B. den Quellport und ein Array mit mindestens einem Zielport.

    Weitere Informationen zum Weiterleitungskontext finden Sie unter Hyper-V Extensible Switch Forwarding Context.

  • Die Erweiterung muss die OOB-Daten, einschließlich des vorhandenen Quellports, aus dem ursprünglichen Paket in das geklonte Paket kopieren, indem CopyNetBufferListInfo aufgerufen wird. Wenn die Erweiterung plant, das Paket in den Eingangsdatenpfad einzuschleusen, müssen auch die Zielports aus den OOB-Daten des ursprünglichen Pakets kopiert werden.

    Wenn die OOB-Daten kopiert werden, muss die Erweiterung die folgenden Richtlinien befolgen:

    • Wenn die Filtererweiterung plant, das Paket in den Eingangsdatenpfad einzufügen, muss copyNetBufferListInfo mit dem NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS Flag nicht angegeben aufgerufen werden. Dadurch werden die Zielports des ursprünglichen Pakets nicht in die geklonten Pakete kopiert. Wenn die Filtererweiterung dieses Paket in den Eingangsdatenpfad einfügt, werden dem Paket Zielports entweder durch eine zugrunde liegende Weiterleitungserweiterung (sofern im Treiberstapel aktiviert) oder den Miniportrand des erweiterbaren Switches hinzugefügt.

    • Wenn die Filtererweiterung plant, das Paket in den ausgehenden Datenpfad einzufügen, muss copyNetBufferListInfo mit dem angegebenen NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS Flag aufgerufen werden. Dadurch werden die Zielports des ursprünglichen Pakets in die geklonten Pakete kopiert.

  • Wenn die Filtererweiterung ein Paket klont oder dupliziert, das aus dem ausgehenden Datenpfad abgerufen wurde, kann sie die Zielports für das Paket ändern, nachdem CopyNetBufferListInfo mit dem angegebenen NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS-Flag aufgerufen wird. Weitere Informationen zu diesem Verfahren finden Sie unter Ändern der Quellportdaten eines Pakets für den erweiterbaren Switch.

  • Wenn die Weiterleitungserweiterung ein Paket klont oder dupliziert, das aus dem Eingangsdatenpfad abgerufen wurde, muss sie neue Zielports für das Paket hinzufügen, bevor sie das Paket in den Eingangsdatenpfad einschleust. Weitere Informationen zu diesem Verfahren finden Sie unter Hinzufügen von Extensible Switch-Zielportdaten zu einem Paket.

  • Nachdem die Erweiterung CopyNetBufferListInfo aufgerufen hat, werden dem Paket dieselben Quellportinformationen zugewiesen, die im ursprünglichen Paket enthalten waren.

    Die Erweiterung kann SetNetBufferListSource aufrufen, um die Quellportinformationen in den Out-of-Band-Daten (OOB) des Pakets zu ändern.

    Die Erweiterung möchte möglicherweise, dass das Paket so behandelt wird, als ob es von einem bestimmten Port stammt. Dadurch können die Richtlinien für diesen Port auf das Paket angewendet werden. Die Erweiterung ruft SetNetBufferListSource auf, um den Quellport für das Paket zu ändern.

    Es kann jedoch vorkommen, dass die Erweiterung den Quellportbezeichner des Pakets NDIS_SWITCH_DEFAULT_PORT_ID zuweisen möchte. Beispielsweise kann die Erweiterung den Quellportbezeichner auf NDIS_SWITCH_DEFAULT_PORT_ID für proprietäre Steuerungspakete festlegen, die an ein Gerät im externen Netzwerk gesendet werden.

  • Im Standard-NDIS-Datenpfad weisen nicht erweiterbare OOB-Switchdaten häufig unterschiedliche Werte auf, je nachdem, ob das Paket als Senden oder Empfangen angegeben wird. Beispielsweise ist die NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO OOB-Daten eine Vereinigung von Sende- und Empfangs-spezifischen Strukturen.

    Im erweiterbaren Switchdatenpfad werden alle Pakete durch den Erweiterungstreiberstapel verschoben, da sie sowohl senden als auch empfangen werden. Aus diesem Gründen befinden sich die nicht erweiterbaren OOB-Daten des Switches innerhalb der NET_BUFFER_LIST Struktur des Pakets entweder in einem Sende- oder Empfangsformat, während die Dauer des Flusses durch den Treiberstapel verläuft.

    Das Format dieser OOB-Daten hängt vom erweiterbaren Quellswitchport ab, von dem das Paket an den erweiterbaren Switch gelangt ist. Wenn der Quellport mit dem externen Netzwerkadapter verbunden ist, haben die OOB-Daten des nicht erweiterbaren Switches ein Empfangsformat. Für andere Ports haben diese OOB-Daten ein Sendeformat.

    Die Quellportinformationen werden in der NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO Union in den OOB-Daten der NET_BUFFER_LIST Struktur des Pakets gespeichert. Die Erweiterung ruft die Daten mithilfe des makros NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL ab.

    Hinweis Wenn die Erweiterung die NET_BUFFER_LIST Struktur eines Pakets klont, muss sie die nicht erweiterbaren Switch-OOB-Daten berücksichtigen, wenn sie die OOB-Daten hinzufügt oder ändert. Die Erweiterung kann CopyNetBufferListInfo aufrufen, um alle OOB-Daten aus einem Quellpaket in ein geklontes Paket zu kopieren. Diese Funktion behält das OOB-Sende- oder Empfangsformat bei, wenn die Daten in das Paket kopiert werden.

  • Wenn die Erweiterung ein Paket klont, befinden sich die geklonten Paketdaten im lokalen oder vertrauenswürdigen Arbeitsspeicher im übergeordneten Betriebssystem der übergeordneten Hyper-V-Partition. Auf diesen Arbeitsspeicher kann die untergeordnete Partition nicht zugreifen. Daher gilt es als "sicher" vor nicht synchronisierten Updates durch das Gastbetriebssystem, das in dieser Partition ausgeführt wird.

    Nachdem das ursprüngliche Paket geklont wurde, muss die Erweiterung die NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO Union im geklonten Paket mithilfe des makros NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL abrufen. Die Erweiterung muss das IsPacketDataSafe-Element auf TRUE festlegen. Dies gibt an, dass sich alle Paketdaten im vertrauenswürdigen Arbeitsspeicher befinden.

Das Filtern und Weiterleiten von Erweiterungen muss die folgenden Richtlinien zum Einfügen geklonter Pakete in den eingehenden oder ausgehenden Datenpfad befolgen:

  • Die Erweiterung muss NdisFSendNetBufferLists aufrufen, um das geklonte Paket in den Eingangsdatenpfad einzufügen. Die Erweiterung muss den SendFlags-Parameter mit den entsprechenden erweiterbaren Switchflags-Flageinstellungen festlegen. Weitere Informationen zu diesen Flageinstellungen finden Sie unter Hyper-V Extensible Switch Send and Receive Flags.

    Wenn NDIS die FilterSendNetBufferListsComplete-Funktion der Erweiterung aufruft , um die Sendeanforderung des geklonten Pakets abzuschließen, muss die Erweiterung FreeNetBufferListForwardingContext aufrufen, um den zugewiesenen Weiterleitungskontext freizustellen. Die Erweiterung muss dies tun, bevor sie die NET_BUFFER_LIST-Struktur für das Paket freigibt oder wiederverwendet.

    Hinweis Die Erweiterung muss das geklonte Paket in den Eingangsdatenpfad einfügen, wenn sie die Paketdaten oder den Quellport für ein Paket ändert, das sie aus dem ausgehenden Datenpfad abgerufen hat. Außerdem muss das geklonte Paket in den Eingangsdatenpfad eingefügt werden, wenn die Zielports des Pakets nicht beibehalten werden.

  • Die Erweiterung muss NdisFIndicateReceiveNetBufferLists aufrufen, um das geklonte Paket in den ausgehenden Datenpfad einzufügen. Die Erweiterung muss den ReceiveFlags-Parameter mit den entsprechenden erweiterbaren Switchflags-Einstellungen festlegen.

    Wenn NDIS die FilterReturnNetBufferLists-Funktion der Erweiterung aufruft , um die Empfangsanforderung des geklonten Pakets abzuschließen, muss die Erweiterung FreeNetBufferListForwardingContext aufrufen, bevor sie die NET_BUFFER_LIST-Struktur für das Paket freigibt oder wiederverwendet.

    Hinweis Bevor die Weiterleitungserweiterung NdisFIndicateReceiveNetBufferLists aufruft, muss sie die Zielports des geklonten Pakets ermittelt und diese Daten den OOB-Daten des Pakets hinzugefügt haben.

  • Wenn die Erweiterung die NET_BUFFER_LIST Struktur eines Pakets klont, muss sie den Besitz der NET_BUFFER_LIST Struktur des ursprünglichen Pakets behalten, bis die Sende- oder Empfangsanforderung des geklonten Pakets abgeschlossen ist. Die Erweiterung muss das ParentNetBufferList-Element der NET_BUFFER_LIST Struktur des geklonten Pakets verwenden, um eine Verbindung mit der NET_BUFFER_LIST Struktur des ursprünglichen Pakets herzustellen.

    Hinweis In NDIS 6.30 (Windows Server 2012) kann die Erweiterung den ParentNetBufferList-Member verwenden, um eine Verknüpfung mit dem ursprünglichen Paket herzustellen, dies ist jedoch nicht erforderlich. In NDIS 6.40 (Windows Server 2012 R2) und höher ist die Erweiterung erforderlich, um den ParentNetBufferList-Member zum Verknüpfen mit dem ursprünglichen Paket zu verwenden.

    Sobald die Sende- oder Empfangsanforderung des geklonten Pakets abgeschlossen ist, muss die Erweiterung die Sende- oder Empfangsanforderung des ursprünglichen Pakets abschließen.

    Hinweis Wenn die Erweiterung die NET_BUFFER_LIST Struktur eines Pakets geklont hat, kann sie die Sende- oder Empfangsanforderung des ursprünglichen Pakets abschließen, nachdem es geklont wurde.

  • Wenn die Erweiterung ein Paket klont, kann sie die Sende- oder Empfangsanforderung des ursprünglichen Pakets abschließen, sobald es geklont wird.

Wenn die Weiterleitungs- oder Filtererweiterung ein Paket im ausgehenden Datenpfad abruft, kann sie keine geklonte Version des Pakets in diesen Datenpfad einfügen, wenn die Erweiterung die Paketdaten geändert oder den Quellport geändert hat. Die Erweiterung kann diese Pakete jedoch in den Eingangsdatenpfad einfügen. Dadurch kann das Paket ordnungsgemäß über den erweiterbaren Switchdatenpfad weitergeleitet und gefiltert werden.

Hinweis Filtererweiterungen können nur geklonte Pakete in den Eingangsdatenpfad einfügen, wenn die Zielports des Pakets nicht beibehalten werden.

Angenommen, ein Paket mit mehreren Zielports wurde im ausgehenden Datenpfad des erweiterbaren Switches abgerufen. Wenn ein Zielport eine besondere Behandlung erfordert, z. B. die Datenkapselung, führt die Weiterleitungs- oder Filtererweiterung die folgenden Schritte aus:

  1. Schließen Sie die Paketübermittlung an den Port aus, der eine spezielle Behandlung erfordert. Dazu legt die Erweiterung das IsExcluded-Element der NDIS_SWITCH_PORT_DESTINATION Struktur des Zielports auf den Wert 1 fest. Weitere Informationen zu diesem Verfahren finden Sie unter Ausschließen der Paketübermittlung an extensible Switch-Zielports.

  2. Klonen Sie das ursprüngliche Paket, und führen Sie die erforderliche Verarbeitung der Paketdaten aus.

    Hinweis Die Filtererweiterung darf keinen Zielport für das geklonte Paket hinzufügen. Diese Daten werden später durch die Weiterleitungserweiterung oder den Miniportrand des erweiterbaren Switches hinzugefügt.

  3. Leiten Sie das ursprüngliche Paket im ausgehenden Datenpfad weiter, indem Sie NdisMIndicateReceiveNetBufferLists aufrufen.

  4. Führen Sie das geklonte Paket in den Eingangsdatenpfad ein, indem Sie NdisFSendNetBufferLists aufrufen.

Weitere Informationen zu den erweiterbaren Ein- und Ausgehenden Switch-Datenpfaden finden Sie unter Hyper-V Extensible Switch Data Path.

Hinweis Bei der Erfassung von Erweiterungen kann kein Paketdatenverkehr geklont werden. Sie können jedoch Paketdatenverkehr entstammen. Weitere Informationen finden Sie unter Ursprungspaketdatenverkehr.