빠른 패킷 처리에 매우 유용한 커널 우회 라이브러리인 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 애플리케이션은 DPDK의 EAL 매개변수를 지원합니다. 이러한 내용은 여기에서 찾을 수 있습니다.
이는 예를 들어 구성할 l-코어 및 포트의 양을 지정하는 데 유용합니다.
이 DPDK 애플리케이션에서는 UDP 대상 포트 8080에 도착하는 모든 패킷이 삭제됩니다. 그렇지 않고 패킷의 이더넷 헤더 유형이 IPv4 또는 VLAN인 경우 UDP 소스/대상 포트와 함께 소스/대상 MAC 및 IP 주소를 교환한 다음 패킷을 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 패킷인지 확인합니다(이 경우 문제 없이 패킷의 나머지 부분을 처리할 수 있도록 패킷 데이터를 4바이트로 오프셋합니다). 그런 다음 경로 해시 테이블의 키가 대상 IP로 조회를 수행합니다. 조회가 성공하면 소스 MAC 주소가 대상 MAC 주소로 대체되고(TX 버퍼 및 대기열을 생성한 이후 패킷은 도착하는 것과 동일한 포트로 나가게 됩니다) 대상 MAC 주소는 IP의 MAC 주소로 대체됩니다. 위에서 언급한 경로 파일에서 할당되었습니다. 그렇지 않으면 패킷이 삭제되고 패킷 삭제 카운터가 증가됩니다.
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
참고 - 이 애플리케이션은 DPDK 공통 프로젝트에서 만든 사용자 정의 함수인 check_and_del_lru_from_hash_table()
을 통해 LRU 재활용을 지원합니다. 이 함수를 사용할 때 DPDK 공통 헤더 파일을 포함하기 전에 USE_HASH_TABLES
정의해야 합니다.
이것은 해시 테이블에 대한 수동 LRU 방법을 구현하는 작은 애플리케이션입니다. 한동안 나는 LRU 테이블이 이 라이브러리에서 작동하도록 노력해 왔습니다. 그러나 실제로 테이블을 초기화하는 데는 성공하지 못했습니다.
따라서 나는 대신 이 라이브러리를 계속 사용하고 나만의 LRU 기능을 구현하기로 결정했습니다. 기본적으로 rte_hash_get_key_with_position()
함수를 사용하여 삭제할 가장 오래된 키를 검색합니다. 그러나 가장 최근에 삭제된 위치에 새 항목이 삽입되는 것으로 나타나므로 테이블의 최대 항목까지 위치 값을 계속 증가시켜야 합니다. 즉, 위치 값이 최대 테이블 항목을 초과하면 다시 0으로 설정해야 합니다.
명령줄 옵션은 필요하지 않지만 EAL 매개변수는 계속 지원됩니다. 하지만 그들은 차이를 만들지 않을 것입니다.
예는 다음과 같습니다.
./ratelimit