Filtre de paquets Android

Le filtre de paquets Android (APF) permet au framework de contrôler la logique de filtrage des paquets matériels au moment de l'exécution. Cela permet au système d'économiser de l'énergie en supprimant les paquets au niveau matériel, tout en permettant au framework Android de modifier les règles de filtrage au moment de l'exécution en fonction des conditions du réseau.

Présentation de l'APF

L'APF se compose de deux éléments principaux :

  • L'interpréteur APF s'exécute sur le matériel réseau (généralement le chipset Wi-Fi). L'interpréteur APF exécute le bytecode APF sur les paquets reçus par le matériel et décide de les accepter, de les supprimer ou d'y répondre.
  • Le code de génération du programme APF s'exécute sur le processeur principal. Le code crée et met à jour les programmes APF en fonction de l'état du réseau et de l'appareil.

Les méthodes Wi-Fi HAL permettent au framework Android d'installer le bytecode du programme APF et de lire les compteurs actuels. Le module Mainline de la pile réseau peut mettre à jour le bytecode du programme APF à tout moment pendant l'exécution d'APF.

Plusieurs filtres APF sont implémentés. Par exemple, APF inclut des filtres permettant de supprimer les types Ethernet non autorisés, de filtrer les paquets d'annonces de routeur IPv6 (RA), de filtrer le trafic multicast et broadcast si le verrouillage multicast n'est pas maintenu, de supprimer les paquets DHCP pour les autres hôtes et de supprimer les paquets ARP (Address Resolution Protocol) et ND (Neighbor Discovery) non sollicités. Si le micrologiciel est compatible avec APFv6, ApfFilter génère également des règles pour répondre aux types de paquets courants qui nécessiteraient autrement que le processeur se réveille pour répondre, comme les requêtes ARP et les requêtes NS. La liste complète des filtres est définie dans ApfFilter.

Étant donné que le code de génération du programme APF fait partie du module Network Stack, vous pouvez utiliser les mises à jour Mainline mensuelles pour ajouter de nouveaux filtres et mettre à jour la logique de filtrage.

Révision de l'APF

La liste suivante décrit l'historique des révisions de l'APF :

  • APFv6 : introduit dans Android 15, cette version est compatible avec le filtrage des paquets, inclut des compteurs pour le débogage et les métriques, et est compatible avec la transmission des paquets.
  • APFv4 : introduit dans Android 10, cette version est compatible avec le filtrage des paquets et inclut des compteurs pour le débogage et les métriques.
  • APFv2 : introduite dans Android 7, cette version est compatible avec le filtrage des paquets.

Intégration de l'APF

Les API APF entre l'interpréteur APF et le matériel sont définies dans apf_interpreter.h (APFv4, APFv6). Le code du micrologiciel Wi-Fi appelle accept_packet() dans APFv4 ou apf_run() dans APFv6 pour déterminer si le paquet doit être supprimé (valeur de retour nulle) ou transmis au processeur d'application (valeur de retour non nulle). Si un paquet doit être transmis, apf_run() renvoie également zéro, car son paquet n'a pas besoin d'être transmis au processeur de l'application. Si le micrologiciel est compatible avec APFv6, il doit implémenter les API apf_allocate_buffer() et apf_transmit_buffer(). L'interpréteur APF appelle ces deux API lors de la logique de transmission des paquets. Les instructions APF sont de longueur variable. Chaque instruction comporte au moins un octet. Les codes d'instruction APF sont définis dans apf.h pour APFv4 et sont intégrés directement dans apf_interpreter.c pour APFv6.

