首页 > 其他分享 >dpdk入门实践6——L2fwd二层通信和l3fwd三层通信

dpdk入门实践6——L2fwd二层通信和l3fwd三层通信

时间:2023-01-13 10:47:28浏览次数:47  
标签:hash -- 端口 通信 L2fwd LPM IPv4 l3fwd

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网卡

我加载了两张网卡,该例子的文档中提到加载虚拟网卡modprobe ixgbe max_vfs=2,2这里我理解需要是支持sr-iov的智能网卡,否则不能加载出虚拟网卡来。

关于数据包流转流程

数据包以MAX_PKT_BURST大小的突发形式读取。rte_eth_rx_burst()函数将mbuf指针写入本地表,并返回表中可用mbuf的数量。然后,表中的每个mbuf都由l2fwd_simple_forward()函数进行处理。这个处理过程非常简单:从RX端口处理TX端口,如果启用了MAC地址更新,则替换源地址和目标MAC地址。例如,如果启用了前四个端口(端口掩码0xf),端口1和2相互转发,端口3和4相互转发。此外,如果启用了MAC地址更新,则MAC地址将受到如下影响:源MAC地址将被TX_PORTMAC地址替换,目标MAC地址将被替换为:

  1. 源MAC地址改为TX_PORT MAC地址
  2. 将目标MAC地址更改为02:00:00:00:00:00:TX_PORT_ID

l3fwd Sample

l3fwd和l2fwd类似,不同的是l2fwd例子里的转发决策依赖从input包读取到的信息。而l3fwd的转发决策依赖于转发表:hash-based 或者 LPM-based,默认使用LPM方法. 散希查找键由DiffServ5元组表示,该元组由从输入包读取的以下字段组成:源IP地址、目标IP地址、协议、源端口和目标端口。从已标识的流程表条目中读取输入数据包的输出接口的ID。应用程序使用的流组被静态配置,并在初始化时加载到散列中。当所选的查找方法是基于LPM的时,将使用一个LPM对象来模拟IPv4数据包的转发阶段。LPM对象被用作路由表,以便在运行时标识每个输入数据包的下一跳。LPM查找密钥由从输入数据包读取的目标IP地址字段表示。输入数据包的输出接口的ID是LPM查找返回的下一个跳点。应用程序使用的LPM规则集被静态配置,并在初始化时加载到LPM对象中.

在这个例子里,定义了l3fwd_lkp_mode类型,它的成员是函数指针。这里该类型有两个变量l3fwd_em_lkp和l3fwd_lpm_lkp,它们分别对应hash方法和LPM方法,可以看出这个例子使用面向过程的语言模拟了面向对象的多态,如果是相同的对象而实现方法不同可以参考这种方法来做。

运行

./build/l3fwd -l 1,2 -n 4 -- -p 0x3 --config="(0,0,1),(1,0,2)"
或者
./build/l3fwd  -l 1,2 -n 4 -- -p 0x3 --config="(0,0,1),(1,0,2)" --parse-ptype --eth-dest=0,30:fd:65:32:f0:6f --eth-dest=1,30:fd:65:32:f0:72  //这种可以防止把目的地址修改为02:00:00:00:00:01填充包

其中,
--config (port,queue,lcore)[,(port,queue,lcore)]: Determines which queues from which ports are mapped to which cores.上面的例子就是映射从port 0 来的 queue 0到 lcore 1;映射从port 1来的queue 0 到 lcore 2.
程序一开始使用函数setup_l3fwd_lookup_tables()建立转发查找表,根据用户配置来判断是使用hash还是LPM方法。它们都对应一系列回调函数:setup、check_ptype、cb_parse_ptype、main_loop、get_ipv4_lookup_struct 和get_ipv6_lookup_struct
该例子中,l3fwd_em打头的文件都是hash方法的,l3fwd_lpm打头的文件都是LPM方法的。

转发表的建立

hash方法转发表

代码中hash表如下:

static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = {
	{{IPv4(101, 0, 0, 0), IPv4(100, 10, 0, 1),  101, 11, IPPROTO_TCP}, 0},
	{{IPv4(201, 0, 0, 0), IPv4(200, 20, 0, 1),  102, 12, IPPROTO_TCP}, 1},
	{{IPv4(111, 0, 0, 0), IPv4(100, 30, 0, 1),  101, 11, IPPROTO_TCP}, 2},
	{{IPv4(211, 0, 0, 0), IPv4(200, 40, 0, 1),  102, 12, IPPROTO_TCP}, 3},
};

首先,使用setup_hash()函数建立hash表。建立过程是用上面数组中的每一条信息分别是五元组(srcip、dstip、srcport、dstport、protocal)和出口interface,使用这条信息作为key插入到hash表中。使用函数rte_hash_add_key()插入hash表,如果成功返回一个正值,然后再使用该值作为数组ipv4_l3fwd_out_if的偏移量存储if_out值用于查找该五元组对应的if_out.当数据包进来时,获取数据报头的五元组,利用这个五元组来到hash表中查找hash值。使用函数rte_hash_lookup()查找hash值,正常返回一个正值,然后利用该正值作为数组ipv4_l3fwd_out_if的偏移量找到对应的if_out.这个查找过程就是函数em_get_ipv4_dst_port()表达的过程。

LPM方法转发表

static struct ipv4_l3fwd_lpm_route ipv4_l3fwd_lpm_route_array[] = {
	{IPv4(1, 1, 1, 0), 24, 0},
	{IPv4(2, 1, 1, 0), 24, 1},
	{IPv4(3, 1, 1, 0), 24, 2},
	{IPv4(4, 1, 1, 0), 24, 3},
	{IPv4(5, 1, 1, 0), 24, 4},
	{IPv4(6, 1, 1, 0), 24, 5},
	{IPv4(7, 1, 1, 0), 24, 6},
	{IPv4(8, 1, 1, 0), 24, 7},
};

和hash方法一样,先要建立查询表,这里使用setup_lpm()函数建立LPM表。源数据如上所示,每条数据时ip地址、掩码、if_out. 这里直接使用函数rte_lpm_add()添加转发数据,当数据包到来时使用函数rte_lpm_lookup()利用数据包中的目的地址来索引找到出口端口号.

问题

程序运行都没有提示错误,那么怎么判定通没通呢?

标签:hash,--,端口,通信,L2fwd,LPM,IPv4,l3fwd
From: https://www.cnblogs.com/janeysj/p/15213337.html

相关文章