فلتر حزم Android

يتيح "فلتر حزم 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:

  1. إسقاط العداد وزيادة قيمته:
    1. قيم EtherType: 0x88A2 و0x88A4 و0x88B8 و0x88CD و0x88E1 0x88E3
    2. حزم طلب أو استكشاف بروتوكول DHCP لإصدار IPv4
    3. حزم RS
  2. تمرير العداد وزيادته: جميع الحِزم الأخرى

في ما يلي رموز برنامج APF التي تتكون من 1 بايت:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
برنامج APF 2

عندما تكون شاشة الجهاز مطفأة، ثبِّت برنامج APF 2. يفلتر هذا البرنامج جميع الحِزم التي يفرِّط فيها برنامج APF 1، بالإضافة إلى حِزم طلب قياس سرعة الاتصال. للتأكّد من تثبيت برنامج APF 2 بشكل صحيح، أرسِل حزم ping إلى الجهاز الذي يتم اختباره.

في ما يلي منطق برنامج APF 2:

  1. إسقاط العداد وزيادة قيمته:
    1. قيم EtherType: 0x88A2 و0x88A4 و0x88B8 و0x88CD و0x88E1 0x88E3
    2. حزم طلب أو استكشاف بروتوكول DHCP لإصدار IPv4
    3. حزم RS
  2. إسقاط العداد وزيادته: حزم طلب فحص الاتصال ICMP
  3. تمرير العداد وزيادته: جميع الحِزم الأخرى

في ما يلي رموز برنامج 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