Ajout de données de port de destination de commutateur extensible à un paquet

Cette rubrique décrit comment les extensions de transfert de commutateur extensible Hyper-V peuvent spécifier la remise de paquets à un ou plusieurs ports de destination. Ces extensions peuvent également transférer des paquets vers des cartes réseau physiques individuelles qui sont liées à la carte réseau externe du commutateur extensible.

Note Seule une extension de transfert ou le commutateur lui-même peut transférer des paquets vers des ports de commutateur extensibles ou des cartes réseau individuelles.

La figure suivante montre le chemin des données pour le trafic de paquets via la pile de pilotes de commutateur extensible pour NDIS 6.40 (Windows Server 2012 R2) et versions ultérieures. Les deux figures montrent également le chemin d’accès aux données pour le trafic de paquets vers ou depuis les cartes réseau connectées aux ports de commutateur extensibles.

Organigramme qui montre le chemin des données pour le trafic de paquets vers ou depuis les cartes réseau connectées aux ports de commutateur extensible pour NDIS 6.40 (Windows Server 2012 R2) et versions ultérieures.

La figure suivante montre le chemin des données pour le trafic de paquets via la pile de pilotes de commutateur extensible pour NDIS 6.30 (Windows Server 2012).

Organigramme qui montre le chemin des données pour le trafic de paquets vers ou depuis les cartes réseau connectées aux ports de commutateur extensible pour NDIS 6.30 (Windows Server 2012).

Chaque port de destination de commutateur extensible est spécifié par un élément NDIS_SWITCH_PORT_DESTINATION au sein de la structure NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Ce tableau est contenu dans le contexte de transfert hors bande (OOB) de la structure NET_BUFFER_LIST du paquet. Pour plus d’informations sur ce contexte, consultez Contexte de transfert de commutateur extensible Hyper-V.

Si une extension de transfert est liée et activée dans la pile de pilotes de commutateur extensible, elle est chargée de déterminer les ports de destination de chaque paquet obtenu à partir du chemin de données d’entrée du commutateur extensible, sauf s’il s’agit d’un paquet NVGRE. Pour plus d’informations sur ce chemin de données, consultez Vue d’ensemble du chemin des données du commutateur extensible Hyper-V. Pour plus d’informations sur les paquets NVGRE, consultez Transfert hybride.

Note Si une extension de transfert n’est pas liée ou activée dans la pile de pilotes, le commutateur extensible détermine les ports de destination des paquets qu’il obtient à partir du chemin des données d’entrée.

