Partager via


Déchargement de la somme de contrôle

NetAdapterCx prend en charge le déchargement des tâches de somme de contrôle TCP/IP au moment de l’exécution.

Avant que le transport TCP/IP ne passe une structure NET_PACKET au pilote client, il spécifie les informations de somme de contrôle associées au NET_PACKET dans une extension de paquet NET_PACKET_CHECKSUM .

Le transport TCP/IP calcule la somme de complément pour le pseudo-tête TCP/UDP avant de décharger le calcul de la somme de contrôle pour un paquet TCP/UDP, comme décrit dans Déchargement des tâches de somme de contrôle.

La désactivation des déchargements de somme de contrôle lorsque le déchargement de segmentation générique (GSO) est activé n’empêche pas le pilote client de calculer et d’insérer des sommes de contrôle dans les paquets générés par la fonctionnalité GSO. Pour désactiver complètement les déchargements de somme de contrôle, vous devez également désactiver l’authentification GSO.

Mots clés INF pour contrôler le déchargement de la somme de contrôle

NetAdapterCx vérifie les mots clés de 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 de somme de contrôle spécifiés dans Utilisation des 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 la somme de contrôle avec un paramètre de clé de Registre. Les mots clés groupés ne sont pas pris en charge.

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

Configuration du déchargement de la somme de contrôle

Les pilotes clients publient d’abord les fonctionnalités de déchargement de la somme de contrôle 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 le déchargement de la somme de contrôle de transmission (Tx), le pilote client :

  1. Alloue une structure NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES .

  2. Appelle NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT pour initialiser la structure.

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

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

Pour configurer le déchargement de la somme de contrôle de réception (Rx), le pilote client :

  1. Alloue une structure NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES .

  2. Appelle NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT pour initialiser la structure.

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

Pendant l’appel à NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT le pilote client fournit un pointeur vers le rappel EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM . 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 somme de contrôle de transmission matérielle

  1. Les éléments Layer3Flags de la structure NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES doivent être définis. La définition de Layer4Flags est facultative. La définition de Layer3Flags et Layer4Flags indique les paquets sur lesquels la carte réseau est capable d’effectuer le déchargement de la somme de contrôle.

  2. Layer3HeaderOffsetLimit et Layer4HeaderOffsetLimit dans NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES sont facultatifs. 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 à la carte réseau de calculer la somme de contrôle pour cette couche.

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

Règles pour indiquer les fonctionnalités de somme de contrôle de réception matérielle

NetAdapterCx ne nécessite pas que le pilote publie les fonctionnalités de somme de contrôle de réception du matériel. Si le déchargement de la somme de contrôle est activé, la carte réseau doit effectuer un déchargement de somme de contrôle sur tous les paquets qu’elle peut gérer. Si la carte réseau ne peut pas effectuer le déchargement de somme de contrôle sur un paquet, NetAdapterCx le décharge dans un logiciel.

Cet exemple montre comment un pilote client peut configurer ses fonctionnalités de déchargement de somme de contrôle matérielle :

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's Tx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES txChecksumOffloadCapabilities;

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

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions |
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT(
        &txChecksumOffloadCapabilities,
        layer3Flags,
        EvtAdapterOffloadSetTxChecksum);

    txChecksumOffloadCapabilities.Layer4Flags = layer4Flags;

    txChecksumOffloadCapabilities.Layer4HeaderOffsetLimit = 127;

    // Set the current Tx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetTxChecksumCapabilities(NetAdapter,
        &txChecksumOffloadCapabilities);

    // Configure the hardware's Rx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES rxChecksumOffloadCapabilities;

    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT(
        &rxChecksumOffloadCapabilities,
        EvtAdapterOffloadSetRxChecksum);

    // Set the current Rx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRxChecksumCapabilities(NetAdapter,
        &rxChecksumOffloadCapabilities);
}

Mise à jour des déchargements matériels

Si la pile TCP/IP ou un pilote de protocole d’overlying demande une modification des fonctionnalités actives de l’adaptateur net, NetAdapterCx appelle le rappel EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM ou EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM du pilote client qui a été inscrit lors de l’initialisation de l’adaptateur. Dans ces fonctions, 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 de somme de contrôle qui sont activés :

L’exemple suivant montre comment un pilote client peut mettre à jour ses fonctionnalités de déchargement de somme de contrôle Tx/Rx :

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

    // Store the updated information in the context
    adapterContext->TxHardwareIpChecksum = NetOffloadIsTxChecksumIPv4Enabled(Offload);
    adapterContext->TxHardwareTcpChecksum = NetOffloadIsTxChecksumTcpEnabled(Offload);
    adapterContext->TxHardwareUdpChecksum = NetOffloadIsTxChecksumUdpEnabled(Offload);

    // Update the new hardware Tx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

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

    // Store the updated information in the context
    adapterContext->RxHardwareIpChecksum = NetOffloadIsRxChecksumIPv4Enabled(Offload);
    adapterContext->RxHardwareTcpChecksum = NetOffloadIsRxChecksumTcpEnabled(Offload);
    adapterContext->RxHardwareUdpChecksum = NetOffloadIsRxChecksumUdpEnabled(Offload);

    // Update the new hardware Rx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

Traitement de la somme de contrôle de transmission

Un pilote client effectue généralement le traitement de somme de contrôle suivant sur le chemin de transmission :

  1. Le pilote client appelle la fonction NetExtensionGetPacketChecksum avec l’index de paquets pour obtenir une structure NET_PACKET_CHECKSUM .

  2. Le pilote client teste les indicateurs spécifiques à la couche dans la structure NET_PACKET_CHECKSUM.

    • Si l’indicateur est NetPacketTxChecksumActionPassthrough, la carte réseau ne doit pas effectuer d’opérations de somme de contrôle dans cette couche.

    • Si l’indicateur est NetPacketTxChecksumActionRequired, le pilote client doit déterminer le protocole utilisé au niveau de cette couche dans ce paquet spécifique à l’aide de la structure NET_PACKET_LAYOUT et indiquer à la carte réseau la somme de contrôle qu’il doit calculer pour le paquet.

  3. Le pilote client transmet le paquet à la carte réseau, qui calcule les sommes de contrôle appropriées pour le paquet.

Recevoir le traitement de la somme de contrôle

Avant d’indiquer une structure NET_PACKET pour un paquet de réception sur lequel il effectue des tâches de somme de contrôle, le pilote client valide les sommes de contrôle et définit les indicateurs appropriés dans la structure NET_PACKET_CHECKSUM .

Les indicateurs peuvent être l’un des suivants :

Indicateur Description
NetPacketRxChecksumEvaluationNotChecked La carte réseau n’a pas pu valider la somme de contrôle du paquet
NetPacketRxChecksumEvaluationValid La somme de contrôle du paquet est valide
NetPacketRxChecksumEvaluationInvalid La somme de contrôle du paquet n’est pas valide