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 abandonnant les paquets en mode 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'API AF

Ce programme se compose de deux éléments principaux:

  • L'interpréteur APF s'exécute sur du matériel réseau (généralement, le chip 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 de 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 HAL Wi-Fi permettent au framework Android d'installer le bytecode du programme APF et de lire les compteurs actuels. Le module réseau principal de la pile réseau peut mettre à jour le bytecode du programme APF à tout moment pendant son exécution.

Plusieurs filtres APF sont implémentés. Par exemple, APF inclut des filtres pour supprimer les éthertypes non autorisés, filtrer les paquets d'annonces de routeur IPv6, filtrer le trafic de multidiffusion et de diffusion si le verrouillage multicast n'est pas respecté, supprimer les paquets DHCP d'autres hôtes, et supprimer les paquets ARP (Unsolicited Address Resolution Protocol) et ND (Neighbor Discovery Protocol). 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 de programme APF fait partie du module de pile réseau, vous pouvez utiliser les mises à jour principales mensuelles pour ajouter de nouveaux filtres et mettre à jour la logique de filtrage.

Révision de l'API AFP

La liste suivante décrit l'historique des révisions de l'API Google Play:

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

Intégration de l'API AF

Les API APF entre l'interprète 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 de l'application (valeur de retour différente de zéro). Si un paquet doit être transmis, apf_run() renvoie également zéro, car son paquet n'a pas besoin d'être transmis au processeur d'application. Si le micrologiciel est compatible avec APFv6, il doit implémenter les API apf_allocate_buffer() et apf_transmit_buffer(). L'interprète APF appelle ces deux API lors de la logique de transmission des paquets. Les instructions APF sont de longueur variable. La longueur de chaque instruction est d'au moins 1 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 de données. Elle ne doit pas être effacée ni écrite par le chipset, sauf via les méthodes HAL APF. Le bytecode APF utilise le stockage de données pour stocker les compteurs des paquets acceptés et abandonné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 la maximisation de leur potentiel d'économie d'énergie et de fonctionnalité nécessite des règles de filtrage dynamiques et complexes. Cette complexité nécessite une partie dédiée de la mémoire sur puce. 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éteurs APFv4 et APFv6 sont optimisés pour la taille du code. Sous l'architecture arm32, l'interprète APFv4 compilé mesure environ 1,8 ko, tandis que l'interprète APFv6 plus complexe, avec des fonctionnalités supplémentaires (par exemple, la prise en charge de la somme de contrôle native et le code de décompression DNS natif), mesure environ 4 ko.

Les filtres APF peuvent fonctionner avec d'autres filtres spécifiques au fournisseur de chipset 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, le filtre APF ne le traite pas.

Pour garantir le bon fonctionnement du filtre APF, lorsque l'APF est activé, le micrologiciel doit fournir au filtre APF un accès à l'ensemble 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 RA APF. Le dossier samples contient des utilitaires Python qui génèrent des programmes d'externalisation APFv6. Pour en savoir plus, consultez la documentation des fichiers d'utilitaire Python.

Déboguer l'API Firebase Analytics

Pour vérifier si l'API FP est activée sur l'appareil, affichez le programme en cours, les compteurs en cours 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 cet exemple de 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 l'APF (version 4).
  • Last program: cette section correspond au dernier programme binaire APF installé au format de chaîne hexadécimale.
  • APF packet counters: cette section indique le nombre de paquets transmis ou supprimés par la règle APF et les motifs spécifiques.

Pour décoder et désassembler le code en langage d'assemblage 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 de l'API FP 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.

Vous trouverez ci-dessous 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 permet de l'exécuter avec l'interpréteur APFv6. Tous les autres arguments peuvent être utilisés à la fois 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 de transmission d'un paquet à l'APF pour vérifier s'il peut être abandonné ou transmis.

Pour fournir la pré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. Étant donné que chaque compteur compte 4 octets, les régions de données doivent être suffisamment longues pour qu'aucun débordement de tampon ne se produise.

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 au 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 fonctionnalité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 une sortie détaillée de chaque étape de l'exécution de l'interprète, 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 affiché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 de la fonctionnalité APF:

  • Effacement inattendu de la région de données:la mémoire APF doit être entièrement dédiée à l'APF. Seul le code de l'interprète ou le code du framework (via l'API HAL) est autorisé à modifier la région de mémoire APF.
  • Problèmes d'installation avec des programmes APF de X octets (X <= maxLen) : le micrologiciel doit prendre en charge la lecture ou l'écriture de toute longueur de programme jusqu'à maxLen sans échec, plantage ni troncation. Les écritures ne doivent pas modifier les octets compris entre X et maxLen.
  • Implémentation de l'APF dans le code du pilote:l'APF ne doit être implémentée que dans le micrologiciel, et non dans le code du pilote. Sinon, aucun avantage d'économie d'énergie n'est obtenu, car le processeur doit se réveiller pour traiter le paquet.
  • Valeurs filter_age ou filter_age_16384th incorrectes:les valeurs filter_age (APFv4) et filter_age_16384th (APFv6) doivent être correctement transmises aux fonctions accept_packet() et apf_run(). Pour en savoir plus sur le calcul de filter_age_16384th, consultez la documentation sur apf_interpreter.h.
  • APF non activé lorsque nécessaire:APF doit être activé lorsque l'écran est éteint et que le lien Wi-Fi est inactif 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. La transmission de paquets tronqués à l'APF n'est pas valide.

Tests APF

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

  • Test d'intégration de ApfFilter et apf_interpreter:vérifie que ApfFilter génère un bytecode approprié et que apf_interpreter exécute correctement le code pour produire les résultats attendus.
  • CTS APF à appareil unique: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 allumé et que le trafic Wi-Fi est inférieur à 10 Mbit/s.
    • Les fonctionnalités APF sont déclarées correctement.
    • Les opérations de lecture et d'écriture sur la région de mémoire APF aboutissent, 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 multi-appareil APF:utilise deux appareils (un émetteur, 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, et le test vérifie s'ils ont été correctement supprimés, transmis ou traités en fonction des règles configurées dans ApfFilter.

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

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

L'intégration des tests APF dans les suites de tests d'intégration Wi-Fi du micrologiciel est cruciale pour vérifier le bon fonctionnement de l'APF dans les scénarios de connexion Wi-Fi complexes, par exemple pour les connexions Wi-Fi ininterrompues ou en itinérance. Vous trouverez des instructions détaillées sur l'exécution de tests d'intégration dans la section suivante.

Prérequis

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

  • L'API Flutter Plugin doit être activée dans tous les scénarios de test d'intégration (par exemple, le roaming, la création avant la rupture).
  • Au début de chaque test, effacez la mémoire de l'API Flutter.
  • 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. Deux programmes APF sont fournis dans ce document et peuvent être installés pendant les tests. Les programmes sont au format de chaîne hexadécimale. Le testeur doit convertir la chaîne hexadécimale en binaire et l'installer dans le micrologiciel afin 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 les programmes 1 et 2.

Programme APF 1

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

La logique du programme 1 de l'API Azure Function est la suivante:

  1. Compteur de dépôt et d'incrémentation :
    1. Valeurs EtherType: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1 et 0x88E3
    2. Paquets de découverte ou de requête DHCP IPv4
    3. Paquets RS
  2. Compteur de transmission et d'incrémentation: tous les autres paquets.

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

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
Programme APF 2

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

La logique du programme 2 de l'API Azure Playground for Firebase est la suivante:

  1. Baisser et incrémenter le compteur :
    1. Valeurs EtherType: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1 et 0x88E3
    2. Paquets de découverte ou de requête DHCP IPv4
    3. Paquets RS
  2. Compteur d'abandons et d'incrémentation: paquets de requêtes de ping ICMP
  3. Compteur de transmission et d'incrémentation: tous les autres paquets

Les codes du programme 2 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 correctement transmis ou abandonnés, procédez comme suit:

  • Récupérez et vérifiez la région de données APF toutes les cinq minutes.
  • Ne pas effacer le compteur.
  • Générez des paquets de test pour déclencher chaque règle de filtre.
  • 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]

Pseudocode pour le programme 1 et le programme 2 de l'API F

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