Partager via


Clonage du trafic de paquets

Cette rubrique décrit comment les extensions de commutateur extensible Hyper-V clonent ou dupliquez des paquets et les injectent dans le chemin de données du commutateur extensible. Pour plus d’informations sur le clonage des paquets, consultez Structures NET_BUFFER_LIST clonées.

Note Cette page suppose que vous êtes familiarisé avec les informations et les diagrammes dans Vue d’ensemble du commutateur extensible Hyper-V et du transfert hybride.

Note Dans l’interface de commutateur extensible, les pilotes de filtre NDIS sont appelés extensions de commutateur extensible et la pile de pilotes est appelée pile de pilotes de commutateur extensible. Pour plus d’informations sur les extensions, consultez Extensions de commutateur extensible Hyper-V.

Les extensions de filtrage et de transfert de commutateur extensible peuvent injecter des paquets cloné dans le chemin d’entrée ou de sortie des données du commutateur extensible en suivant ces instructions :

  • L’extension doit d’abord allouer une structure NET_BUFFER_LIST pour le paquet cloné. L’extension doit ensuite copier les données de paquet du paquet d’origine vers le paquet cloné. Pour plus d’informations sur la façon de cloner des paquets, consultez Structures NET_BUFFER_LIST dérivées.

  • Une fois que l’extension alloue une structure NET_BUFFER_LIST , elle doit appeler la fonction de gestionnaire AllocateNetBufferListForwardingContext pour allouer le contexte de transfert de commutateur extensible pour le paquet.

    Le contexte de transfert réside dans les données hors bande (OOB) du paquet. Il contient des informations de transfert pour le paquet, telles que son port source et un tableau d’un ou plusieurs ports de destination.

    Pour plus d’informations sur le contexte de transfert, consultez Contexte de transfert de commutateur extensible Hyper-V.

  • L’extension doit copier les données OOB, y compris le port source existant, du paquet d’origine vers le paquet cloné en appelant CopyNetBufferListInfo. Si l’extension prévoit d’injecter le paquet dans le chemin des données d’entrée, elle doit également copier les ports de destination à partir des données OOB du paquet d’origine.

    Lorsqu’elle copie les données OOB, l’extension doit suivre les instructions suivantes :

    • Si l’extension de filtrage prévoit d’injecter le paquet dans le chemin des données d’entrée, elle doit appeler CopyNetBufferListInfo avec l’indicateur NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS non spécifié. Cela empêche la copie des ports de destination du paquet d’origine dans les paquets clonés. Lorsque l’extension de filtrage injecte ce paquet dans le chemin de données d’entrée, les ports de destination sont ajoutés au paquet par une extension de transfert sous-jacente (si activée dans la pile de pilotes) ou par le bord miniport du commutateur extensible.

    • Si l’extension de filtrage prévoit d’injecter le paquet dans le chemin de données de sortie, elle doit appeler CopyNetBufferListInfo avec l’indicateur NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS spécifié. Cela entraîne la copie des ports de destination du paquet d’origine dans les paquets clonés.

  • Si l’extension de filtrage clone ou duplique un paquet obtenu à partir du chemin de données de sortie, elle peut modifier les ports de destination du paquet après avoir appelé CopyNetBufferListInfo avec l’indicateur NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS spécifié. Pour plus d’informations sur cette procédure, consultez Modification des données de port source du commutateur extensible d’un paquet.

  • Si l’extension de transfert clone ou duplique un paquet obtenu à partir du chemin des données d’entrée, elle doit ajouter de nouveaux ports de destination pour le paquet avant d’injecter le paquet dans le chemin de données d’entrée. Pour plus d’informations sur cette procédure, consultez Ajout de données de port de destination de commutateur extensible à un paquet.

  • Une fois que l’extension a appelé CopyNetBufferListInfo, le paquet reçoit les mêmes informations de port source que celles contenues dans le paquet d’origine.

    L’extension peut appeler SetNetBufferListSource pour modifier les informations de port source dans les données hors bande (OOB) du paquet.

    L’extension peut souhaiter que le paquet soit traité comme s’il provient d’un port particulier. Cela permet d’appliquer les stratégies de ce port au paquet. L’extension appelle SetNetBufferListSource pour modifier le port source du paquet.

    Toutefois, il peut arriver que l’extension souhaite affecter l’identificateur de port source du paquet à NDIS_SWITCH_DEFAULT_PORT_ID. Par exemple, l’extension peut vouloir définir l’identificateur de port source sur NDIS_SWITCH_DEFAULT_PORT_ID pour les paquets de contrôle propriétaires envoyés à un appareil sur le réseau externe.

  • Dans le chemin de données NDIS standard, les données OOB de commutateur non extensible ont souvent des valeurs différentes selon que le paquet est indiqué comme un envoi ou une réception. Par exemple, le NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO données OOB est une union de structures spécifiques à l’envoi et à la réception

    Dans le chemin de données du commutateur extensible, tous les paquets se déplacent dans la pile du pilote d’extension à la fois en tant qu’envois et réceptions. Pour cette raison, les données OOB du commutateur non extensible dans la structure NET_BUFFER_LIST du paquet seront au format d’envoi ou de réception pendant la durée du flux via la pile de pilotes.

    Le format de ces données OOB dépend du port de commutateur extensible source à partir duquel le paquet est arrivé au commutateur extensible. Si le port source est connecté à la carte réseau externe, les données OOB du commutateur non extensible seront dans un format de réception. Pour les autres ports, ces données OOB seront au format d’envoi.

    Les informations de port source sont stockées dans l’union NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO dans les données OOB de la structure NET_BUFFER_LIST du paquet. L’extension obtient les données à l’aide de la macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL .

    Note Si l’extension clone la structure NET_BUFFER_LIST d’un paquet, elle doit tenir compte des données OOB du commutateur non extensible si elle ajoute ou modifie les données OOB. L’extension peut appeler CopyNetBufferListInfo pour copier toutes les données OOB d’un paquet source vers un paquet cloné. Cette fonction conserve le format d’envoi ou de réception OOB lorsque les données sont copiées dans le paquet.

  • Lorsque l’extension clone un paquet, les données de paquet clonées se trouvent dans la mémoire locale ou approuvée dans le système d’exploitation parent de la partition parente Hyper-V. Cette mémoire n’est pas accessible par la partition enfant. Par conséquent, il est considéré comme « sécurisé » contre les mises à jour non synchronisées par le système d’exploitation invité qui s’exécute dans cette partition.

    Une fois le paquet d’origine cloné, l’extension doit obtenir l’union NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO dans le paquet cloné à l’aide de la macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . L’extension doit définir le membre IsPacketDataSafe sur TRUE. Cela spécifie que toutes les données de paquet se trouvent dans la mémoire approuvée.

