我是DPDK领域的新生。我从 DPDK 主页给出的示例应用程序开始。我被这个例子困住了——DPDK RX/TX 回调示例应用程序 https://doc.dpdk.org/guides/sample_app_ug/rxtx_callbacks.html。条件是长时间没有流量出现(尚未输出)。我猜原因是我无法将流量发送到 DPDK 端口。
我首先逐步展示我的设置。开头的 nic 信息
然后我拒绝eth2
and eth3
with
sudo ifconfig eth2 down
sudo ifconfig eth3 down
Next, using usertools/dpdk-setup.sh
I build the DPDK source (i686-native-linuxapp-gcc
), insert IGB UIO module, Setup hugepage mapping for non-NUMA systems, bind device to IGB UIO module. This is my device setting and hugepage list:
所有准备工作都已完成。我开始构建示例应用程序。使用以下命令
export RTE_SDK=~/dpdk/dpdk-18.08
export RTE_TARGET=i686-native-linuxapp-gcc
cd examples/rxtx_callbacks/
make
一切正常,输出编译信息:
mininet@mininet-vm:~/dpdk/dpdk-18.08/examples/rxtx_callbacks$ make
CC main.o
LD rxtx_callbacks
INSTALL-APP rxtx_callbacks
INSTALL-MAP rxtx_callbacks.map
然后,我开始使用以下命令运行示例应用程序:
sudo ./build/rxtx_callbacks -l1 -n4
执行日志为:
mininet@mininet-vm:~/dpdk/dpdk-18.08/examples/rxtx_callbacks$ sudo ./build/rxtx_callbacks -l1 -n4
EAL: Detected 2 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Probing VFIO support...
EAL: PCI device 0000:00:08.0 on NUMA socket 0
EAL: probe driver: 8086:100e net_e1000_em
EAL: PCI device 0000:00:09.0 on NUMA socket 0
EAL: probe driver: 8086:100e net_e1000_em
EAL: PCI device 0000:00:0a.0 on NUMA socket 0
EAL: probe driver: 8086:100e net_e1000_em
EAL: PCI device 0000:00:11.0 on NUMA socket 0
EAL: probe driver: 8086:100f net_e1000_em
Port 0 MAC: 08 00 27 9d f9 5a
Port 1 MAC: 08 00 27 7f e8 8a
随着时间的流逝,什么也没有发生。不过我发现执行结果应该是这样的:
root@ubuntu:/home/chang/dpdk/examples/rxtx_callbacks/build# ./rxtx_callbacks -l 1 -n 4
EAL: Detected 8 lcore(s)
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Multi-process socket /var/run/.rte_unix
EAL: Probing VFIO support...
EAL: PCI device 0000:02:01.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:02.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:03.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:04.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 8086:100f net_e1000_em
Port 0 MAC: 00 0c 29 f7 4d 25
Port 1 MAC: 00 0c 29 f7 4d 2f
Core 1 forwarding packets. [Ctrl+C to quit]
Latency = 629 cycles
Latency = 787 cycles
^C
我尝试找到结果,我添加了一个printf
in lcore_main()
函数如下:
for (;;) {
RTE_ETH_FOREACH_DEV(port) {
struct rte_mbuf *bufs[BURST_SIZE];
/* printf("receive a packet\n"); */
const uint16_t nb_rx = rte_eth_rx_burst(port, 0,
bufs, BURST_SIZE);
if (unlikely(nb_rx == 0))
continue;
printf("send a packet\n");
const uint16_t nb_tx = rte_eth_tx_burst(port ^ 1, 0,
bufs, nb_rx);
if (unlikely(nb_tx < nb_rx)) {
uint16_t buf;
for (buf = nb_tx; buf < nb_rx; buf++)
rte_pktmbuf_free(bufs[buf]);
}
}
}
I find 没有收到数据包,因为它应该通过检查---if (unlikely(nb_rx == 0))
。因此,我尝试自己使用提供的 pktgen 发送数据包Linux(不是 DPDK)。然而失败了。我会展示我的踪迹。
#!/bin/sh
modprobe pktgen
function pgset() {
local result
echo $1 > $PGDEV
result=`cat $PGDEV | fgrep "Result: OK:"`
if [ "$result" = "" ]; then
cat $PGDEV | fgrep Result:
fi
}
function pg() {
echo inject > $PGDEV
cat $PGDEV
}
# Config Start Here -----------------------------------------------------------
# thread config
# Each CPU has own thread. Two CPU example. We add eth1.
PGDEV=/proc/net/pktgen/kpktgend_0
echo "Removing all devices"
pgset "rem_device_all"
echo "Adding eth1"
pgset "add_device eth1"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 10000"
# device config
# delay 0 means maximum speed.
CLONE_SKB="clone_skb 1000000"
# NIC adds 4 bytes CRC
PKT_SIZE="pkt_size 60"
# COUNT 0 means forever
#COUNT="count 0"
COUNT="count 10000000"
DELAY="delay 0"
PGDEV=/proc/net/pktgen/eth1
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"
pgset "$DELAY"
pgset "dst 127.0.0.1"
# here! the mac address given by the sample application
pgset "dst_mac 08:00:27:9d:f9:5a"
# Time to run
PGDEV=/proc/net/pktgen/pgctrl
echo "Running... ctrl^C to stop"
pgset "start"
echo "Done"
# Result can be vieved in /proc/net/pktgen/eth1
然而,什么也没发生。可能是向dpdk端口发送数据包的方式错误。由于dpdk端口位于第2层,第3层工具,例如ping
,都是无用的。示例应用程序一直卡住,我很绝望。您能分享一些想法来解决我的问题吗?
最好的祝愿。
EDIT1:
@Amedeo 的回复有效,但是,我只能发送一些数据包(几个数据包不是交通流量) 到 RX/TX 回调应用程序。我尝试过使用pktgen
由...提供Linux,但是界面dtap0
无法接收产生的流量pktgen
。以下是我的实验过程。
首先,所有准备工作与上面相同。但是,我使用以下命令运行示例应用程序
sudo ./build/rxtx_callbacks -l1 -n4 --vdev=net_tap0
而不是
sudo ./build/rxtx_callbacks -l1 -n4
I can see a new nic item in ifconfig
, after running the sample application.
哦,我需要提一下我已经拒绝了eth1
然而,这样eth1
, eth2
, and eth3
供 DPDK 使用。执行输出如下:
EAL: Detected 2 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Probing VFIO support...
EAL: PCI device 0000:00:08.0 on NUMA socket 0
EAL: probe driver: 8086:100e net_e1000_em
EAL: PCI device 0000:00:09.0 on NUMA socket 0
EAL: probe driver: 8086:100e net_e1000_em
EAL: PCI device 0000:00:0a.0 on NUMA socket 0
EAL: probe driver: 8086:100e net_e1000_em
EAL: PCI device 0000:00:11.0 on NUMA socket 0
EAL: probe driver: 8086:100f net_e1000_em
rte_pmd_tap_probe(): Initializing pmd_tap for net_tap0 as dtap0
Port 0 MAC: 08 00 27 93 2b 19
Port 1 MAC: 08 00 27 9d f9 5a
Port 2 MAC: 08 00 27 7f e8 8a
Port 3 MAC: fe 02 cf 5a 23 ee
Core 1 forwarding packets. [Ctrl+C to quit]
The Port 3 with fe 02 cf 5a 23 ee
正是dtap0
nic in ifconfig
。现在我尝试注入流量dtap0
界面。但是,我尝试使用pktgen
由...提供Linux,但仍然失败。
我先给出接口dtap0
IP 地址使用:
sudo dhclient dtap0
and get:
dtap0 Link encap:Ethernet HWaddr fe:02:cf:5a:23:ee
inet addr:10.0.2.16 Bcast:10.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:73 errors:0 dropped:0 overruns:0 frame:0
TX packets:92 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:6651 (6.6 KB) TX bytes:7808 (7.8 KB)
然后,我编写一个 shell 脚本来生成流量负载eth0
to dtap0
(我希望)。这是剧本。
#!/bin/sh
#modprobe pktgen
modprobe pktgen
function pgset() {
local result
echo $1 > $PGDEV
result=`cat $PGDEV | fgrep "Result: OK:"`
if [ "$result" = "" ]; then
cat $PGDEV | fgrep Result:
fi
}
function pg() {
echo inject > $PGDEV
cat $PGDEV
}
# Config Start Here -----------------------------------------------------------
# thread config
# Each CPU has own thread. Two CPU exammple. We add eth1, eth2 respectivly.
PGDEV=/proc/net/pktgen/kpktgend_0
echo "Removing all devices"
pgset "rem_device_all"
echo "Adding eth0"
pgset "add_device eth0"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 10000"
# device config
# delay 0 means maximum speed.
CLONE_SKB="clone_skb 1000000"
# NIC adds 4 bytes CRC
PKT_SIZE="pkt_size 60"
# COUNT 0 means forever
#COUNT="count 0"
COUNT="count 10000000"
DELAY="delay 0"
PGDEV=/proc/net/pktgen/eth0
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"
pgset "$DELAY"
# ip address of interface dtap0
pgset "dst 10.0.2.16"
# the mac address of interface dtap0
pgset "dst_mac fe:02:cf:5a:23:ee"
# Time to run
PGDEV=/proc/net/pktgen/pgctrl
echo "Running... ctrl^C to stop"
pgset "start"
echo "Done"
运行这个脚本,我真的找到了界面eth0
正在生成输出数据包(使用nload
or ifconfig
)。然而,接口dtap0
没有传入流量。我也尝试iperf
发送流量,但是dtap0
既不能处理 TCP 连接,也不能处理 UDP ACK。iperf
and ping
两者均不可用。
感谢您分享对我的问题的任何想法。
EDIT2:
感谢@Amedeo 的分享。我已经弄清楚如何使用pktgen
由...提供Linux将数据包发送到RX/TX Callback
示例应用程序。
一切为了跑步RX/TX Callback
示例应用程序与EDIT1。我将脚本更改为pktgen
如下:
#!/bin/sh
#modprobe pktgen
modprobe pktgen
function pgset() {
local result
echo $1 > $PGDEV
result=`cat $PGDEV | fgrep "Result: OK:"`
if [ "$result" = "" ]; then
cat $PGDEV | fgrep Result:
fi
}
function pg() {
echo inject > $PGDEV
cat $PGDEV
}
# Config Start Here -----------------------------------------------------------
# thread config
# Each CPU has own thread. Two CPU exammple. We add dtap0
PGDEV=/proc/net/pktgen/kpktgend_1
# echo "Removing all devices"
# pgset "rem_device_all"
echo "Adding dtap0"
pgset "add_device dtap0"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 10000"
# device config
# delay 0 means maximum speed.
CLONE_SKB="clone_skb 1000000"
# NIC adds 4 bytes CRC
PKT_SIZE="pkt_size 60"
# COUNT 0 means forever
#COUNT="count 0"
COUNT="count 10000000"
DELAY="delay 0"
PGDEV=/proc/net/pktgen/dtap0
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"
pgset "$DELAY"
# pgset "dst 192.168.211.101"
# whatever mac address
pgset "dst_mac ce:2a:23:42:ce:ff"
# Time to run
PGDEV=/proc/net/pktgen/pgctrl
echo "Running... ctrl^C to stop"
pgset "start"
echo "Done"
我需要做的只是这样从 dtap0 发送数据包! And
dtap0 --- dpdk port --- rxtx_callbacks
一切顺利。