Android-Paketfilter

Mit dem Android Packet Filter (APF) kann das Framework die Hardware-Paketfilterlogik zur Laufzeit steuern. Dadurch kann das System Strom sparen, indem Pakete in der Hardware verworfen werden. Gleichzeitig kann das Android-Framework die Filterregeln zur Laufzeit basierend auf den Netzwerkbedingungen ändern.

APF-Übersicht

APF besteht aus zwei Hauptkomponenten:

  • Der APF-Interpreter wird auf der Netzwerkhardware ausgeführt (in der Regel auf dem WLAN-Chipsatz). Der APF-Interpreter führt APF-Bytecode für Pakete aus, die von der Hardware empfangen werden, und entscheidet, ob sie akzeptiert, verworfen oder beantwortet werden sollen.
  • Der APF-Programmgenerierungscode wird auf der Haupt-CPU ausgeführt. Der Code erstellt und aktualisiert APF-Programme entsprechend dem Netzwerk- und Gerätestatus.

Mit den Wi-Fi HAL-Methoden kann das Android-Framework den APF-Programm-Bytecode installieren und die aktuellen Zähler lesen. Das Network Stack Mainline-Modul kann den APF-Programm-Bytecode jederzeit aktualisieren, während APF ausgeführt wird.

Es sind mehrere APF-Filter implementiert. APF enthält beispielsweise Filter, um nicht zulässige EtherTypes zu verwerfen, IPv6-Router-Advertisement-Pakete (RA) zu filtern, Multicast- und Broadcast-Traffic zu filtern, wenn die Multicast-Sperre nicht gehalten wird, DHCP-Pakete für andere Hosts zu verwerfen und unerwünschte ARP-Pakete (Address Resolution Protocol) und ND-Pakete (Neighbor Discovery) zu verwerfen. Wenn die Firmware APFv6 unterstützt, ApfFilter generiert auch Regeln, um auf gängige Pakettypen zu antworten, für die andernfalls die CPU aktiviert werden müsste, z. B. ARP- und NS Abfragen. Die vollständige Liste der Filter ist in ApfFilter definiert.

Da der APF-Programmgenerierungscode Teil des Network Stack-Moduls ist, können Sie mit monatlichen Mainline-Updates neue Filter hinzufügen und die Filterlogik aktualisieren.

APF-Revision

In der folgenden Liste wird der Überarbeitungsverlauf von APF beschrieben:

  • APFv6 wurde in Android 15 eingeführt. Diese Version unterstützt die Paketfilterung, enthält Zähler für das Debugging und Messwerte und unterstützt die Paketübertragung.
  • APFv4 wurde in Android 10 eingeführt. Diese Version unterstützt die Paketfilterung und enthält Zähler für das Debugging und Messwerte.
  • APFv2 wurde in Android 7 eingeführt. Diese Version unterstützt die Paketfilterung.

APF-Integration

Die APF-APIs zwischen dem APF-Interpreter und der Hardware sind in apf_interpreter.h (APFv4, APFv6) definiert. Der Wi-Fi-Firmwarecode ruft accept_packet() in APFv4 oder apf_run() in APFv6 auf, um zu ermitteln, ob das Paket verworfen (Rückgabewert 0) oder an den App-Prozessor übergeben werden soll (Rückgabewert ungleich 0). Wenn ein Paket übertragen werden muss, gibt apf_run() ebenfalls 0 zurück, da das Paket nicht an den App-Prozessor übergeben werden muss. Wenn die Firmware APFv6 unterstützt, müssen die APIs apf_allocate_buffer() und apf_transmit_buffer() implementiert werden. Der APF-Interpreter ruft diese beiden APIs während der Paketübertragungslogik auf. APF-Anweisungen haben eine variable Länge. Jede Anweisung ist mindestens 1 Byte lang. Die APF-Anweisungscodes sind definiert in apf.h für APFv4 und für APFv6 direkt in apf_interpreter.c eingebettet.

