Partager via


Bouclage des paquets NDIS

Si l’indicateur NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET dans le membre NblFlags de la structure NET_BUFFER_LIST est défini, le paquet est un paquet de bouclage. Les pilotes de protocole et les pilotes de filtre peuvent case activée cet indicateur pour déterminer si un paquet est un paquet de bouclage.

NDIS remet en boucle les paquets si les trois conditions suivantes sont remplies :

  1. Le type de média de l’adaptateur miniport sous-jacent est NdisMedium802_3 ou NdisMedium802_5.

  2. L’une des trois conditions suivantes est remplie :

    1. Une liaison de protocole a défini le paramètre de NDIS_PACKET_TYPE_PROMISCUOUS avec l’OID OID_GEN_CURRENT_PACKET_FILTER pour spécifier son filtre de paquets (et, pour Windows 8 et versions ultérieures, n’a pas défini NDIS_PACKET_TYPE_NO_LOCAL dans le même OID) et l’une des conditions suivantes est vraie :

      • Il existe plusieurs liaisons à l’adaptateur miniport.
      • Un module de filtre est attaché à l’adaptateur miniport et le module de filtre a inscrit un gestionnaire de réception.
    2. Une liaison de protocole définit le paramètre de NDIS_PACKET_TYPE_ALL_LOCAL avec l’OID OID_GEN_CURRENT_PACKET_FILTER pour spécifier son filtre de paquets et l’une des conditions suivantes est vraie.

      • Il existe plusieurs liaisons à l’adaptateur miniport.
      • Un module de filtre est attaché à l’adaptateur miniport et le module de filtre a inscrit un gestionnaire de réception.
    3. L’appelant définit l’indicateur NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK dans le paramètre SendFlags de la fonction NdisSendNetBufferLists .

  3. Le paquet est acceptable comme déterminé par le filtre de paquets défini avec l’OID OID_GEN_CURRENT_PACKET_FILTER pour l’adaptateur miniport. Voici quelques exemples :

    • Si le paquet est un paquet direct, l’adresse de destination dans le paquet doit correspondre à l’adresse MAC de l’adaptateur miniport.
    • Si le paquet est un paquet de multidiffusion, le filtre de paquets doit avoir NDIS_PACKET_TYPE_ALL_MULTICAST défini ou l’adresse de destination correspond à l’une des adresses de multidiffusion dans la liste d’adresses de multidiffusion de l’adaptateur miniport et le filtre de paquets a NDIS_PACKET_TYPE_MULTICAST défini.
    • Si le paquet est un paquet de diffusion, le filtre de paquets de l’adaptateur miniport doit avoir NDIS_PACKET_TYPE_BROADCAST défini.
    • Le filtre de paquets de l’adaptateur miniport a NDIS_PACKET_TYPE_PROMISCUOUS ou NDIS_PACKET_TYPE_ALL_LOCAL défini.

Une liaison de protocole reçoit des paquets de bouclage si l’une des conditions suivantes est vraie :

  1. La liaison de protocole est l’expéditeur d’origine du paquet et NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK est défini.

  2. La liaison de protocole ne définit pas NDIS_PACKET_TYPE_NO_LOCAL dans le filtre de paquets.

Une liaison de protocole ne reçoit pas de paquets de bouclage si l’une des conditions suivantes est remplie :

  1. La liaison de protocole définit NDIS_PACKET_TYPE_NO_LOCAL dans le filtre de paquets et il ne s’agit pas de l’expéditeur d’origine du paquet.

  2. La liaison de protocole est l’expéditeur d’origine, mais NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK n’est pas défini dans le paramètre SendFlags dans un appel à la fonction NdisSendNetBufferLists .

La figure suivante montre le flux logique de l’algorithme de bouclage.

Organigramme qui montre le flux logique de l’algorithme de bouclage.