অ্যান্ড্রয়েড প্যাকেট ফিল্টার

অ্যান্ড্রয়েড প্যাকেট ফিল্টার (APF) ফ্রেমওয়ার্ককে রানটাইমে হার্ডওয়্যার প্যাকেট ফিল্টারিং লজিক নিয়ন্ত্রণ করতে দেয়। এর ফলে সিস্টেম হার্ডওয়্যারে প্যাকেট ড্রপ করে শক্তি সাশ্রয় করতে পারে, এবং একই সাথে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক নেটওয়ার্কের অবস্থার উপর ভিত্তি করে রানটাইমে ফিল্টারিং নিয়ম পরিবর্তন করতে পারে।

এপিএফ ওভারভিউ

এপিএফ দুটি প্রধান উপাদান নিয়ে গঠিত:

  • এপিএফ ইন্টারপ্রেটার নেটওয়ার্কিং হার্ডওয়্যারে (সাধারণত, ওয়াই-ফাই চিপসেট) চলে। হার্ডওয়্যার দ্বারা গৃহীত প্যাকেটগুলোর উপর এপিএফ বাইটকোড চালায় এবং সেগুলোকে গ্রহণ, বর্জন, নাকি উত্তর দেবে, সেই সিদ্ধান্ত নেয়।
  • এপিএফ প্রোগ্রাম তৈরির কোডটি প্রধান সিপিইউতে চলে। এই কোডটি নেটওয়ার্ক এবং ডিভাইসের অবস্থা অনুযায়ী এপিএফ প্রোগ্রাম তৈরি ও হালনাগাদ করে।

Wi-Fi HAL পদ্ধতিগুলো অ্যান্ড্রয়েড ফ্রেমওয়ার্ককে APF প্রোগ্রামের বাইটকোড ইনস্টল করতে এবং বর্তমান কাউন্টারগুলো পড়তে দেয়। APF চলমান থাকা অবস্থায় নেটওয়ার্ক স্ট্যাক মেইনলাইন মডিউল যেকোনো সময় APF প্রোগ্রামের বাইটকোড আপডেট করতে পারে।

এখানে বেশ কয়েকটি APF ফিল্টার প্রয়োগ করা হয়েছে। উদাহরণস্বরূপ, APF-এ এমন ফিল্টার রয়েছে যা অননুমোদিত ইথারটাইপ বাদ দেয়, IPv6 রাউটার অ্যাডভার্টাইজমেন্ট (RA) প্যাকেট ফিল্টার করে, মাল্টিকাস্ট লক ধরে রাখা না হলে মাল্টিকাস্ট এবং ব্রডকাস্ট ট্র্যাফিক ফিল্টার করে, অন্যান্য হোস্টের জন্য DHCP প্যাকেট বাদ দেয় এবং অনাকাঙ্ক্ষিত অ্যাড্রেস রেজোলিউশন প্রোটোকল (ARP) ও নেইবার ডিসকভারি (ND) প্যাকেট বাদ দেয়। যদি ফার্মওয়্যারটি APFv6 সমর্থন করে, ApfFilter এমন সাধারণ প্যাকেট প্রকারের উত্তর দেওয়ার জন্য নিয়মও তৈরি করে, যেগুলোর উত্তর দেওয়ার জন্য অন্যথায় CPU-কে জেগে উঠতে হতো, যেমন ARP কোয়েরি এবং NS কোয়েরি। ফিল্টারগুলির সম্পূর্ণ তালিকা ApfFilter এ সংজ্ঞায়িত করা আছে।

যেহেতু APF প্রোগ্রাম জেনারেশন কোডটি নেটওয়ার্ক স্ট্যাক মডিউলের একটি অংশ, তাই আপনি মাসিক মেইনলাইন আপডেট ব্যবহার করে নতুন ফিল্টার যোগ করতে এবং ফিল্টারিং লজিক আপডেট করতে পারেন।

এপিএফ সংশোধন

