Partager via


Chargement de la coalescence des segments de réception (RSC)

Lors de la réception de données, la plupart des couches de la pile TCP/IP doivent examiner séparément les informations de l'en-tête de chaque segment. Cela entraîne une surcharge importante lors de la réception de grandes quantités de données.

La coalescence des segments de réception (RSC) réduit cette surcharge en coalesçant une séquence de segments reçus et en les indiquant dans la pile TCP/IP en un seul segment coalescé. Les couches supérieures de la pile TCP/IP n'ont besoin d'examiner qu'un seul en-tête pour l'ensemble de la séquence.

Une carte d'interface réseau (NIC) qui prend en charge le RSC au niveau matériel peut améliorer considérablement les performances du chemin de réception. Elle peut également réduire l'utilisation du processeur de l'hôte, car elle libère la couche de protocole de l'exécution du RSC dans le logiciel.

Pour plus de détails sur le RSC, voir Vue d'ensemble du Receive Segment Coalescing.

NetAdapterCX supporte également UDP RSC (URO) à partir de la version 2.5. Pour plus de détails, voir UDP RSC Offload (URO).

Mots clés INF pour contrôler le délestage RSC

NetAdapterCx vérifie les mots-clés du registre et les respecte lors de l'activation des capacités de déchargement actives. Le pilote n'a pas besoin de prendre d'autres mesures.

Les mots-clés RSC spécifiés dans les mots-clés INF normalisés pour RSC peuvent être utilisés pour activer/désactiver le délestage RSC avec un paramètre de clé de registre.

Les valeurs des mots-clés doivent être de type REG_SZ.

Configuration du délestage RSC

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

Pour configurer les capacités RSC, le pilote client :

  1. alloue une structure NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES.

  2. Appelle NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT pour initialiser la structure.

  3. Appelle NetAdapterOffloadSetRscCapabilities pour enregistrer la structure avec NetAdapterCx.

Lors de l'appel à NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT, le pilote client fournit un pointeur sur le rappel EVT_NET_ADAPTER_OFFLOAD_SET_RSC. Le système invoque ce rappel ultérieurement si les capacités de déchargement actives changent.

Règles relatives à l'indication des capacités RSC matérielles

  1. Les pilotes clients ne doivent PAS effectuer de RSC logiciel sur un type de trafic qui n'est pas pris en charge matériellement par la carte d'interface réseau.

Les règles suivantes s'appliquent à la structure NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES :

  1. NetAdapterOffloadLayer3FlagIPv4NoOptions et NetAdapterOffloadLayer3FlagIPv6NoExtensions sont les seules valeurs valables pour le champ Layer3Flags. Ces indicateurs indiquent la prise en charge d'IPv4 et d'IPv6 respectivement.

  2. NetAdapterOffloadLayer4FlagTcpNoOptions et NetAdapterOffloadLayer4FlagUdp sont les seules valeurs valables pour le champ Layer4Flags. Ces indicateurs indiquent la prise en charge de TCP et d'UDP respectivement.

  3. Les indicateurs de la couche 3 doivent être définis si l'indicateur NetAdapterOffloadLayer4FlagTcpNoOptions est défini.

  4. Le champ TcpTimestampOption est facultatif. Les pilotes clients définissent ce champ après avoir appelé NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT et avant d'appeler NetAdapterOffloadSetRscCapabilities pour indiquer si la carte d'interface réseau prend en charge l'option d'horodatage TCP.

L'exemple suivant montre comment un pilote client peut configurer ses capacités de délestage matériel RSC.

VOID
MyAdapterSetRscOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's RSC offload capabilities
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES rscOffloadCapabilities;
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT(
        &rscOffloadCapabilities,
        NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions,
        NetAdapterOffloadLayer4FlagTcpNoOptions,
        MyEvtAdapterOffloadSetRsc);
    rscOffloadCapabilities.TcpTimestampOption = FALSE;

    // Set the current RSC offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRscCapabilities(NetAdapter, &rscOffloadCapabilities);
}

Mise à jour des décharges matérielles RSC

Si la pile TCP/IP ou un pilote de protocole superposé requête une modification des capacités RSC actives de la carte réseau, NetAdapterCx invoque le rappel EVT_NET_ADAPTER_OFFLOAD_SET_RSC du pilote client qui a été enregistré dans NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES. Dans ce rappel, le système fournit des capacités mises à jour dans l'objet NETOFFLOAD que le pilote client peut interroger pour mettre à jour ses capacités de déchargement.

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

L'exemple suivant montre comment un pilote client peut mettre à jour ses capacités de délestage RSC :

VOID
MyEvtAdapterOffloadSetRsc(
    NETADAPTER NetAdapter,
    NETOFFLOAD Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = NetvAdapterGetContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->IsRscIPv4Enabled = NetOffloadIsTcpRscIPv4Enabled(Offload);
    adapterContext->IsRscIPv6Enabled = NetOffloadIsTcpRscIPv6Enabled(Offload);
    adapterContext->IsRscTcpTimestampOptionEnabled = NetOffloadIsRscTcpTimestampOptionEnabled(Offload);
}

UDP RSC Offload (URO)

URO permet de regrouper les segments UDP reçus. Les cartes d'interface réseau peuvent combiner des datagrammes UDP issus du même flux qui correspondent à un ensemble de règles dans une mémoire tampon logiquement contiguë. Ces datagrammes combinés sont ensuite indiqués dans la pile de mise en réseau Windows sous la forme d’un seul paquet volumineux. Pour plus d'informations sur les règles URO, voir Règles de regroupement des paquets UDP.

Le mot-clé URO spécifié dans INF keyword for controlling URO peut être utilisé pour activer/désactiver URO à l'aide d'une clé de registre.

Les pilotes clients NetAdapterCx peuvent utiliser les structures RSC existantes et l'API RSC pour URO. Pour configurer URO, les pilotes clients doivent attribuer au champ Layer4Flags de la structure NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES la valeur NetAdapterOffloadLayer4FlagUdp.

Le comportement d'URO reflète celui de RSC à une exception près. Lorsque le rappel EVT_NET_ADAPTER_OFFLOAD_SET_RSC désactive l'URO, le pilote doit indiquer les segments coalescents existants et attendre que toutes les indications URO en suspens soient terminées. Cette approche garantit qu'il n'y a pas d'indications URO actives lorsque le callback revient.