Prise en charge de NVGRE dans le déchargement de segmentation UDP (USO)
NDIS 6.85 introduit la virtualisation de réseau à l’aide de l’encapsulation de routage générique (NVGRE) avec le déchargement de segmentation UDP (USO). Les pilotes de miniport, de protocole et de filtre NDIS, ainsi que les cartes réseau qui exécutent USO, doivent prendre en charge les encapsulations NVGRE et VXLAN.
Remarque : cet article suppose que vous êtes familiarisé avec les informations contenues dans Le déchargement de segmentation UDP (USO).
Si NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO. IsEncapsulatedPacket a la valeur TRUE et les informations udpSegmentationOffloadInfo hors bande (OOB) sont valides, la prise en charge de NVGRE et de VXLAN est requise. La carte réseau doit effectuer le déchargement USO sur le paquet encapsulé NVGRE/VXLAN avec la condition suivante :
- NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO. Transmettre. Le membre UdpHeaderOffset n’a pas la valeur de décalage correcte et ne doit pas être utilisé par la carte réseau ou le pilote miniport.
Pour prendre en charge NVGRE dans USO, les pilotes de protocole et de filtre doivent :
- Ajustez les valeurs InnerFrameOffset, TransportIpHeaderRelativeOffset et TcpHeaderRelativeOffset dans la structure NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO pour tenir compte de l’en-tête d’en-tête d’encapsulation. TcpHeaderRelativeOffset fait référence à l’en-tête UDP.
Les cartes réseau et les pilotes miniport peuvent utiliser les valeurs InnerFrameOffset, TransportIpHeaderRelativeOffset et TcpHeaderRelativeOffset fournies dans la structure NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO . Le pilote de carte réseau ou de miniport peut effectuer toutes les vérifications d’en-tête d’en-tête d’en-tête d’en-tête du tunnel (externe) ou des en-têtes suivants pour valider ces décalages.
Les pilotes miniport doivent gérer le cas où NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO. InnerFrameOffset peut se trouver dans une liste de collecte de points différente du début du paquet. Le pilote de protocole garantit que tous les en-têtes d’encapsulation ajoutés (ETH, IP, GRE/VXLAN) seront physiquement contigus et se trouveront dans la première MDL du paquet.
Les pilotes de protocole et de filtre ne garantissent pas que la longueur totale de la charge utile UDP est un multiple exact de la valeur MSS réduite quand UdpSegmentation.SubMssFinalSegmentSupported est défini dans les fonctionnalités NDIS_OFFLOAD . Pour cette raison, les pilotes de miniport et les cartes réseau avec SubMssFinalSegmentSupported doivent mettre à jour l’en-tête IP du tunnel (externe). Les cartes réseau doivent générer autant de segments de taille que possible en fonction de la valeur MSS réduite dans le NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO. Transmettre Informations OOB. Un seul segment de sous-MSS peut être généré par envoi LSOv2.
Les pilotes miniport doivent :
- Calculez la somme de contrôle pour l’en-tête IP du tunnel (externe).
- Incrémentez la valeur d’identification IP (ID IP) de l’en-tête IP (externe) du tunnel pour chaque paquet. Le premier paquet doit utiliser l’ID IP dans l’en-tête IP (externe) du tunnel d’origine.
- Incrémentez l’ID IP de l’en-tête IP de transport (interne) pour chaque paquet. Le premier paquet doit utiliser l’ID IP dans l’en-tête d’adresse IP (interne) de transport d’origine.
- Calculez la somme de contrôle pour l’en-tête UDP et l’en-tête IP de transport (interne).
- Vérifiez que les en-têtes complets, y compris les en-têtes du tunnel d’encapsulation (externe) sont ajoutés à chaque paquet généré.