L'APF repose sur une mémoire dédiée. La mémoire est utilisée à la fois pour le programme APF lui-même et pour le stockage des données. Elle ne doit pas être effacée ni écrite par le chipset, sauf par le biais des méthodes APF HAL. Le bytecode APF utilise le stockage de données pour stocker les compteurs de paquets acceptés et supprimés. La région de données peut être lue à partir du framework Android. Les instructions APF sont efficaces en termes de mémoire, mais pour maximiser leur potentiel d'économie d'énergie et de fonctionnalité, des règles de filtrage complexes et dynamiques sont nécessaires. Cette complexité nécessite une partie dédiée de la mémoire sur le chipset. La mémoire minimale requise pour APFv4 est de 1 024 octets, tandis que APFv6 nécessite 2 048 octets. Toutefois, nous vous recommandons vivement d'allouer 4 096 octets pour APFv6 afin de garantir des performances optimales. L'interpréteur APF doit être compilé dans le micrologiciel. Les interprètes APFv4 et APFv6 sont optimisés pour la taille du code. Sous l'architecture arm32, l'interpréteur APFv4 compilé est d'environ 1,8 Ko, tandis que l'interpréteur APFv6 plus complexe, avec des fonctionnalités supplémentaires (par exemple, la prise en charge native des sommes de contrôle et le code de décompression DNS natif), est d'environ 4 Ko.

Les filtres APF peuvent fonctionner avec d'autres filtres spécifiques aux fournisseurs de chipsets dans le micrologiciel. Les fournisseurs de chipsets peuvent choisir d'exécuter leur logique de filtrage avant ou après le processus de filtrage APF. Si un paquet est supprimé avant d'atteindre le filtre APF, ce dernier ne le traite pas.

Pour garantir le bon fonctionnement du filtre APF, lorsque l'APF est activé, le micrologiciel doit fournir au filtre APF l'accès à l'intégralité du paquet, et pas seulement à l'en-tête.

Exemples de programmes APF

ApfTest et ApfFilterTest contiennent des exemples de programmes de test qui illustrent le fonctionnement de chaque filtre APF. Pour étudier le programme généré, modifiez le cas de test afin d'imprimer le programme sous forme de chaîne hexadécimale.

Le dossier testdata contient des exemples de programmes APFv4 pour les filtres APF RA. Le dossier samples contient des utilitaires Python qui génèrent des programmes de déchargement APFv6. Pour en savoir plus, consultez la documentation dans les fichiers utilitaires Python.

Déboguer l'APF

Pour vérifier si l'APF est activé sur l'appareil, affichez le programme actuel, les compteurs actuels et exécutez la commande adb shell dumpsys network_stack. Voici un exemple de cette commande :

adb shell dumpsys network_stack
......
IpClient.wlan0 APF dump:
    Capabilities: ApfCapabilities{version: 4, maxSize: 4096, format: 1}
......
    Last program:
      6bfcb03a01b8120c6b9494026506006b907c025e88a27c025988a47c025488b87c024f88cd7c024a88e17c024588e384004408066a0e6bdca4022b000600010800060412147a1e016bd884021f00021a1c6b8c7c021c0000686bd4a402080006ffffffffffff6a266bbca402010004c0a801eb6bf87401f6120c84005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506c2fc393057dd6bf47401cb0a1e52f06bac7c01c600e06bb41a1e7e000001b9ffffffff6bb07e000001aec0a801ff6be868a4019a0006ffffffffffff6bb874019b6bf07401907c001386dd686bd0a4017d0006ffffffffffff6bc874017e0a147a0e3a6b980a267c017000ff6be07401650a366ba87c016200858219886a26a2050fff02000000000000000000000000006ba4740146aa0e84013700e6aa0f8c0130006068a4011b000f33330000000184c9b26aed4c86dd606a12a2f02600b03afffe8000000000000086c9b2fffe6aed4cff02000000000000000000000000000186006a3aa2e9024000123c92e4606a3ea2d70800000000000000006a56a2ce04030440c01a5a92c9601a5e92c4606a62a2bb04000000006a66a2a6102401fa00049c048400000000000000006a76a29d04030440c01a7a9298601a7e9293606c0082a28904000000006c0086a27310fdfd9ed67950000400000000000000006c0096a2690418033c001a9a9264606c009ea24e102401fa00049c048000000000000000006c00aea24404180330001ab2923f606c00b6a22910fdfd9ed67950000000000000000000006c00c6a21f04190300001aca921a606c00cea20410fdfd9ed67950000400000000000000016bc472086be4b03a01b87206b03a01b87201
    APF packet counters:
      TOTAL_PACKETS: 469
      PASSED_DHCP: 4
      PASSED_IPV4: 65
      PASSED_IPV6_NON_ICMP: 64
      PASSED_IPV4_UNICAST: 64
      PASSED_IPV6_ICMP: 223
      PASSED_IPV6_UNICAST_NON_ICMP: 6
      PASSED_ARP_UNICAST_REPLY: 4
      PASSED_NON_IP_UNICAST: 1
      DROPPED_RA: 4
      DROPPED_IPV4_BROADCAST_ADDR: 7
      DROPPED_IPV4_BROADCAST_NET: 27

