如何使用一个 NIC 设置循环转发以在 DPDK testpmd 中发送数据包并自行接收它们?
How to set a loop forwarding using one NIC to TX packets and RX them itself in DPDK testpmd?
我想实现这样一个场景:
- 在 NIC 的 RXQ 0 中收到一个数据包
- NIC 获取并放入它的 TXQ 0
- 通过某种方式(NIC 的努力?),数据包将被发送到 NIC 的 RXQ 0,并返回到步骤 1。
我觉得正向模式tx_first
是我需要的
网卡:
PMD:MLX5
版本:5.0-1.0.0.0
DPDK版本:20.11.1
完整命令行
./testpmd.sh 0 11-12 1 1 testpmd0 3b:00.0
#testpmd.sh
#if [ $# -ne 6 ]
#then
# echo [=11=]" <socket_id> <core_list> <core_num> <queue_num> <prefix>"
# exit 255
#fi
./build/app/dpdk-testpmd -l -n 4 \
--socket-mem=2048,2048 \
-a ,txq_inline=200,txq_mpw
--file-prefix= \
-- \
-i \
--mbcache=512 \
--txonly-multi-flow \
--rxd=2048 --txd=2048 \
--rxq= --txq= \
--nb-cores= \
--port-topology=loop \
--numa --socket-num= --port-numa-config=0, --ring-numa-config=0,3,
但是在我设置命令行参数 --port-topology=loop
并尝试了 start tx_first
流是:
testpmd> start tx_first
io packet forwarding - ports=1 - cores=1 - streams=1 - NUMA support enabled, MP allocation mode: native
Logical Core 12 (socket 0) forwards packets on 1 streams:
RX P=0/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
我得到了统计数据:
testpmd> show fwd stats all
---------------------- Forward statistics for port 0 ----------------------
RX-packets: 6 RX-dropped: 0 RX-total: 6
TX-packets: 38 TX-dropped: 0 TX-total: 38
----------------------------------------------------------------------------
+++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
RX-packets: 6 RX-dropped: 0 RX-total: 6
TX-packets: 38 TX-dropped: 0 TX-total: 38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#32 same packets like this
restore info: - no tunnel info - no outer header - no miss group
src=04:3F:72:CB:21:46 - dst=02:00:00:00:00:00 - type=0x0800 - length=64 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 L4_UDP - l2_len=14 - l3_len=20 - l4_len=8 - Send queue=0x0
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN PKT_RX_OUTER_L4_CKSUM_UNKNOWN
# discrete but same packets received
testpmd> port 0/queue 0: received 1 packets
restore info: - no tunnel info - no outer header - no miss group
src=F4:74:88:8C:11:86 - dst=01:80:C2:00:00:00 - type=0x0069 - length=119 - nb_segs=1 - hw ptype: L2_ETHER - sw ptype: L2_ETHER - l2_len=14 - Receive queue=0x0
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN PKT_RX_OUTER_L4_CKSUM_UNKNOWN
port 0/queue 0: sent 1 packets
restore info: - no tunnel info - no outer header - no miss group
src=F4:74:88:8C:11:86 - dst=01:80:C2:00:00:00 - type=0x0069 - length=119 - nb_segs=1 - hw ptype: L2_ETHER - sw ptype: L2_ETHER - l2_len=14 - Send queue=0x0
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN PKT_RX_OUTER_L4_CKSUM_UNKNOWN
port 0/queue 0: received 1 packets
restore info: - no tunnel info - no outer header - no miss group
src=F4:74:88:8C:11:86 - dst=01:80:C2:00:00:00 - type=0x0069 - length=119 - nb_segs=1 - hw ptype: L2_ETHER - sw ptype: L2_ETHER - l2_len=14 - Receive queue=0x0
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN PKT_RX_OUTER_L4_CKSUM_UNKNOWN
NIC 没有接收到它发送的 Tx 数据包,为什么?
为了在环回模式下设置 DPDK 应用程序 dpdk-tespmd
,它需要 2 DPDK ports
和 --port-topology=loop
。
但是如果只有 1 个物理 NIC 端口,则有几个选项可以将 DPDK 接口设置为环回模式
- TX 和 RX 交叉连接的物理收发器
- 在
fabric loopback mode
中配置了嵌入式交换机的网卡
- 如果连接到外部开关启用
MAC|PHY loopback
开关。
一旦配置为以上 3 种模式中的任何一种,运行 以下命令
- 设置 eth-peer 0 [所需 DST MAC 地址]
- 设置转发 macswp
- 开始tx_first
在没有物理 NIC 的情况下验证与 ./build/app/testpmd -l 2-3 --vdev=net_tap0,iface=testDpdk0 -- -i --rxq=1 --txq=1
相同的启动 testpmd。设置 RX 数据包的详细程度 set verbose 2
我想实现这样一个场景:
- 在 NIC 的 RXQ 0 中收到一个数据包
- NIC 获取并放入它的 TXQ 0
- 通过某种方式(NIC 的努力?),数据包将被发送到 NIC 的 RXQ 0,并返回到步骤 1。
我觉得正向模式tx_first
是我需要的
网卡: PMD:MLX5 版本:5.0-1.0.0.0
DPDK版本:20.11.1
完整命令行
./testpmd.sh 0 11-12 1 1 testpmd0 3b:00.0
#testpmd.sh
#if [ $# -ne 6 ]
#then
# echo [=11=]" <socket_id> <core_list> <core_num> <queue_num> <prefix>"
# exit 255
#fi
./build/app/dpdk-testpmd -l -n 4 \
--socket-mem=2048,2048 \
-a ,txq_inline=200,txq_mpw
--file-prefix= \
-- \
-i \
--mbcache=512 \
--txonly-multi-flow \
--rxd=2048 --txd=2048 \
--rxq= --txq= \
--nb-cores= \
--port-topology=loop \
--numa --socket-num= --port-numa-config=0, --ring-numa-config=0,3,
但是在我设置命令行参数 --port-topology=loop
并尝试了 start tx_first
流是:
testpmd> start tx_first
io packet forwarding - ports=1 - cores=1 - streams=1 - NUMA support enabled, MP allocation mode: native
Logical Core 12 (socket 0) forwards packets on 1 streams:
RX P=0/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
我得到了统计数据:
testpmd> show fwd stats all
---------------------- Forward statistics for port 0 ----------------------
RX-packets: 6 RX-dropped: 0 RX-total: 6
TX-packets: 38 TX-dropped: 0 TX-total: 38
----------------------------------------------------------------------------
+++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
RX-packets: 6 RX-dropped: 0 RX-total: 6
TX-packets: 38 TX-dropped: 0 TX-total: 38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#32 same packets like this
restore info: - no tunnel info - no outer header - no miss group
src=04:3F:72:CB:21:46 - dst=02:00:00:00:00:00 - type=0x0800 - length=64 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 L4_UDP - l2_len=14 - l3_len=20 - l4_len=8 - Send queue=0x0
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN PKT_RX_OUTER_L4_CKSUM_UNKNOWN
# discrete but same packets received
testpmd> port 0/queue 0: received 1 packets
restore info: - no tunnel info - no outer header - no miss group
src=F4:74:88:8C:11:86 - dst=01:80:C2:00:00:00 - type=0x0069 - length=119 - nb_segs=1 - hw ptype: L2_ETHER - sw ptype: L2_ETHER - l2_len=14 - Receive queue=0x0
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN PKT_RX_OUTER_L4_CKSUM_UNKNOWN
port 0/queue 0: sent 1 packets
restore info: - no tunnel info - no outer header - no miss group
src=F4:74:88:8C:11:86 - dst=01:80:C2:00:00:00 - type=0x0069 - length=119 - nb_segs=1 - hw ptype: L2_ETHER - sw ptype: L2_ETHER - l2_len=14 - Send queue=0x0
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN PKT_RX_OUTER_L4_CKSUM_UNKNOWN
port 0/queue 0: received 1 packets
restore info: - no tunnel info - no outer header - no miss group
src=F4:74:88:8C:11:86 - dst=01:80:C2:00:00:00 - type=0x0069 - length=119 - nb_segs=1 - hw ptype: L2_ETHER - sw ptype: L2_ETHER - l2_len=14 - Receive queue=0x0
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN PKT_RX_OUTER_L4_CKSUM_UNKNOWN
NIC 没有接收到它发送的 Tx 数据包,为什么?
为了在环回模式下设置 DPDK 应用程序 dpdk-tespmd
,它需要 2 DPDK ports
和 --port-topology=loop
。
但是如果只有 1 个物理 NIC 端口,则有几个选项可以将 DPDK 接口设置为环回模式
- TX 和 RX 交叉连接的物理收发器
- 在
fabric loopback mode
中配置了嵌入式交换机的网卡
- 如果连接到外部开关启用
MAC|PHY loopback
开关。
一旦配置为以上 3 种模式中的任何一种,运行 以下命令
- 设置 eth-peer 0 [所需 DST MAC 地址]
- 设置转发 macswp
- 开始tx_first
在没有物理 NIC 的情况下验证与 ./build/app/testpmd -l 2-3 --vdev=net_tap0,iface=testDpdk0 -- -i --rxq=1 --txq=1
相同的启动 testpmd。设置 RX 数据包的详细程度 set verbose 2