নিম্নলিখিত তালিকাটিতে APF-এর সংশোধন ইতিহাস বর্ণনা করা হয়েছে:

  • APFv6: অ্যান্ড্রয়েড ১৫-এ প্রবর্তিত এই সংস্করণটি প্যাকেট ফিল্টারিং, ডিবাগিং ও মেট্রিক্সের জন্য কাউন্টার এবং প্যাকেট ট্রান্সমিশন সমর্থন করে।
  • APFv4: অ্যান্ড্রয়েড ১০-এ প্রবর্তিত এই সংস্করণটি প্যাকেট ফিল্টারিং সমর্থন করে এবং এতে ডিবাগিং ও মেট্রিক্সের জন্য কাউন্টার অন্তর্ভুক্ত রয়েছে।
  • APFv2: অ্যান্ড্রয়েড ৭-এ প্রবর্তিত এই সংস্করণটি প্যাকেট ফিল্টারিং সমর্থন করে।

এপিএফ ইন্টিগ্রেশন

APF ইন্টারপ্রেটার এবং হার্ডওয়্যারের মধ্যে APF API-গুলো apf_interpreter.h ( APFv4 , APFv6 ) ফাইলে সংজ্ঞায়িত করা আছে। প্যাকেটটি বাদ দেওয়া হবে (শূন্য রিটার্ন ভ্যালু) নাকি অ্যাপ প্রসেসরের কাছে পাঠানো হবে (অশূন্য রিটার্ন ভ্যালু), তা নির্ধারণ করার জন্য Wi-Fi ফার্মওয়্যার কোড APFv4-এর ক্ষেত্রে accept_packet() অথবা APFv6-এর ক্ষেত্রে apf_run() কল করে। যদি কোনো প্যাকেট পাঠানোর প্রয়োজন হয়, তাহলে apf_run() ফাংশনটিও শূন্য রিটার্ন করে, কারণ এর প্যাকেটটি অ্যাপ প্রসেসরের কাছে পাঠানোর প্রয়োজন হয় না। যদি ফার্মওয়্যারটি APFv6 সমর্থন করে, তবে এটিকে অবশ্যই apf_allocate_buffer() এবং apf_transmit_buffer() API-গুলো ইমপ্লিমেন্ট করতে হবে। APF ইন্টারপ্রেটার প্যাকেট ট্রান্সমিশন লজিকের সময় এই দুটি API কল করে। APF ইনস্ট্রাকশনগুলো পরিবর্তনশীল দৈর্ঘ্যের হয়। প্রতিটি ইনস্ট্রাকশনের দৈর্ঘ্য কমপক্ষে ১ বাইট। APF ইনস্ট্রাকশন কোডগুলো APFv4-এর জন্য apf.h ফাইলে এবং APFv6-এর জন্য apf_interpreter.c মধ্যে সরাসরি ইনলাইন করা থাকে।

APF একটি নির্দিষ্ট মেমরির উপর নির্ভর করে। এই মেমরিটি APF প্রোগ্রাম এবং ডেটা স্টোরেজ উভয়ের জন্যই ব্যবহৃত হয়, এবং APF HAL পদ্ধতি ছাড়া চিপসেট দ্বারা এই মেমরি খালি করা বা লেখা যাবে না। APF বাইটকোড গৃহীত এবং বাতিল হওয়া প্যাকেটের জন্য কাউন্টার সংরক্ষণ করতে ডেটা স্টোরেজ ব্যবহার করে। আপনি অ্যান্ড্রয়েড ফ্রেমওয়ার্ক থেকে ডেটা অঞ্চলটি পড়তে পারেন। APF নির্দেশাবলী মেমরি-দক্ষ, কিন্তু এর শক্তি-সাশ্রয় এবং কার্যকারিতার সম্ভাবনাকে সর্বোচ্চ করতে জটিল, গতিশীল ফিল্টারিং নিয়মের প্রয়োজন হয়। এই জটিলতার জন্য অন-চিপসেট মেমরির একটি নির্দিষ্ট অংশের প্রয়োজন হয়। APFv4-এর জন্য ন্যূনতম মেমরির প্রয়োজন ১০২৪ বাইট, যেখানে APFv6-এর জন্য ২০৪৮ বাইট প্রয়োজন। তবে, সর্বোত্তম পারফরম্যান্স যাচাই করার জন্য আমরা আপনাকে APFv6-এর জন্য ৪০৯৬ বাইট বরাদ্দ করার জন্য দৃঢ়ভাবে সুপারিশ করি। APF ইন্টারপ্রেটারকে অবশ্যই ফার্মওয়্যারে কম্পাইল করতে হবে। APFv4 এবং APFv6 উভয় ইন্টারপ্রেটারই কোডের আকারের জন্য অপ্টিমাইজ করা হয়েছে। arm32 আর্কিটেকচারের অধীনে, কম্পাইল করা APFv4 ইন্টারপ্রেটারের আকার প্রায় ১.৮ কিলোবাইট, যেখানে অতিরিক্ত বৈশিষ্ট্য (যেমন, বিল্ট-ইন চেকসাম সাপোর্ট এবং বিল্ট-ইন ডিএনএস ডিকম্প্রেশন কোড) সহ আরও জটিল APFv6 ইন্টারপ্রেটারের আকার প্রায় ৪ কিলোবাইট।

