DPDK从网卡直接取数据到用户空间,需要有数据转发的规则才能通信。也就是说需要用户实现相关通信网络协议实现相关数据包的转发(有些协议栈不转发ICMP报文那就Ping不通),例如腾讯的fstack,爱奇艺的DPVS等。这里仅以简单的2层和3层通信实例。
l2fwd Sample
运行
./build/l2fwd -l 0-3 -n 4 -- -q 8 -p 0x03
或者
./build/l2fwd -cf -- -p 0x03 --no-mac-updating //不启动MAC地址更新
其中
- l是使用的核,n是Number of memory channels,不知道是个啥,好像填几都可以,看不出差别。
- --前面的参数是dpdk程序通用参数,后面的是该程序专用参数,其中
- q是number of queue (=ports) per lcore (default is 1),这里我理解为一个lcore来轮询几个端口。应该不是端口数量,因为我的环境是绑定了两个网卡,我填到15都可以,到16就不行了,因为代码里规定了最大值。
- p是PORTMASK: hexadecimal bitmask of ports to configure,这里我理解为配置的端口的16进制掩码,例如我使用了两张网卡,所以这里是0x03.如果我填0xffff就不行,程序会报错并给你个参考数值
关于处理队列
对于每个端口来说,只有一个RX队列(only one lcore is able to poll a given port). TX队列数量基于可用的lcores. 可以使用rte_eth_dev_configure() 函数来配置每个端口的队列数。该应用程序使用一个lcore来轮询一个或多个端口,这取决于-q选项,它指定每个lcore的队列数。例如,如果用户指定了-q4,则应用程序能够用一个lcore轮询四个端口。如果目标上有16个端口(如果端口掩码参数是-pffff),则应用程序将需要4个lcore来轮询所有端口。
每个lcore都应该能够在任何端口上传输。对于每个端口,都将初始化单个TX队列。
关于加载虚拟sriov网卡