APF verwendet einen dedizierten Arbeitsspeicher. Der Arbeitsspeicher wird sowohl für das APF-Programm selbst als auch für die Datenspeicherung verwendet. Er darf vom Chipsatz nur über die APF HAL-Methoden gelöscht oder beschrieben werden. Der APF-Bytecode verwendet den Datenspeicher, um Zähler für akzeptierte und verworfene Pakete zu speichern. Sie können den Datenbereich über das Android-Framework lesen. APF-Anweisungen sind speichereffizient, aber um ihr Potenzial für Energieeinsparungen und Funktionalität zu maximieren, sind komplexe, dynamische Filterregeln erforderlich. Diese Komplexität erfordert einen dedizierten Teil des On-Chip-Arbeitsspeichers. Die Mindestanforderung an den Arbeitsspeicher für APFv4 beträgt 1024 Byte, für APFv6 sind 2048 Byte erforderlich. Wir empfehlen jedoch dringend, 4096 Byte für APFv6 zuzuweisen, um eine optimale Leistung zu gewährleisten. Der APF-Interpreter muss in die Firmware kompiliert werden. Sowohl APFv4- als auch APFv6-Interpreter sind für die Codegröße optimiert. Unter der arm32-Architektur ist der kompilierte APFv4-Interpreter etwa 1,8 KB groß, während der komplexere APFv6-Interpreter mit zusätzlichen Funktionen (z. B. integrierte Prüfsummenerstellung und integrierter DNS-Dekomprimierungscode) etwa 4 KB groß ist.

APF-Filter können zusammen mit anderen chipsatzanbieterspezifischen Filtern in der Firmware verwendet werden. Sie können Ihre Filterlogik entweder vor oder nach dem APF-Filterprozess ausführen. Wenn ein Paket verworfen wird, bevor es den APF-Filter erreicht, wird es vom APF-Filter nicht verarbeitet.

Um die korrekte APF-Filterfunktion zu überprüfen, wenn APF aktiviert ist, prüfen Sie, ob die Firmware dem APF-Filter Zugriff auf das gesamte Paket und nicht nur auf den Header gewährt.

APF-Programmbeispiele

ApfTest und ApfFilterTest enthalten Beispieltestprogramme, die die Funktionsweise der einzelnen APF-Filter veranschaulichen. Wenn Sie das tatsächlich generierte Programm untersuchen möchten, ändern Sie den Testfall so, dass das Programm als Hex-String ausgegeben wird.

Der Ordner testdata enthält APFv4-Beispielprogramme für APF-RA-Filter. Der Ordner samples enthält Python-Dienstprogramme, die APFv6-Offload Programme generieren. Weitere Informationen finden Sie in der Dokumentation in den Python-Dienstprogrammdaten.

APF debuggen

Wenn Sie prüfen möchten, ob APF auf Ihrem Gerät aktiviert ist, rufen Sie das aktuelle Programm und die aktuellen Zähler auf und führen Sie den Befehl adb shell dumpsys network_stack aus. Hier ein Beispiel für diesen Befehl:

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

Die Ausgabe für diesen Befehl adb shell dumpsys network_stack enthält Folgendes:

  • ApfCapabilities{version: 4, maxSize: 4096, format: 1}: Das bedeutet, dass die WLAN-Chips APF (Version 4) unterstützen.
  • Last program: In diesem Abschnitt wird das zuletzt installierte APF-Programm im Hex-String-Format angezeigt.
  • APF packet counters: In diesem Abschnitt wird angezeigt, wie viele Pakete von APF weitergeleitet oder verworfen wurden und aus welchen Gründen.

Verwenden Sie das apf_disassembler Tool, um den Code zu decodieren und in eine für Menschen lesbare Assemblersprache zu zerlegen. Führen Sie den Befehl m apf_disassembler aus, um die ausführbare Binärdatei zu kompilieren. Hier ein Beispiel für die Verwendung des Tools 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
......

Wenn Sie APF-Ergebnisse offline prüfen möchten, verwenden Sie das apf_run Tool. Führen Sie den Befehl m apf_run aus, um die ausführbare Binärdatei zu kompilieren. Das Tool apf_run unterstützt sowohl APFv4- als auch APFv6-Interpreter.

Im Folgenden finden Sie die Anleitung für den Befehl apf_run. Standardmäßig wird der Befehl apf_run im APFv4-Interpreter ausgeführt. Wenn Sie das Argument --v6 an apf_run übergeben, wird es für den APFv6-Interpreter ausgeführt. Alle anderen Argumente können sowohl für APFv4 als auch für APFv6 verwendet werden.

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.

Hier ein Beispiel, wie Sie ein Paket an APF übergeben, um zu prüfen, ob es verworfen oder weitergeleitet werden kann.

Verwenden Sie die Option --packet, um den Hex-Binärstring des Rohpakets anzugeben. Verwenden Sie die Option --data, um den Hex-Binärstring des Datenbereichs anzugeben, in dem der APF-Zähler gespeichert ist, der verwendet wird. Da jeder Zähler 4 Byte lang ist, müssen die Datenbereiche lang genug sein, um einen Pufferüberlauf zu vermeiden.

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

