تستخدم أداة حركة مرور شبكة eBPF مجموعة من تطبيقات kernel ومساحة المستخدم لمراقبة استخدام الشبكة على الجهاز منذ آخر تشغيل للجهاز. فهو يوفر وظائف إضافية مثل وضع علامات على المقبس، وفصل حركة المرور الأمامية/الخلفية وجدار الحماية لكل UID لمنع التطبيقات من الوصول إلى الشبكة اعتمادًا على حالة الهاتف. يتم تخزين الإحصائيات التي تم جمعها من الأداة في بنية بيانات kernel تسمى eBPF maps
ويتم استخدام النتيجة بواسطة خدمات مثل NetworkStatsService
لتوفير إحصائيات حركة المرور المستمرة منذ آخر تشغيل.
الأمثلة والمصادر
تغييرات مساحة المستخدم موجودة بشكل أساسي في مشاريع system/netd
و framework/base
. يتم التطوير في AOSP، لذلك سيكون كود AOSP محدثًا دائمًا. يقع المصدر بشكل رئيسي في system/netd/server/TrafficController*
و system/netd/bpfloader
و system/netd/libbpf/
. بعض التغييرات الضرورية في إطار العمل موجودة في framework/base/
system/core
أيضًا.
تطبيق
بدءًا من Android 9، يجب على أجهزة Android التي تعمل على kernel 4.9 أو أعلى والتي تم شحنها في الأصل مع الإصدار P أن تستخدم محاسبة مراقبة حركة مرور الشبكة المستندة إلى eBPF بدلاً من xt_qtaguid
. تعد البنية التحتية الجديدة أكثر مرونة وأكثر قابلية للصيانة ولا تتطلب أي كود نواة خارج الشجرة.
يتم توضيح الاختلافات الرئيسية في التصميم بين مراقبة حركة المرور القديمة وeBPF في الشكل 1.
الشكل 1. اختلافات تصميم مراقبة حركة المرور القديمة (يسار) وeBPF (يمين).
يعتمد التصميم الجديد trafficController
على مرشح eBPF لكل cgroup
بالإضافة إلى وحدة xt_bpf
netfilter داخل النواة. يتم تطبيق مرشحات eBPF هذه على الحزمة tx/rx عندما تمر عبر المرشح. يوجد مرشح cgroup
eBPF في طبقة النقل وهو مسؤول عن حساب حركة المرور مقابل UID الصحيح اعتمادًا على UID للمقبس بالإضافة إلى إعداد مساحة المستخدم. يتم ربط xt_bpf
netfilter بسلسلة bw_raw_PREROUTING
و bw_mangle_POSTROUTING
وهو مسؤول عن حساب حركة المرور مقابل الواجهة الصحيحة.
في وقت التمهيد، تقوم trafficController
الخاصة بعملية مساحة المستخدم بإنشاء خرائط eBPF المستخدمة لجمع البيانات وتثبيت جميع الخرائط كملف افتراضي في sys/fs/bpf
. بعد ذلك، تقوم عملية bpfloader
ذات الامتيازات بتحميل برنامج eBPF المترجم مسبقًا إلى النواة وإرفاقه بالمجموعة cgroup
الصحيحة. توجد cgroup
جذر واحدة لجميع حركة المرور، لذا يجب تضمين كل العمليات في cgroup
تلك بشكل افتراضي.
في وقت التشغيل، يمكن trafficController
وضع علامة/إلغاء وضع علامة على مأخذ التوصيل عن طريق الكتابة إلى traffic_cookie_tag_map
و traffic_uid_counterSet_map
. يمكن لـ NetworkStatsService
قراءة بيانات إحصائيات حركة المرور من traffic_tag_stats_map
، traffic_uid_stats_map
، و traffic_iface_stats_map
. إلى جانب وظيفة جمع إحصائيات حركة المرور، فإن trafficController
ومرشح cgroup
eBPF مسؤولان أيضًا عن حظر حركة المرور من معرفات UID معينة وفقًا لإعدادات الهاتف. تعد ميزة حظر حركة مرور الشبكة المستندة إلى UID بديلاً لوحدة xt_owner
داخل kernel ويمكن تكوين وضع التفاصيل عن طريق الكتابة إلى traffic_powersave_uid_map
و traffic_standby_uid_map
و traffic_dozable_uid_map
.
يتبع التنفيذ الجديد تطبيق وحدة xt_qtaguid
القديمة، لذلك سيتم تشغيل TrafficController
و NetworkStatsService
إما مع التنفيذ القديم أو الجديد. إذا كان التطبيق يستخدم واجهات برمجة التطبيقات العامة، فلن يواجه أي اختلاف سواء تم استخدام أدوات xt_qtaguid
أو eBPF في الخلفية.
إذا كان نواة الجهاز يعتمد على Android kernel 4.9 الشائع (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 أو أعلى)، فلن تكون هناك حاجة لإجراء تعديلات على HALs أو برامج التشغيل أو كود kernel لتنفيذ أداة eBPF الجديدة.
متطلبات
يجب أن تكون التكوينات التالية قيد التشغيل في تكوين kernel:
-
CONFIG_CGROUP_BPF=y
-
CONFIG_BPF=y
-
CONFIG_BPF_SYSCALL=y
-
CONFIG_NETFILTER_XT_MATCH_BPF=y
-
CONFIG_INET_UDP_DIAG=y
يعد اختبار تكوين VTS kernel مفيدًا عند التحقق من تشغيل التكوين الصحيح.
-
عملية إهمال xt_qtaguid القديمة
تحل أداة eBPF الجديدة محل وحدة xt_qtaguid
ووحدة xt_owner
التي تعتمد عليها. سنبدأ في إزالة وحدة xt_qtaguid
من نواة Android وتعطيل تكويناتها غير الضرورية.
في إصدار Android 9، يتم تشغيل الوحدة xt_qtaguid
في جميع الأجهزة، ولكن يتم نقل جميع واجهات برمجة التطبيقات العامة التي تقرأ ملف proc الوحدة النمطية xt_qtaguid
مباشرةً إلى خدمة NetworkManagement
Service. اعتمادًا على إصدار kernel للجهاز ومستوى واجهة برمجة التطبيقات الأول، تعرف خدمة NetworkManagement
Service ما إذا كانت أدوات eBPF قيد التشغيل وتختار الوحدة المناسبة للحصول عليها لكل إحصائيات استخدام شبكة التطبيق. يتم حظر التطبيقات ذات مستوى SDK 28 والأعلى من الوصول إلى ملفات xt_qtaguid
proc بواسطة sepolicy.
في إصدار Android التالي بعد 9، سيتم حظر وصول التطبيق إلى ملفات xt_qtaguid
proc تمامًا، وسنبدأ في إزالة وحدة xt_qtaguid
من نواة Android الشائعة الجديدة. بعد إزالته، سنقوم بتحديث التكوين الأساسي لنظام Android لإصدار kernel هذا لإيقاف تشغيل وحدة xt_qtaguid
بشكل صريح. سيتم إهمال الوحدة xt_qtaguid
تمامًا عندما يكون الحد الأدنى لمتطلبات إصدار kernel لإصدار Android هو 4.9 أو أعلى.
في إصدار Android 9، يلزم فقط الأجهزة التي يتم تشغيلها بإصدار Android 9 أن تتمتع بميزة eBPF الجديدة. بالنسبة للأجهزة التي يتم شحنها مع نواة يمكنها دعم أدوات eBPF، نوصي بتحديثها إلى ميزة eBPF الجديدة عند الترقية إلى إصدار Android 9. لا يوجد اختبار CTS لفرض هذا التحديث.
تصديق
يجب عليك بانتظام الحصول على تصحيحات من نواة Android الشائعة وAndroid AOSP الرئيسي. تأكد من أن تنفيذك يجتاز اختبارات VTS وCTS المعمول بها، و netd_unit_test
، و libbpf_test
.
اختبارات
هناك اختبارات net_tests لـ kernel للتأكد من تشغيل الميزات المطلوبة وتصحيحات kernel المطلوبة. تم دمج الاختبارات كجزء من اختبارات VTS لإصدار Android 9. توجد بعض اختبارات الوحدات في system/netd/
( netd_unit_test
و libbpf_test
). توجد بعض الاختبارات في netd_integration_test
للتحقق من صحة السلوك العام للأداة الجديدة.
CTS وCTS التحقق
نظرًا لأن كلا وحدتي مراقبة حركة المرور مدعومتان في إصدار Android 9، فلا يوجد اختبار CTS لفرض تنفيذ الوحدة الجديدة على جميع الأجهزة. ولكن بالنسبة للأجهزة التي تحتوي على إصدار kernel أعلى من 4.9 والتي تأتي في الأصل مع إصدار Android 9 (أي مستوى واجهة برمجة التطبيقات الأول >= 28)، توجد اختبارات CTS على GSI للتحقق من تكوين الوحدة الجديدة بشكل صحيح. يمكن استخدام اختبارات CTS القديمة مثل TrafficStatsTest
و NetworkUsageStatsTest
و CtsNativeNetTestCases
للتحقق من توافق السلوك مع وحدة UID القديمة.
الاختبار اليدوي
توجد بعض اختبارات الوحدات في system/netd/
( netd_unit_test
و netd_integration_test
و libbpf_test
). يوجد دعم dumpsys للتحقق من الحالة يدويًا. يعرض الأمر dumpsys netd
الحالة الأساسية لوحدة trafficController
وما إذا كان eBPF قيد التشغيل بشكل صحيح. إذا تم تشغيل eBPF، فسيعرض الأمر dumpsys netd trafficcontroller
المحتوى التفصيلي لكل خريطة eBPF، بما في ذلك معلومات المقبس ذات العلامات والإحصائيات لكل علامة ومعرف UID وiface ومطابقة UID للمالك.
مواقع الاختبار
توجد اختبارات CTS في:
- https://android.googlesource.com/platform/cts/+/main/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
- https://android.googlesource.com/platform/cts/+/main/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java
- https://android.googlesource.com/platform/system/netd/+/main/tests/bpf_base_test.cpp
توجد اختبارات VTS على https://android.googlesource.com/kernel/tests/+/main/net/test/bpf_test.py .
اختبارات الوحدة موجودة في:
- https://android.googlesource.com/platform/system/netd/+/main/libbpf/BpfNetworkStatsTest.cpp
- https://android.googlesource.com/platform/system/netd/+/main/server/TrafficControllerTest.cpp