Le résultat de cette commande adb shell dumpsys network_stack inclut les éléments suivants :

  • ApfCapabilities{version: 4, maxSize: 4096, format: 1} : cela signifie que les puces Wi-Fi sont compatibles avec APF (version 4).
  • Last program : cette section correspond au dernier binaire du programme APF installé au format chaîne hexadécimale.
  • APF packet counters : cette section indique le nombre de paquets transmis ou supprimés par APF, ainsi que les raisons spécifiques.

Pour décoder et désassembler le code en langage assembleur lisible par l'homme, utilisez l'outil apf_disassembler. Pour compiler le binaire exécutable, exécutez la commande m apf_disassembler. Voici un exemple d'utilisation de l'outil apf_disassembler :

echo "6bfcb03a01b8120c6b949401e906006b907c01e288a27c01dd88a47c01d888b87c01d388cd7c01ce88e17c01c988e384004008066a0e6bdca401af000600010800060412147a1e016bd88401a300021a1c6b8c7c01a00000686bd4a4018c0006ffffffffffff1a266bc07c018900006bf874017e120c84005408000a17821f1112149c00181fffab0d2a108211446a3239a205065a56483ac3146bf47401530a1e52f06bac7c014e00e06bb41a1e7e00000141ffffffff6be868a4012d0006ffffffffffff6bb874012e6bf07401237c001386dd686bd0a401100006ffffffffffff6bc87401110a147a0d3a6b980a267c010300ff6be072f90a366ba87af8858218886a26a2040fff02000000000000000000000000006ba472ddaa0e82d0aeaa0f8c00c9025868a2b60f5a56483ac3140c8126f3895186dd606a12a28b2600783afffe8000000000000002005efffe00026fff02000000000000000000000000000186006a3aa284024000123c94007d02586a3ea2700800000000000000006a56a26704190500001a5a94006002586a5ea23b2020014860486000000000000000006464200148604860000000000000000000646a7ea23204030440c01a8294002b02581a8694002402586c008aa21a04000000006c008ea204102a0079e10abcf60500000000000000006bc472086be4b03a01b87206b03a01b87201" | out/host/linux-x86/bin/apf_disassembler
       0: li    r1, -4
       2: lddw  r0, [r1+0]
       3: add   r0, 1
       5: stdw  r0, [r1+0]
       6: ldh   r0, [12]
       8: li    r1, -108
      10: jlt   r0, 0x600, 504
      15: li    r1, -112
      17: jeq   r0, 0x88a2, 504
      22: jeq   r0, 0x88a4, 504
      27: jeq   r0, 0x88b8, 504
      32: jeq   r0, 0x88cd, 504
      37: jeq   r0, 0x88e1, 504
      42: jeq   r0, 0x88e3, 504
      47: jne   r0, 0x806, 116
......

Pour vérifier les résultats APF hors connexion, utilisez l'outil apf_run. Pour compiler le binaire exécutable, exécutez la commande m apf_run. L'outil apf_run est compatible avec les interpréteurs APFv4 et APFv6.

