فیلتر بسته 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 به شرح زیر است:
- شمارشگر افت و افزایش:
- مقادیر EtherType:
0x88A2
،0x88A4
،0x88B8
،0x88CD
،0x88E1
،0x88E3
- IPv4 DHCP بسته ها را کشف یا درخواست می کند
- بسته های RS
- مقادیر EtherType:
- شمارنده پاس و افزایش: همه بسته های دیگر.
کدهای 1 بایتی برنامه APF به شرح زیر است:
6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
برنامه APF 2
وقتی صفحه دستگاه خاموش است، برنامه APF 2 را نصب کنید. این برنامه تمام بسته هایی را که برنامه APF 1 فیلتر می کند و همچنین بسته های درخواست پینگ را فیلتر می کند. برای تأیید اینکه برنامه APF 2 به درستی نصب شده است، بسته های پینگ را به دستگاه تحت آزمایش ارسال کنید.
منطق برنامه 2 APF به شرح زیر است:
- شمارشگر افت و افزایش:
- مقادیر EtherType:
0x88A2
،0x88A4
،0x88B8
،0x88CD
،0x88E1
،0x88E3
- IPv4 DHCP بسته ها را کشف یا درخواست می کند
- بسته های RS
- مقادیر EtherType:
- Drop and increment counter: بسته های درخواست پینگ ICMP
- شمارنده پاس و افزایش: همه بسته های دیگر
کدهای 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