Mit dem Android Packet Filter (APF) kann das Framework die Hardware-Paketfilterlogik zur Laufzeit steuern. So kann das System Strom sparen, indem es Pakete in der Hardware verwirft. Gleichzeitig kann das Android-Framework Filterregeln zur Laufzeit basierend auf den Netzwerkbedingungen ändern.
Übersicht über die APF
APF besteht aus zwei Hauptkomponenten:
- Der APF-Interpreter wird auf der Netzwerk-Hardware (in der Regel dem WLAN-Chipsatz) ausgeführt. 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 Code für die APF-Programmerstellung 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 zum Verwerfen nicht zulässiger Ethertypes, zum Filtern von IPv6-Router-Advertisement-Paketen (RA), zum Filtern von Multicast- und Broadcast-Traffic, wenn die Multicast-Sperre nicht gehalten wird, zum Verwerfen von DHCP-Paketen für andere Hosts und zum Verwerfen unerwünschter ARP-Pakete (Address Resolution Protocol) und ND-Pakete (Neighbor Discovery). Wenn die Firmware APFv6 unterstützt, generiert ApfFilter
auch Regeln, um auf häufige Pakettypen zu antworten, für die die CPU ansonsten aktiviert werden müsste, z. B. ARP- und NS-Anfragen. Die vollständige Liste der Filter ist in ApfFilter
definiert.
Da der Code zur Generierung von APF-Programmen Teil des Network Stack-Moduls ist, können Sie monatliche Mainline-Updates verwenden, um neue Filter hinzuzufügen und die Filterlogik zu aktualisieren.
APF-Revision
In der folgenden Liste wird der Überarbeitungsverlauf von APF beschrieben:
- APFv6:Diese Version wurde in Android 15 eingeführt und unterstützt die Paketfilterung, enthält Zähler für das Debugging und Messwerte und unterstützt die Paketübertragung.
- APFv4:Diese Version wurde in Android 10 eingeführt und unterstützt die Paketfilterung. Sie enthält Zähler für das Debugging und Messwerte.
- APFv2:Diese Version wurde in Android 7 eingeführt und 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 WLAN-Firmwarecode ruft accept_packet()
in APFv4 oder apf_run()
in APFv6 auf, um zu ermitteln, ob das Paket verworfen (Rückgabewert null) oder an den App-Prozessor übergeben (Rückgabewert ungleich null) 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 ist mindestens 1 Byte lang. Die APF-Befehlscodes sind in apf.h
für APFv4 definiert und werden für APFv6 direkt in apf_interpreter.c
eingefügt.
APF benötigt dedizierten Arbeitsspeicher. Der Arbeitsspeicher wird sowohl für das APF-Programm selbst als auch für die Datenspeicherung verwendet und darf vom Chipsatz nur über die APF-HAL-Methoden gelöscht oder geschrieben werden. Der APF-Bytecode verwendet den Datenspeicher zum Speichern von Zählern für angenommene und verworfene Pakete. Die Datenregion kann aus dem Android-Framework gelesen werden. 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-Chipset-Speichers. Der Mindestspeicherbedarf für APFv4 beträgt 1.024 Byte, für APFv6 2.048 Byte. Wir empfehlen jedoch dringend, 4096 Bytes 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 ist der kompilierte APFv4-Interpreter etwa 1,8 KB groß, während der komplexere APFv6-Interpreter mit zusätzlichen Funktionen (z. B. native Unterstützung für Prüfsummen und nativer DNS-Dekomprimierungscode) etwa 4 KB groß ist.
APF-Filter können in der Firmware zusammen mit anderen chipset-anbieterspezifischen Filtern verwendet werden. Chiphersteller 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 korrekt funktioniert, muss die Firmware dem APF-Filter Zugriff auf das gesamte Paket und nicht nur auf den Header gewähren, wenn APF aktiviert ist.
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 Testlauf 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 zum Generieren von APFv6-Offload-Programmen. Weitere Informationen finden Sie in der Dokumentation in den Python-Hilfsdateien.
APF debuggen
Wenn Sie prüfen möchten, ob APF auf dem 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. 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 für diesen Beispielbefehl 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 die zuletzt installierte APF-Programmbinärdatei im Hexadezimalstringformat.APF packet counters
: In diesem Abschnitt wird angezeigt, wie viele Pakete von APF weitergeleitet oder verworfen werden, sowie die jeweiligen Gründe.
Verwenden Sie das Tool apf_disassembler
, 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.
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 die 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 das Handbuch 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 ist ein Beispiel, wie ein Paket an APF übergeben wird, um zu prüfen, ob es verworfen oder weitergeleitet werden kann.
Verwenden Sie die Option --packet
, um die hexadezimale binäre Stringdarstellung des Rohpakets anzugeben. Verwenden Sie --data option
, um den hexadezimalen Binärstring der Datenregion anzugeben, in der der APF-Zähler gespeichert wird. Da jeder Zähler 4 Byte lang ist, müssen die Datenbereiche 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
wie folgt:
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 der Ausführung des Interpreters aus, was beim Debuggen hilfreich ist. In diesem Beispiel geben wir ein ARP-Anfragepaket in das APF-Programm ein.
Die Ausgabe zeigt, dass die ARP-Anfrage verworfen wird, aber ein Antwortpaket generiert wird.
Die Details dieses generierten Pakets werden im Abschnitt transmitted packet
angezeigt.
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 die APF-Speicherregion ändern.
- Installationsprobleme bei APF-Programmen mit X Byte (X <=
maxLen
): Die Firmware muss das Lesen oder Schreiben von Programmen mit einer beliebigen Länge bis zumaxLen
ohne Fehler, Abstürze oder Kürzungen unterstützen. Bei Schreibvorgängen dürfen keine Bytes zwischenX
undmaxLen
geändert werden. - APF-Implementierung im Treibercode:APF sollte nur in der Firmware und nicht im Treibercode implementiert werden. Andernfalls gibt es keine Vorteile beim Stromsparen, da die CPU zum Verarbeiten des Pakets aktiviert werden muss.
- Falsche
filter_age
- oderfilter_age_16384th
-Werte:Die Wertefilter_age
(APFv4) undfilter_age_16384th
(APFv6) müssen korrekt an die Funktionenaccept_packet()
undapf_run()
übergeben werden. Weitere Informationen zur Berechnung vonfilter_age_16384th
finden Sie in der Dokumentation zuapf_interpreter.h
. - APF nicht aktiviert, wenn erforderlich:APF muss aktiviert sein, wenn der Bildschirm aus ist und entweder die WLAN-Verbindung inaktiv ist oder der Traffic unter 10 Mbit/s liegt.
- Abgeschnittene 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. Das Übergeben abgeschnittener Pakete an APF ist nicht zulässig.
APF-Tests
Ab Android 15 bietet Android sowohl CTS-Testläufe 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 APF-Funktionalität sicherzustellen. Hier finden Sie eine Aufschlüsselung des Zwecks der einzelnen Testfälle:
ApfFilter
- undapf_interpreter
-Integrationstest:Prüft, obApfFilter
korrekten Bytecode generiert undapf_interpreter
den Code korrekt ausführt, um die erwarteten Ergebnisse zu erzielen.- CTS für ein einzelnes APF-Gerät:Hier wird ein einzelnes Gerät verwendet, um die APF-Funktionalität auf dem WLAN-Chipsatz zu testen.
Bestätigt Folgendes:
- APF wird aktiviert, wenn das Display ausgeschaltet ist und der WLAN-Traffic unter 10 Mbit/s liegt.
- APF-Funktionen werden 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()
oderapf_run()
übergeben. - Firmware, die in APFv4/APFv6 integriert ist, kann Pakete verwerfen.
- In APFv6 integrierte Firmware kann auf Pakete antworten.
- APF-CTS für mehrere Geräte:Hier werden zwei Geräte (ein Sender, ein Empfänger) verwendet, um das Filterverhalten von APF zu testen. Auf der Senderseite werden verschiedene Arten von Paketen generiert. Der Test bestätigt, ob sie gemäß den in
ApfFilter
konfigurierten Regeln korrekt verworfen, weitergeleitet oder beantwortet werden.
Zusätzliche Anleitung für Integrationstests
Außerdem empfehlen wir Chipherstellern dringend, APF-Tests in ihre eigenen Firmware-WLAN-Integrationstest-Suites aufzunehmen.
Die Integration von APF-Tests in die Testsuiten für die Firmware-WLAN-Integration 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.
Voraussetzungen
Gehen Sie bei der Durchführung von Integrationstests so vor:
- APF muss in allen Integrationstestfällen 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.
Testszenarien
APF muss während der Integrationstests aktiv sein. Dieses Dokument enthält zwei APF-Programme, die während des Tests installiert werden können. Die Programme sind im Hexadezimalstring-Format und der Tester muss den Hexadezimalstring in Binärformat konvertieren und in der Firmware installieren, damit die Programme von apf_interpreter
ausgeführt werden können. Während des Integrationstests sollte der Tester Pakete senden, die die Filterlogik in Programm 1 und Programm 2 auslösen.
APF-Programm 1
Installieren Sie APF-Programm 1, wenn das Display des Geräts 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 des APF-Programms 1 ist wie folgt:
- Zähler zurücksetzen und erhöhen:
- EtherType-Werte:
0x88A2
,0x88A4
,0x88B8
,0x88CD
,0x88E1
,0x88E3
- IPv4-DHCP-Erkennungs- oder -Anfragepakete
- RS-Pakete
- EtherType-Werte:
- Zähler weitergeben und erhöhen: Alle anderen Pakete.
Die 1-Byte-Codes für APF-Programme 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 des APF-Programms 2 ist wie folgt:
- Zähler zurücksetzen und erhöhen:
- EtherType-Werte:
0x88A2
,0x88A4
,0x88B8
,0x88CD
,0x88E1
,0x88E3
- IPv4-DHCP-Erkennungs- oder -Anfragepakete
- RS-Pakete
- EtherType-Werte:
- Pakete für ICMP-Ping-Anfragen verwerfen und Zähler erhöhen
- Zähler weitergeben und erhöhen: 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 korrekt weitergeleitet oder verworfen werden:
- APF-Datenregion alle 5 Minuten abrufen und überprüfen.
- Löschen Sie den Zähler nicht.
- Generieren Sie Testpakete, um jede Filterregel auszulösen.
Prüfen Sie die Zählerinkremente mit den folgenden Speicherorten:
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