L’extension de transfert doit suivre ces instructions lorsqu’elle détermine les ports de destination d’un paquet obtenu sur le chemin des données d’entrée :

  • L’extension doit initialiser une structure NDIS_SWITCH_PORT_DESTINATION au sein de la structure NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY avec les informations du port de destination.

    Si le port de destination n’est pas connecté à la carte réseau externe, l’extension doit définir le membre NicIndex de la structure NDIS_SWITCH_PORT_DESTINATION sur NDIS_SWITCH_DEFAULT_NIC_INDEX.

    Si le port de destination est connecté à la carte réseau externe du commutateur extensible, l’extension peut spécifier l’index d’une carte réseau physique sous-jacente à laquelle transférer la demande d’envoi. Pour ce faire, l’extension définit le membre NicIndex sur la valeur NDIS_SWITCH_NIC_INDEX différente de zéro de la carte réseau de destination liée à la carte réseau externe.

    Pour plus d’informations, consultez Transfert de paquets vers des cartes réseau physiques.

  • L’extension doit ajouter des ports de destination aux données OOB d’un paquet uniquement pour les ports qui ont des connexions de carte réseau actives. Si l’extension a transféré une demande de OID_SWITCH_NIC_DISCONNECT , elle ne doit pas ajouter de port de destination associé à la carte réseau déconnectée.

  • Pour améliorer les performances, l’extension doit uniquement ajouter des destinations de port valides pour la remise de paquets. Dans ce cas, l’extension doit définir le membre IsExcluded de la structure NDIS_SWITCH_PORT_DESTINATION du port de destination sur FALSE.

  • Pour conserver les données de réseau local virtuel (VLAN) 802.1Q dans un paquet avant d’être remises à un port, l’extension définit le membre PreserveVLAN sur TRUE.

    Pour supprimer les données de réseau local virtuel (VLAN) 802.1Q dans un paquet avant d’être remises à un port, l’extension définit le membre PreserveVLAN sur FALSE.

  • Pour conserver les données de priorité 802.1Q dans un paquet avant d’être remises à un port, l’extension définit le membre PreservePriority sur TRUE.

    Pour supprimer les données de priorité 802.1Q dans un paquet avant leur remise à un port, l’extension définit le membre PreservePriority sur FALSE.

  • Si l’extension de transfert ajoute plusieurs ports de destination pour un paquet, elle doit suivre les étapes suivantes :

    1. L’extension accède d’abord à la structure NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO du paquet à l’aide de la macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . L’extension lit ensuite le membre NumAvailableDestinations pour déterminer le nombre d’éléments de port de destination inutilisés disponibles dans le tableau de ports de destination. Si l’extension nécessite plus de ports de destination que ceux disponibles dans le tableau, elle doit appeler la fonction GrowNetBufferListDestinations pour allouer de l’espace pour les ports de destination supplémentaires dans le tableau.

      Lorsque l’extension appelle GrowNetBufferListDestinations, elle définit le paramètre NumberOfNewDestinations sur le nombre de nouveaux ports de destination à ajouter au paquet.

      L’extension définit également le paramètre NetBufferLists sur un pointeur vers la structure NET_BUFFER_LIST du paquet.

      Note S’il existe des ports de destination disponibles dans le tableau, l’extension ne doit pas appeler GrowNetBufferListDestinations.

    2. Si la fonction GrowNetBufferListDestinations retourne correctement, elle a ajouté les ports de destination supplémentaires à la fin du tableau de destination dans la structure NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Un pointeur vers cette structure est retourné dans le paramètre Destinations .

      Note Si la fonction GrowNetBufferListDestinations ne peut pas allouer le nombre demandé de ports de destination, elle retourne NDIS_STATUS_RESOURCES.

    3. L’extension spécifie de nouveaux éléments de port de destination dans la structure NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . L’extension initialise chaque nouveau port de destination en tant que structure NDIS_SWITCH_PORT_DESTINATION .

      L’extension initialise les nouveaux ports de destination vers le tableau en commençant par le décalage NumDestinations . NumDestinations est un membre de la structure NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY .

    4. Une fois que l’extension a terminé d’ajouter ou de modifier des éléments de port de destination, elle doit appeler UpdateNetBufferListDestinations pour valider ces modifications.

  • Si l’extension ajoute un port de destination unique pour un paquet, elle doit suivre les étapes suivantes :

    1. L’extension initialise les informations de port de destination pour le paquet dans une structure de NDIS_SWITCH_PORT_DESTINATION allouée à l’extension .

    2. L’extension appelle AddNetBufferListDestination pour valider les modifications apportées à la structure NET_BUFFER_LIST pour le paquet. L’extension transmet l’adresse de la structure NDIS_SWITCH_PORT_DESTINATION dans le paramètre Destination .

      Note L’extension ne doit pas appeler la fonction UpdateNetBufferListDestinations pour valider les modifications apportées à un paquet avec un seul port de destination.

  • Lorsque l’extension de transfert appelle AddNetBufferListDestination ou UpdateNetBufferListDestinations pour valider les modifications pour les ports de destination, l’interface de commutateur extensible ne supprime pas les ports de commutateur extensible spécifiés dans les éléments de la structure NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Une fois l’opération d’envoi ou de réception de paquets terminée, l’interface est libre de supprimer le port si nécessaire.

    Note Une fois que l’extension de transfert a validé les modifications apportées aux ports de destination dans le contexte de transfert, les ports de destination ne peuvent pas être supprimés et seul le membre IsExcluded de la structure NDIS_SWITCH_PORT_DESTINATION d’un port de destination peut être modifié. Pour plus d’informations, consultez Exclusion de la remise de paquets aux ports de destination du commutateur extensible.

  • L’extension de transfert doit synchroniser sa gestion des demandes d’ensemble d’identificateur d’objet (OID) de OID_SWITCH_NIC_DISCONNECT avec son code qui ajoute des ports de destination pour la carte réseau déconnectée.

    Si le FilterOidRequest de l’extension de transfert est appelé pour une demande de OID_SWITCH_NIC_DISCONNECT , l’extension peut effectuer l’une des opérations suivantes :

    • Si l’extension appelée NdisFOidRequest pour transférer cette demande OID, elle ne doit pas spécifier le port avec la carte réseau déconnectée comme port de destination pour le paquet.

      Note Si le seul port de destination du paquet est celui avec la carte réseau déconnectée, l’extension doit supprimer le paquet.

    • L’extension peut retourner NDIS_STATUS_PENDING pour terminer la requête de manière asynchrone. Cela permet à l’extension d’ajouter le port avec la carte réseau déconnectée comme port de destination pour le paquet. Cela permet également à l’extension d’appeler AddNetBufferListDestinations ou UpdateNetBufferListDestinations et d’effectuer l’ajout de ports de destination à un paquet.

      L’extension souhaite peut-être effectuer cette opération pour les paquets qu’elle doit transférer vers un port avant d’être détruite.

      Note Si l’extension retourne NDIS_STATUS_PENDING, elle peut également appeler ReferenceSwitchPort pour incrémenter le compteur de références pour le port avec la carte réseau déconnectée. Toutefois, l’extension ne peut pas transférer la requête OID tant qu’elle n’a pas appelé DereferenceSwitchPort pour décrémenter le compteur de référence pour le port.

  • Si le nombre de ports de destination est égal à zéro, l’extension de transfert doit appeler NdisMSendNetBufferListsComplete pour supprimer le paquet. L’extension doit également appeler ReportFilteredNetBufferLists pour informer l’interface de commutateur extensible du paquet supprimé.

    Note Si l’extension de transfert a obtenu une liste liée de structures NET_BUFFER_LIST pour plusieurs paquets à partir du chemin des données d’entrée, elle doit créer une liste distincte de paquets supprimés. Ce faisant, l’extension peut appeler NdisMSendNetBufferListsComplete et ReportFilteredNetBufferLists une seule fois.

  • Si le nombre de ports de destination est supérieur à zéro, l’extension de transfert doit appeler NdisFSendNetBufferLists pour transférer le paquet sur le chemin des données d’entrée vers le bord miniport du commutateur extensible.

    Note Si l’extension de transfert a obtenu une liste liée de structures NET_BUFFER_LIST pour plusieurs paquets à partir du chemin de données d’entrée, elle doit créer une liste distincte de paquets transférés. Ce faisant, l’extension peut appeler NdisFSendNetBufferLists une seule fois pour transférer la liste des paquets. En outre, l’extension doit conserver des listes distinctes pour transférer les paquets qui ont les mêmes ports de destination. Pour plus d’informations, consultez Indicateurs d’envoi et de réception du commutateur extensible Hyper-V.