Android-Paketfilter

Mit dem Android-Paketfilter (APF) kann das Framework die Logik der Hardware-Paketfilterung zur Laufzeit steuern. So kann das System Energie sparen, indem Pakete in der Hardware verworfen werden, während das Android-Framework die Filterregeln zur Laufzeit basierend auf den Netzwerkbedingungen ändern kann.

APF-Übersicht

APF besteht aus zwei Hauptkomponenten:

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

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

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

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

APF-Revision

In der folgenden Liste wird der Versionsverlauf von APF beschrieben:

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

APF-Integration

Die APF-APIs zwischen dem APF-Interpreter und der Hardware sind in apf_interpreter.h definiert (APFv4, APFv6). Der Wi‑Fi-Firmwarecode ruft accept_packet() in APFv4 oder apf_run() in APFv6 auf, um zu ermitteln, ob das Paket verworfen (Nullrückgabewert) oder an den App-Prozessor übergeben (Nichtnullrückgabewert) werden soll. Wenn ein Paket übertragen werden muss, gibt apf_run() auch null 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 hat eine Länge von mindestens 1 Byte. Die APF-Anweisungscodes sind für APFv4 in apf.h definiert und für APFv6 direkt in apf_interpreter.c eingefügt.

APF benötigt speziellen 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 angenommene und verworfene Pakete zu speichern. Die Datenregion kann aus dem Android-Framework gelesen werden. APF-Anweisungen sind speichereffizient, aber um die Energieeinsparung und Funktionalität zu maximieren, sind komplexe, dynamische Filterregeln erforderlich. Diese Komplexität erfordert einen speziellen Teil des On-Chip-Speichers. Der Mindestarbeitsspeicherbedarf für APFv4 beträgt 1.024 Byte, für APFv6 sind 2.048 Byte erforderlich. Wir empfehlen jedoch dringend, 4.096 Byte für APFv6 zuzuweisen, um eine optimale Leistung zu erzielen. 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 hat der kompilierte APFv4-Interpreter eine Größe von etwa 1,8 KB, während der komplexere APFv6-Interpreter mit zusätzlichen Funktionen (z. B. nativer Prüfsummenunterstützung und nativem DNS-Dekomprimierungscode) etwa 4 KB groß ist.

APF-Filter können zusammen mit anderen Chipsatz-anbieterspezifischen Filtern in der Firmware verwendet werden. Chipsatzanbieter 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.

Damit der APF-Filter ordnungsgemäß funktioniert, muss die Firmware dem APF-Filter bei aktiviertem APF Zugriff auf das gesamte Paket gewähren, nicht nur auf den Header.

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 Hexadezimalstring ausgegeben wird.

Der Ordner testdata enthält Beispiel-APFv4-Programme für APF-RA-Filter. Der Ordner samples enthält Python-Dienstprogramme, mit denen APFv6-Offload-Programme generiert werden. Weitere Informationen finden Sie in der Dokumentation in den Python-Dienstprogrammdateien.

APF debuggen

Wenn du prüfen möchtest, ob APF auf dem Gerät aktiviert ist, zeige das aktuelle Programm und die aktuellen Zähler an und führe den Befehl adb shell dumpsys network_stack aus. Im Folgenden finden Sie 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 dieses Beispiels für den 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: Dieser Abschnitt enthält das Binärprogramm des zuletzt installierten APF-Programms im Hexadezimal-Stringformat.
  • APF packet counters: In diesem Abschnitt sehen Sie, wie viele Pakete von APF weitergeleitet oder verworfen werden, und die jeweiligen Gründe.

Verwenden Sie das Tool apf_disassembler, um den Code zu decodieren und in eine für Menschen lesbare Assemblersprache zu übersetzen. Führen Sie den Befehl m apf_disassembler aus, um die ausführbare Binärdatei zu kompilieren. Im Folgenden finden Sie ein Beispiel für die Verwendung des apf_disassembler-Tools:

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 Tool apf_run. Führen Sie den Befehl m apf_run aus, um die ausführbare Binärdatei zu kompilieren. Das apf_run-Tool 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 mit dem 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 ein Paket an die APF übergeben wird, um zu prüfen, ob es verworfen oder weitergeleitet werden kann.

