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 supérieurs à 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 l’authentification GSO

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

Les mots clés LSO spécifiés dans Utilisation de valeurs de Registre pour activer et désactiver le déchargement des tâches peuvent être utilisés pour activer/désactiver le déchargement de LSO avec un paramètre de clé de Registre.

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

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

Configuration de l’authentification GSO

Les pilotes clients publient d’abord les fonctionnalités DSO de leur matériel lors de l’initialisation de l’adaptateur net. Cela peut se produire dans leur rappel EvtDevicePrepareHardware avant de démarrer une carte réseau.

Pour configurer l’authentification 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 rappel EVT_NET_ADAPTER_OFFLOAD_SET_GSO . Le système appelle ce rappel ultérieurement si les fonctionnalités de déchargement actives changent.

Règles pour indiquer les fonctionnalités de GSO matérielles

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

  1. Le pilote doit définir les valeurs Layer3Flags et Layer4Flags.

  2. Si la carte réseau prend en charge LSO, 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 d’effectuer 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ériels

Si la pile TCP/IP ou un pilote de protocole trop long demande une modification des fonctionnalités actives de l’adaptateur net, NetAdapterCx appelle le rappel EVT_NET_ADAPTER_OFFLOAD_SET_GSO du pilote client qui a été inscrit lors de l’initialisation de l’adaptateur. 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 les déchargements activés :

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);
}