Un petit référentiel que j'utiliserai pour stocker mes progrès et tester mes programmes du DPDK, une bibliothèque de contournement du noyau très utile pour le traitement rapide des paquets.
Ce référentiel utilise mon projet DPDK Common dans le but de simplifier les choses.
AVERTISSEMENT - J'ajoute encore d'autres exemples au fil du temps et je dois tester de nouvelles fonctionnalités/méthodes.
Si vous souhaitez créer le DPDK en utilisant les options par défaut, ce qui suit devrait fonctionner en supposant que vous disposez des exigences telles que ninja
et meson
.
git clone https://github.com/DPDK/dpdk.git
cd dpdk/
meson build
cd build
ninja
sudo ninja install
sudo ldconfig
Tous les fichiers d'en-tête nécessaires du DPDK seront stockés dans /usr/local/include/
.
Vous pouvez recevoir ninja
et meson
en utilisant ce qui suit.
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
Vous pouvez utiliser git
et make
pour créer les fichiers sources à l'intérieur de ce référentiel.
git clone --recursive https://github.com/gamemann/The-DPDK-Examples.git
cd The-DPDK-Examples/
make
Les exécutables seront construits dans le répertoire build/
par défaut.
Toutes les applications DPDK de ce référentiel prennent en charge les paramètres EAL de DPDK. Ceux-ci peuvent être trouvés ici.
Ceci est utile pour spécifier la quantité de L-cores et de ports à configurer par exemple.
Dans cette application DPDK, tous les paquets arrivant sur le port de destination UDP 8080 seront abandonnés. Sinon, si le type d'en-tête Ethernet du paquet est IPv4 ou VLAN, il échangera les adresses MAC et IP source/destination ainsi que les ports source/destination UDP, puis enverra le paquet sur le chemin TX (transférant essentiellement le paquet d'où il vient) .
En plus des paramètres EAL, les éléments suivants sont disponibles spécifiquement pour cette application.
-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.
Voici un exemple :
./dropudp8080 -l 0-1 -n 1 -- -q 1 -p 0xff -s
Dans cette application DPDK, une simple table de hachage de routage est créée, la clé étant l'adresse IP de destination et la valeur étant l'adresse MAC vers laquelle transférer.
Les routes sont lues à partir du fichier /etc/l3fwd/routes.txt
au format suivant.
<ip address> <mac address in xx:xx:xx:xx:xx:xx>
Ce qui suit est un exemple.
10.50.0.4 ae:21:14:4b:3a:6d
10.50.0.5 d6:45:f3:b1:a4:3d
Lorsqu'un paquet est traité, nous nous assurons qu'il s'agit d'un paquet IPv4 ou VLAN (dans ce cas, nous décalons les données du paquet de quatre octets afin de pouvoir traiter le reste du paquet sans problème). Ensuite, nous effectuons une recherche avec l'adresse IP de destination comme clé sur la table de hachage de route. Si la recherche réussit, l'adresse MAC source est remplacée par l'adresse MAC de destination (les paquets sortiront par le même port qu'ils arrivent puisque nous créons un tampon TX et une file d'attente) et l'adresse MAC de destination est remplacée par l'adresse MAC de l'IP. a été attribué à partir du fichier de routes mentionné ci-dessus. Sinon, le paquet est abandonné et le compteur de paquets abandonnés est incrémenté.
En plus des paramètres EAL, les éléments suivants sont disponibles spécifiquement pour cette application.
-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.
Voici un exemple :
./simple_l3fwd -l 0-1 -n 1 -- -q 1 -p 0xff -s
Dans cette application, si une adresse IP source est égale ou supérieure au nombre de paquets par seconde ou d'octets par seconde spécifié dans la ligne de commande, les paquets sont abandonnés. Sinon, les adresses Ethernet et IP sont échangées avec les ports TCP/UDP et le paquet est renvoyé hors du chemin TX.
Les statistiques des paquets sont également incluses avec l'indicateur -s
.
Les options de ligne de commande suivantes sont prises en charge.
-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.
Voici un exemple :
./ratelimit -l 0-1 -n 1 -- -q 1 -p 0xff -s
REMARQUE - Cette application prend en charge le recyclage LRU via une fonction personnalisée que j'ai créée dans le projet DPDK Common, check_and_del_lru_from_hash_table()
. Assurez-vous de définir USE_HASH_TABLES
avant d'inclure le fichier d'en-tête DPDK Common lors de l'utilisation de cette fonction.
Il s'agit d'une petite application qui implémente une méthode LRU manuelle pour les tables de hachage. Depuis un moment, j'essaie de faire fonctionner les tables LRU à partir de ces bibliothèques. Cependant, je n’ai eu aucun succès pour initialiser la table.
Par conséquent, j’ai décidé de continuer à utiliser ces bibliothèques et d’implémenter ma propre fonctionnalité LRU. J'utilise essentiellement la fonction rte_hash_get_key_with_position()
pour récupérer la clé la plus ancienne à supprimer. Cependant, il semble que la nouvelle entrée soit insérée à la position qui a été supprimée la plus récemment, vous devez donc continuer à incrémenter la valeur de position jusqu'au nombre maximum d'entrées de la table. Cela dit, une fois que la valeur de position dépasse le nombre maximal d'entrées dans le tableau, vous devez la remettre à 0.
Aucune option de ligne de commande n'est nécessaire, mais les paramètres EAL sont toujours pris en charge. Mais ils ne feront aucune différence.
Voici un exemple :
./ratelimit