Utilisation du filtrage de couche 2

Le filtrage de couche 2 est pris en charge dans Windows 8 et versions ultérieures de Windows.

Cette fonctionnalité PAM permet de filtrer les champs de l’en-tête MAC de couche 2. Ces couches sont appelées par paquet pour tous les paquets envoyés ou reçus par l’ordinateur hôte. Les couches sont appelées avant le réassemblage des paquets sur le chemin d’accès entrant et après la fragmentation des paquets sur le chemin sortant. Ces couches sont accessibles à partir d’un pilote de filtre léger (LWF) NDIS.

Notes

Une légende ne doit pas injecter de paquets au niveau d’une couche si elle ne dispose pas déjà d’un filtre correspondant au niveau de cette couche. L’injection des structures NET_BUFFER_LIST doit être coordonnée avec l’ajout et la suppression du filtre afin que l’injection ne soit effectuée que lorsque le filtre existe dans la couche correspondante. En outre, les fournisseurs ne doivent pas supprimer les filtres qui appartiennent à d’autres fournisseurs. 

Cette section comprend les rubriques suivantes :

Injection d’images MAC

Un pilote de rappel appelle la fonction FwpsInjectMacReceiveAsync0 pour réinjecter une image MAC précédemment absorbée (ou un clone de l’image) vers le chemin de données entrantes de couche 2 à partir de laquelle elle a été interceptée, ou pour injecter une image MAC inventée dans le chemin de données entrantes.

Un pilote de rappel appelle la fonction FwpsInjectMacSendAsync0 pour réinjecter une image MAC précédemment absorbée (ou un clone de l’image) vers le chemin de données sortante de couche 2 à partir de laquelle elle a été interceptée, ou pour injecter une trame MAC inventée dans le chemin de données sortant.

Le paramètre netBufferLists peut être une chaîne NET_BUFFER_LIST . Toutefois, la fonction d’achèvement peut être appelée plusieurs fois chacune, complétant un segment (ou un seul NET_BUFFER_LIST) de la chaîne.

Les images injectées peuvent être classées à nouveau si les paquets correspondent au même filtre que celui initialement classé. Par conséquent, comme pour les légendes des couches IP, les légendes de couche 2 doivent également protéger contre l’inspection infinie des paquets en appelant FwpsQueryPacketInjectionState0.

En outre, vous devez avoir des légendes au niveau de la couche où vous injectez. Dans le cas contraire, votre NET_BUFFER_LIST injectée ne sera pas terminée à votre fonction d’achèvement, et le NET_BUFFER_LIST ira plus loin dans la pile. Dans ce cas, le comportement n’est pas défini, car NDIS essaiera de passer le NET_BUFFER_LIST injecté au composant suivant dans la pile.

Le membre État NET_BUFFER_LIST contient le résultat status de l’injection de pile. Le résultat status de l’injection de pile est le status que la pile place dans le NET_BUFFER_LIST après le retour d’une fonction d’injection PAM STATUS_SUCCESS. Vous devez utiliser la macro NT_SUCCESS pour case activée l’status de l’injection de pile dans le membre Status. Si la valeur Status est STATUS_SUCCESS, l’injection a réussi sans plus d’informations. Les valeurs de membre d’état supérieures à STATUS_SUCCESS signifient que l’injection a réussi, mais il peut y avoir plus d’informations sur l’injection qui doivent être prises en compte. Les valeurs de membre d’état inférieures à STATUS_SUCCESS signifient que l’injection a échoué pour la raison spécifiée dans le membre Status.

Classification des listes de mémoires tampons réseau chaînées

Par défaut, un pilote de légende peut uniquement classer les listes de mémoires tampons réseau individuellement. Toutefois, un pilote de légende peut classer NET_BUFFER_LIST chaînes pour de meilleures performances, s’il effectue les deux opérations suivantes :

  • Spécifie l’indicateur FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY dans le membre Indicateurs de la structure FWPS_CALLOUT2 .
  • Inscrit une fonction classifyFn2 qui peut classifier NET_BUFFER_LIST chaînes.

Avertissement

Toutefois, si un pilote de légende définit l’indicateur FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY , il ne peut pas utiliser les fonctions suivantes pour modifier NET_BUFFER_LISTs.

Avec cet indicateur défini, FwpsAllocateCloneNetBufferList0 retourne toujours une erreur INVALID_PARAMETER . Cela peut entraîner de manière inattendue l’échec d’un pilote de légende tierce pour gérer le nombre de références de NET_BUFFER_LISTs, entraînant l’arrêt des opérations d’envoi et de réception.

Couches et champs de couche 2 du PAM

Les identificateurs de couche de filtrage au moment de l’exécution pour le filtrage des commutateurs virtuels sont les suivants :

FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET

FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET

FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE

FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE

Les identificateurs de champ de données pour le filtrage des commutateurs virtuels sont les suivants :

FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET

FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET

FWPS_FIELDS_INBOUND_MAC_FRAME_NATIVE

FWPS_FIELDS_OUTBOUND_MAC_FRAME_NATIVE