Réception de données réseau
La figure suivante illustre une opération de réception de base, qui implique un pilote miniport, NDIS et un pilote de protocole.
Les pilotes Miniport appellent la fonction NdisMIndicateReceiveNetBufferLists pour indiquer NET_BUFFER structures aux pilotes de niveau supérieur. Chaque structure NET_BUFFER doit généralement être attachée à une structure NET_BUFFER_LIST distincte. Cela permet aux pilotes de protocole de créer un sous-ensemble de la liste d’origine des structures NET_BUFFER_LIST et de les transférer à différents clients. Certains pilotes, par exemple les pilotes miniport natifs IEEE 802.11, peuvent attacher plusieurs NET_BUFFER structure à une structure NET_BUFFER_LIST.
Après avoir lié toutes les structures NET_BUFFER_LIST, un pilote miniport transmet un pointeur vers la première structure NET_BUFFER_LIST de la liste vers la fonction NdisMIndicateReceiveNetBufferLists . NDIS examine les structures NET_BUFFER_LIST et appelle la fonction ProtocolReceiveNetBufferLists de chaque pilote de protocole associé aux structures NET_BUFFER_LIST. NDIS transmet un sous-ensemble de la liste qui inclut uniquement les structures NET_BUFFER_LIST associées à la liaison correcte à chaque pilote de protocole. NDIS correspond à la valeur NetBufferListFrameType spécifiée dans la structure NET_BUFFER_LIST au type de trame inscrit par chaque pilote de protocole.
Si l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags passé à la fonction ProtocolReceiveNetBufferLists d’un pilote de protocole est défini, NDIS récupère la propriété des structures NET_BUFFER_LIST immédiatement après le retour de l’appel ProtocolReceiveNetBufferLists .
Note Si l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES est défini, le pilote de protocole doit conserver l’ensemble d’origine de structures NET_BUFFER_LIST dans la liste liée. Par exemple, lorsque cet indicateur est défini, le pilote peut traiter les structures et les indiquer une par une dans la pile, mais avant que la fonction ne retourne, elle doit restaurer la liste liée d’origine.
Si l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags passé à la fonction ProtocolReceiveNetBufferLists d’un pilote de protocole n’est pas défini, le pilote de protocole peut conserver la propriété des structures NET_BUFFER_LIST. Dans ce cas, le pilote de protocole doit retourner les structures NET_BUFFER_LIST en appelant la fonction NdisReturnNetBufferLists .
Si un pilote miniport est faible sur les ressources de réception, il peut définir l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags dans l’appel à NdisMIndicateReceiveNetBufferLists. Dans ce cas, le pilote peut récupérer la propriété de toutes les structures NET_BUFFER_LIST indiquées et des structures de NET_BUFFERincorporées dès que NdisMIndicateReceiveNetBufferLists est retourné. L’indication NET_BUFFER structures avec le jeu d’indicateurs NDIS_RECEIVE_FLAGS_RESOURCES force les pilotes de protocole à copier les données et doit donc être évité. Un pilote miniport doit détecter quand il est sur le point de manquer de ressources de réception et prendre toutes les mesures nécessaires pour éviter cette situation.
NDIS appelle la fonction MiniportReturnNetBufferLists d’un pilote miniport après que le pilote de protocole a appelé NdisReturnNetBufferLists.
Note Si un pilote miniport indique une structure NET_BUFFER_LIST avec l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES défini, cela ne signifie pas que NDIS indique la structure NET_BUFFER_LIST au pilote de protocole avec le même status. Par exemple, NDIS peut copier une structure de NET_BUFFER_LIST avec l’indicateur de NDIS_RECEIVE_FLAGS_RESOURCES défini et indiquer la copie au pilote de protocole avec l’indicateur effacé.
NDIS peut retourner des structures NET_BUFFER_LIST au pilote miniport dans n’importe quel ordre arbitraire et dans n’importe quelle combinaison. Autrement dit, la liste liée des structures de NET_BUFFER_LIST retournées à un pilote miniport par un appel à sa fonction MiniportReturnNetBufferLists peut avoir NET_BUFFER_LIST structures de différents appels précédents à NdisMIndicateReceiveNetBufferLists.
Les pilotes miniport doivent définir le membre SourceHandle dans les structures NET_BUFFER_LIST sur le MiniportAdapterHandle fourni par NDIS au pilote miniport dans la fonction MiniportInitializeEx . Les pilotes de filtre doivent définir le membre SourceHandle de chaque structure NET_BUFFER_LIST que le pilote de filtre provient du NdisFilterHandle du filtre que NDIS a fourni au pilote de filtre dans la fonction FilterAttach . Les pilotes de filtre ne doivent pas modifier le membre SourceHandle dans les structures NET_BUFFER_LIST qui ne proviennent pas du pilote de filtre.
Les pilotes intermédiaires définissent également le membre SourceHandle dans la structure NET_BUFFER_LIST sur la valeur MiniportAdapterHandle fournie par NDIS au pilote intermédiaire dans la fonction MiniportInitializeEx . Si un pilote intermédiaire transfère une indication de réception, le pilote doit enregistrer la valeur SourceHandle fournie par le pilote sous-jacent avant d’écrire dans le membre SourceHandle . Lorsque NDIS retourne une structure de NET_BUFFER_LIST transférée au pilote intermédiaire, le pilote intermédiaire doit restaurer le SourceHandle qu’il a enregistré.