Wenn Sie die APF-Ergebnisse mit der pcap-Datei vergleichen möchten, die von tcpdump erstellt wurde, verwenden Sie den Befehl apf_run so:

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

Wenn Sie die Übertragungsfunktionen von APFv6 testen möchten, verwenden Sie den Befehl apf_run so:

$ 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

Wenn Sie den Parameter --trace verwenden, gibt das Tool apf_run eine detaillierte Ausgabe der einzelnen Schritte der Ausführung des Interpreters aus, was für das Debugging hilfreich ist. In diesem Beispiel geben Sie ein ARP-Abfragepaket in das APF-Programm ein. Die Ausgabe zeigt, dass die ARP-Abfrage verworfen wurde, aber ein Antwortpaket generiert wurde. Die Details dieses generierten Pakets finden Sie im Abschnitt transmitted packet.

Häufige Probleme bei der Integration

In diesem Abschnitt werden einige häufige Probleme bei der APF-Integration beschrieben:

  • Unerwartetes Löschen des Datenbereichs:Der APF-Arbeitsspeicher muss vollständig für APF reserviert sein. Nur der Interpretercode oder der Frameworkcode (über die HAL API) dürfen den APF-Arbeitsspeicherbereich ändern.
  • Installationsprobleme mit APF-Programmen mit X Byte (X <= maxLen) : Die Firmware muss das Lesen und Schreiben von Programmen mit einer beliebigen Länge bis zu maxLen ohne Fehler, Abstürze oder Kürzungen unterstützen. Schreibvorgänge dürfen keine Byte zwischen X und maxLen ändern.
  • APF-Implementierung im Treibercode:APF sollte nur in der Firmware und nicht im Treibercode implementiert werden. Andernfalls gibt es keine Energieeinsparungen, da die CPU aktiviert werden muss, um das Paket zu verarbeiten.
  • Falsche Werte für filter_age oder filter_age_16384th:Die filter_age (APFv4) und filter_age_16384th (APFv6) Werte müssen korrekt an die Funktionen accept_packet() und apf_run() übergeben werden. Details zu Details zur Berechnung von filter_age_16384th, finden Sie in der Dokumentation in apf_interpreter.h.
  • APF ist nicht aktiviert, wenn es erforderlich ist:APF muss aktiviert sein, wenn der Bildschirm ausgeschaltet ist und entweder die WLAN-Verbindung im Leerlauf ist oder der Traffic weniger als 10 Mbit/s beträgt.
  • Gekürzte Pakete, die an accept_packet() oder apf_run() übergeben werden:Alle Unicast-, Broadcast- und Multicast-Pakete, die an accept_packet() oder apf_run() übergeben werden, müssen vollständig sein. Es ist nicht zulässig, gekürzte Pakete an APF zu übergeben.

APF-Tests

Ab Android 15 bietet Android sowohl CTS-Testfälle (Compatibility Test Suite) für einzelne Geräte als auch für mehrere Geräte für die APF-Filter- und APF-Interpreter-Integration, um die korrekte APF-Funktionalität zu überprüfen. Hier eine Aufschlüsselung des Zwecks der einzelnen Testfälle:

  • Integrationstest für ApfFilter und apf_interpreter: Prüft, ob ApfFilter den richtigen Bytecode generiert und apf_interpreter den Code korrekt ausführt, um die erwarteten Ergebnisse zu erzielen.
  • **CTS für einzelne Geräte für APF**: Verwendet ein einzelnes Gerät, um die APF -Funktionalität auf dem WLAN-Chipsatz zu testen. Bestätigt Folgendes:
    • APF wird aktiviert, wenn der Bildschirm ausgeschaltet ist und der WLAN-Traffic weniger als 10 Mbit/s beträgt.
    • APF-Funktionen werden korrekt deklariert.
    • Lese- und Schreibvorgänge im APF-Arbeitsspeicherbereich sind erfolgreich und der Arbeitsspeicherbereich wird nicht unerwartet geändert.
    • Argumente werden korrekt an accept_packet() oder apf_run() übergeben.
    • Firmware, die in APFv4/APFv6 integriert ist, kann Pakete verwerfen.
    • Firmware, die in APFv6 integriert ist, kann auf Pakete antworten.
  • **CTS für mehrere Geräte für APF**: Verwendet zwei Geräte (einen Absender und einen Empfänger), um das Filterverhalten von APF zu testen. Auf der Absenderseite werden verschiedene Arten von Paketen generiert. Der Test bestätigt, ob sie basierend auf den in ApfFilter konfigurierten Regeln korrekt verworfen, weitergeleitet oder beantwortet werden, um die korrekte APF-Funktionalität zu überprüfen.

