Sebuah repositori kecil yang akan saya gunakan untuk menyimpan kemajuan saya dan menguji program dari DPDK, perpustakaan bypass kernel yang sangat berguna untuk pemrosesan paket yang cepat.
Repositori ini menggunakan proyek DPDK Common saya dalam upaya menyederhanakannya.
PERINGATAN - Saya masih menambahkan lebih banyak contoh seiring berjalannya waktu dan saya perlu menguji fungsi/metode baru.
Jika Anda ingin membuat DPDK menggunakan opsi default, hal berikut ini akan berfungsi dengan asumsi Anda memiliki persyaratan seperti ninja
dan meson
.
git clone https://github.com/DPDK/dpdk.git
cd dpdk/
meson build
cd build
ninja
sudo ninja install
sudo ldconfig
Semua file header yang diperlukan dari DPDK akan disimpan di dalam /usr/local/include/
.
Anda dapat menerima ninja
dan meson
menggunakan yang berikut ini.
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
Anda dapat menggunakan git
dan make
untuk membuat file sumber di dalam repositori ini.
git clone --recursive https://github.com/gamemann/The-DPDK-Examples.git
cd The-DPDK-Examples/
make
Executable akan dibangun di dalam direktori build/
secara default.
Semua aplikasi DPDK dalam repositori ini mendukung parameter EAL DPDK. Ini dapat ditemukan di sini.
Ini berguna untuk menentukan jumlah l-core dan port yang akan dikonfigurasi misalnya.
Pada aplikasi DPDK ini, paket apa pun yang sampai pada port tujuan UDP 8080 akan di-drop. Sebaliknya, jika tipe header ethernet paket adalah IPv4 atau VLAN, paket tersebut akan menukar MAC sumber/tujuan dan alamat IP bersama dengan port sumber/tujuan UDP kemudian mengirimkan paket keluar jalur TX (pada dasarnya meneruskan paket dari tempat asalnya) .
Selain parameter EAL, berikut ini tersedia khusus untuk aplikasi ini.
-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.
Berikut ini contohnya:
./dropudp8080 -l 0-1 -n 1 -- -q 1 -p 0xff -s
Dalam aplikasi DPDK ini, tabel hash perutean sederhana dibuat dengan kuncinya adalah alamat IP tujuan dan nilainya adalah alamat MAC yang akan diteruskan.
Rute dibaca dari file /etc/l3fwd/routes.txt
dalam format berikut.
<ip address> <mac address in xx:xx:xx:xx:xx:xx>
Berikut ini adalah contohnya.
10.50.0.4 ae:21:14:4b:3a:6d
10.50.0.5 d6:45:f3:b1:a4:3d
Ketika sebuah paket diproses, kami memastikan itu adalah paket IPv4 atau VLAN (dalam hal ini kami mengimbangi data paket sebesar empat byte sehingga kami dapat memproses sisa paket tanpa masalah). Setelah itu, kami melakukan pencarian dengan IP tujuan menjadi kunci pada tabel hash rute. Jika pencarian berhasil, alamat MAC sumber diganti dengan alamat MAC tujuan (paket akan keluar pada port yang sama dengan saat mereka tiba karena kita membuat buffer dan antrian TX) dan alamat MAC tujuan diganti dengan alamat MAC IP ditugaskan dari file rute yang disebutkan di atas. Jika tidak, paket akan dibuang dan penghitung paket yang dijatuhkan akan bertambah.
Selain parameter EAL, berikut ini tersedia khusus untuk aplikasi ini.
-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.
Berikut ini contohnya:
./simple_l3fwd -l 0-1 -n 1 -- -q 1 -p 0xff -s
Dalam aplikasi ini, jika IP sumber sama dengan atau melebihi paket per detik atau byte per detik yang ditentukan dalam baris perintah, paket tersebut akan dihapus. Jika tidak, alamat ethernet dan IP akan ditukar bersama dengan port TCP/UDP dan paket akan diteruskan kembali keluar jalur TX.
Statistik paket juga disertakan dengan tanda -s
.
Opsi baris perintah berikut ini didukung.
-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.
Berikut ini contohnya:
./ratelimit -l 0-1 -n 1 -- -q 1 -p 0xff -s
CATATAN - Aplikasi ini mendukung daur ulang LRU melalui fungsi khusus yang saya buat di proyek DPDK Common, check_and_del_lru_from_hash_table()
. Pastikan untuk mendefinisikan USE_HASH_TABLES
sebelum menyertakan file header DPDK Common saat menggunakan fungsi ini.
Ini adalah aplikasi kecil yang mengimplementasikan metode LRU manual untuk tabel hash. Untuk sementara saya telah mencoba membuat tabel LRU berfungsi dari perpustakaan ini. Namun, saya tidak berhasil menginisialisasi tabel.
Oleh karena itu, saya memutuskan untuk tetap menggunakan perpustakaan ini dan mengimplementasikan fungsi LRU saya sendiri. Saya pada dasarnya menggunakan fungsi rte_hash_get_key_with_position()
untuk mengambil kunci terlama yang akan dihapus. Namun, tampaknya entri baru disisipkan pada posisi yang terakhir dihapus sehingga Anda harus terus menambah nilai posisi hingga entri maksimal pada tabel. Oleh karena itu, setelah nilai posisi melebihi entri tabel maksimum, Anda perlu mengaturnya kembali ke 0.
Tidak diperlukan opsi baris perintah, namun parameter EAL masih didukung. Meski begitu, mereka tidak akan membuat perbedaan.
Berikut ini contohnya:
./ratelimit