Android Paket Filtresi

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 ile maxLen 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 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 değerini hesaplama hakkında ayrıntılı bilgi için apf_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() veya apf_run()'ye iletilen kısaltılmış paketler: accept_packet() veya apf_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 ve apf_interpreter entegrasyon testi: ApfFilter'nin doğru bayt kodu oluşturduğunu ve apf_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() veya apf_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:

  1. Sayacı düşürme ve artırma:
    1. EtherType değerleri: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. IPv4 DHCP keşif veya istek paketleri
    3. RS paketleri
  2. 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:

  1. Sayacı düşürme ve artırma:
    1. EtherType değerleri: 0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3
    2. IPv4 DHCP keşif veya istek paketleri
    3. RS paketleri
  2. Sayacı düşür ve artır: ICMP ping istek paketleri
  3. 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