Verwenden Sie die Option --packet, um die Darstellung des Rohpakets als Hexadezimal-Binärstring anzugeben. Verwenden Sie --data option, um den Hexadezimal-Binärstring der Datenregion anzugeben, der zum Speichern des APF-Zählers verwendet wird. Da jeder Zähler 4 Byte lang ist, müssen die Datenregionen lang genug sein, damit kein Pufferüberlauf auftritt.

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

Wenn Sie die APF-Ergebnisse mit der von tcpdump erstellten pcap-Datei vergleichen möchten, verwenden Sie den Befehl apf_run folgendermaßen:

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

Verwenden Sie den Befehl apf_run, um die APFv6-Übertragungsfunktionen zu testen:

$ 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 jedes Schritts bei der Ausführung des Interpreters aus, was beim Debuggen hilfreich ist. In diesem Beispiel geben wir ein ARP-Abfragepaket in das APF-Programm ein. Die Ausgabe zeigt, dass die ARP-Abfrage gelöscht wird, aber ein Antwortpaket generiert wird. Die Details dieses generierten Pakets finden Sie im Abschnitt transmitted packet.

Häufige Integrationsprobleme

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

  • Unerwartetes Löschen der Datenregion:Der APF-Speicher muss vollständig für APF reserviert sein. Nur der Interpreter- oder Framework-Code (über die HAL API) darf den APF-Speicherbereich ändern.
  • Installationsprobleme mit APF-Programmen mit X Byte (X <= maxLen): Die Firmware muss das Lesen oder Schreiben von Programmen mit einer Länge von bis zu maxLen ohne Fehler, Abstürze oder Kürzung unterstützen. Bei Schreibvorgängen dürfen keine Bytes zwischen X und maxLen geändert werden.
  • APF-Implementierung im Treibercode:APF sollte nur in der Firmware und nicht im Treibercode implementiert werden. Andernfalls gibt es keine Energieeinsparungen, da die CPU zum Verarbeiten des Pakets aktiviert werden muss.
  • Falsche filter_age- oder filter_age_16384th-Werte:Die Werte filter_age (APFv4) und filter_age_16384th (APFv6) müssen korrekt an die Funktionen accept_packet() und apf_run() übergeben werden. Weitere Informationen zur Berechnung von filter_age_16384th finden Sie in der Dokumentation unter apf_interpreter.h.
  • APF nicht bei Bedarf aktiviert:APF muss aktiviert sein, wenn das Display ausgeschaltet ist und entweder die WLAN-Verbindung inaktiv ist oder der Traffic unter 10 Mbit/s liegt.
  • Abgeschnittene 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. Das Weitergeben von gekürzten Paketen an APF ist unzulässig.

APF-Tests

Ab Android 15 bietet Android sowohl CTS-Tests für einzelne Geräte als auch für mehrere Geräte für die Integration von APF-Filtern und APF-Interpretern, um die korrekte Funktion von APF zu gewährleisten. Im Folgenden finden Sie eine Aufschlüsselung des Zwecks der einzelnen Testfälle:

  • ApfFilter- und apf_interpreter-Integrationstest: Prüft, ob ApfFilter den richtigen Bytecode generiert und apf_interpreter den Code korrekt ausführt, um die erwarteten Ergebnisse zu erzielen.
  • APF-CTS für einzelne Geräte:Mit einem einzelnen Gerät wird die APF-Funktionalität des WLAN-Chipsatzes getestet. Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:
    • APF wird aktiviert, wenn das Display ausgeschaltet ist und der WLAN-Traffic unter 10 Mbit/s liegt.
    • APF-Funktionen sind korrekt deklariert.
    • Lese- und Schreibvorgänge im APF-Speicherbereich sind erfolgreich und der Speicherbereich wird nicht unerwartet geändert.
    • Argumente werden korrekt an accept_packet() oder apf_run() übergeben.
    • In APFv4/APFv6 integrierte Firmware kann Pakete löschen.
    • Firmware, die in APFv6 integriert ist, kann auf Pakete antworten.
  • CTS für mehrere Geräte mit APF:Beim Testen des Filterverhaltens von APF werden zwei Geräte (ein Sender, ein Empfänger) verwendet. Auf der Absenderseite werden verschiedene Arten von Paketen generiert. Der Test bestätigt, ob sie gemäß den in ApfFilter konfigurierten Regeln korrekt verworfen, übergeben oder beantwortet werden.

