مستودع صغير سأستخدمه لتخزين التقدم الذي أحرزه وبرامج الاختبار من DPDK، وهي مكتبة تجاوز kernel مفيدة جدًا لمعالجة الحزم السريعة.
يستخدم هذا المستودع مشروع DPDK Common الخاص بي في محاولة لتبسيط الأمور.
تحذير - ما زلت أقوم بإضافة المزيد من الأمثلة مع مرور الوقت وأحتاج إلى اختبار وظائف/طرق جديدة.
إذا كنت تريد إنشاء DPDK باستخدام الخيارات الافتراضية، فيجب أن يعمل ما يلي على افتراض أن لديك المتطلبات مثل ninja
و meson
.
git clone https://github.com/DPDK/dpdk.git
cd dpdk/
meson build
cd build
ninja
sudo ninja install
sudo ldconfig
سيتم تخزين جميع ملفات الرأس المطلوبة من DPDK داخل /usr/local/include/
.
يمكنك الحصول على ninja
meson
باستخدام ما يلي.
sudo apt update
sudo apt install python3 python3-pip
sudo pip3 install meson # Pip3 is used because 'apt' has an outdated version of Meson usually.
sudo apt install ninja-build
يمكنك استخدام git
and make
لإنشاء الملفات المصدر داخل هذا المستودع.
git clone --recursive https://github.com/gamemann/The-DPDK-Examples.git
cd The-DPDK-Examples/
make
سيتم إنشاء الملفات التنفيذية داخل دليل build/
افتراضيًا.
تدعم جميع تطبيقات DPDK الموجودة في هذا المستودع معلمات EAL الخاصة بـ DPDK. يمكن العثور على هذه هنا.
وهذا مفيد في تحديد مقدار المراكز والمنافذ التي سيتم تكوينها على سبيل المثال.
في تطبيق DPDK هذا، سيتم إسقاط أي حزم تصل إلى منفذ وجهة UDP رقم 8080. بخلاف ذلك، إذا كان نوع رأس إيثرنت الحزمة هو IPv4 أو VLAN، فسيتم تبديل عناوين MAC وIP للمصدر/الوجهة مع منافذ المصدر/الوجهة UDP ثم إرسال الحزمة خارج مسار TX (بشكل أساسي إعادة توجيه الحزمة من حيث أتت) .
بالإضافة إلى معلمات EAL، يتوفر ما يلي خصيصًا لهذا التطبيق.
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
هنا مثال:
./dropudp8080 -l 0-1 -n 1 -- -q 1 -p 0xff -s
في تطبيق DPDK هذا، يتم إنشاء جدول تجزئة توجيه بسيط بحيث يكون المفتاح هو عنوان IP الوجهة والقيمة هي عنوان MAC الذي سيتم إعادة التوجيه إليه.
تتم قراءة المسارات من الملف /etc/l3fwd/routes.txt
بالتنسيق التالي.
<ip address> <mac address in xx:xx:xx:xx:xx:xx>
وفيما يلي مثال.
10.50.0.4 ae:21:14:4b:3a:6d
10.50.0.5 d6:45:f3:b1:a4:3d
عند معالجة حزمة ما، نتأكد من أنها حزمة IPv4 أو VLAN (نقوم بتعويض بيانات الحزمة بمقدار أربعة بايت في هذه الحالة حتى نتمكن من معالجة بقية الحزمة دون مشاكل). بعد ذلك، نقوم بإجراء بحث حيث يكون عنوان IP الوجهة هو المفتاح في جدول تجزئة المسار. إذا نجح البحث، فسيتم استبدال عنوان MAC المصدر بعنوان MAC الوجهة (ستخرج الحزم من نفس المنفذ الذي تصل إليه منذ أن قمنا بإنشاء مخزن مؤقت TX وقائمة انتظار) ويتم استبدال عنوان MAC الوجهة بعنوان MAC الخاص بـ IP تم تعيينه من ملف المسارات المذكور أعلاه. وبخلاف ذلك، يتم إسقاط الحزمة ويتم زيادة عداد إسقاط الحزمة.
بالإضافة إلى معلمات EAL، يتوفر ما يلي خصيصًا لهذا التطبيق.
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
هنا مثال:
./simple_l3fwd -l 0-1 -n 1 -- -q 1 -p 0xff -s
في هذا التطبيق، إذا كان عنوان IP المصدر يساوي أو يتجاوز الحزم في الثانية أو البايتات في الثانية المحددة في سطر الأوامر، فسيتم إسقاط الحزم. وبخلاف ذلك، يتم تبديل عناوين إيثرنت وIP مع منافذ TCP/UDP ويتم إعادة توجيه الحزمة مرة أخرى إلى مسار TX.
يتم أيضًا تضمين إحصائيات الحزمة مع العلامة -s
.
يتم دعم خيارات سطر الأوامر التالية.
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
--pps => The packets per second to limit each source IP to.
--bps => The bytes per second to limit each source IP to.
هنا مثال:
./ratelimit -l 0-1 -n 1 -- -q 1 -p 0xff -s
ملاحظة - يدعم هذا التطبيق إعادة تدوير LRU عبر وظيفة مخصصة قمت بإنشائها في مشروع DPDK Common، check_and_del_lru_from_hash_table()
. تأكد من تحديد USE_HASH_TABLES
قبل تضمين ملف الرأس DPDK Common عند استخدام هذه الوظيفة.
هذا تطبيق صغير يطبق طريقة LRU اليدوية لجداول التجزئة. لفترة من الوقت كنت أحاول جعل جداول LRU تعمل من هذه المكتبات. ومع ذلك، لم أحقق أي نجاح في تهيئة الجدول فعليًا.
لذلك، قررت الاستمرار في استخدام هذه المكتبات بدلاً من ذلك وتنفيذ وظيفة LRU الخاصة بي. أستخدم بشكل أساسي وظيفة rte_hash_get_key_with_position()
لاسترداد أقدم مفتاح لحذفه. ومع ذلك، يبدو أنه تم إدراج الإدخال الجديد في الموضع الذي تم حذفه مؤخرًا، لذا يتعين عليك الاستمرار في زيادة قيمة الموضع حتى الحد الأقصى لإدخالات الجدول. ومع ذلك، بمجرد أن تتجاوز قيمة الموضع الحد الأقصى لإدخالات الجدول، ستحتاج إلى إعادته إلى 0.
ليست هناك حاجة إلى خيارات سطر الأوامر، لكن معلمات EAL لا تزال مدعومة. على الرغم من ذلك، فإنها لن تحدث فرقا.
هنا مثال:
./ratelimit