ফার্মওয়্যারের মধ্যে এপিএফ ফিল্টারগুলো অন্যান্য চিপসেট ভেন্ডর-নির্দিষ্ট ফিল্টারগুলোর পাশাপাশি কাজ করতে পারে। আপনি এপিএফ ফিল্টারিং প্রক্রিয়ার আগে বা পরে আপনার ফিল্টারিং লজিকটি চালাতে পারেন। যদি কোনো প্যাকেট এপিএফ ফিল্টারে পৌঁছানোর আগেই বাদ পড়ে যায়, তবে এপিএফ ফিল্টারটি প্যাকেটটি প্রসেস করে না।

APF ফিল্টারের সঠিক কার্যকারিতা যাচাই করতে, APF চালু থাকা অবস্থায় নিশ্চিত করুন যে ফার্মওয়্যারটি APF ফিল্টারকে শুধুমাত্র হেডার নয়, বরং সম্পূর্ণ প্যাকেটটিতেই অ্যাক্সেস দিচ্ছে।

এপিএফ প্রোগ্রামের নমুনা

ApfTest এবং ApfFilterTest নমুনা টেস্ট প্রোগ্রাম রয়েছে যা প্রতিটি APF ফিল্টার কীভাবে কাজ করে তা তুলে ধরে। প্রকৃত জেনারেটেড প্রোগ্রামটি অধ্যয়ন করার জন্য, টেস্ট কেসটি পরিবর্তন করে প্রোগ্রামটিকে একটি হেক্স স্ট্রিং হিসাবে প্রিন্ট করুন।

testdata ফোল্ডারটিতে APF RA ফিল্টারের জন্য নমুনা APFv4 প্রোগ্রাম রয়েছে। samples ফোল্ডারটিতে পাইথন ইউটিলিটি রয়েছে যা APFv6 অফলোড প্রোগ্রাম তৈরি করে। আরও বিস্তারিত জানতে, পাইথন ইউটিলিটি ফাইলগুলির ডকুমেন্টেশন দেখুন।

ডিবাগ এপিএফ

আপনার ডিভাইসে 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} : এর মানে হলো ওয়াই-ফাই চিপগুলো APF (সংস্করণ 4) সমর্থন করে।
  • Last program : এই বিভাগে হেক্স স্ট্রিং ফরম্যাটে সর্বশেষ ইনস্টল করা APF প্রোগ্রামের বাইনারিটি রয়েছে।
  • APF packet counters : এই বিভাগে দেখানো হয় এপিএফ দ্বারা কতগুলো প্যাকেট পাস বা ড্রপ করা হয়েছে এবং তার নির্দিষ্ট কারণগুলো।

কোডটিকে মানুষের পাঠযোগ্য অ্যাসেম্বলার ভাষায় ডিকোড ও ডিসঅ্যাসেম্বল করতে 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 ইন্টারপ্রেটারে চলে। apf_run এর সাথে --v6 আর্গুমেন্টটি পাস করলে এটি 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 অপশনটি ব্যবহার করুন। যেহেতু প্রতিটি কাউন্টার ৪ বাইট দীর্ঘ, তাই কোনো বাফার ওভারফ্লো যাতে না ঘটে তা নিশ্চিত করার জন্য ডেটা অঞ্চলগুলো যথেষ্ট দীর্ঘ হতে হবে।

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

