Ein kleines Repository, das ich zum Speichern meiner Fortschritts- und Testprogramme aus dem DPDK verwenden werde, einer Kernel-Bypass-Bibliothek, die für die schnelle Paketverarbeitung sehr nützlich ist.
Dieses Repository verwendet mein DPDK Common-Projekt, um die Dinge einfacher zu machen.
ACHTUNG – Ich füge im Laufe der Zeit immer noch weitere Beispiele hinzu und muss neue Funktionen/Methoden testen.
Wenn Sie das DPDK mit Standardoptionen erstellen möchten, sollte Folgendes funktionieren, vorausgesetzt, Sie verfügen über die Anforderungen wie ninja
und meson
.
git clone https://github.com/DPDK/dpdk.git
cd dpdk/
meson build
cd build
ninja
sudo ninja install
sudo ldconfig
Alle benötigten Header-Dateien vom DPDK werden in /usr/local/include/
gespeichert.
Sie können ninja
und meson
wie folgt erhalten.
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
Sie können git
und make
verwenden, um die Quelldateien in diesem Repository zu erstellen.
git clone --recursive https://github.com/gamemann/The-DPDK-Examples.git
cd The-DPDK-Examples/
make
Ausführbare Dateien werden standardmäßig im Verzeichnis build/
erstellt.
Alle DPDK-Anwendungen in diesem Repository unterstützen die EAL-Parameter von DPDK. Diese finden Sie hier.
Dies ist beispielsweise nützlich, um die Anzahl der zu konfigurierenden L-Cores und Ports anzugeben.
In dieser DPDK-Anwendung werden alle Pakete, die am UDP-Zielport 8080 ankommen, verworfen. Andernfalls, wenn der Ethernet-Header-Typ des Pakets IPv4 oder VLAN ist, werden die Quell-/Ziel-MAC- und IP-Adressen zusammen mit den UDP-Quell-/Ziel-Ports ausgetauscht und das Paket dann über den TX-Pfad gesendet (im Grunde wird das Paket von dort weitergeleitet, wo es kam). .
Zusätzlich zu den EAL-Parametern stehen speziell für diese Anwendung die folgenden zur Verfügung.
-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.
Hier ist ein Beispiel:
./dropudp8080 -l 0-1 -n 1 -- -q 1 -p 0xff -s
In dieser DPDK-Anwendung wird eine einfache Routing-Hash-Tabelle erstellt, wobei der Schlüssel die Ziel-IP-Adresse und der Wert die MAC-Adresse für die Weiterleitung ist.
Routen werden aus der Datei /etc/l3fwd/routes.txt
im folgenden Format gelesen.
<ip address> <mac address in xx:xx:xx:xx:xx:xx>
Das Folgende ist ein Beispiel.
10.50.0.4 ae:21:14:4b:3a:6d
10.50.0.5 d6:45:f3:b1:a4:3d
Wenn ein Paket verarbeitet wird, stellen wir sicher, dass es sich um ein IPv4- oder VLAN-Paket handelt (in diesem Fall versetzen wir die Paketdaten um vier Bytes, damit wir den Rest des Pakets ohne Probleme verarbeiten können). Anschließend führen wir eine Suche durch, wobei die Ziel-IP der Schlüssel in der Routen-Hash-Tabelle ist. Wenn die Suche erfolgreich ist, wird die Quell-MAC-Adresse durch die Ziel-MAC-Adresse ersetzt (Pakete werden über denselben Port gesendet, an dem sie ankommen, da wir einen TX-Puffer und eine Warteschlange erstellen) und die Ziel-MAC-Adresse wird durch die MAC-Adresse der IP ersetzt wurde aus der oben genannten Routendatei zugewiesen. Andernfalls wird das Paket verworfen und der Zähler für verworfene Pakete wird erhöht.
Zusätzlich zu den EAL-Parametern stehen speziell für diese Anwendung die folgenden zur Verfügung.
-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.
Hier ist ein Beispiel:
./simple_l3fwd -l 0-1 -n 1 -- -q 1 -p 0xff -s
Wenn in dieser Anwendung eine Quell-IP die in der Befehlszeile angegebenen Pakete pro Sekunde oder Bytes pro Sekunde erreicht oder überschreitet, werden die Pakete verworfen. Andernfalls werden die Ethernet- und IP-Adressen zusammen mit den TCP/UDP-Ports ausgetauscht und das Paket wird über den TX-Pfad zurückgeleitet.
Paketstatistiken sind auch im Flag -s
enthalten.
Die folgenden Befehlszeilenoptionen werden unterstützt.
-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.
Hier ist ein Beispiel:
./ratelimit -l 0-1 -n 1 -- -q 1 -p 0xff -s
HINWEIS – Diese Anwendung unterstützt LRU-Recycling über eine benutzerdefinierte Funktion, die ich im DPDK Common-Projekt erstellt habe, check_and_del_lru_from_hash_table()
. Stellen Sie sicher, dass Sie USE_HASH_TABLES
definieren, bevor Sie die DPDK Common-Header-Datei einschließen, wenn Sie diese Funktion verwenden.
Dies ist eine kleine Anwendung, die eine manuelle LRU-Methode für Hash-Tabellen implementiert. Seit einiger Zeit versuche ich, LRU-Tabellen aus diesen Bibliotheken zum Laufen zu bringen. Es gelang mir jedoch nicht, die Tabelle tatsächlich zu initialisieren.
Daher habe ich beschlossen, stattdessen weiterhin diese Bibliotheken zu verwenden und meine eigene LRU-Funktionalität zu implementieren. Grundsätzlich verwende ich die Funktion rte_hash_get_key_with_position()
um den ältesten zu löschenden Schlüssel abzurufen. Es scheint jedoch, dass der neue Eintrag an der Position eingefügt wird, die zuletzt gelöscht wurde, sodass Sie den Positionswert weiter erhöhen müssen, bis die maximale Anzahl an Einträgen in der Tabelle erreicht ist. Sobald der Positionswert jedoch die maximalen Tabelleneinträge überschreitet, müssen Sie ihn auf 0 zurücksetzen.
Es sind keine Befehlszeilenoptionen erforderlich, EAL-Parameter werden jedoch weiterhin unterstützt. Allerdings werden sie keinen Unterschied machen.
Hier ist ein Beispiel:
./ratelimit