Android Paket Filtresi (APF), çerçevenin çalışma zamanında donanım paketi filtreleme mantığını kontrol etmesine olanak tanır. Bu sayede sistem, donanımdaki paketleri bırakarak güç tasarrufu yapabilir. Aynı zamanda Android çerçevesinin, ağ koşullarına göre filtreleme kurallarını çalışma zamanında değiştirmesine olanak tanır.
APF'ye genel bakış
APF iki ana bileşenden oluşur:
- APF yorumlayıcısı, ağ donanımında (genellikle Wi-Fi yonga seti) çalışır. APF yorumlayıcısı, donanım tarafından alınan paketlerde APF bayt kodunu çalıştırır ve bunları kabul etme, bırakma veya yanıtlama konusunda karar verir.
- APF programı oluşturma kodu, ana CPU'da çalışır. Kod, ağ ve cihaz durumuna göre APF programları oluşturur ve günceller.
Wi-Fi HAL yöntemleri, Android çerçevesinin APF programı bayt kodunu yüklemesine ve mevcut sayaçları okumasına olanak tanır. Network Stack Mainline modülü, APF çalışırken APF programı bayt kodunu istediği zaman güncelleyebilir.
Birkaç APF filtresi uygulanır. Örneğin, APF, izin verilmeyen ethertypes'ları bırakmak, IPv6 yönlendirici reklamı (RA) paketlerini filtrelemek, çoklu yayın kilidi tutulmuyorsa çoklu yayın ve yayın trafiğini filtrelemek, diğer ana makineler için DHCP paketlerini bırakmak ve istenmeyen adres çözümleme protokolü (ARP) ve komşu bulma (ND) paketlerini bırakmak için filtreler içerir. Donanım yazılımı APFv6'yı destekliyorsa
ApfFilter
aksi takdirde yanıt vermek için CPU'nun uyanmasını gerektirecek yaygın paket türlerine (ör. ARP sorguları ve NS sorguları) yanıt verecek kurallar da oluşturur. Filtrelerin tam listesi ApfFilter
içinde tanımlanmıştır.
APF programı oluşturma kodu, Network Stack modülünün bir parçası olduğundan yeni filtreler eklemek ve filtreleme mantığını güncellemek için aylık Mainline güncellemelerini kullanabilirsiniz.
APF düzeltmesi
Aşağıdaki listede APF'nin düzeltme geçmişi açıklanmaktadır:
- APFv6: Android 15'te kullanıma sunulan bu sürüm, paket filtrelemeyi destekler, hata ayıklama ve metrikler için sayaçlar içerir ve paket iletimini destekler.
- APFv4: Android 10'da kullanıma sunulan bu sürüm, paket filtrelemeyi destekler ve hata ayıklama ile metrikler için sayaçlar içerir.
- APFv2: Android 7'de kullanıma sunulan bu sürüm, paket filtrelemeyi destekler.
APF entegrasyonu
APF yorumlayıcı ile donanım arasındaki APF API'leri
apf_interpreter.h
(APFv4,
APFv6) içinde tanımlanır.
Kablosuz yazılım kodu, paketin bırakılıp bırakılmayacağını (sıfır dönüş değeri) veya uygulama işlemcisine geçirilip geçirilmeyeceğini (sıfır olmayan dönüş değeri) belirlemek için APFv4'te accept_packet()
, APFv6'da ise apf_run()
çağrısı yapar. Bir paketin iletilmesi gerekiyorsa apf_run()
de sıfır değerini döndürür çünkü paketinin uygulama işlemcisine iletilmesi gerekmez. Donanım yazılımı APFv6'yı destekliyorsa apf_allocate_buffer()
ve apf_transmit_buffer()
API'lerini uygulamalıdır. APF yorumlayıcısı, paket iletim mantığı sırasında bu iki API'yi çağırır.
APF talimatları değişken uzunluktadır. Her talimatın uzunluğu en az 1 bayt olmalıdır. APF talimat kodları, APFv4 için apf.h
'de tanımlanır ve APFv6 için doğrudan apf_interpreter.c
'de satır içi olarak bulunur.
APF, özel belleğe dayanır. Bellek hem APF programının kendisi hem de veri depolama için kullanılır ve yonga seti tarafından APF HAL yöntemleri dışında temizlenmemeli veya yazılmamalıdır. APF bayt kodu, kabul edilen ve bırakılan paketlerin sayaçlarını depolamak için veri depolama alanını kullanır. Veri bölgesi, Android çerçevesinden okunabilir. APF talimatları bellek açısından verimlidir ancak güç tasarrufu ve işlevsellik potansiyellerini en üst düzeye çıkarmak için karmaşık ve dinamik filtreleme kuralları gerekir. Bu karmaşıklık, çip üzerindeki belleğin ayrılmış bir bölümünü gerektirir. APFv4 için minimum bellek gereksinimi 1.024 bayt, APFv6 için ise 2.048 bayttır. Ancak optimum performans için APFv6'ya 4.096 bayt ayırmanızı önemle tavsiye ederiz. APF yorumlayıcısı, donanım yazılımına derlenmelidir. Hem APFv4 hem de APFv6 yorumlayıcıları kod boyutu için optimize edilmiştir. arm32 mimarisinde derlenen APFv4 yorumlayıcısı yaklaşık 1,8 KB iken ek özelliklere (ör.yerel sağlama toplamı desteği ve yerel DNS sıkıştırmasını açma kodu) sahip daha karmaşık APFv6 yorumlayıcısı yaklaşık 4 KB'tır.
APF filtreleri, üretici yazılımı içindeki diğer yonga seti satıcısına özel filtrelerle birlikte çalışabilir. Yonga seti tedarikçileri, filtreleme mantıklarını APF filtreleme işleminden önce veya sonra çalıştırmayı seçebilir. Bir paket APF filtresine ulaşmadan önce bırakılırsa APF filtresi paketi işlemez.
APF filtresinin doğru şekilde çalışmasını sağlamak için APF etkinleştirildiğinde donanım yazılımı, APF filtresine yalnızca başlık değil, paketin tamamına erişim sağlamalıdır.
APF program örnekleri
ApfTest
ve
ApfFilterTest
her APF filtresinin nasıl çalıştığını gösteren örnek test programları içerir. Oluşturulan gerçek programı incelemek için test senaryosunu, programı onaltılık dize olarak yazdıracak şekilde değiştirin.
testdata
klasöründe, APF RA filtreleri için örnek APFv4 programları bulunur. samples
klasöründe, APFv6 boşaltma programları oluşturan Python yardımcı programları bulunur. Daha fazla bilgi için Python yardımcı programı dosyalarındaki belgelere bakın.
APF'de hata ayıklama
APF'nin cihazda etkin olup olmadığını kontrol etmek için mevcut programı görüntüleyin, mevcut sayaçları gösterin ve adb shell dumpsys network_stack
komutunu çalıştırın. Aşağıda bu komuta dair bir örnek verilmiştir:
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
Bu örnek adb shell dumpsys network_stack
komutunun çıkışı aşağıdakileri içerir:
ApfCapabilities{version: 4, maxSize: 4096, format: 1}
: Bu, Wi-Fi çipinin APF'yi (sürüm 4) desteklediği anlamına gelir.Last program
: Bu bölüm, onaltılık dize biçiminde en son yüklenen APF programı ikilisidir.APF packet counters
: Bu bölümde, APF tarafından kaç paketin iletildiği veya bırakıldığı ve bunun nedenleri gösterilir.
Kodu çözüp okunabilir bir derleyici diline ayırmak için apf_disassembler
aracını kullanın. Yürütülebilir ikili dosyayı derlemek için m apf_disassembler
komutunu çalıştırın.
Aşağıda, apf_disassembler
aracının nasıl kullanılacağına dair bir örnek verilmiştir:
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
......
APF sonuçlarını çevrimdışı olarak kontrol etmek için
apf_run
aracını kullanın. Yürütülebilir ikili dosyayı derlemek için m apf_run
komutunu çalıştırın. apf_run
aracı hem APFv4 hem de APFv6 yorumlayıcılarını destekler.
Aşağıda apf_run
komutunun kılavuzu verilmiştir. apf_run
komutu varsayılan olarak APFv4 yorumlayıcısında çalışır. --v6
bağımsız değişkenini apf_run
'ye iletmek, bu bağımsız değişkenin APFv6 yorumlayıcısına karşı çalışmasına olanak tanır. Diğer tüm bağımsız değişkenler hem APFv4 hem de APFv6 için kullanılabilir.
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.
Paketin bırakılıp bırakılamayacağını veya geçirilip geçirilemeyeceğini kontrol etmek için APF'ye bir paket iletme örneğini aşağıda bulabilirsiniz.
Ham paketin onaltılık ikili dize sunumunu sağlamak için --packet
seçeneğini kullanın. Veri bölgesinin onaltılık ikili dize değerini sağlamak için --data option
kullanın. Bu değer, APF sayacını depolamak için kullanılır.
Her sayaç 4 bayt uzunluğunda olduğundan, veri bölgeleri arabellek taşması olmaması için yeterince uzun olmalıdır.
out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b9494010c06006b907c010588a27c010088a47c00fb88b87c00f688cd7c00f188e17c00ec88e384003908066a0e6bdca2d40600010800060412147a18016bd882ca021a1c6b8c7ac900686bd4a2b706ffffffffffff6a266bbca2b204c0a814656bf872a8120c84005808000a17821e1112149c00171fffab0d2a108210446a3239a204064651dbcc88ff6bf4727e0a1e52f06bac7a7be06bb41a1e7e0000006effffffff6bb07e00000063c0a814ff6be868a25106ffffffffffff6bb872536bf072497c001086dd686bd0a23806ffffffffffff6bc8723a0a147a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201 --packet 5ebcd79a8f0dc244efaab81408060001080006040002c244efaab814c0a8ca1e5ebcd79a8f0d --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Packet passed
Data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001
APF sonuçlarını tcpdump tarafından alınan pcap dosyasıyla karşılaştırmak için apf_run
komutunu aşağıdaki gibi kullanın:
out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b989401df06006b947c01d888a27c01d388a47c01ce88b87c01c988cd7c01c488e17c01bf88e384004408066a0e6bdca401a5000600010800060412147a1e016bd884019900021a1c6b907c01960000686bd4a401820006ffffffffffff6a266bc0a4017b0004c0a82b056bf874017084005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506fabe589435936bf47401470a1e52f06bb07c014200e06bb81a1e7e00000135ffffffff6bb47e0000012ac0a82bff6be868a401160006ffffffffffff6bbc7401176bf074010c7c001086dd686bd0a2fb06ffffffffffff6bcc72fd0a147a0b3a6b9c0a267af1ff6be072e70a366bac7ae6858218886a26a2040fff02000000000000000000000000006ba872cbaa0e82be8eaa0f8c00b7025868a2a40ffabe5894359352a9874d08aa86dd606a12a2792600583afffe80000000000000f7d4e8ccd81ddb43fe80000000000000f8be58fffe94359386006a3aa272024108123c94006b02586a3ea25e0800000000000000006a56a25504030440c01a5a94004e02581a5e94004702586a62a23e04000000006a66a229102409891f9a26ae6d00000000000000006a76a22004190300001a7a94001902586a7ea204102409891f9a26ae6dba98e781ca9ef9ba6bc872086be4b03a01b87206b03a01b87201 --pcap apf.pcap --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
37 packets dropped
1733 packets passed
Data: 00000000000000000000000000000000000000000200000005000000000000000000000002000000000000001b000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000689000000000000003c00000000000000000000000000000000000006ea
APFv6 iletim özelliklerini test etmek için apf_run
komutunu aşağıdaki gibi kullanın:
$ 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
--trace
parametresini kullandığınızda apf_run
aracı, yorumlayıcının yürütülmesindeki her adımın ayrıntılı bir çıktısını sağlar. Bu çıktı, hata ayıklama için yararlıdır. Bu örnekte, APF programına bir ARP sorgu paketi gireriz.
Çıkış, ARP sorgusunun bırakıldığını ancak bir yanıt paketi oluşturulduğunu gösteriyor.
Oluşturulan bu paketin ayrıntıları transmitted packet
bölümünde gösterilir.
Sık karşılaşılan entegrasyon sorunları
Bu bölümde, APF entegrasyonu sırasında karşılaşılan bazı yaygın sorunlar vurgulanmaktadır:
- Beklenmedik veri bölgesi temizleme: APF belleği tamamen APF'ye ayrılmalıdır. APF bellek bölgesini yalnızca yorumlayıcı kodu veya çerçeve kodu (HAL API aracılığıyla) değiştirebilir.
- X baytlık APF programlarıyla ilgili yükleme sorunları (X <=
maxLen
): Donanım yazılımı,maxLen
'a kadar olan tüm program uzunluklarını hata, kilitlenme veya kesme olmadan okumayı ya da yazmayı desteklemelidir. Yazma işlemleri,X
vemaxLen
arasındaki hiçbir baytı değiştirmemelidir. - Sürücü kodunda APF uygulaması: APF yalnızca sürücü kodunda değil, yalnızca donanım yazılımında uygulanmalıdır. Aksi takdirde, CPU'nun paketi işlemesi için uyanması gerektiğinden güç tasarrufu avantajı olmaz.
- Yanlış
filter_age
veyafilter_age_16384th
değerleri:filter_age
(APFv4) vefilter_age_16384th
(APFv6) değerleri,accept_packet()
veapf_run()
işlevlerine doğru şekilde iletilmelidir.filter_age_16384th
hesaplamasıyla ilgili ayrıntılar içinapf_interpreter.h
dokümanlarına bakın. - Gerekli olduğunda APF etkinleştirilmiyor: Ekran kapalıyken ve kablosuz bağlantı boşta olduğunda veya trafik 10 Mbps'nin altında olduğunda APF etkinleştirilmelidir.
accept_packet()
veyaapf_run()
'ye iletilen kesilmiş paketler:accept_packet()
veyaapf_run()
'ye iletilen tüm tek noktaya yayın, yayın ve çok noktaya yayın paketleri eksiksiz olmalıdır. Kısaltılmış paketlerin APF'ye iletilmesi geçerli değildir.
APF testleri
Android 15'ten itibaren Android, doğru APF işlevselliğini sağlamak için APF filtresi ve APF yorumlayıcı entegrasyonuyla ilgili hem tek cihazlı hem de çok cihazlı CTS test senaryoları sunar. Her test senaryosunun amacı aşağıda açıklanmıştır:
ApfFilter
veapf_interpreter
entegrasyon testi:ApfFilter
'nin doğru bayt kodu oluşturduğunu veapf_interpreter
'ün beklenen sonuçları üretmek için kodu doğru şekilde yürüttüğünü doğrular.- APF tek cihazlı CTS:
Kablosuz yonga setinde APF işlevini test etmek için tek bir cihaz kullanılır.
Şunları onaylar:
- APF, ekran kapalıyken ve kablosuz trafik 10 Mbps'nin altındayken açılır.
- APF özellikleri doğru şekilde bildirilir.
- APF bellek bölgesindeki okuma ve yazma işlemleri başarılı olur ve bellek bölgesi beklenmedik şekilde değiştirilmez.
- Bağımsız değişkenler
accept_packet()
veyaapf_run()
'ye doğru şekilde aktarılıyor. - APFv4/APFv6 ile entegre edilmiş donanım yazılımı paketleri bırakabilir.
- APFv6 ile entegre edilmiş donanım yazılımı, paketlere yanıt verebilir.
- APF çok cihazlı CTS:
APF'nin filtreleme davranışını test etmek için iki cihaz (bir gönderen, bir alıcı) kullanır. Gönderen tarafında çeşitli paket türleri oluşturulur ve test,
ApfFilter
içinde yapılandırılan kurallara göre bu paketlerin doğru şekilde bırakılıp bırakılmadığını, iletilip iletilmediğini veya yanıtlanıp yanıtlanmadığını onaylar.
Ek entegrasyon testi talimatları
Ayrıca, yonga seti tedarikçilerinin kendi donanım yazılımı kablosuz entegrasyon test paketlerine APF testini dahil etmelerini önemle tavsiye ederiz.
APF testinin, üretmeden önce kırma veya dolaşım gibi karmaşık kablosuz bağlantı senaryolarında uygun APF işlevselliğini doğrulamak için donanım yazılımı kablosuz entegrasyon test paketlerine entegre edilmesi çok önemlidir. Entegrasyon testlerinin nasıl yapılacağıyla ilgili ayrıntılı talimatları aşağıdaki bölümde bulabilirsiniz.
Ön koşullar
Entegrasyon testleri yaparken aşağıdakileri uygulayın:
- APF, tüm entegrasyon testlerinde (ör. dolaşım, kesintisiz arama) etkinleştirilmelidir.
- Her testin başında APF belleğini temizleyin.
- Test sırasında APF programlarını 5 dakikada bir yükleyin veya yeniden yükleyin.
Test senaryoları
APF, entegrasyon testleri boyunca etkin olmalıdır. Bu belgede, test sırasında yüklenebilecek iki APF programı verilmiştir. Programlar onaltılık dize biçimindedir ve test uzmanı, programların apf_interpreter
tarafından yürütülebilmesi için onaltılık dizeyi ikiliye dönüştürüp donanım yazılımına yüklemelidir. Entegrasyon testi sırasında test eden kişi, 1. ve 2. programda filtreleme mantığını tetiklemesi beklenen paketler göndermelidir.
APF programı 1
Cihaz ekranı açıkken APF programı 1'i yükleyin. Bu program, cihaz işlevselliğini etkilemeyen zararsız paketler bırakabilir. Bu paketler, APF'nin ağ trafiğini doğru şekilde filtreleyip filtrelemediğini test etmek için kullanılır.
APF programı 1'in mantığı şöyledir:
- Bırakma ve sayaç artırma:
- EtherType değerleri:
0x88A2
,0x88A4
,0x88B8
,0x88CD
,0x88E1
,0x88E3
- IPv4 DHCP bulma veya istek paketleri
- RS paketleri
- EtherType değerleri:
- Geç ve sayaç değerini artır: Diğer tüm paketler.
APF programı 1 baytlık kodları şunlardır:
6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
APF programı 2
Cihaz ekranı kapalıyken APF programı 2'yi yükleyin. Bu program, APF programı 1'in filtrelediği tüm paketlerin yanı sıra ping isteği paketlerini de filtreler. APF programı 2'nin doğru şekilde yüklendiğini doğrulamak için test edilen cihaza ping paketleri gönderin.
APF programı 2'nin mantığı şu şekildedir:
- Bırakma ve sayaç artırma:
- EtherType değerleri:
0x88A2
,0x88A4
,0x88B8
,0x88CD
,0x88E1
,0x88E3
- IPv4 DHCP bulma veya istek paketleri
- RS paketleri
- EtherType değerleri:
- Sayaç düşürme ve artırma: ICMP ping isteği paketleri
- Geçiş ve sayaç artırma: Diğer tüm paketler
APF programı 2 baytlık kodları aşağıdaki gibidir:
6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C007488A27C006F88A47C006A88B87C006588CD7C006088E17C005B88E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE87234120C84000E86DD0A1482093A0A368204856BE0721F120C84001008000A17820B01AB0D220E8204086BE472086BDCB03A01B87206B03A01B87201
Veri doğrulama
APF programının yürütüldüğünü ve paketlerin doğru şekilde iletildiğini veya bırakıldığını doğrulamak için aşağıdakileri yapın:
- APF veri bölgesini 5 dakikada bir getirip doğrulayın.
- Sayacı temizlemeyin.
- Her filtre kuralını tetiklemek için test paketleri oluşturun.
Aşağıdaki bellek konumlarını kullanarak sayaç artışlarını doğrulayın:
Sayaç adı Bellek konumu 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]
APF programı 1 ve APF programı 2 için sözde kod
Aşağıdaki sözde kodda, APF programı 1 ve APF programı 2'nin mantığı ayrıntılı olarak açıklanmaktadır:
// 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