Les extensions de filtrage et de transfert doivent suivre ces instructions pour injecter des paquets clonés dans le chemin des données d’entrée ou de sortie :

  • L’extension doit appeler NdisFSendNetBufferLists pour injecter le paquet cloné dans le chemin des données d’entrée. L’extension doit définir le paramètre SendFlags avec les paramètres d’indicateur de commutateur extensible appropriés. Pour plus d’informations sur ces paramètres d’indicateur, consultez Indicateurs d’envoi et de réception du commutateur extensible Hyper-V.

    Lorsque NDIS appelle la fonction FilterSendNetBufferListsComplete de l’extension pour terminer la demande d’envoi du paquet cloné, l’extension doit appeler FreeNetBufferListForwardingContext pour libérer le contexte de transfert alloué. L’extension doit effectuer cette opération avant de libérer ou de réutiliser la structure NET_BUFFER_LIST pour le paquet.

    Note L’extension doit injecter le paquet cloné dans le chemin des données d’entrée si elle modifie les données de paquet ou le port source d’un paquet qu’elle a obtenu à partir du chemin de données de sortie. Il doit également injecter le paquet cloné dans le chemin des données d’entrée si les ports de destination du paquet ne sont pas conservés.

  • L’extension doit appeler NdisFIndicateReceiveNetBufferLists pour injecter le paquet cloné dans le chemin des données de sortie. L’extension doit définir le paramètre ReceiveFlags avec les paramètres d’indicateur de commutateur extensible appropriés.

    Lorsque NDIS appelle la fonction FilterReturnNetBufferLists de l’extension pour terminer la demande de réception du paquet cloné, l’extension doit appeler FreeNetBufferListForwardingContext avant de libérer ou de réutiliser la structure NET_BUFFER_LIST pour le paquet.

    Note Avant que l’extension de transfert appelle NdisFIndicateReceiveNetBufferLists, elle doit avoir déterminé les ports de destination du paquet cloné et ajouté ces données aux données OOB du paquet.

  • Si l’extension clone la structure NET_BUFFER_LIST d’un paquet, elle doit conserver la propriété de la structure NET_BUFFER_LIST du paquet d’origine jusqu’à ce que la demande d’envoi ou de réception du paquet cloné soit terminée. L’extension doit utiliser le membre ParentNetBufferList de la structure NET_BUFFER_LIST du paquet cloné pour établir un lien avec la structure NET_BUFFER_LIST du paquet d’origine.

    Note Dans NDIS 6.30 (Windows Server 2012), l’extension peut utiliser le membre ParentNetBufferList pour établir un lien vers le paquet d’origine, mais elle n’est pas obligatoire. Dans NDIS 6.40 (Windows Server 2012 R2) et versions ultérieures, l’extension est requise pour utiliser le membre ParentNetBufferList pour établir un lien vers le paquet d’origine.

    Une fois la demande d’envoi ou de réception du paquet cloné terminée, l’extension doit terminer la demande d’envoi ou de réception du paquet d’origine.

    Note Si l’extension a cloné la structure NET_BUFFER_LIST d’un paquet, elle peut terminer la demande d’envoi ou de réception du paquet d’origine après son clonage.

  • Si l’extension clone un paquet, elle peut terminer la demande d’envoi ou de réception du paquet d’origine dès qu’il est cloné.

