Android Paket Filtresi (APF), çerçevenin çalışma zamanında donanım paket filtreleme mantığını kontrol etmesine olanak tanır. Bu sayede sistem, donanımda paketleri bırakarak güç tasarrufu sağlarken Android çerçevesinin, ağ koşullarına göre çalışma zamanında filtreleme kurallarını 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 kablosuz yonga seti) çalışır. APF yorumlayıcısı, donanım tarafından alınan paketlerde APF bayt kodunu çalıştırır ve paketleri kabul edip etmeyeceği, atlayıp atlamayacağı veya yanıtlayıp yanıtlamayacağına karar verir.
- APF program oluşturma kodu ana CPU'da çalışır. Kod, APF programlarını ağa ve cihaz durumuna göre oluşturur ve günceller.
Wi-Fi HAL yöntemleri, Android çerçevesinin APF program bytecode'ini yüklemesine ve mevcut sayaçları okumasına olanak tanır. Ağ Yığını Ana Hat modülü, APF çalışırken APF program bayt kodunu istediği zaman güncelleyebilir.
Birkaç APF filtresi uygulanmıştır. Örneğin, APF; izin verilmeyen ether türlerini, IPv6 yönlendirici reklamı (RA) paketlerini, çoklu yayın kilidi tutulmuyorsa çoklu yayın ve yayın trafiğini, diğer ana makineler için DHCP paketlerini ve isteksiz adres çözümleme protokolü (ARP) ile komşu bulma (ND) paketlerini düşürmek için filtreler içerir. Donanım yazılımı APFv6'yı destekliyorsa ApfFilter
, ARP sorguları ve NS sorguları gibi yanıt vermek için CPU'nun uyanık kalması gereken yaygın paket türlerini yanıtlamak üzere kurallar da oluşturur. Filtrelerin tam listesi ApfFilter
bölümünde 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 ana hat 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 aktarımını destekler.
- APFv4: Android 10'da kullanıma sunulan bu sürüm paket filtrelemeyi destekler ve hata ayıklama ve 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ısı ile donanım arasındaki APF API'leri apf_interpreter.h
(APFv4,
APFv6) içinde tanımlanır.
Wi-Fi donanım yazılımı kodu, paketin atlanıp atlanmayacağını (sıfır döndürülen değer) veya uygulama işleyiciye iletilip iletilmeyeceğini (sıfır olmayan döndürülen değer) belirlemek için APFv4'te accept_packet()
veya APFv6'da apf_run()
çağırır. Bir paketin iletilmesi gerekiyorsa apf_run()
, paketinin uygulama işleyicisine iletilmesine gerek olmadığı için sıfır döndürür. 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 aktarım mantığı sırasında bu iki API'yi çağırır.
APF talimatları değişken uzunluktadır. Her talimat en az 1 bayt uzunluğundadır. APF talimat kodları, APFv4 için apf.h
içinde tanımlanır ve APFv6 için doğrudan apf_interpreter.c
içine yerleştirilir.
APF, özel bellekten yararlanır. Bellek hem APF programı hem de veri depolama için kullanılır ve APF HAL yöntemleri dışında çipset tarafından temizlenmeli veya yazılmamalıdır. APF bayt kodu, kabul edilen ve bırakılan paketlerin sayacını depolamak için veri depolamayı 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 özel 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ı sağlamak için APFv6 için 4096 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 derlenmiş APFv4 yorumlayıcısı yaklaşık 1,8 KB'tır. Buna karşılık, ek özelliklere (ör. yerel sağlama toplamı desteği ve yerel DNS sıkıştırma kodu) sahip daha karmaşık APFv6 yorumlayıcısı yaklaşık 4 KB'tır.
APF filtreleri, donanım yazılımındaki çipset tedarikçisine özgü diğer 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 atlanırsa APF filtresi paketi işlemez.
APF filtresinin doğru işlevini sağlamak için APF etkinleştirildiğinde donanım yazılımı, APF filtresine yalnızca başlığa 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. Gerçekte oluşturulan programı incelemek için test örneğini, programı onaltılık dize olarak yazdıracak şekilde değiştirin.
testdata
klasörü, APF RA filtreleri için örnek APFv4 programları içerir. samples
klasörü, APFv6 yükü aktarma programları oluşturan Python yardımcı programlarını içerir. Daha fazla bilgi için Python yardımcı program dosyalarındaki dokümanlara bakın.
APF'yi hata ayıklama
Cihazda APF'nin etkin olup olmadığını kontrol etmek için mevcut programı ve 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ışı şunları içerir:
ApfCapabilities{version: 4, maxSize: 4096, format: 1}
: Bu, kablosuz çiplerin APF'yi (4. sürüm) 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 belirli nedenler gösterilir.
Kodu çözmek ve insan tarafından 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 yorumcuları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
bağımsız değişkenine iletmek, APFv6 yorumlayıcısına karşı çalıştırılmasını sağlar. 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.
Aşağıda, paketin bırakılıp bırakılamayacağını kontrol etmek için APF'ye bir paket iletme örneği verilmiştir.
Ham paketin onaltılık ikili dize gösterimini sağlamak için --packet
seçeneğini kullanın. APF sayacını depolamak için kullanılan veri bölgesinin on altılık ikili dizesini sağlamak üzere --data option
değerini kullanın. Her sayaç 4 bayt uzunluğunda olduğundan veri bölgeleri, arabelleğe taşma 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ütme işlemindeki her bir adımın ayrıntılı çıktısını sağlar. Bu, hata ayıklama için yararlıdır. Bu örnekte, APF programına bir ARP sorgu paketi giriyoruz.
Çıkış, ARP sorgusunun bırakıldığını ancak bir yanıt paketinin oluşturulduğunu gösterir.
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ılmış olmalıdır; APF bellek bölgesinin yalnızca yorumlayıcı kodu veya çerçeve kodu (HAL API aracılığıyla) tarafından değiştirilmesine izin verilir.
- X baytlık APF programlarıyla ilgili yükleme sorunları (X <=
maxLen
): Donanım yazılımı,maxLen
'a kadar herhangi bir program uzunluğunu hata, kilitlenme veya kısaltma olmadan okumayı veya yazmayı desteklemelidir. Yazma işlemleri,X
ilemaxLen
arasındaki baytları değiştirmemelidir. - Sürücü kodunda APF uygulaması: APF, sürücü kodunda değil, yalnızca donanım yazılımında uygulanmalıdır. Aksi takdirde, paketi işlemek için CPU'nun uyanık kalması gerektiğinden güç tasarrufu avantajı yoktur.
- 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
değerini hesaplama hakkında ayrıntılı bilgi içinapf_interpreter.h
dokümanlarına bakın. - APF gerektiğinde etkinleştirilmedi: APF, ekran kapalıyken ve kablosuz bağlantı boştayken veya trafik 10 Mb/sn'nin altındayken etkinleştirilmelidir.
accept_packet()
veyaapf_run()
'ye iletilen kısaltılmış paketler:accept_packet()
veyaapf_run()
'ye iletilen tüm tekil yayın, yayın ve çoklu yayın paketleri eksiksiz olmalıdır. Kısaltılmış paketlerin APF'ye aktarılması geçerli değildir.
APF testleri
Android 15'ten itibaren Android, APF işlevinin doğru şekilde çalışmasını sağlamak için APF filtresi ve APF yorumlayıcısı entegrasyonu için hem tek cihazlı hem de çok cihazlı CTS test örnekleri sağlar. Her test senaryosunun amacının dökümü aşağıda verilmiştir:
ApfFilter
veapf_interpreter
entegrasyon testi:ApfFilter
'nin doğru bayt kodu oluşturduğunu veapf_interpreter
'ın beklenen sonuçları elde etmek için kodu doğru şekilde yürüttüğünü doğrular.- APF tek cihazlı CTS:
Kablosuz yonga setindeki APF işlevini test etmek için tek bir cihaz kullanılır.
Şunları onaylar:
- APF, ekran kapalıyken ve kablosuz ağ trafiği 10 Mb/sn'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 bir şekilde değiştirilmez.
- Bağımsız değişkenler
accept_packet()
veyaapf_run()
'a doğru şekilde aktarılır. - APFv4/APFv6 ile entegre edilmiş donanım yazılımı paketleri düşürebilir.
- APFv6 ile entegre edilmiş donanım yazılımı paketleri yanıtlayabilir.
- 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ılmış kurallara göre bu paketlerin doğru şekilde atlanıp atlanmadığını, iletilip iletilmediğini veya yanıtlanıp yanıtlanmadığını onaylar.
Ek entegrasyon testi talimatları
Ayrıca, yonga seti tedarikçilerinin APF testini kendi donanım yazılımı kablosuz ağ entegrasyon test paketlerine dahil etmelerini önemle tavsiye ederiz.
APF testini, donanım yazılımı kablosuz ağ entegrasyon test paketlerine entegre etmek, kablosuz bağlantıyı kesmeden önce bağlantı oluşturma veya dolaşım kablosuz bağlantısı gibi karmaşık kablosuz bağlantı senaryolarında APF işlevinin düzgün şekilde çalıştığını doğrulamak için ç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 yapın:
- APF, tüm entegrasyon testlerinde (ör. dolaşım, kesinti öncesi oluşturma) 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 dokümanda, test sırasında yüklenebilecek iki APF programı sağlanmıştır. Programlar onaltılık dize biçimindedir ve test uzmanının, programların apf_interpreter
tarafından yürütülebilmesi için onaltılık dizeyi ikili sisteme dönüştürmesi ve donanım yazılımına yüklemesi gerekir. Entegrasyon testi sırasında test uzmanı, 1. program ve 2. programdaki 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şlevini 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 mantığı aşağıdaki gibidir:
- Sayacı düşürme ve artırma:
- EtherType değerleri:
0x88A2
,0x88A4
,0x88B8
,0x88CD
,0x88E1
,0x88E3
- IPv4 DHCP keşif veya istek paketleri
- RS paketleri
- EtherType değerleri:
- Geçiş ve sayaç artırma: Diğer tüm paketler.
APF program 1 bayt kodları aşağıdaki gibidir:
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 istek 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 mantığı aşağıdaki gibidir:
- Sayacı düşürme ve artırma:
- EtherType değerleri:
0x88A2
,0x88A4
,0x88B8
,0x88CD
,0x88E1
,0x88E3
- IPv4 DHCP keşif veya istek paketleri
- RS paketleri
- EtherType değerleri:
- Sayacı düşür ve artır: ICMP ping istek paketleri
- Geçiş ve sayıcı artırma: Diğer tüm paketler
APF program 2 bayt 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 atıldığını doğrulamak için aşağıdakileri yapın:
- APF veri bölgesini 5 dakikada bir getirin ve 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 kod, APF programı 1 ve APF programı 2'nin mantığını ayrıntılı olarak açıklar:
// 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