Voici le manuel de la commande apf_run. Par défaut, la commande apf_run s'exécute dans l'interpréteur APFv4. Transmettre l'argument --v6 à apf_run lui permet de s'exécuter sur l'interpréteur APFv6. Tous les autres arguments peuvent être utilisés pour APFv4 et APFv6.

apf_run --help
Usage: apf_run --program <program> --pcap <file>|--packet <packet> [--data <content>] [--age <number>] [--trace]
  --program    APF program, in hex.
  --pcap       Pcap file to run through program.
  --packet     Packet to run through program.
  --data       Data memory contents, in hex.
  --age        Age of program in seconds (default: 0).
  --trace      Enable APF interpreter debug tracing
  --v6         Use APF v6
  -c, --cnt    Print the APF counters
  -h, --help   Show this message.

Voici un exemple pour transmettre un paquet à APF afin de vérifier s'il peut être supprimé ou transmis.

Pour fournir la représentation de la chaîne binaire hexadécimale du paquet brut, utilisez l'option --packet. Pour fournir la chaîne binaire hexadécimale de la région de données, qui est utilisée pour stocker le compteur APF, utilisez --data option. Comme chaque compteur mesure 4 octets, les régions de données doivent être suffisamment longues pour éviter tout dépassement de mémoire tampon.

out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b9494010c06006b907c010588a27c010088a47c00fb88b87c00f688cd7c00f188e17c00ec88e384003908066a0e6bdca2d40600010800060412147a18016bd882ca021a1c6b8c7ac900686bd4a2b706ffffffffffff6a266bbca2b204c0a814656bf872a8120c84005808000a17821e1112149c00171fffab0d2a108210446a3239a204064651dbcc88ff6bf4727e0a1e52f06bac7a7be06bb41a1e7e0000006effffffff6bb07e00000063c0a814ff6be868a25106ffffffffffff6bb872536bf072497c001086dd686bd0a23806ffffffffffff6bc8723a0a147a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201 --packet 5ebcd79a8f0dc244efaab81408060001080006040002c244efaab814c0a8ca1e5ebcd79a8f0d --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Packet passed
Data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001

Pour comparer les résultats de l'APF avec le fichier pcap capturé par tcpdump, utilisez la commande apf_run comme suit :

out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b989401df06006b947c01d888a27c01d388a47c01ce88b87c01c988cd7c01c488e17c01bf88e384004408066a0e6bdca401a5000600010800060412147a1e016bd884019900021a1c6b907c01960000686bd4a401820006ffffffffffff6a266bc0a4017b0004c0a82b056bf874017084005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506fabe589435936bf47401470a1e52f06bb07c014200e06bb81a1e7e00000135ffffffff6bb47e0000012ac0a82bff6be868a401160006ffffffffffff6bbc7401176bf074010c7c001086dd686bd0a2fb06ffffffffffff6bcc72fd0a147a0b3a6b9c0a267af1ff6be072e70a366bac7ae6858218886a26a2040fff02000000000000000000000000006ba872cbaa0e82be8eaa0f8c00b7025868a2a40ffabe5894359352a9874d08aa86dd606a12a2792600583afffe80000000000000f7d4e8ccd81ddb43fe80000000000000f8be58fffe94359386006a3aa272024108123c94006b02586a3ea25e0800000000000000006a56a25504030440c01a5a94004e02581a5e94004702586a62a23e04000000006a66a229102409891f9a26ae6d00000000000000006a76a22004190300001a7a94001902586a7ea204102409891f9a26ae6dba98e781ca9ef9ba6bc872086be4b03a01b87206b03a01b87201 --pcap apf.pcap --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
37 packets dropped
1733 packets passed
Data: 00000000000000000000000000000000000000000200000005000000000000000000000002000000000000001b000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000689000000000000003c00000000000000000000000000000000000006ea

Pour tester les capacités de transmission APFv6, utilisez la commande apf_run comme suit :