tcpdump দ্বারা গৃহীত pcap ফাইলের সাথে APF-এর ফলাফল মিলিয়ে দেখতে, নিম্নলিখিতভাবে 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 টুলটি ইন্টারপ্রেটারের কার্য সম্পাদনের প্রতিটি ধাপের একটি বিস্তারিত আউটপুট প্রদান করে, যা ডিবাগিংয়ের জন্য সহায়ক। এই উদাহরণে, আপনি APF প্রোগ্রামে একটি ARP কোয়েরি প্যাকেট ইনপুট করেছেন। আউটপুটে দেখা যায় যে ARP কোয়েরিটি ড্রপ করা হয়েছে, কিন্তু একটি রিপ্লাই প্যাকেট তৈরি হয়েছে। এই তৈরি হওয়া প্যাকেটের বিস্তারিত বিবরণ transmitted packet সেকশনে দেখানো হয়েছে।

সাধারণ ইন্টিগ্রেশন সমস্যা

এই বিভাগে APF ইন্টিগ্রেশনের সময় সম্মুখীন হওয়া কয়েকটি সাধারণ সমস্যা তুলে ধরা হয়েছে:

  • অপ্রত্যাশিত ডেটা অঞ্চল খালি করা: APF মেমরি অবশ্যই সম্পূর্ণরূপে APF-এর জন্য উৎসর্গীকৃত হতে হবে; শুধুমাত্র ইন্টারপ্রেটার কোড অথবা ফ্রেমওয়ার্ক কোড (HAL API-এর মাধ্যমে) APF মেমরি অঞ্চল পরিবর্তন করার অনুমতিপ্রাপ্ত।
  • X বাইটের (X <= maxLen ) APF প্রোগ্রাম ইনস্টলেশন সংক্রান্ত সমস্যা: ফার্মওয়্যারকে অবশ্যই কোনো ব্যর্থতা, ক্র্যাশ বা খণ্ডন ছাড়াই 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 সক্রিয় করা হয়নি: যখন স্ক্রিন বন্ধ থাকে এবং ওয়াই-ফাই লিঙ্কটি নিষ্ক্রিয় থাকে অথবা ট্র্যাফিক ১০ Mbps-এর কম হয়, তখন APF অবশ্যই সক্রিয় থাকতে হবে।
  • accept_packet() বা apf_run() এ পাঠানো খণ্ডিত প্যাকেট: accept_packet() বা apf_run() এ পাঠানো সমস্ত ইউনিকাস্ট, ব্রডকাস্ট এবং মাল্টিকাস্ট প্যাকেট অবশ্যই সম্পূর্ণ হতে হবে। APF-এ খণ্ডিত প্যাকেট পাঠানো বৈধ নয়।

এপিএফ পরীক্ষা

অ্যান্ড্রয়েড ১৫ থেকে শুরু করে, অ্যান্ড্রয়েড সঠিক APF কার্যকারিতা যাচাই করার জন্য APF ফিল্টার এবং APF ইন্টারপ্রেটার ইন্টিগ্রেশনের জন্য একক-ডিভাইস এবং একাধিক-ডিভাইস উভয় ধরনের কম্প্যাটিবিলিটি টেস্ট স্যুট (CTS) টেস্ট কেস প্রদান করে। নিচে প্রতিটি টেস্ট কেসের উদ্দেশ্যের একটি বিশদ বিবরণ দেওয়া হলো:

  • ApfFilter এবং apf_interpreter-এর ইন্টিগ্রেশন টেস্ট : এটি যাচাই করে যে ApfFilter সঠিক বাইটকোড তৈরি করে এবং apf_interpreter প্রত্যাশিত ফলাফল প্রদানের জন্য কোডটি সঠিকভাবে কার্যকর করে।
  • এপিএফ সিঙ্গেল-ডিভাইস সিটিএস : ওয়াই-ফাই চিপসেটে এপিএফ কার্যকারিতা পরীক্ষা করার জন্য একটিমাত্র ডিভাইস ব্যবহার করে। এটি নিশ্চিত করে যে:
    • স্ক্রিন বন্ধ থাকলে এবং ওয়াই-ফাই ট্র্যাফিক ১০ এমবিপিএস-এর কম হলে এপিএফ চালু হয়।
    • APF সক্ষমতাগুলো সঠিকভাবে ঘোষণা করা হয়েছে।
    • APF মেমরি অঞ্চলে পঠন এবং লিখন কার্যক্রম সফল হয়, এবং মেমরি অঞ্চলটি অপ্রত্যাশিতভাবে পরিবর্তিত হয় না।
    • accept_packet() বা apf_run() ফাংশনে আর্গুমেন্টগুলো সঠিকভাবে পাস করা হচ্ছে।
    • APFv4/APFv6-এর সাথে সমন্বিত ফার্মওয়্যার প্যাকেট বাদ দিতে পারে।
    • APFv6-এর সাথে সমন্বিত ফার্মওয়্যার প্যাকেটের জবাব দিতে পারে।
  • এপিএফ মাল্টিডিভাইস সিটিএস : এপিএফ-এর ফিল্টারিং আচরণ পরীক্ষা করার জন্য দুটি ডিভাইস (একটি প্রেরক, একটি প্রাপক) ব্যবহার করে। প্রেরক প্রান্তে বিভিন্ন ধরণের প্যাকেট তৈরি করা হয় এবং এপিএফ-এর সঠিক কার্যকারিতা যাচাই করার জন্য, পরীক্ষাটি নিশ্চিত করে যে ApfFilter এ কনফিগার করা নিয়ম অনুসারে সেগুলি সঠিকভাবে ড্রপ, পাস বা রিপ্লাই করা হচ্ছে কিনা।

