فیلتر بسته اندروید

فیلتر بسته Android (APF) به چارچوب اجازه می دهد منطق فیلتر کردن بسته های سخت افزاری را در زمان اجرا کنترل کند. این به سیستم اجازه می‌دهد با انداختن بسته‌ها در سخت‌افزار در مصرف انرژی صرفه‌جویی کند، در حالی که به چارچوب اندروید اجازه می‌دهد قوانین فیلتر را در زمان اجرا بر اساس شرایط شبکه تغییر دهد.

نمای کلی APF

APF از دو جزء اصلی تشکیل شده است:

  • مفسر APF روی سخت افزار شبکه (معمولاً چیپست Wi-Fi) اجرا می شود. مفسر APF بایت کد APF را روی بسته های دریافت شده توسط سخت افزار اجرا می کند و تصمیم می گیرد که آیا آنها را بپذیرد، رها کند یا به آنها پاسخ دهد.
  • کد تولید برنامه APF روی CPU اصلی اجرا می شود. کد برنامه های APF را با توجه به وضعیت شبکه و دستگاه ایجاد و به روز می کند.

روش های Wi-Fi HAL به فریم ورک اندروید اجازه می دهد بایت کد برنامه APF را نصب کند و شمارنده های فعلی را بخواند. ماژول Network Stack Mainline می تواند بایت کد برنامه APF را در هر زمانی که APF در حال اجرا است به روز کند.

چندین فیلتر APF پیاده سازی شده است. به عنوان مثال، APF شامل فیلترهایی برای حذف اترتیپ‌های غیرمجاز، فیلتر کردن بسته‌های تبلیغاتی روتر IPv6 (RA)، فیلتر کردن ترافیک چندپخشی و پخش در صورت عدم نگه داشتن قفل چندپخشی، رها کردن بسته‌های DHCP برای میزبان‌های دیگر، و حذف پروتکل وضوح آدرس ناخواسته (ARP) است. و بسته های کشف همسایه (ND). اگر سفت‌افزار از APFv6 پشتیبانی می‌کند، ApfFilter همچنین قوانینی را برای پاسخ‌دهی به انواع بسته‌های رایج ایجاد می‌کند که در غیر این صورت نیاز به بیدار شدن CPU برای پاسخگویی دارد، مانند پرس‌وجوهای ARP و پرس‌وجوهای NS. لیست کامل فیلترها در ApfFilter تعریف شده است.