Zusätzliche Anweisungen für Integrationstests

Außerdem empfehlen wir dringend, APF-Tests in Ihre Firmware-WLAN-Integrationstestsuiten aufzunehmen.

Die Integration von APF-Tests in Firmware-WLAN-Integrationstestsuiten ist entscheidend, um die ordnungsgemäße APF-Funktionalität in komplexen WLAN-Verbindungsszenarien wie Make-Before-Break- oder Roaming-WLAN-Verbindungsszenarien zu überprüfen. Eine detaillierte Anleitung zum Durchführen von Integrationstests finden Sie im folgenden Abschnitt.

Vorbereitung

Führen Sie bei der Durchführung von Integrationstests folgende Schritte aus:

  • APF muss in allen Integrationstestfällen aktiviert sein (z. B. Roaming, Make-Before-Break).
  • Löschen Sie zu Beginn jedes Tests den APF-Arbeitsspeicher.
  • Installieren oder installieren Sie APF-Programme während des Tests alle 5 Minuten neu.

Testszenarien

APF muss während der Integrationstests aktiv sein. Dieses Dokument enthält zwei APF-Programme, die Sie während des Tests installieren können. Die Programme sind im Hex-String-Format. Sie müssen den Hex-String in Binärformat konvertieren und die Programme in der Firmware installieren, damit apf_interpreter sie ausführen kann. Während des Integrationstests sollten Sie Pakete senden, die die Filterlogik in Programm 1 und Programm 2 auslösen sollen.

APF-Programm 1

Installieren Sie APF-Programm 1, wenn der Gerätebildschirm eingeschaltet ist. Dieses Programm kann harmlose Pakete verwerfen, die die Gerätefunktionen nicht beeinträchtigen. Mit diesen Paketen wird getestet, ob der APF den Netzwerkverkehr korrekt filtert.

Die Logik von APF-Programm 1 ist wie folgt:

  1. Verwerfen und Zähler erhöhen:
    1. EtherType-Werte: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. IPv4-DHCP-Erkennungs- oder ‑Anfragepakete
    3. RS-Pakete
  2. Weiterleiten und Zähler erhöhen: Alle anderen Pakete.

Die Bytecodes für APF-Programm 1 sind wie folgt:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
APF-Programm 2

Installieren Sie APF-Programm 2, wenn der Gerätebildschirm ausgeschaltet ist. Dieses Programm filtert alle Pakete heraus, die von APF-Programm 1 gefiltert werden, sowie Ping-Anfragepakete. Wenn Sie prüfen möchten, ob APF-Programm 2 korrekt installiert ist, senden Sie Ping-Pakete an das zu testende Gerät.

Die Logik von APF-Programm 2 ist wie folgt:

  1. Verwerfen und Zähler erhöhen:
    1. EtherType-Werte: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. IPv4-DHCP-Erkennungs- oder ‑Anfragepakete
    3. RS-Pakete
  2. Verwerfen und Zähler erhöhen: ICMP-Ping-Anfragepakete
  3. Weiterleiten und Zähler erhöhen: Alle anderen Pakete

Die Bytecodes für APF-Programm 2 sind wie folgt:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C007488A27C006F88A47C006A88B87C006588CD7C006088E17C005B88E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE87234120C84000E86DD0A1482093A0A368204856BE0721F120C84001008000A17820B01AB0D220E8204086BE472086BDCB03A01B87206B03A01B87201
Datenüberprüfung

So prüfen Sie, ob das APF-Programm korrekt ausgeführt wird und Pakete korrekt weiterleitet oder verwirft:

  • Rufen Sie den APF-Datenbereich alle 5 Minuten ab und überprüfen Sie ihn.
  • Löschen Sie den Zähler nicht.
  • Generieren Sie Testpakete, um jede Filterregel auszulösen.
  • Prüfen Sie die Zählererhöhungen anhand dieser Speicherorte:

    Zählername Speicherort
    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 für APF-Programm 1 und APF-Programm 2

Der folgende Pseudocode erläutert die Logik von APF-Programm 1 und APF-Programm 2 im Detail:

// 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