如何使用netcat为DPDK Skeleton示例提供输入数据包?
解决DPDK Skeleton示例的数据包输入问题
首先明确:DPDK Skeleton示例是直接操作物理/虚拟网口的二层转发程序,它不监听TCP/UDP端口,所以nc localhost 2399这类基于套接字的操作完全无效。下面分两种场景给出可行方案:
场景1:单台机器测试(用虚拟网口模拟)
如果只有一台机器,需要创建DPDK可识别的虚拟网口对来生成流量:
- 加载DPDK兼容的驱动(二选一即可):
# 方案1:用内核自带的vfio-pci sudo modprobe vfio-pci # 方案2:用DPDK编译的igb_uio sudo insmod <你的DPDK编译目录>/build/kmod/igb_uio.ko - 创建虚拟网口对:
sudo ip link add veth0 type veth peer name veth1 sudo ip link set veth0 up sudo ip link set veth1 up - 将其中一个网口绑定到DPDK驱动:
# 查询veth1的PCI总线地址 sudo lshw -class network -businfo | grep veth1 # 假设输出的地址是0000:02:00.0,执行绑定 sudo <你的DPDK目录>/usertools/dpdk-devbind.py --bind=vfio-pci 0000:02:00.0 - 启动Skeleton示例并指定启用该网口:
这里sudo ./dpdk-skeleton -l 1 -n 4 -- -p 0x1-p 0x1表示启用编号为0的DPDK网口(对应刚才绑定的veth1)。 - 在另一个终端发送二层数据包:
用scapy构造并发送(需先安装scapy):
此时Skeleton会收到数据包并完成转发。from scapy.all import * # 替换为Skeleton输出的网口MAC地址 sendp(Ether(dst="XX:XX:XX:XX:XX:XX")/IP()/UDP()/Raw(load="test data"), iface="veth0")
场景2:两台机器物理直连测试
如果有两台机器用网线直接连接:
- 在运行Skeleton的机器上,将物理网口绑定到DPDK驱动:
# 查询物理网口的PCI地址 sudo lshw -class network -businfo | grep Ethernet # 假设地址是0000:01:00.0,执行绑定 sudo ./dpdk-devbind.py --bind=vfio-pci 0000:01:00.0 - 启动Skeleton示例并启用该网口:
sudo ./dpdk-skeleton -l 1 -n 4 -- -p 0x1 - 在另一台机器上发送二层数据包:
同样用scapy构造发送,目标MAC填Skeleton输出的网口MAC,发送网口选直连的物理网口:
也可以用from scapy.all import * sendp(Ether(dst="XX:XX:XX:XX:XX:XX")/IP()/UDP()/Raw(load="test data"), iface="<本机直连网口名>")tcpreplay加载现成的pcap包发送:sudo tcpreplay -i <本机直连网口名> test.pcap
关键注意事项
- Skeleton只做二层以太网帧的转发,不处理IP/TCP/UDP的套接字逻辑,所有基于localhost端口的操作都不适用。
- 必须确保网口已正确绑定到DPDK兼容驱动,否则示例无法识别并使用该网口。
- 发送的数据包目标MAC必须匹配Skeleton输出的网口MAC,否则网口会直接丢弃数据包。
内容的提问来源于stack exchange,提问作者intrigued_66
相关产品推荐
相关产品推荐