از آنجایی که کد تولید برنامه APF بخشی از ماژول پشته شبکه است، می توانید ماهانه از [ Mainline updates برای افزودن فیلترهای جدید و به روز رسانی منطق فیلتر استفاده کنید.

بازبینی APF

لیست زیر تاریخچه تجدید نظر APF را شرح می دهد:

  • APFv6: این نسخه که در اندروید 15 معرفی شده است، از فیلتر بسته ها پشتیبانی می کند، شامل شمارنده هایی برای اشکال زدایی و معیارها است و از انتقال بسته پشتیبانی می کند.
  • APFv4: این نسخه که در اندروید 10 معرفی شده است، از فیلتر بسته پشتیبانی می کند و شامل شمارنده هایی برای اشکال زدایی و معیارها می باشد.
  • APFv2: این نسخه که در اندروید 7 معرفی شده است، از فیلتر کردن بسته ها پشتیبانی می کند.

ادغام APF

APIهای APF بین مفسر APF و سخت‌افزار در apf_interpreter.h ( APFv4 ، APFv6 ) تعریف شده‌اند. کد میان‌افزار Wi-Fi accept_packet() در APFv4 یا apf_run() در APFv6 فراخوانی می‌کند تا مشخص کند بسته باید حذف شود (مقدار بازگشتی صفر) یا به پردازنده برنامه ارسال شود (مقدار برگشتی غیر صفر). اگر بسته ای نیاز به انتقال داشته باشد، apf_run() نیز صفر را برمی گرداند زیرا بسته آن نیازی به ارسال به پردازنده برنامه ندارد. اگر سیستم عامل از APFv6 پشتیبانی می کند، باید API های apf_allocate_buffer() و apf_transmit_buffer() را پیاده سازی کند. مفسر APF این دو API را در طول منطق انتقال بسته فراخوانی می کند. دستورالعمل های APF دارای طول متغیر هستند. هر دستورالعمل حداقل 1 بایت طول دارد. کدهای دستورالعمل APF در apf.h برای APFv4 تعریف شده اند و مستقیماً در apf_interpreter.c برای APFv6 قرار می گیرند.

APF به حافظه اختصاصی متکی است. حافظه هم برای خود برنامه APF و هم برای ذخیره سازی داده ها استفاده می شود و حافظه نباید توسط چیپست پاک یا نوشته شود مگر از طریق روش های APF HAL. بایت کد APF از ذخیره سازی داده برای ذخیره شمارنده برای بسته های پذیرفته شده و حذف شده استفاده می کند. منطقه داده را می توان از چارچوب Android خواند. دستورالعمل های APF در حافظه کارآمد هستند، اما به حداکثر رساندن پتانسیل صرفه جویی در انرژی و عملکرد آنها نیازمند قوانین فیلترینگ پیچیده و پویا است. این پیچیدگی نیازمند بخش اختصاصی حافظه روی چیپست است. حداقل حافظه مورد نیاز برای APFv4 1024 بایت است، در حالی که APFv6 به 2048 بایت نیاز دارد. با این حال، اکیداً توصیه می کنیم که 4096 بایت را برای APFv6 تخصیص دهید تا از عملکرد مطلوب اطمینان حاصل کنید. مفسر APF باید در سیستم عامل کامپایل شود. هر دو مفسر APFv4 و APFv6 برای اندازه کد بهینه شده اند. تحت معماری arm32، مفسر APFv4 کامپایل شده حدود 1.8 کیلوبایت است، در حالی که مفسر پیچیده تر APFv6، با ویژگی های اضافه شده (به عنوان مثال، پشتیبانی از چک جمع بومی و کد رفع فشرده DNS بومی)، تقریباً 4 کیلوبایت است.

فیلترهای APF می توانند در کنار سایر فیلترهای فروشنده خاص چیپست در داخل سیستم عامل کار کنند. فروشندگان چیپست می توانند منطق فیلترینگ خود را قبل یا بعد از فرآیند فیلتر APF اجرا کنند. اگر بسته ای قبل از رسیدن به فیلتر APF رها شود، فیلتر APF بسته را پردازش نمی کند.

برای اطمینان از عملکرد صحیح فیلتر APF، هنگامی که APF روشن است، سیستم عامل باید به فیلتر APF دسترسی به کل بسته، نه فقط هدر، زمانی که APF فعال است، فراهم کند.

نمونه برنامه APF

ApfTest و ApfFilterTest حاوی نمونه برنامه های آزمایشی هستند که نحوه عملکرد هر فیلتر APF را نشان می دهد. برای مطالعه برنامه تولید شده واقعی، نمونه آزمایشی را تغییر دهید تا برنامه را به صورت رشته هگزا چاپ کند.

پوشه testdata شامل نمونه برنامه های APFv4 برای فیلترهای APF RA است. پوشه samples شامل ابزارهای پایتون است که برنامه های تخلیه APFv6 را تولید می کند. برای جزئیات بیشتر، به مستندات موجود در فایل های کاربردی پایتون مراجعه کنید.

اشکال زدایی APF

برای بررسی اینکه آیا APF روی دستگاه فعال است، برنامه فعلی را نمایش دهید، شمارنده های فعلی را نشان دهید و دستور adb shell dumpsys network_stack را اجرا کنید. مثال زیر نمونه ای از این دستور است:

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

خروجی این دستور adb shell dumpsys network_stack مثال شامل موارد زیر است:

  • ApfCapabilities{version: 4, maxSize: 4096, format: 1} : این بدان معناست که تراشه‌های Wi-Fi از APF (نسخه 4) پشتیبانی می‌کنند.
  • Last program : این بخش آخرین باینری برنامه APF نصب شده در قالب رشته هگز است.
  • APF packet counters : این بخش نشان می دهد که چه تعداد بسته توسط APF ارسال یا رها شده است و دلایل خاص آن وجود دارد.

برای رمزگشایی و جداسازی کد به زبان اسمبلر قابل خواندن توسط انسان، از ابزار apf_disassembler استفاده کنید. برای کامپایل باینری اجرایی، دستور m apf_disassembler را اجرا کنید. در زیر نمونه ای از نحوه استفاده از ابزار apf_disassembler آورده شده است:

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، از ابزار apf_run استفاده کنید. برای کامپایل باینری اجرایی، دستور m apf_run را اجرا کنید. ابزار apf_run از هر دو مفسر APFv4 و APFv6 پشتیبانی می کند.

در زیر راهنمای دستور apf_run آمده است. به طور پیش فرض، دستور apf_run در مفسر APFv4 اجرا می شود. ارسال آرگومان --v6 به apf_run به آن اجازه می دهد تا در برابر مفسر APFv6 اجرا شود. همه آرگومان های دیگر را می توان برای هر دو APFv4 و APFv6 استفاده کرد.

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.

در اینجا یک مثال برای ارسال یک بسته به APF برای بررسی اینکه آیا بسته می تواند رها یا ارسال شود، آورده شده است.

برای ارائه رشته باینری هگزا بسته خام، از گزینه --packet استفاده کنید. برای ارائه رشته باینری هگز ناحیه داده که برای ذخیره شمارنده APF استفاده می شود، از --data option استفاده کنید. از آنجایی که طول هر شمارنده 4 بایت است، مناطق داده باید به اندازه کافی طولانی باشند تا اطمینان حاصل شود که سرریز بافر اتفاق نمی افتد.

out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b9494010c06006b907c010588a27c010088a47c00fb88b87c00f688cd7c00f188e17c00ec88e384003908066a0e6bdca2d40600010800060412147a18016bd882ca021a1c6b8c7ac900686bd4a2b706ffffffffffff6a266bbca2b204c0a814656bf872a8120c84005808000a17821e1112149c00171fffab0d2a108210446a3239a204064651dbcc88ff6bf4727e0a1e52f06bac7a7be06bb41a1e7e0000006effffffff6bb07e00000063c0a814ff6be868a25106ffffffffffff6bb872536bf072497c001086dd686bd0a23806ffffffffffff6bc8723a0a147a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201 --packet 5ebcd79a8f0dc244efaab81408060001080006040002c244efaab814c0a8ca1e5ebcd79a8f0d --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Packet passed
Data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001

برای بررسی نتایج APF در برابر فایل pcap گرفته شده توسط tcpdump، از دستور apf_run به صورت زیر استفاده کنید:

out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b989401df06006b947c01d888a27c01d388a47c01ce88b87c01c988cd7c01c488e17c01bf88e384004408066a0e6bdca401a5000600010800060412147a1e016bd884019900021a1c6b907c01960000686bd4a401820006ffffffffffff6a266bc0a4017b0004c0a82b056bf874017084005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506fabe589435936bf47401470a1e52f06bb07c014200e06bb81a1e7e00000135ffffffff6bb47e0000012ac0a82bff6be868a401160006ffffffffffff6bbc7401176bf074010c7c001086dd686bd0a2fb06ffffffffffff6bcc72fd0a147a0b3a6b9c0a267af1ff6be072e70a366bac7ae6858218886a26a2040fff02000000000000000000000000006ba872cbaa0e82be8eaa0f8c00b7025868a2a40ffabe5894359352a9874d08aa86dd606a12a2792600583afffe80000000000000f7d4e8ccd81ddb43fe80000000000000f8be58fffe94359386006a3aa272024108123c94006b02586a3ea25e0800000000000000006a56a25504030440c01a5a94004e02581a5e94004702586a62a23e04000000006a66a229102409891f9a26ae6d00000000000000006a76a22004190300001a7a94001902586a7ea204102409891f9a26ae6dba98e781ca9ef9ba6bc872086be4b03a01b87206b03a01b87201 --pcap apf.pcap --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
37 packets dropped
1733 packets passed
Data: 00000000000000000000000000000000000000000200000005000000000000000000000002000000000000001b000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000689000000000000003c00000000000000000000000000000000000006ea

برای آزمایش قابلیت های انتقال APFv6، از دستور apf_run به صورت زیر استفاده کنید:

$ 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 استفاده می کنید، ابزار apf_run خروجی دقیقی از هر مرحله در اجرای مفسر ارائه می دهد که برای اشکال زدایی مفید است. در این مثال، یک بسته پرس و جو ARP را در برنامه APF وارد می کنیم. خروجی نشان می دهد که پرس و جو ARP حذف شده است، اما یک بسته پاسخ تولید می شود. جزئیات این بسته تولید شده در قسمت transmitted packet نشان داده شده است.

مسائل مشترک یکپارچه سازی

این بخش چندین مشکل متداول را که در طول ادغام APF با آن مواجه می شود برجسته می کند:

  • پاکسازی منطقه داده غیرمنتظره: حافظه APF باید کاملاً به APF اختصاص داده شود. فقط کد مفسر یا کد چارچوب (از طریق HAL API) مجاز به تغییر ناحیه حافظه APF است.
  • مشکلات نصب با برنامه های APF X بایت (X <= maxLen ): سیستم عامل باید از خواندن یا نوشتن هر برنامه تا maxLen بدون خرابی، خرابی یا برش پشتیبانی کند. رایت ها نباید هیچ بایتی را بین X و maxLen تغییر دهند.
  • پیاده سازی APF در کد درایور: APF باید فقط در سیستم عامل اجرا شود، نه کد راننده. در غیر این صورت، هیچ مزیتی برای صرفه جویی در مصرف انرژی وجود ندارد زیرا CPU برای پردازش بسته باید بیدار شود.
  • مقادیر filter_age یا filter_age_16384th نادرست: مقادیر filter_age (APFv4) و filter_age_16384th (APFv6) باید به‌درستی به توابع accept_packet() و apf_run() ارسال شوند. برای جزئیات در مورد محاسبه filter_age_16384th ، به مستندات موجود در apf_interpreter.h مراجعه کنید.
  • APF در صورت لزوم فعال نمی‌شود: وقتی صفحه نمایش خاموش است و یا پیوند Wi-Fi غیرفعال است یا ترافیک زیر 10 مگابیت در ثانیه است، APF باید فعال شود.
  • بسته‌های کوتاه‌شده به accept_packet() یا apf_run() ارسال می‌شوند: همه بسته‌های unicast، broadcast و multicast ارسال شده به accept_packet() یا apf_run() باید کامل باشند. ارسال بسته های کوتاه شده به APF معتبر نیست.

تست های APF

با شروع Android 15، Android موارد تست CTS تک دستگاهی و چند دستگاهی را برای فیلتر APF و ادغام مفسر APF برای اطمینان از عملکرد صحیح APF فراهم می کند. در اینجا به تفکیک هدف هر مورد آزمایشی اشاره شده است:

  • تست یکپارچه سازی ApfFilter و apf_interpreter : تأیید می کند که ApfFilter کد بایت درستی را تولید می کند و apf_interpreter کد را به درستی اجرا می کند تا نتایج مورد انتظار را ایجاد کند.
  • APF تک دستگاهی CTS : از یک دستگاه برای آزمایش عملکرد APF در چیپست Wi-Fi استفاده می کند. تایید می کند که:
    • وقتی صفحه نمایش خاموش است و ترافیک Wi-Fi زیر 10 مگابیت بر ثانیه است، APF روشن می شود.
    • قابلیت های APF به درستی اعلام شده است.
    • عملیات خواندن و نوشتن در منطقه حافظه APF با موفقیت انجام می شود و منطقه حافظه به طور غیرمنتظره ای تغییر نمی کند.
    • آرگومان ها به درستی به accept_packet() یا apf_run() ارسال می شوند.
    • سیستم عامل ادغام شده با APFv4/APFv6 می تواند بسته ها را رها کند.
    • سیستم عامل ادغام شده با APFv6 می تواند به بسته ها پاسخ دهد.
  • CTS چند دستگاهی APF : از دو دستگاه (یک فرستنده، یک گیرنده) برای آزمایش رفتار فیلتر کردن APF استفاده می کند. انواع مختلفی از بسته‌ها در سمت فرستنده تولید می‌شوند و آزمایش بر اساس قوانین پیکربندی‌شده در ApfFilter تأیید می‌کند که آیا به درستی حذف، پاس شده یا به آنها پاسخ داده شده است.

دستورالعمل های اضافی آزمون ادغام

علاوه بر این، ما قویاً توصیه می کنیم که فروشندگان چیپست تست APF را در مجموعه تست یکپارچه سازی Wi-Fi سیستم عامل خود بگنجانند.

ادغام تست APF در مجموعه‌های تست ادغام Wi-Fi میان‌افزار برای تأیید عملکرد مناسب APF در سناریوهای پیچیده اتصال Wi-Fi مانند سناریوهای اتصال Wi-Fi قبل از قطع یا رومینگ بسیار مهم است. دستورالعمل های دقیق در مورد نحوه انجام تست های یکپارچه سازی را می توان در بخش زیر یافت.

پیش نیازها

هنگام انجام تست های یکپارچه سازی، موارد زیر را انجام دهید:

  • APF باید در تمام موارد تست یکپارچه سازی فعال باشد (به عنوان مثال، رومینگ، ساخت قبل از شکست).
  • در شروع هر آزمایش، حافظه APF را پاک کنید.
  • برنامه های APF را هر 5 دقیقه در طول آزمایش نصب یا دوباره نصب کنید.

سناریوهای تست

APF باید در طول تست های ادغام فعال باشد. دو برنامه APF در این سند ارائه شده است که می توانند در حین آزمایش نصب شوند. برنامه ها در قالب رشته هگزا هستند و تستر باید رشته هگز را به باینری تبدیل کرده و آنها را به سیستم عامل نصب کند تا برنامه ها توسط apf_interpreter اجرا شوند. در طول تست یکپارچه سازی، تستر باید بسته هایی را ارسال کند که انتظار می رود منطق فیلتر را در برنامه 1 و برنامه 2 فعال کنند.

برنامه APF 1

وقتی صفحه دستگاه روشن است، برنامه APF 1 را نصب کنید. این برنامه می‌تواند بسته‌های بی‌ضرر را که بر عملکرد دستگاه تأثیر نمی‌گذارد، رها کند. این بسته ها برای آزمایش اینکه آیا APF به درستی ترافیک شبکه را فیلتر می کند یا خیر استفاده می شود.

منطق برنامه APF 1 به شرح زیر است:

  1. شمارشگر افت و افزایش:
    1. مقادیر EtherType: 0x88A2 ، 0x88A4 ، 0x88B8 ، 0x88CD ، 0x88E1 ، 0x88E3
    2. IPv4 DHCP بسته ها را کشف یا درخواست می کند
    3. بسته های RS
  2. شمارنده پاس و افزایش: همه بسته های دیگر.

کدهای 1 بایتی برنامه APF به شرح زیر است:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
برنامه APF 2

وقتی صفحه دستگاه خاموش است، برنامه APF 2 را نصب کنید. این برنامه تمام بسته هایی را که برنامه APF 1 فیلتر می کند و همچنین بسته های درخواست پینگ را فیلتر می کند. برای تأیید اینکه برنامه APF 2 به درستی نصب شده است، بسته های پینگ را به دستگاه تحت آزمایش ارسال کنید.

منطق برنامه 2 APF به شرح زیر است:

  1. شمارشگر افت و افزایش:
    1. مقادیر EtherType: 0x88A2 ، 0x88A4 ، 0x88B8 ، 0x88CD ، 0x88E1 ، 0x88E3
    2. IPv4 DHCP بسته ها را کشف یا درخواست می کند
    3. بسته های RS
  2. Drop and increment counter: بسته های درخواست پینگ ICMP
  3. شمارنده پاس و افزایش: همه بسته های دیگر

کدهای 2 بایتی برنامه APF به شرح زیر است:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C007488A27C006F88A47C006A88B87C006588CD7C006088E17C005B88E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE87234120C84000E86DD0A1482093A0A368204856BE0721F120C84001008000A17820B01AB0D220E8204086BE472086BDCB03A01B87206B03A01B87201
تایید داده ها

برای تأیید اینکه برنامه APF اجرا شده و بسته ها به درستی ارسال یا حذف شده اند، موارد زیر را انجام دهید:

  • منطقه داده APF را هر 5 دقیقه واکشی و تأیید کنید.
  • پیشخوان را پاک نکنید
  • بسته های آزمایشی را برای راه اندازی هر قانون فیلتر ایجاد کنید.
  • افزایش شمارنده را با استفاده از مکان‌های حافظه زیر تأیید کنید:

    نام پیشخوان محل حافظه
    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 1 و برنامه APF 2

شبه کد زیر منطق برنامه APF 1 و برنامه APF 2 را به طور مفصل توضیح می دهد:

// 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