Partager via


Récupération d’une carte réseau qui ne répond pas avec NetAdapterCx PLDR

NetAdapterCx offre un moyen efficace de réinitialiser et de récupérer des périphériques réseau défectueux via la réinitialisation d’appareil au niveau de la plateforme (PLDR). Sans redémarrer l’ensemble du système Windows, l’opération PLDR détruit la pile des périphériques réseau affectés, ce qui garantit que leur matériel et leurs pilotes redémarrent à partir d’un état vide. NetAdapterCx permet également aux pilotes clients de collecter des diagnostics à partir d’appareils défaillants avant qu’ils ne soient réinitialisés au niveau de la plateforme.

PLDR est déclenché quand un comportement anormal de l’appareil est détecté. Elle peut être déclenchée par :

  • Le système d’exploitation. Par exemple, le côté système d’exploitation peut déclencher plDR lorsqu’un paquet en transit est bloqué dans le pilote pendant trop longtemps.

  • Pilotes clients IHV (Fournisseur de matériel indépendant). Par exemple, les pilotes clients peuvent demander à NetAdapterCx de déclencher plDR lorsqu’un pilote détecte que son appareil ne répond pas à sa commande de contrôle.

Pour fournir une défaillance et une récupération d’appareil conviviales, nous recommandons que les IVS et les fabricants d’équipement d’origine (OEM) prennent en charge PLDR pour leurs périphériques réseau. Pour plus d’informations sur plDR, consultez Réinitialisation et récupération d’un appareil. NetAdapterCx ne récupère pas les périphériques réseau via la réinitialisation des appareils au niveau de la fonction.

Inscrire le rappel facultatif diagnostics collection

Dans le cadre du processus de réinitialisation et de récupération NetAdapterCx, le pilote client peut collecter des diagnostics spécifiques au périphérique à partir de l’appareil défaillant avant que l’appareil ne soit réinitialisé au niveau de la plateforme. Les IVS et Microsoft peuvent utiliser ces données dans l’analyse post-échec pour améliorer la qualité de leurs produits.

Inscrire NET_DEVICE_RESET_CAPABILITIES

Les pilotes clients doivent initialiser et inscrire la structure NET_DEVICE_RESET_CAPABILITIES dans leur fonction de rappel EVT_WDF_DRIVER_DEVICE_ADD afin de collecter des diagnostics spécifiques au périphérique.

NET_DEVICE_RESET_CAPABILITIES contient :

  • GUID unique. L’IHV spécifie ce GUID et l’utilise ultérieurement pour identifier et récupérer le diagnostics de réinitialisation à partir d’un vidage de mémoire. Par exemple, la commande .enumtag peut être utilisée pour récupérer le diagnostics.

  • Fonction de rappel d’événement EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS . NetAdapterCx appelle ce rappel pour collecter des diagnostics. Si le pilote client fournit un rappel EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS , NetAdapterCx l’appelle sur le pilote client à l’aide d’un thread dédié .

L’exemple suivant montre comment inscrire NET_DEVICE_RESET_CAPABILITIES auprès de NetAdapterCx :

EVT_WDF_DRIVER_DEVICE_ADD EvtWdfDriverDeviceAdd;
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS EvtDeviceCollectResetDiagnostics;

NTSTATUS EvtWdfDriverDeviceAdd(
    WDFDRIVER Driver,
    PWDFDEVICE_INIT DeviceInit
)
{
    ...

    NET_DEVICE_RESET_CAPABILITIES resetCapabilities;
    NET_DEVICE_RESET_CAPABILITIES_INIT(
        &resetCapabilities,
        DUMMY_GUID,
        EvtDeviceCollectResetDiagnostics);
    NetDeviceInitSetResetCapabilities(DeviceInit, &resetCapabilities);

    ...
}

Pour plus d’informations sur l’initialisation de la structure NET_DEVICE_RESET_CAPABILITIES , consultez NET_DEVICE_RESET_CAPABILITIES_INIT.

Pour savoir comment publier la structure NET_DEVICE_RESET_CAPABILITIES sur NetAdapterCx, consultez NetDeviceInitSetResetCapabilities.

