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: 27Die 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: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001Wenn 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: 00000000000000000000000000000000000000000200000005000000000000000000000002000000000000001b000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000689000000000000003c00000000000000000000000000000000000006eaWenn 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 zumaxLenohne Fehler, Abstürze oder Kürzungen unterstützen. Schreibvorgänge dürfen keine Byte zwischenXundmaxLenä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_ageoderfilter_age_16384th:Diefilter_age(APFv4) undfilter_age_16384th(APFv6) Werte müssen korrekt an die Funktionenaccept_packet()undapf_run()übergeben werden. Details zu Details zur Berechnung vonfilter_age_16384th, finden Sie in der Dokumentation inapf_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()oderapf_run()übergeben werden:Alle Unicast-, Broadcast- und Multicast-Pakete, die anaccept_packet()oderapf_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
ApfFilterden richtigen Bytecode generiert undapf_interpreterden 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()oderapf_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
ApfFilterkonfigurierten 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:
- Verwerfen und Zähler erhöhen:
- EtherType-Werte:
0x88A2,0x88A4,0x88B8,0x88CD,0x88E1,0x88E3 - IPv4-DHCP-Erkennungs- oder ‑Anfragepakete
- RS-Pakete
- EtherType-Werte:
- 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:
- Verwerfen und Zähler erhöhen:
- EtherType-Werte:
0x88A2,0x88A4,0x88B8,0x88CD,0x88E1,0x88E3 - IPv4-DHCP-Erkennungs- oder ‑Anfragepakete
- RS-Pakete
- EtherType-Werte:
- Verwerfen und Zähler erhöhen: ICMP-Ping-Anfragepakete
- 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