$ apf_run --program 75001001020304050608060001080006040002AA300E3CAA0FBA06AA09BA07AA08BA086A01BA09120C84006F08066A0EA30206000108000604032B12147A27017A020203301A1C820200032D68A30206FFFFFFFFFFFF020E1A267E000000020A000001032C020B1A267E000000020A000001032CAB24003CCA0606CB0306CB090ACB0306C60A000001CA0606CA1C04AA
0A3A12AA1AAA25FFFF032F020D120C84001708000A1782100612149C00091FFFAB0D2A10820207032A02117C000E86DD68A30206FFFFFFFFFFFF021603190A1482020002187A023A02120A36820285031F8216886A26A2020FFF020000000000000000000000000003200214 --packet FFFFFFFFFFFF112233445566080600010800060400011122334455660A0000020000000000000A0000
01 --data 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 --age 0 --v6 --trace
      R0       R1       PC  Instruction
-------------------------------------------------
       0        0        0: data        16, 01020304050608060001080006040002
       0        0       19: debugbuf    size=3644
       0        0       23: ldm         r0, m[15]
       0        0       25: stdw        counter=6, r0
       0        0       27: ldm         r0, m[9]
       0        0       29: stdw        counter=7, r0
       0        0       31: ldm         r0, m[8]
 134d811        0       33: stdw        counter=8, r0
 134d811        0       35: li          r0, 1
       1        0       37: stdw        counter=9, r0
       1        0       39: ldh         r0, [12]
     806        0       41: jne         r0, 0x806, 157
     806        0       46: li          r0, 14
       e        0       48: jbseq       r0, 0x6, 59, 000108000604
       e        0       59: ldh         r0, [20]
       1        0       61: jeq         r0, 0x1, 103
       1        0      103: ldw         r0, [38]
 a000001        0      105: jeq         r0, 0xa000001, 116
 a000001        0      116: allocate    60
 a000001        0      120: pktcopy     src=6, len=6
 a000001        0      123: datacopy    src=3, len=6
 a000001        0      126: datacopy    src=9, len=10
 a000001        0      129: datacopy    src=3, len=6
 a000001        0      132: write       0x0a000001
 a000001        0      137: pktcopy     src=6, len=6
 a000001        0      140: pktcopy     src=28, len=4
 a000001        0      143: ldm         r0, m[10]
      2a        0      145: add         r0, 18
      3c        0      147: stm         r0, m[10]
      3c        0      149: transmit    ip_ofs=255
      3c        0      153: drop        counter=47
Packet dropped
Data: 00000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000100000011d8340100000000000000000000000000000000000000000100000078563412
transmitted packet: 112233445566010203040506080600010800060400020102030405060a0000011122334455660a000002000000000000000000000000000000000000

Lorsque vous utilisez le paramètre --trace, l'outil apf_run fournit un résultat détaillé de chaque étape de l'exécution de l'interpréteur, ce qui est utile pour le débogage. Dans cet exemple, nous saisissons un paquet de requête ARP dans le programme APF. La sortie indique que la requête ARP est abandonnée, mais qu'un paquet de réponse est généré. Les détails de ce paquet généré sont indiqués dans la section transmitted packet.

Problèmes d'intégration courants

