Gestion de la notification de suspension sélective n’inactif NDIS
NDIS démarre une opération de suspension sélective si l’un des événements suivants se produit :
La carte réseau est inactive depuis plus longtemps qu’une période d’inactivité. La durée de ce délai d’expiration est spécifiée par la valeur du mot clé INF standardisé *SSIdleTimeout. Pour plus d’informations sur cette mot clé, consultez Mots clés INF standardisés pour la suspension sélective NDIS.
Pour plus d’informations sur la façon dont NDIS détermine qu’une carte réseau est inactive, consultez Comment NDIS détecte les cartes réseau inactives.
Le système conforme à la Always On technologie AOAC (Always Connected) est en cours de transition vers un état de veille connectée.
Grâce à l’opération de suspension sélective, la carte réseau est passée à un état de faible consommation d’alimentation. NDIS commence cette opération en appelant la fonction de gestionnaire MiniportIdleNotification pour émettre une notification d’inactivité au pilote miniport.
Le pilote miniport peut avoir besoin d’effectuer des actions dépendantes du bus lorsqu’il gère la notification d’inactivité. L’illustration suivante montre les étapes qui sont impliquées dans la gestion d’une notification inactive par un pilote miniport pour une carte réseau USB.
Cette rubrique inclut les informations suivantes sur la façon de gérer une notification de suspension sélective NDIS inactive :
Instructions pour la gestion de l’appel à MiniportIdleNotification
Instructions pour l’appel à NdisMIdleNotificationConfirm
Annulation et exécution d’une notification de suspension sélective d’inactivité NDIS
Instructions pour la gestion de l’appel à MiniportIdleNotification
NDIS et le pilote miniport effectuent ces étapes lorsque NDIS appelle MiniportIdleNotification :
NDIS appelle la fonction de gestionnaire MiniportIdleNotification pour avertir le pilote que la carte réseau sous-jacente semble inactive. NDIS définit le paramètre ForceIdle de la fonction de gestionnaire MiniportIdleNotification sur l’une des valeurs suivantes :
NDIS définit le paramètre ForceIdle sur FALSE lorsque la carte réseau est inactive depuis plus longtemps que le délai d’inactivité.
NDIS définit le paramètre ForceIdle sur TRUE lorsqu’un système conforme à la technologie Always On Always Connected (AOAC) passe à un état de veille connectée.
Lorsque MiniportIdleNotification est appelé, le pilote miniport peut mettre son veto à la notification d’inactivité et à l’opération de suspension sélective en retournant NDIS_STATUS_BUSY. Par exemple, le pilote peut opposer son veto à la notification d’inactivité si le pilote détecte une activité sur la carte réseau.
Si le pilote miniport met son veto à la notification d’inactivité, NDIS redémarre le moniteur d’activité sur la carte réseau. Si l’adaptateur redevient inactif pendant la période d’inactivité, NDIS appelle MiniportIdleNotification.
Note Le pilote miniport ne doit pas opposer son veto à la notification d’inactivité si le paramètre ForceIdle a la valeur TRUE. Dans ce cas, le pilote doit poursuivre l’opération de suspension sélective.
Si le pilote miniport ne met pas son veto à la notification inactive, il doit effectuer toutes les opérations spécifiques au bus pour préparer la carte réseau à une opération de suspension sélective. Par exemple, le pilote miniport d’une carte réseau USB effectue les étapes suivantes pour déterminer si la carte réseau peut passer à un état d’alimentation faible :
Le pilote miniport appelle IoCallDriver pour émettre un paquet de demande d’E/S (IRP) pour une demande d’inactivité USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) au pilote de bus USB sous-jacent. Dans cette IRP, le pilote miniport doit spécifier une routine de rappel et d’achèvement.
Le pilote de bus USB ne termine pas immédiatement l’IRP. L’IRP est laissé dans un état en attente lors de la transition à faible puissance. Le pilote de bus termine l’IRP ultérieurement lorsque l’un des événements suivants se produit :
Le pilote miniport annule l’IRP.
Une modification de l’état d’alimentation du système est requise.
L’appareil est supprimé du hub USB.
Une fois que le pilote de bus USB a déterminé qu’il peut placer la carte réseau dans un état de faible consommation d’énergie, il appelle la routine de rappel IRP du pilote miniport. Cet appel confirme que la carte réseau peut passer à un état de faible consommation.
Pour obtenir des instructions sur l’écriture d’une routine de rappel pour l’IRP de requête inactive USB, consultez Implémentation d’une routine de rappel IRP de demande d’inactivité USB.
Une fois que le pilote miniport a terminé la préparation de la carte réseau pour une opération de suspension sélective, il appelle NdisMIdleNotificationConfirm. Dans cet appel, le pilote miniport spécifie l’état d’alimentation le plus bas vers lequel la carte réseau peut effectuer la transition.
Selon les exigences du bus pour les opérations de suspension sélectives, le pilote miniport appelle NdisMIdleNotificationConfirm de manière synchrone dans le contexte de l’appel à MiniportIdleNotification ou de manière asynchrone après le retour de MiniportIdleNotification . Par exemple, le pilote miniport d’une carte réseau USB appelle NdisMIdleNotificationConfirm dans le contexte de la routine de rappel pour la demande d’inactivité USB. Le pilote de bus USB appelle la routine de rappel de manière synchrone dans le contexte de l’appel à IoCallDriver ou de manière asynchrone après le retour de MiniportIdleNotification .
Si la carte réseau peut être transitionnée vers un état de faible consommation, le pilote miniport retourne NDIS_STATUS_PENDING de l’appel à MiniportIdleNotification.
Note Le pilote miniport retourne NDIS_STATUS_PENDING, car la notification d’inactivité n’est pas terminée tant que le pilote n’appelle pas NdisMIdleNotificationComplete. Le pilote miniport ne doit pas retourner NDIS_STATUS_SUCCESS de MiniportIdleNotification.
Le pilote miniport doit effectuer les opérations suivantes jusqu’à ce que la carte réseau soit suspendue et transition vers un état de faible consommation :
Le pilote miniport doit traiter les paquets reçus et les indiquer à NDIS en appelant NdisMIndicateReceiveNetBufferLists.
Le pilote miniport doit traiter les paquets envoyés terminés et les indiquer à NDIS en appelant NdisMSendNetBufferListsComplete.
Note NDIS n’appelle pas la fonction MiniportSendNetBufferLists du pilote pour envoyer des paquets si MiniportIdleNotification retourne NDIS_STATUS_PENDING.
Instructions pour l’appel à NdisMIdleNotificationConfirm
NDIS et le pilote miniport suivent ces étapes lorsque le pilote miniport appelle NdisMIdleNotificationConfirm :
Les problèmes NDIS IRP_MN_WAIT_WAKE au pilote de bus sous-jacent. Cette IRP permet au pilote de bus de réveiller la carte réseau en réponse à un signal de mise en éveil externe.
NDIS émet une demande d’ensemble d’identificateur d’objet (OID) de OID_PM_PARAMETERS au pilote miniport. Cette demande OID est associée à une structure de NDIS_PM_PARAMETERS qui spécifie les paramètres sous lesquels la carte réseau génère un événement de mise en éveil.
Le pilote miniport doit suivre ces instructions lorsqu’il traite les membres de la structure NDIS_PM_PARAMETERS :
Si le paramètre ForceIdle de la fonction de gestionnaire MiniportIdleNotification a la valeur FALSE, NDIS définit uniquement l’indicateur NDIS_PM_SELECTIVE_SUSPEND_ENABLED dans le membre WakeUpFlags de la structure NDIS_PM_PARAMETERS . Dans ce cas, la carte réseau peut signaler un événement de mise en éveil lorsque l’un des événements suivants se produit :
La carte réseau reçoit un paquet qui correspond à un filtre de paquets de réception. L’adaptateur est configuré pour utiliser ces filtres via les demandes de jeu OID de OID_GEN_CURRENT_PACKET_FILTER.
La carte réseau détecte d’autres événements externes qui nécessitent un traitement par la pile de pilotes réseau, par exemple lorsque l’état de la liaison change pour la déconnexion du média ou pour le support connecté.
Si le paramètre ForceIdle de la fonction de gestionnaire MiniportIdleNotification a été défini sur TRUE, NDIS ne définit pas l’indicateur NDIS_PM_SELECTIVE_SUSPEND_ENABLED dans le membre WakeUpFlags de la structure NDIS_PM_PARAMETERS . Dans ce cas, NDIS définit d’autres membres dans la structure NDIS_PM_PARAMETERS pour les événements de mise en éveil non liés à la suspension sélective NDIS.
Note NDIS définit le paramètre ForceIdle sur TRUE uniquement lorsqu’un système conforme à la technologie Always On Always Connected (AOAC) passe à un état de veille connectée.
Le pilote termine la requête OID avec NDIS_STATUS_SUCCESS.
Note Si NDIS définit l’indicateur NDIS_PM_SELECTIVE_SUSPEND_ENABLED dans le membre WakeUpFlags de NDIS_PM_PARAMETERS structure, il émet la demande de jeu OID de OID_PM_PARAMETERS directement au pilote miniport. Cela permet à NDIS de contourner le traitement par des pilotes de filtre dans la pile des pilotes réseau.
Une fois la demande de jeu OID de OID_PM_PARAMETERS terminée, NDIS émet une demande de jeu OID OID_PNP_SET_POWER au pilote miniport.
Lorsqu’il gère cette demande de jeu d’OID, le pilote prépare la carte réseau pour passer à l’état de faible consommation spécifié dans la requête OID. Le pilote doit effectuer toutes les opérations en attente de la manière suivante :
Le pilote miniport attend que tous les paquets de réception indiqués précédemment soient retournés par le biais d’appels à MiniportReturnNetBufferLists.
Le pilote miniport attend que les demandes d’envoi traitées par le matériel se terminent. Une fois les requêtes terminées, le pilote miniport doit appeler NdisMSendNetBufferListsComplete.
Le pilote miniport termine toutes les demandes d’envoi en attente en appelant NdisMSendNetBufferListsComplete.
Le pilote miniport doit annuler tous les minuteurs NDIS et les éléments de travail en attente. Une fois ceux-ci annulés, le pilote doit attendre la fin de ces minuteurs et éléments de travail.
Le pilote miniport doit placer la carte réseau dans un état d’arrêt. Par exemple, le pilote doit annuler tous les minuteurs matériels.
Le pilote miniport configure la carte réseau sous-jacente pour activer les événements de mise en éveil spécifiés précédemment dans la demande de jeu OID de OID_PM_PARAMETERS. Une fois la carte réseau préparée pour la transition à faible consommation d’énergie, le pilote miniport effectue la demande de jeu OID de OID_PNP_SET_POWER avec NDIS_STATUS_SUCCESS.
NDIS émet un IRP_MN_SET_POWER au pilote de bus sous-jacent. Cette IRP demande la transition de la carte réseau vers un état de faible consommation d’alimentation.
Note Lors d’une opération de suspension sélective, la carte réseau est convertie à l’état d’alimentation de l’appareil spécifié dans l’appel à NdisMIdleNotificationConfirm. Le pilote miniport spécifie cet état d’alimentation de l’appareil dans le paramètre IdlePowerState de cette fonction.
Une fois l’IRP terminé, NDIS retourne à partir de l’appel à NdisMIdleNotificationConfirm.
Annulation et exécution d’une notification de suspension sélective d’inactivité NDIS
Une fois la notification inactive émise, elle peut être annulée et terminée des manières suivantes :
NDIS peut annuler la notification d’inactivité en attente si les conditions suivantes sont remplies :
Un protocole ou un pilote de filtre excessive émet une demande de paquet d’envoi ou une requête OID au pilote miniport.
L’adaptateur sous-jacent signale un événement de mise en éveil, comme la réception d’un paquet qui correspond à un modèle WOL (Wake-on-LAN) ou la détection d’une modification de sa connexion multimédia status.
NDIS annule la notification inactive en appelant MiniportCancelIdleNotification. Lorsque cette fonction de gestionnaire est appelée, le pilote miniport annule tous les IIP spécifiques au bus qu’il a pu émettre précédemment pour la notification d’inactivité. Enfin, le pilote miniport appelle NdisMIdleNotificationComplete pour terminer la notification d’inactivité.
Pour plus d’informations sur la façon dont NDIS annule la notification d’inactivité, consultez Annulation de la notification d’inactivité de suspension sélective NDIS.
Une fois que la carte réseau est dans un état de faible alimentation, le pilote miniport peut effectuer la notification d’inactivité lui-même pour rétablir l’état d’alimentation de l’adaptateur. Les raisons de cette opération sont spécifiques à la conception et aux exigences du pilote et de l’adaptateur. Le pilote miniport termine la notification d’inactivité en appelant NdisMIdleNotificationComplete.
Pour plus d’informations sur la façon dont le pilote miniport termine la notification d’inactivité, consultez Terminer la notification d’inactivité de suspension sélective NDIS.