অতিরিক্ত ইন্টিগ্রেশন পরীক্ষার নির্দেশাবলী

এছাড়াও, আমরা দৃঢ়ভাবে সুপারিশ করছি যে আপনি আপনার ফার্মওয়্যার ওয়াই-ফাই ইন্টিগ্রেশন টেস্ট স্যুটগুলিতে এপিএফ টেস্টিং অন্তর্ভুক্ত করুন।

ফার্মওয়্যার ওয়াই-ফাই ইন্টিগ্রেশন টেস্ট স্যুটে APF টেস্টিং অন্তর্ভুক্ত করা অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে মেক-বিফোর-ব্রেক বা রোমিং ওয়াই-ফাই কানেকশনের মতো জটিল পরিস্থিতিতে APF-এর সঠিক কার্যকারিতা যাচাই করার জন্য। ইন্টিগ্রেশন টেস্ট কীভাবে করতে হয়, তার বিস্তারিত নির্দেশাবলী পরবর্তী বিভাগে পাওয়া যাবে।

পূর্বশর্ত

ইন্টিগ্রেশন টেস্ট করার সময় নিম্নলিখিত বিষয়গুলো করুন:

  • সমস্ত ইন্টিগ্রেশন টেস্ট কেস জুড়ে APF সক্রিয় রাখতে হবে (উদাহরণস্বরূপ, রোমিং, মেক-বিফোর-ব্রেক)।
  • প্রতিটি পরীক্ষার শুরুতে APF মেমরি খালি করুন।
  • পরীক্ষা চলাকালীন প্রতি ৫ মিনিট অন্তর এপিএফ প্রোগ্রামগুলো ইনস্টল বা পুনরায় ইনস্টল করুন।

পরীক্ষার দৃশ্যকল্প

ইন্টিগ্রেশন টেস্ট চলাকালীন APF অবশ্যই সক্রিয় থাকতে হবে। এই ডকুমেন্টে দুটি APF প্রোগ্রাম দেওয়া আছে যা আপনি টেস্টিং চলাকালীন ইনস্টল করতে পারেন। প্রোগ্রামগুলো হেক্স স্ট্রিং ফরম্যাটে রয়েছে, এবং আপনাকে অবশ্যই হেক্স স্ট্রিংটিকে বাইনারিতে রূপান্তর করে ফার্মওয়্যারে প্রোগ্রামগুলো ইনস্টল করতে হবে যাতে apf_interpreter সেগুলো এক্সিকিউট করতে পারে। ইন্টিগ্রেশন টেস্ট চলাকালীন, আপনাকে এমন প্যাকেট পাঠাতে হবে যা প্রোগ্রাম ১ এবং প্রোগ্রাম ২-এর ফিল্টারিং লজিককে ট্রিগার করবে বলে আশা করা যায়।