Cette section met en évidence plusieurs problèmes courants rencontrés lors de l'intégration d'APF :

  • Effacement inattendu de la région de données : la mémoire APF doit être entièrement dédiée à APF. Seuls le code de l'interpréteur ou le code du framework (via l'API HAL) sont autorisés à modifier la région de mémoire APF.
  • Problèmes d'installation avec les programmes APF de X octets (X <= maxLen) : Le micrologiciel doit être compatible avec la lecture ou l'écriture de programmes de n'importe quelle longueur jusqu'à maxLen sans échec, plantage ni troncature. Les écritures ne doivent pas modifier les octets entre X et maxLen.
  • Implémentation de l'APF dans le code du pilote : l'APF ne doit être implémenté que dans le micrologiciel, et non dans le code du pilote. Sinon, il n'y a aucun avantage en termes d'économie d'énergie, car le processeur doit se réactiver pour traiter le paquet.
  • Valeurs filter_age ou filter_age_16384th incorrectes : les valeurs filter_age (APFv4) et filter_age_16384th (APFv6) doivent être transmises correctement aux fonctions accept_packet() et apf_run(). Pour en savoir plus sur le calcul de filter_age_16384th, consultez la documentation dans apf_interpreter.h.
  • L'APF n'est pas activé lorsque cela est nécessaire : l'APF doit être activé lorsque l'écran est éteint et que la connexion Wi-Fi est inactive ou que le trafic est inférieur à 10 Mbit/s.
  • Paquets tronqués transmis à accept_packet() ou apf_run() : tous les paquets unicast, broadcast et multicast transmis à accept_packet() ou apf_run() doivent être complets. Il n'est pas possible de transmettre des paquets tronqués à APF.

Tests APF

À partir d'Android 15, Android fournit des cas de test CTS pour un seul appareil et pour plusieurs appareils pour l'intégration du filtre APF et de l'interpréteur APF afin de garantir le bon fonctionnement d'APF. Voici une description de l'objectif de chaque cas de test :

  • ApfFilter et apf_interpreter Test d'intégration : vérifie que ApfFilter génère le bytecode correct et que apf_interpreter exécute le code correctement pour produire les résultats attendus.
  • CTS APF pour un seul appareil : utilise un seul appareil pour tester la fonctionnalité APF sur le chipset Wi-Fi. Vérifiez les points suivants :
    • L'APF s'active lorsque l'écran est éteint et que le trafic Wi-Fi est inférieur à 10 Mbit/s.
    • Les fonctionnalités APF sont correctement déclarées.
    • Les opérations de lecture et d'écriture sur la région de mémoire APF réussissent, et la région de mémoire n'est pas modifiée de manière inattendue.
    • Les arguments sont correctement transmis à accept_packet() ou apf_run().
    • Le micrologiciel intégré à APFv4/APFv6 peut abandonner des paquets.
    • Le micrologiciel intégré à APFv6 peut répondre aux paquets.
  • CTS APF multi-appareils : utilise deux appareils (un émetteur et un récepteur) pour tester le comportement de filtrage de l'APF. Différents types de paquets sont générés côté expéditeur. Le test vérifie s'ils sont correctement supprimés, transmis ou répondus en fonction des règles configurées dans ApfFilter.

Instructions supplémentaires pour les tests d'intégration

De plus, nous recommandons vivement aux fournisseurs de chipsets d'intégrer les tests APF à leurs propres suites de tests d'intégration Wi-Fi du micrologiciel.

L'intégration des tests APF dans les suites de tests d'intégration Wi-Fi du micrologiciel est essentielle pour vérifier le bon fonctionnement de l'APF dans des scénarios de connexion Wi-Fi complexes, tels que les scénarios de connexion Wi-Fi "make-before-break" ou d'itinérance. Vous trouverez des instructions détaillées sur la façon d'effectuer des tests d'intégration dans la section suivante.

Prérequis

