我现在有点困难,所以我真的需要一些帮助。
我想创建一个 Flask 接口来创建和发送 pcap。创建部分是用 Scapy 完成的,并且工作没有问题。为了发送数据包,我想读取创建的 Pcap 文件并使用 dpdk-pktgen,目标是获得大约 10G。
我的问题是,pktgen 不起作用,我无法理解我做错了什么。
我使用 ubuntu-22.04 在 EVE-NG 中进行了测试设置,我模拟了 Intel-Skylake-Server CPU,机器有 3 个端口,1 个用于管理,2 个用于流量。 我尝试安装最新的 pktgen 和 dpdk 版本,当前为 pktgen:24.05.3 和 dpdk:24.07.0-rc0。但是我在编译 pktgen 时遇到了很多错误。经过多次尝试后,我按照 this 线程的提示切换到 pktgen: 22.04.01 和 dpdk: 22.11.1。 现在我可以编译 pktgen,并且可以使用以下命令启动 pktgen:
sudo ./path/to/pktgen -l 0-1 -- -P -s 0:myfile.pcap
在现在打开的控制台中,我尝试使用“str”,但没有生成流量。
我需要更改什么才能生成流量?是否可以在没有控制台的情况下启动传输,以便只需要一个命令?
由于我不想使用过时版本的 dpdk 和 pktgen,所以我尝试使用最新版本。 在 Ubuntu-22.04 上我只遇到编译错误,所以我切换到 ubuntu-23.10。这修复了我的编译错误,但尽管使用与 ubuntu-22.04 中相同的设置,我还是得到: Pktgen 出现段错误
获得7-8个栈帧
或:
EAL:错误 - 退出代码:1 原因:pktgen_pcap_open:pcap_info_t 结构的 rte_zmalloc_socket() 失败
我使用了完全相同的 Pcap 文件,但我在网上没有找到任何有关此错误的信息。
我也尝试避免 EVE-NG,我想也许仿真可能是个问题。我在我的个人电脑上尝试了 ubuntu-23.10 和 ubuntu-24.04,但遇到了同样的错误。 这可能很重要,我的个人电脑运行的是 AMD-Ryzen 5 5600X。
还值得一提的是:我使用 uio_pci_generic 内核。在 EVE-NG 中,我没有 IOMMU 组,即使在更改 grub 后我仍然没有任何组,因此我无法使用 vfio-pci 内核。我的个人电脑也一样,但我的主板是问题所在,因为它不会拆分我的 IOMMU 组,而且我无法分离我的网卡。
有人可以帮助我实现上述目标吗?是否有其他工具可以轻松读取和发送 pcap 流量并生成大量流量?
我感谢每一个帮助。 真诚的
虽然问题的主要焦点是
pktgen
的问题,但它似乎允许使用一些“其他工具”提供不同的解决方案,因此有以下答案。
在DPDK中,有一个名为pcap的虚拟设备驱动程序。除其他功能外,它还允许人们从 pcap 文件中读取数据包,就像它们刚刚从线路到达一样,它们出现在虚拟设备的 Rx 队列中。使用选项
infinite_rx=1
,可以指示驱动程序连续重复重播。鉴于此,应该可以连接这样的设备,以便它提供要转发到另一设备(例如物理设备)的数据包。作为转发器应用程序,可以使用 l2fwd,这是 DPDK 附带的示例程序,或者,当需要更多控制时,可以使用 test-pmd。
以下是实现此功能的大致工作流程描述:
sudo apt update
sudo apt install git libnuma-dev libpcap-dev meson ninja-build python3-pyelftools
# (one also has to care about dependencies for the physical NIC driver, if any)
git clone https://dpdk.org/git/dpdk
cd ./dpdk
meson -Dexamples=l2fwd build
ninja -C build
# Instead of 0000:02:00.0, one should query the
# actual physical NIC port's PF ID via command
# sudo ./usertools/dpdk-devbind.py --status
# To configure 1G hugepages, one may use command
# sudo ./usertools/dpdk-hugepages.py --setup=1G
# For l2fwd, the command is as follows:
sudo ./build/examples/dpdk-l2fwd --vdev net_pcap0,rx_pcap=/path/to/file.pcap,infinite_rx=1 -a 0000:02:00.0 -- -p 0x3
# For test-pmd, one may launch forwarding either via single command
sudo ./build/app/dpdk-testpmd --vdev net_pcap0,rx_pcap=/path/to/file.pcap,infinite_rx=1 -a 0000:02:00.0 --
# or using the interactive test-pmd prompt, as follows
sudo ./build/app/dpdk-testpmd --vdev net_pcap0,rx_pcap=/path/to/file.pcap,infinite_rx=1 -a 0000:02:00.0 -- -i
# testpmd> set fwd io
# testpmd> start
# testpmd> show port stats all
# testpmd> stop
一旦开始转发,pcap设备将不断“接收”文件中的数据包,并将其转发到物理NIC端口的Tx队列,最终在线上。
如果 pcap 驱动程序抱怨多段数据包,则可能需要首先从设备选项中删除
infinite_rx=1
参数,以确保至少有某些功能可以工作,然后考虑收集具有较小数据包的 pcap 文件,以便数据包总是可以放入单个 mbuf 中。或者,在使用 test-pmd 时,可能需要指定 --mbuf-size=X
选项(after --
分隔符),该选项应该将 mbuf 数据室大小设置为所需的 X
值。
此设置是否可以达到 10G 线速是另一个主题,属于单独的问题。