Android Paket Filtresi

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 ve maxLen 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 veya filter_age_16384th değerleri: filter_age (APFv4) ve filter_age_16384th (APFv6) değerleri, accept_packet() ve apf_run() işlevlerine doğru şekilde iletilmelidir. filter_age_16384th hesaplamasıyla ilgili ayrıntılar için apf_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() veya apf_run()'ye iletilen kesilmiş paketler: accept_packet() veya apf_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 ve apf_interpreter entegrasyon testi: ApfFilter'nin doğru bayt kodu oluşturduğunu ve apf_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() veya apf_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:

  1. Bırakma ve sayaç artırma:
    1. EtherType değerleri: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. IPv4 DHCP bulma veya istek paketleri
    3. RS paketleri
  2. 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:

  1. Bırakma ve sayaç artırma:
    1. EtherType değerleri: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. IPv4 DHCP bulma veya istek paketleri
    3. RS paketleri
  2. Sayaç düşürme ve artırma: ICMP ping isteği paketleri
  3. 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