Implémenter EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS

La séquence de réinitialisation et de récupération peut se produire à tout moment. Par conséquent, l’implémentation de rappel EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS du pilote client doit prendre en compte les éléments suivants :

  • NetAdapterCx synchronise le rappel EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS avec d’autres rappels qui peuvent se produire pendant la séquence de mise hors tension. Le pilote client peut supposer que NetAdapterCx n’appellera pas de rappels tels que l’annulation/l’arrêt de file d’attente de paquets, la mise en production matérielle et la suppression d’objets de périphérique tant que EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS n’est pas retourné.

  • Le pilote client doit faire preuve de prudence lors de la gestion de diagnostics collecte afin d’éviter les interblocages. Il doit tenir compte du fait que le matériel est peut-être déjà dans un état d’échec.

  • Il est essentiel que EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS se termine le plus rapidement possible afin que le reste du processus PLDR puisse continuer. EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS doivent être fiables et doivent revenir dans les 3 secondes.

  • NetAdapterCx appelle toujours EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS au PASSIVE_LEVEL.

Pour envoyer diagnostics à NetAdapterCx, le pilote client effectue les étapes suivantes :

  1. Préallouer une mémoire tampon plate à partir d’un pool paginé ou non paginé pour collecter le diagnostics de réinitialisation. Le pilote doit préallouer cette mémoire tampon pour éviter une erreur de mémoire insuffisante lors de la réinitialisation du périphérique.

  2. Dans le rappel EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS, envoyez le diagnostics en tant que mémoire tampon de données plate en appelant l’API NetDeviceStoreResetDiagnostics. Le pilote client doit appeler l’API NetDeviceStoreResetDiagnostics à PASSIVE_LEVEL.

  3. Libérez la mémoire tampon de données une fois que NetDeviceStoreResetDiagnostics est retourné.

Important

L’API NetDeviceStoreResetDiagnostics doit être appelée uniquement dans le rappel EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS. Il ne peut pas non plus être utilisé pour soumettre à nouveau diagnostics données après les retours précédents de NetDeviceStoreResetDiagnostics. La violation de l’un de ces cas entraîne une vérification d’erreur.

Important

La limite de taille pour la réinitialisation diagnostics est de 1 Mo.

Comment un pilote client demande plDR

Un pilote client déclenche plDR à l’aide de l’API NetAdapterCx NetDeviceRequestReset lorsqu’il détecte une défaillance d’appareil. NetDeviceRequestReset retourne immédiatement au pilote client. La séquence de réinitialisation et de récupération décrite dans La séquence de réinitialisation et de récupération NetAdapterCx est déclenchée et asynchrone à l’appel NetDeviceRequestReset .

Une seule opération PLDR peut se produire à un moment donné. Par conséquent, les appels suivants de NetDeviceRequestReset n’ont aucun effet lorsqu’une opération PLDR a déjà démarré.

L’appel de NetDeviceRequestReset n’a pas non plus d’effet si la séquence de mise hors tension a déjà été lancée.

Séquence de réinitialisation et de récupération NetAdapterCx

Lorsque le système d’exploitation ou le pilote client déclenche plDR, la séquence suivante se produit :

  1. Collecter les diagnostics de réinitialisation : NetAdapterCx appelle le rappel EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS du pilote client pour collecter des diagnostics à partir de l’appareil défaillant. Par exemple, le pilote peut collecter une instantané du microprogramme du périphérique. Cette étape est facultative et se produit uniquement si le pilote client a inscrit la structure NET_DEVICE_RESET_CAPABILITIES . Sinon, NetAdapterCx ignore cette étape.

  2. Exécuter plDR : NetAdapterCx effectue l’opération de réinitialisation de l’appareil au niveau de la plateforme. L’alimentation NetAdapterCx recycle le matériel et détruit la pile des périphériques logiciels.

Le diagramme suivant illustre la séquence de réinitialisation et de récupération NetAdapterCx :

Organigramme illustrant la séquence de réinitialisation et de récupération NetAdapterCx.