พื้นที่เก็บข้อมูลขนาดเล็กที่ฉันจะใช้เพื่อจัดเก็บความคืบหน้าและทดสอบโปรแกรมจาก DPDK ซึ่งเป็นไลบรารีเคอร์เนลบายพาสที่มีประโยชน์มากสำหรับการประมวลผลแพ็กเก็ตที่รวดเร็ว
พื้นที่เก็บข้อมูลนี้ใช้โปรเจ็กต์ 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
และ make
เพื่อสร้างไฟล์ต้นฉบับภายในที่เก็บนี้ได้
git clone --recursive https://github.com/gamemann/The-DPDK-Examples.git
cd The-DPDK-Examples/
make
ไฟล์ปฏิบัติการจะถูกสร้างขึ้นภายในไดเร็กทอรี build/
ตามค่าเริ่มต้น
แอปพลิเคชัน DPDK ทั้งหมดในพื้นที่เก็บข้อมูลนี้รองรับพารามิเตอร์ EAL ของ DPDK สิ่งเหล่านี้อาจพบได้ที่นี่
สิ่งนี้มีประโยชน์สำหรับการระบุจำนวน l-core และพอร์ตที่จะกำหนดค่าเป็นต้น
ในแอปพลิเคชัน 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