Небольшой репозиторий, который я буду использовать для хранения своих успехов и тестовых программ из 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-ядер и портов для настройки.
В этом приложении DPDK любые пакеты, поступающие на порт назначения UDP 8080, будут отброшены. В противном случае, если тип заголовка Ethernet пакета — 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-адрес равен или превышает количество пакетов в секунду или байт в секунду, указанное в командной строке, пакеты отбрасываются. В противном случае адреса Ethernet и IP меняются местами вместе с портами TCP/UDP, и пакет пересылается обратно по пути передачи.
Статистика пакетов также включается с флагом -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 при использовании этой функции.
Это небольшое приложение, реализующее ручной метод LRU для хеш-таблиц. Некоторое время я пытался заставить таблицы LRU работать из этих библиотек. Однако мне не удалось инициализировать таблицу.
Поэтому я решил вместо этого продолжать использовать эти библиотеки и реализовать свою собственную функциональность LRU. В основном я использую функцию rte_hash_get_key_with_position()
для получения самого старого ключа для удаления. Однако похоже, что новая запись вставляется в позицию, которая была удалена в последний раз, поэтому вам придется продолжать увеличивать значение позиции до максимального количества записей в таблице. С учетом вышесказанного, как только значение позиции превысит максимальное количество записей в таблице, вам необходимо установить его обратно на 0.
Никакие параметры командной строки не требуются, но параметры EAL по-прежнему поддерживаются. Хотя они не будут иметь никакого значения.
Вот пример:
./ratelimit