Partager via


Fonctions d’E/S et d’achèvement asynchrones dans les pilotes réseau

La latence est inhérente à certaines opérations réseau. En raison de cette latence, la plupart des fonctions de bord supérieur fournies par un pilote miniport et les fonctions de bord inférieur d’un pilote de protocole sont conçues pour prendre en charge l’opération asynchrone. Au lieu de gaspiller les cycles d’UC en attendant dans une boucle qu’une tâche fastidieuse se termine ou qu’un événement matériel signale, les pilotes réseau s’appuient sur la capacité à gérer la plupart des opérations de manière asynchrone.

Les E/S réseau asynchrones sont prises en charge à l’aide d’une fonction d’achèvement . L’exemple suivant illustre l’utilisation d’une fonction d’achèvement pour une opération d’envoi réseau, mais ce même mécanisme existe pour de nombreuses autres opérations effectuées par un protocole ou un pilote miniport.

Lorsqu’un pilote de protocole appelle NDIS pour envoyer un paquet, ce qui entraîne un appel à la fonction MiniportSendNetBufferLists du pilote miniport, le pilote miniport peut essayer de terminer cette requête immédiatement et de retourner une valeur de status appropriée. Pour l’opération synchrone, les réponses possibles sont NDIS_STATUS_SUCCESS pour la réussite de l’envoi, NDIS_STATUS_RESOURCES et NDIS_STATUS_FAILURE indiquant un échec quelconque.

Toutefois, une opération d’envoi peut prendre un certain temps pendant que le pilote miniport (ou NDIS) met en file d’attente le paquet et attend que la carte réseau indique le résultat de l’opération d’envoi. La fonction Miniport Driver MiniportSendNetBufferLists peut gérer cette opération de façon asynchrone en retournant une valeur status de NDIS_STATUS_PENDING. Lorsque le pilote miniport termine l’opération d’envoi, il appelle la fonction d’achèvement , NdisMSendNetBufferListsComplete, en passant un pointeur vers le descripteur de paquets envoyé. Ces informations sont transmises au pilote de protocole, signalant l’achèvement.

La plupart des opérations de pilote qui peuvent nécessiter une durée prolongée prennent en charge une opération asynchrone avec une fonction d’achèvement similaire. Ces fonctions ont des noms de la forme NdisMXxxComplete.

Des fonctions d’achèvement sont également fournies pour :

  • Définir et interroger la configuration.

  • Réinitialiser le matériel.

  • Indiquez status.

  • Indique les données reçues.

  • Transférer les données reçues.