Si l’extension de transfert ou de filtrage obtient un paquet dans le chemin de données de sortie, elle ne peut pas injecter une version cloné du paquet dans ce chemin de données si l’extension a modifié les données du paquet ou modifié le port source. Toutefois, l’extension peut injecter ces paquets dans le chemin des données d’entrée. Cela permet au paquet d’être transféré et filtré correctement via le chemin de données de commutateur extensible.

Note Les extensions de filtrage ne peuvent injecter des paquets clonés dans le chemin de données d’entrée que si les ports de destination du paquet ne sont pas conservés.

Par exemple, supposons qu’un paquet avec plusieurs ports de destination a été obtenu dans le chemin de données de sortie du commutateur extensible. Si un port de destination nécessite une gestion spéciale, telle que l’encapsulation de données, l’extension de transfert ou de filtrage gère cela en procédant comme suit :

  1. Excluez la remise de paquets au port qui nécessite une gestion spéciale. Pour ce faire, l’extension définit le membre IsExcluded de la structure NDIS_SWITCH_PORT_DESTINATION du port de destination sur une valeur d’un. Pour plus d’informations sur cette procédure, consultez Exclusion de la remise de paquets aux ports de destination de commutateur extensible.

  2. Clonez le paquet d’origine et effectuez la gestion requise des données du paquet.

    Note L’extension de filtrage ne doit pas ajouter de port de destination pour le paquet cloné. Ces données seront ajoutées ultérieurement par l’extension de transfert ou le bord miniport du commutateur extensible.

  3. Transférez le paquet d’origine sur le chemin de données de sortie en appelant NdisMIndicateReceiveNetBufferLists.

  4. Injectez le paquet cloné sur le chemin des données d’entrée en appelant NdisFSendNetBufferLists.

Pour plus d’informations sur les chemins de données d’entrée et de sortie des commutateurs extensibles, consultez Chemin des données de commutateur extensible Hyper-V.

Note La capture d’extensions ne peut pas cloner le trafic de paquets. Toutefois, ils peuvent provenir du trafic de paquets. Pour plus d’informations, consultez Originating Packet Traffic.