Zusätzliche Anleitung für Integrationstests

Außerdem empfehlen wir Chipsatzanbietern dringend, APF-Tests in ihre eigenen Firmware-WLAN-Integrationstest-Suiten aufzunehmen.

Die Einbindung von APF-Tests in die Firmware-WLAN-Integrationstest-Suiten ist entscheidend, um die ordnungsgemäße APF-Funktion in komplexen WLAN-Verbindungsszenarien wie Make-Before-Break- oder Roaming-WLAN-Verbindungsszenarien zu überprüfen. Eine ausführliche Anleitung zum Ausführen von Integrationstests finden Sie im folgenden Abschnitt.

Voraussetzungen

Beachten Sie beim Ausführen von Integrationstests Folgendes:

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

Testfälle

APF muss während der gesamten Integrationstests aktiv sein. In diesem Dokument werden zwei APF-Programme bereitgestellt, die während des Tests installiert werden können. Die Programme sind im Hexadezimal-String-Format. Der Tester muss den Hexadezimal-String in Binärformat konvertieren und in die Firmware einbinden, damit die Programme von apf_interpreter ausgeführt werden können. Während des Integrationstests sollte der Tester Pakete senden, die voraussichtlich die Filterlogik in Programm 1 und Programm 2 auslösen.

APF-Programm 1

Installieren Sie APF-Programm 1, während das Display des Geräts eingeschaltet ist. Dieses Programm kann harmlose Pakete löschen, die sich nicht auf die Gerätefunktionalität auswirken. Mit diesen Paketen wird getestet, ob die APF den Netzwerkverkehr richtig filtert.

Die Logik für APF-Programm 1 sieht so aus:

  1. Zähler zurücksetzen und inkrementieren:
    1. EtherType-Werte: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. IPv4-DHCP-Erkennungs- oder -Anfragepakete
    3. RS-Pakete
  2. Pass and increment counter: Alle anderen Pakete.

Die APF-Programm-1-Byte-Codes sind:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
APF-Programm 2

Installieren Sie APF-Programm 2, wenn das Display des Geräts ausgeschaltet ist. Dieses Programm filtert alle Pakete heraus, die von APF-Programm 1 gefiltert werden, sowie Ping-Anfragepakete. Um zu prüfen, ob APF-Programm 2 korrekt installiert ist, senden Sie Ping-Pakete an das zu testende Gerät.

Die Logik für APF-Programm 2 sieht so aus:

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

Die 2-Byte-Codes für APF-Programme sind:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C007488A27C006F88A47C006A88B87C006588CD7C006088E17C005B88E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE87234120C84000E86DD0A1482093A0A368204856BE0721F120C84001008000A17820B01AB0D220E8204086BE472086BDCB03A01B87206B03A01B87201
Datenüberprüfung

So prüfen Sie, ob das APF-Programm ausgeführt wird und Pakete richtig weitergeleitet oder verworfen werden:

  • Rufen Sie die APF-Datenregion alle 5 Minuten ab und prüfen Sie sie.
  • Löschen Sie den Zähler nicht.
  • Generieren Sie Testpakete, um jede Filterregel auszulösen.
  • Prüfen Sie die Zählererhöhungen anhand der folgenden 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

Im folgenden Pseudocode wird die Logik von APF-Programm 1 und APF-Programm 2 ausführlich erläutert:

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