Lorsque vous effectuez des tests d'intégration, procédez comme suit :

  • L'APF doit être activé dans tous les scénarios de tests d'intégration (par exemple, l'itinérance et le make-before-break).
  • Au début de chaque test, effacez la mémoire de l'APF.
  • Installez ou réinstallez les programmes APF toutes les cinq minutes pendant le test.

Scénarios de test

L'APF doit être actif tout au long des tests d'intégration. Ce document fournit deux programmes APF qui peuvent être installés lors des tests. Les programmes sont au format chaîne hexadécimale. Le testeur doit convertir la chaîne hexadécimale en binaire et l'installer dans le micrologiciel pour que les programmes puissent être exécutés par apf_interpreter. Lors du test d'intégration, le testeur doit envoyer des paquets qui devraient déclencher la logique de filtrage dans le programme 1 et le programme 2.

Programme APF 1

Lorsque l'écran de l'appareil est allumé, installez le programme APF 1. Ce programme peut supprimer des paquets inoffensifs qui n'ont pas d'incidence sur le fonctionnement de l'appareil. Ces paquets sont utilisés pour tester si l'APF filtre correctement le trafic réseau.

La logique du programme APF 1 est la suivante :

  1. Déposer et incrémenter le compteur :
    1. Valeurs EtherType : 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. Paquets de découverte ou de requête DHCP IPv4
    3. Paquets RS
  2. Transmettre et incrémenter le compteur : tous les autres paquets.

Les codes d'un octet du programme APF sont les suivants :

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
Programme APF 2

Lorsque l'écran de l'appareil est éteint, installez le programme APF 2. Ce programme filtre tous les paquets filtrés par le programme 1 de l'APF, ainsi que les paquets de demandes ping. Pour vérifier que le programme 2 de l'APF est correctement installé, envoyez des paquets ping à l'appareil testé.

Voici la logique du programme APF 2 :

  1. Déposer et incrémenter le compteur :
    1. Valeurs EtherType : 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. Paquets de découverte ou de requête DHCP IPv4
    3. Paquets RS
  2. Suppression et incrémentation du compteur : paquets de requête ping ICMP
  3. Transmettre et incrémenter le compteur : tous les autres paquets

Les codes de deux octets du programme APF sont les suivants :

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C007488A27C006F88A47C006A88B87C006588CD7C006088E17C005B88E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE87234120C84000E86DD0A1482093A0A368204856BE0721F120C84001008000A17820B01AB0D220E8204086BE472086BDCB03A01B87206B03A01B87201
Vérification des données

Pour vérifier que le programme APF est exécuté et que les paquets sont transmis ou supprimés correctement, procédez comme suit :

  • Récupérez et vérifiez la région de données APF toutes les cinq minutes.
  • Ne supprimez pas le compteur.
  • Générez des paquets de test pour déclencher chaque règle de filtrage.
  • Vérifiez les incréments de compteur à l'aide des emplacements de mémoire suivants :

    Nom du compteur Emplacement de la mémoire
    DROPPED_ETHERTYPE_DENYLISTED [ApfRamSize - 20, ApfRamSize - 16]
    DROPPED_DHCP_REQUEST_DISCOVERY [ApfRamSize - 24, ApfRamSize - 20]
    DROPPED_ICMP4_ECHO_REQUEST [ApfRamSize - 28, ApfRamSize - 24]
    DROPPED_RS [ApfRamSize - 32, ApfRamSize - 28]
    PASSED_PACKET [ApfRamSize - 36, ApfRamSize - 32]

Pseudo-code pour les programmes APF 1 et APF 2

Le pseudo-code suivant explique en détail la logique des programmes APF 1 et APF 2 :

// ethertype filter
If the ethertype in [0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3]:
    drop packet and increase counter: DROPPED_ETHERTYPE_DENYLISTED

// dhcp discover/request filter
if ethertype != ETH_P_IP:
    skip the filter
if ipv4_src_addr != 0.0.0.0:
    skip the filter
if ipv4_dst_addr != 255.255.255.255
    skip the filter
if not UDP packet:
    skip the filter
if UDP src port is not dhcp request port:
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_DHCP_REQUEST_DISCOVERY

// Router Solicitation filter:
if ethertype != ETH_P_IPV6:
    skip the filter
if not ICMP6 packet:
    skip the filter
if ICMP6 type is not a Router Solicitation:
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_RS

// IPv4 ping filter (only included in Program 2)
if ethertype != ETH_P_IP:
    skip the filter
if it ipv4 protocol is not ICMP:
    skip the filter
if port is not a ping request port
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_ICMP4_ECHO_REQUEST

pass the packet and increase: PASSED_PACKET