Partager via


Déchargement de segmentation générique

Le déchargement de segmentation générique (GSO) représente collectivement le déchargement d’envoi volumineux (LSO) et le déchargement d’envoi UDP (USO).

Les pilotes clients peuvent décharger la segmentation des paquets TCP/UDP qui dépassent l’unité de transmission maximale (MTU) du support réseau. Les pilotes doivent indiquer cette fonctionnalité à NetAdapterCx à l’aide des API GSO.

Mots clés INF pour contrôler le GSO

NetAdapterCx vérifie les mots clés du Registre et les respecte lors de l’activation des fonctionnalités de déchargement actif. Le pilote n’a pas besoin de prendre d’autres mesures.

Les mots clés de l’authentification unique spécifiés dans Using Registry Values to Enable and Disable Task Offloading peuvent être utilisés pour activer/désactiver le déchargement de l’authentification unique avec un paramètre de clé de Registre.

Les mots clés USO spécifiés dans UDP Segmentation Offload (USO) peuvent être utilisés pour activer/désactiver le déchargement USO avec un paramètre de clé de Registre.

Les valeurs de mot clé doivent être de type REG_SZ.

Configuration de GSO

Les pilotes clients annoncent d’abord les fonctionnalités GSO de leur matériel lors de l’initialisation de l’adaptateur réseau. Cela peut se produire dans leur rappel EvtDevicePrepareHardware avant le démarrage d'un adaptateur réseau.

Pour configurer GSO, le pilote client :

  1. Alloue une structure NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES.

  2. Appelle NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT pour initialiser la structure.

  3. Appelle NetAdapterOffloadSetGsoCapabilities pour inscrire la structure auprès de NetAdapterCx.

Pendant l'appel à NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT, le pilote client fournit un pointeur vers le EVT_NET_ADAPTER_OFFLOAD_SET_GSO rappel. Le système appelle ce rappel ultérieurement si les fonctionnalités de déchargement actives changent.

Règles d’indication des fonctionnalités DSO matérielles

Les règles suivantes s’appliquent à la structure NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES :

  1. Le pilote doit définir layer3Flags et Layer4Flags.

  2. Si la carte réseau prend en charge l’authentification unique, le pilote doit remplir le champ Layer4Flags avec l’indicateur NetAdapterOffloadLayer4FlagTcpWithoutOptions TCP.

  3. Si la carte réseau prend en charge USO, le pilote doit remplir le champ Layer4Flags avec l’indicateur NetAdapterOffloadLayer4FlagUdp UDP.

  4. MaximumOffloadSize et MinimumSegmentCount sont des champs obligatoires.

  5. Le champ Layer4OffsetLimit est facultatif. Si le système d’exploitation envoie un paquet avec un décalage d’en-tête supérieur à la limite spécifiée, il ne demande pas l’exécution de l’authentification GSO.

  6. Les paquets IP/TCP sans options/extensions doivent être pris en charge si les options/extensions sont prises en charge.

Cet exemple montre comment un pilote client peut configurer ses fonctionnalités de déchargement matériel.

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's GSO offload capabilities
    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES gsoOffloadCapabilities;

    auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
        NetAdapterOffloadLayer3FlagIPv4WithOptions |
        NetAdapterOffloadLayer3FlagIPv6NoExtensions |
        NetAdapterOffloadLayer3FlagIPv6WithExtensions;

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions;
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT(
        &gsoOffloadCapabilities,
        layer3Flags,
        layer4Flags,
        MY_GSO_OFFLOAD_MAX_SIZE,
        MY_GSO_OFFLOAD_MIN_SEGMENT_COUNT,
        EvtAdapterOffloadSetGso);

    gsoOffloadCapabilities.Layer4OffsetLimit = 127;

    // Set the current GSO offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetGsoCapabilities(NetAdapter, &gsoOffloadCapabilities);
}

Mise à jour des déchargements matériel

Si la pile TCP/IP ou un pilote de protocole superposé demande une modification des capacités actives de l’adaptateur réseau, NetAdapterCx appelle le rappel EVT_NET_ADAPTER_OFFLOAD_SET_GSO du pilote client enregistré lors de l’initialisation de l’adaptateur réseau. Dans cette fonction, le système fournit des fonctionnalités mises à jour dans l’objet NETOFFLOAD que le pilote client interroge pour mettre à jour ses fonctionnalités de déchargement.

Les pilotes clients peuvent appeler les fonctions suivantes pour déterminer quelles décharges sont activées :

L’exemple suivant montre comment un pilote client peut mettre à jour ses fonctionnalités de déchargement GSO :

VOID
MyEvtAdapterOffloadSetGso(
	NETADAPTER NetAdapter,
	NETOFFLOAD Offload
)
{
	PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

	// Store the updated information in the context
	adapterContext->LSOv4 = NetOffloadIsLsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->LSOv6 = NetOffloadIsLsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv4 = NetOffloadIsUsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv6 = NetOffloadIsUsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;

	// Enable hardware checksum if LSO/USO is enabled
	MyUpdateHardwareChecksum(adapterContext);
}