يتيح "فلتر حزم Android" (APF) للإطار الأساسي التحكّم في منطق فلترة حزم الأجهزة في وقت التشغيل. يتيح ذلك للنظام توفير الطاقة من خلال إسقاط حزم البيانات في الأجهزة، مع السماح لإطار عمل Android بتغيير قواعد الفلترة أثناء التشغيل استنادًا إلى ظروف الشبكة.
نظرة عامة على "الإعلانات الصورية"
يتألّف APF من مكوّنين رئيسيين:
- يعمل برنامج تفسير APF على أجهزة الشبكات (عادةً مجموعة شرائح Wi-Fi). يُشغِّل مفسِّر APF رمز APF الثنائي على الحِزم التي يتلقّاها الجهاز ويقرّر ما إذا كان سيتم قبولها أو إسقاطها أو الردّ عليها.
- يتم تشغيل رمز إنشاء برنامج APF على وحدة المعالجة المركزية الرئيسية. تنشئ التعليمة البرمجية برامج APF وتُعدِّلها وفقًا لحالة الشبكة والجهاز.
تسمح طُرق Wi-Fi HAL لإطار عمل Android بتثبيت bytecode لبرنامج APF وقراءة العدادات الحالية. يمكن لمحاولة وحدة "الشبكة الرئيسية" في حِزمة APF تعديل الرمز الثنائي لبرنامج APF في أي وقت أثناء تشغيل APF.
تمّ تنفيذ العديد من فلاتر APF. على سبيل المثال، يتضمّن APF فلاتر لمحاولة
إسقاط أنواع الشبكات غير المسموح بها، وفلتر حِزم إعلانات أجهزة التوجيه (RA) لبروتوكول IPv6،
وفلتر حركة البث المتعدد والبث في حال عدم قفل البث المتعدد، ومحاولة
إسقاط حِزم بروتوكول إدارة حزم البيانات (DHCP) للمضيفين الآخرين، ومحاولة
إسقاط حِزم بروتوكول تحديد العناوين (ARP) غير المرغوب فيها وحِزم اكتشاف الجيران (ND). إذا كان البرنامج الثابت متوافقًا مع APFv6،
ApfFilter
يُنشئ أيضًا قواعد للردّ على أنواع الحِزم الشائعة التي تتطلّب عادةً
تنشيط وحدة المعالجة المركزية للردّ، مثل طلبات البحث عن ARP وطلبات البحث عن NS. يتم تحديد القائمة الكاملة للفلاتر في
ApfFilter
.
بما أنّ رمز إنشاء برنامج APF هو جزء من وحدة "حِزم الشبكة"، يمكنك استخدام التحديثات الرئيسية الشهرية لإضافة فلاتر جديدة وتعديل منطق الفلترة.
مراجعة APF
توضِّح القائمة التالية سجلّ النُسخ السابقة من APF:
- APFv6: تم طرح هذا الإصدار في Android 15، وهو يتوافق مع فلترة الحِزم، ويتضمن عدادات لتصحيح الأخطاء والمقاييس، ويسمح بإرسال الحِزم.
- APFv4: تم طرح هذا الإصدار في Android 10، وهو يتيح فلترة الحِزم ويتضمن عدادات لتصحيح الأخطاء والمقاييس.
- APFv2: تم طرح هذا الإصدار في Android 7، وهو يتيح تصفية حزم البيانات.
دمج APF
يتم تحديد واجهات برمجة التطبيقات في APF بين مترجم APF والأجهزة في
apf_interpreter.h
(APFv4،
APFv6).
يستدعي رمز البرامج الثابتة لشبكة Wi-Fi دالة
accept_packet()
في APFv4 أو
apf_run()
في APFv6 لتحديد ما إذا كان يجب إسقاط الحزمة (قيمة إرجاع صفرية) أو
إرسالها إلى معالج التطبيقات (قيمة إرجاع غير صفرية). إذا كان يجب
إرسال حزمة، يعرض apf_run()
أيضًا القيمة صفر لأنّه لا يلزم تمرير الحزمة إلى معالج التطبيق. إذا كان البرنامج الثابت متوافقًا مع APFv6، يجب أن ينفذ واجهات برمجة التطبيقات
apf_allocate_buffer()
و
apf_transmit_buffer()
. يُطلِق مفسِّر APF طلبَي بيانات واجهتَي برمجة التطبيقات هذين أثناء منطق نقل الحِزم.
تكون تعليمات APF متغيرة الطول. يبلغ طول كل تعليمات برمجية 1 بايت على الأقل. يتم تحديد رموز تعليمات APF في
apf.h
لإصدار APFv4 ويتم تضمينها مباشرةً في
apf_interpreter.c
لإصدار APFv6.
تعتمد ميزة "الإعلانات الصورية" على ذاكرة مخصّصة. تُستخدَم الذاكرة لكلّ من برنامج APF نفسه وتخزين البيانات، ويجب ألّا تمحو الشريحة الذاكرة أو تكتب فيها إلا من خلال طرق APF HAL. يستخدم الرمز الثنائي لبروتوكول APF مساحة تخزين البيانات لتخزين عدادات الحِزم المقبولة والمُسقطة. يمكن قراءة منطقة البيانات من إطار عمل Android. إنّ تعليمات APF فعّالة من حيث استخدام الذاكرة، ولكنّ تحسين إمكانات توفير الطاقة والوظائف يتطلّب قواعد فلترة معقدة وديناميكية. تتطلّب هذه التعقيدات تخصيص جزء من ذاكرة الرقاقة. الحد الأدنى لمتطلبات الذاكرة لبروتوكول APFv4 هو 1024 بايت، بينما يتطلب APFv6 2048 بايت. ومع ذلك، ننصحك بشدة بتخصيص 4096 بايت لبروتوكول APFv6 لضمان تحقيق الأداء الأمثل. يجب compiling مترجم APF في البرامج الثابتة. تم تحسين كلّ من مفسّرَي APFv4 وAPFv6 لحجم الرمز المبرمَج. وفقًا لبنية arm32، يبلغ حجم برنامج الترجمة المجمّع لبروتوكول APFv4 حوالي 1.8 كيلوبايت، في حين يبلغ حجم برنامج الترجمة الأكثر تعقيدًا لبروتوكول APFv6، الذي يتضمّن ميزات إضافية (مثل دعم التحقق من الصحة الأصلي ورمز فك الضغط الأصلي لنظام أسماء النطاقات)، حوالي 4 كيلوبايت.
يمكن أن تعمل فلاتر APF مع فلاتر أخرى خاصة بمورّدي شرائح المعالجة ضمن البرامج الثابتة. يمكن لمورّدي الرقاقات اختيار تنفيذ منطق الفلترة قبل أو بعد عملية فلترة APF. إذا تم إسقاط حزمة قبل الوصول إلى فلتر APF، لا يعالج فلتر APF الحزمة.
لضمان وظيفة فلتر APF الصحيحة، يجب أن يمنح البرامج الثابتة فلتر APF إذن الوصول إلى الحزمة بأكملها، وليس فقط العنوان، عند تفعيل APF.
نماذج برامج APF
تتضمّن المقالتَان ApfTest
و
ApfFilterTest
عيّنات من برامج الاختبار التي توضّح آلية عمل كل فلتر من فلاتر APF. لدراسة
البرنامج الذي تم إنشاؤه فعليًا، عدِّل حالة الاختبار لطباعة البرنامج كسلسلة برمجية هگزاديميكية.
يحتوي المجلد
testdata
على نماذج برامج APFv4 لفلاتر APF RA. يحتوي المجلد
samples
على أدوات Python التي تنشئ برامج نقل بيانات APFv6. لمزيد من
التفاصيل، اطّلِع على المستندات في ملفات أداة Python.
تصحيح أخطاء 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 بايت، يجب أن تكون مناطق data
طويلة بما يكفي للتأكّد من عدم حدوث أيّ تجاوز للسعة التخزينية المؤقتة.
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) بتعديل منطقة ذاكرة APF.
- مشاكل التثبيت في برامج APF التي تبلغ سعة وحدات البايت X (X <=
maxLen
): يجب أن تتيح البرامج الثابتة قراءة أو كتابة أي طول برنامج يصل إلىmaxLen
بدون حدوث أعطال أو تقطُّع. يجب ألا تؤدي عمليات الكتابة إلى تغيير أي وحدات بايت بينX
وmaxLen
. - تنفيذ APF في رمز برنامج تشغيل الجهاز: يجب تنفيذ APF فقط ضمن البرامج الثابتة، وليس في رمز برنامج تشغيل الجهاز. بخلاف ذلك، لا تتوفر أي فوائد لتوفير الطاقة لأنّ وحدة المعالجة المركزية تحتاج إلى الاستيقاظ لمعالجة الحزمة.
- قيم
filter_age
أوfilter_age_16384th
غير صحيحة: يجب تمرير قيمfilter_age
(APFv4) وfilter_age_16384th
(APFv6) بشكلٍ صحيح إلى الدالتَينaccept_packet()
وapf_run()
. للحصول على تفاصيل حول احتسابfilter_age_16384th
، يُرجى الرجوع إلى المستندات فيapf_interpreter.h
. - عدم تفعيل APF عند الحاجة: يجب تفعيل APF عندما تكون الشاشة مغلقة ويكون رابط Wi-Fi غير نشط أو تكون معدلات نقل البيانات أقل من 10 ميغابت في الثانية.
- الحِزم المقتطعة التي تم تمريرها إلى
accept_packet()
أوapf_run()
: يجب أن تكون كل حزمaccept_packet()
أوapf_run()
المخصّصة للبث المباشر والبث المتعدد والبث المباشر المتعدد مكتملة. إنّ تمرير الحِزم المقتطعة إلى APF ليس صالحًا.
اختبارات APF
بدءًا من Android 15، يقدّم نظام التشغيل Android كلاً من حالات اختبار CTS على جهاز واحد وأجهزة متعددة لدمج فلاتر APF ومفسّر APF لضمان وظيفة APF الصحيحة. في ما يلي تفاصيل الغرض من كل حالة اختبار:
- اختبار دمج
ApfFilter
وapf_interpreter
: يُجري هذا الاختبار عملية التحقّق من أنّApfFilter
يُنشئ رمزًا برمجيًا ثنائيًا صحيحًا وأنّapf_interpreter
executes the code correctly to produce the expected results.executes the code correctly to produce the expected results. - اختبار CTS لجهاز واحد مزوّد بميزة APF:
يستخدم جهازًا واحدًا لاختبار وظيفة APF على مجموعة شرائح Wi-Fi.
التأكّد مما يلي:
- يتم تفعيل ميزة "توفير الطاقة في Wi-Fi" عندما تكون الشاشة مطفأة وسرعة نقل البيانات عبر شبكة Wi-Fi أقل من 10 ميغابت في الثانية.
- تم الإعلان عن إمكانات APF بشكل صحيح.
- تنجح عمليات القراءة والكتابة في منطقة ذاكرة APF، ولا يتم تعديل منطقة الذاكرة بشكل غير متوقّع.
- يتم تمرير الوسائط بشكل صحيح إلى
accept_packet()
أوapf_run()
. - يمكن أن يؤدي البرنامج الثابت المدمج مع APFv4/APFv6 إلى إسقاط الحِزم.
- يمكن للبرامج الثابتة المدمجة مع APFv6 الردّ على الحِزم.
- اختبار التوافق مع مجموعة أدوات اختبار التوافق (CTS) لبروتوكول APF على أجهزة متعددة:
يستخدم هذا الاختبار جهازَين (جهاز مُرسِل وجهاز مُستلِم) لاختبار سلوك فلترة APF. يتم إنشاء أنواع مختلفة من الحِزم من جهة المُرسِل، ويؤكّد الاختبار ما إذا تم إسقاطها أو تمريرها أو الردّ عليها بشكلٍ صحيح استنادًا إلى القواعد التي تم ضبطها في
ApfFilter
.
تعليمات إضافية لاختبار الدمج
بالإضافة إلى ذلك، ننصحك بشدة بأن يُدرِج مورّدو شرائح المعالجة اختبار APF في مجموعات اختبار دمج البرامج الثابتة لشبكة Wi-Fi.
من المهم دمج اختبار APF في مجموعات اختبار دمج البرامج الثابتة لشبكة Wi-Fi للتحقّق من وظيفة APF المناسبة في سيناريوهات الاتصال المعقدة بشبكة Wi-Fi مثل سيناريوهات الاتصال بشبكة Wi-Fi أثناء التنقل أو سيناريوهات الاتصال بشبكة Wi-Fi قبل إيقافها. يمكن العثور على تعليمات تفصيلية بشأن كيفية إجراء اختبارات الدمج في القسم التالي.
المتطلّبات الأساسية
عند إجراء اختبارات الدمج، عليك تنفيذ ما يلي:
- يجب تفعيل APF في جميع حالات اختبار الدمج (على سبيل المثال، التجوّل، وإنشاء النسخ الاحتياطية قبل حذفها).
- في بداية كل اختبار، امسح ذاكرة APF.
- تثبيت برامج APF أو إعادة تثبيتها كل 5 دقائق أثناء الاختبار
سيناريوهات الاختبار
يجب أن يكون "برنامج مراقبة الأداء من Google" نشطًا طوال اختبارات الدمج. هناك برنامجان من برامج APF
متوفران في هذا المستند يمكن تثبيتهما أثناء الاختبار. تكون البرامج
بتنسيق سلسلة سداسية عشرية، وعلى المختبِر تحويل السلسلة الست عشرية إلى ثنائية و
تثبيتها على البرامج الثابتة حتى يمكن تنفيذ البرامج من قِبل
apf_interpreter
. أثناء اختبار الدمج، على المختبِر إرسال حزم
يُتوقّع أن تؤدي إلى تفعيل منطق الفلترة في البرنامجَين 1 و2.
برنامج APF 1
عندما تكون شاشة الجهاز مفعّلة، ثبِّت برنامج APF 1. يمكن أن يُسقط هذا البرنامج حزمًا غير ضارة لا تؤثّر في وظيفة الجهاز. تُستخدَم هذه الحِزم لاختبار ما إذا كان "فلتر الوصول إلى الشبكة" يفلتر حركة بيانات الشبكة بشكل صحيح.
في ما يلي منطق برنامج APF 1:
- إسقاط العداد وزيادة قيمته:
- قيم EtherType:
0x88A2
و0x88A4
و0x88B8
و0x88CD
و0x88E1
0x88E3
- حزم طلب أو استكشاف بروتوكول DHCP لإصدار IPv4
- حزم RS
- قيم EtherType:
- تمرير العداد وزيادته: جميع الحِزم الأخرى
في ما يلي رموز برنامج APF التي تتكون من 1 بايت:
6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
برنامج APF 2
عندما تكون شاشة الجهاز مطفأة، ثبِّت برنامج APF 2. يفلتر هذا البرنامج جميع الحِزم التي يفرِّط فيها برنامج APF 1، بالإضافة إلى حِزم طلب قياس سرعة الاتصال. للتأكّد من تثبيت برنامج APF 2 بشكل صحيح، أرسِل حزم ping إلى الجهاز الذي يتم اختباره.
في ما يلي منطق برنامج APF 2:
- إسقاط العداد وزيادة قيمته:
- قيم EtherType:
0x88A2
و0x88A4
و0x88B8
و0x88CD
و0x88E1
0x88E3
- حزم طلب أو استكشاف بروتوكول DHCP لإصدار IPv4
- حزم RS
- قيم EtherType:
- إسقاط العداد وزيادته: حزم طلب فحص الاتصال ICMP
- تمرير العداد وزيادته: جميع الحِزم الأخرى
في ما يلي رموز برنامج 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