এপিএফ প্রোগ্রাম ১

যখন ডিভাইসের স্ক্রিন চালু থাকবে, তখন APF প্রোগ্রাম 1 ইনস্টল করুন। এই প্রোগ্রামটি এমন নিরীহ প্যাকেট বাদ দিতে পারে যা ডিভাইসের কার্যকারিতাকে প্রভাবিত করে না। APF সঠিকভাবে নেটওয়ার্ক ট্র্যাফিক ফিল্টার করছে কিনা তা পরীক্ষা করার জন্য এই প্যাকেটগুলি ব্যবহার করা হয়।

এপিএফ প্রোগ্রাম ১-এর লজিকটি নিম্নরূপ:

  1. কাউন্টার কমানো এবং বাড়ানো:
    1. ইথারটাইপ মানসমূহ: 0x88A2 , 0x88A4 , 0x88B8 , 0x88CD , 0x88E1 , 0x88E3
    2. IPv4 DHCP প্যাকেট আবিষ্কার বা অনুরোধ করে
    3. আরএস প্যাকেট
  2. পাস করুন এবং কাউন্টার বাড়ান: অন্য সব প্যাকেট।

APF প্রোগ্রামের ১ বাইট কোডগুলো নিম্নরূপ:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
এপিএফ প্রোগ্রাম ২

যখন ডিভাইসের স্ক্রিন বন্ধ থাকবে, তখন এপিএফ প্রোগ্রাম ২ ইনস্টল করুন। এই প্রোগ্রামটি এপিএফ প্রোগ্রাম ১ দ্বারা ফিল্টার করা সমস্ত প্যাকেটের পাশাপাশি পিং রিকোয়েস্ট প্যাকেটও ফিল্টার করে দেয়। এপিএফ প্রোগ্রাম ২ সঠিকভাবে ইনস্টল হয়েছে কিনা তা যাচাই করতে, পরীক্ষাধীন ডিভাইসটিতে পিং প্যাকেট পাঠান।

APF প্রোগ্রাম ২-এর লজিকটি নিম্নরূপ:

  1. কাউন্টার কমানো এবং বাড়ানো:
    1. ইথারটাইপ মানসমূহ: 0x88A2 , 0x88A4 , 0x88B8 , 0x88CD , 0x88E1 , 0x88E3
    2. IPv4 DHCP প্যাকেট আবিষ্কার বা অনুরোধ করে
    3. আরএস প্যাকেট
  2. কাউন্টার বাদ দেওয়া এবং বাড়ানো: ICMP পিং অনুরোধ প্যাকেট
  3. কাউন্টার পাস করুন এবং বৃদ্ধি করুন: অন্য সব প্যাকেট

APF প্রোগ্রামের ২ বাইটের কোডগুলো নিম্নরূপ:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C007488A27C006F88A47C006A88B87C006588CD7C006088E17C005B88E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE87234120C84000E86DD0A1482093A0A368204856BE0721F120C84001008000A17820B01AB0D220E8204086BE472086BDCB03A01B87206B03A01B87201
ডেটা যাচাইকরণ

APF প্রোগ্রামটি সঠিকভাবে কার্যকর হচ্ছে এবং প্যাকেট পাস বা ড্রপ করছে কিনা তা যাচাই করতে, নিম্নলিখিতগুলি করুন:

  • প্রতি ৫ মিনিট অন্তর এপিএফ ডেটা অঞ্চলটি সংগ্রহ ও যাচাই করুন।
  • কাউন্টারটি পরিষ্কার করবেন না।
  • প্রতিটি ফিল্টার নিয়ম সক্রিয় করতে টেস্ট প্যাকেট তৈরি করুন।
  • এই মেমরি অবস্থানগুলি ব্যবহার করে কাউন্টার বৃদ্ধি যাচাই করুন:

    কাউন্টারের নাম মেমরি অবস্থান
    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 প্রোগ্রাম ১ এবং APF প্রোগ্রাম ২ এর জন্য সিউডোকোড

নিম্নলিখিত সিউডোকোডে এপিএফ প্রোগ্রাম ১ এবং এপিএফ প্রোগ্রাম ২-এর লজিক বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে:

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