在前面文章《learning vnet:L2 vSwitch》介绍过MAC 学习的过程,本文来学习一下mac地址老化机制及mac地址表学习最大规格。交换机的MAC地址老化机制是为了维护MAC地址表的有效性和防止MAC资源表浪费而设计的。在交换机的正常工作中,会不断监控各个网口传输的数据帧并学习源MAC地址及其对应的网口信息。当交换机在某网口接收到一个数据帧时,会将其源MAC地址添加到MAC地址表中,或者更新已存在的MAC地址条目。
上文中我们创建了BD域及两个tap接口,我们继续在此基础上学习mac地址老化机制。可以通过命令行 show bridge-domain 1 查询BD域中mac老化状态设置及当前BD域最大学习mac数量。
dpdk-vpp源码分析: show bridge-domain 1 detail
BD-ID Index BSN Age(min) Learning U-Forwrd UU-Flood Flooding ARP-Term arp-ufwd Learn-co Learn-li BVI-Intf
1 1 0 off on on flood on off off 2 16777216 N/A
在默认情况下mac地址老化机制是关闭,单个BD域MAC地址表最大学习数量规格(learn-li 的大小)是16777216 = 256*1024*64。默认情况下等于全局mac地址表最大数量。通过show l2fib all命令行可查询mac地址表存储最大规格及全局最大mac 地址存储规格的限制。
dpdk-vpp源码分析: show l2fib all
Mac-Address BD-Idx If-Idx BSN-ISN Age(min) static filter bvi Interface-Name
02:fe:77:ee:1a:87 1 2 0/1 - - - - tap2
02:fe:7f:e2:47:d1 1 1 0/1 - - - - tap1
L2FIB total/learned entries: 2/2 Last scan time: 0.0000e0sec Learn limit: 16777216
全局MAC地址学习数量限制需在vpp启动配置文件startup.conf中设置,为了验证mac限制是否生效,如下我们设置最大极限是2。
l2learn {
limit 2
}
设置完成之后,重新启动vpp进程,查询l2fib表资源,最大mac地址表规格已经修改为2。
上图中很明显存在问题的,单个BD中mac地址数量限制大小未修改,还是默认大小。我们尝试验证一下,是否会影响mac地址学习数量。我们在vpp中创建一个tap3接口,触发mac地址学习,当前已经学习到2个mac地址,达到极限,我们在命名空间PC1中ping 192.168.1.3看一下是否可以学习到到tap3的mac地址。
上图很明显无法学习到tap3接口的mac地址。但是可以ping通,我们抓取了其trace流程,发现其走了未知单播泛洪。如下:
00:17:22:806876: virtio-input
virtio: hw_if_index 1 next-index 4 vring 0 len 98
hdr: flags 0x00 gso_type 0x00 hdr_len 0 gso_size 0 csum_start 0 csum_offset 0 num_buffers 1
00:17:22:806888: ethernet-input
frame: flags 0x1, hw-if-index 1, sw-if-index 1
IP4: 02:fe:61:00:50:e7 -> 02:fe:3d:14:e4:6e
00:17:22:806901: l2-input
l2-input: sw_if_index 1 dst 02:fe:3d:14:e4:6e src 02:fe:61:00:50:e7 [l2-learn l2-fwd l2-flood l2-flood ]
00:17:22:806905: l2-learn
l2-learn: sw_if_index 1 dst 02:fe:3d:14:e4:6e src 02:fe:61:00:50:e7 bd_index 1
00:17:22:806910: l2-fwd
l2-fwd: sw_if_index 1 dst 02:fe:3d:14:e4:6e src 02:fe:61:00:50:e7 bd_index 1 result [0xffffffffffffffff, -1] static age-not bvi filter learn-event learn-move
00:17:22:806914: l2-flood
l2-flood: sw_if_index 1 dst 02:fe:3d:14:e4:6e src 02:fe:61:00:50:e7 bd_index 1
l2-flood: sw_if_index 1 dst 02:fe:3d:14:e4:6e src 02:fe:61:00:50:e7 bd_index 1
00:17:22:806923: l2-output
l2-output: sw_if_index 3 dst 02:fe:3d:14:e4:6e src 02:fe:61:00:50:e7 data 08 00 45 00 00 54 f7 f9 40 00 40 01
l2-output: sw_if_index 2 dst 02:fe:3d:14:e4:6e src 02:fe:61:00:50:e7 data 08 00 45 00 00 54 f7 f9 40 00 40 01
00:17:22:806928: tap3-output
tap3 flags 0x00180005
IP4: 02:fe:61:00:50:e7 -> 02:fe:3d:14:e4:6e
ICMP: 192.168.1.1 -> 192.168.1.3
tos 0x00, ttl 64, length 84, checksum 0xbf5a dscp CS0 ecn NON_ECN
fragment id 0xf7f9, flags DONT_FRAGMENT
ICMP echo_request checksum 0xcf5 id 33417
00:17:22:806933: tap2-output
tap2 flags 0x00180005
IP4: 02:fe:61:00:50:e7 -> 02:fe:3d:14:e4:6e
ICMP: 192.168.1.1 -> 192.168.1.3
tos 0x00, ttl 64, length 84, checksum 0xbf5a dscp CS0 ecn NON_ECN
fragment id 0xf7f9, flags DONT_FRAGMENT
ICMP echo_request checksum 0xcf5 id 33417
00:17:22:806936: tap3-tx
buffer 0x9e47a: current data 0, length 98, buffer-pool 0, ref-count 1, trace handle 0x0
l2-hdr-offset 0 l3-hdr-offset 14
hdr-sz 0 l2-hdr-offset 0 l3-hdr-offset 14 l4-hdr-offset 0 l4-hdr-sz 0
IP4: 02:fe:61:00:50:e7 -> 02:fe:3d:14:e4:6e
ICMP: 192.168.1.1 -> 192.168.1.3
tos 0x00, ttl 64, length 84, checksum 0xbf5a dscp CS0 ecn NON_ECN
fragment id 0xf7f9, flags DONT_FRAGMENT
ICMP echo_request checksum 0xcf5 id 33417
00:17:22:806954: tap2-tx
buffer 0x9b0ae: current data 0, length 98, buffer-pool 0, ref-count 1, trace handle 0x0
l2-hdr-offset 0 l3-hdr-offset 14
hdr-sz 0 l2-hdr-offset 0 l3-hdr-offset 14 l4-hdr-offset 0 l4-hdr-sz 0
IP4: 02:fe:61:00:50:e7 -> 02:fe:3d:14:e4:6e
ICMP: 192.168.1.1 -> 192.168.1.3
tos 0x00, ttl 64, length 84, checksum 0xbf5a dscp CS0 ecn NON_ECN
fragment id 0xf7f9, flags DONT_FRAGMENT
ICMP echo_request checksum 0xcf5 id 33417
接下来我们设置全局mac地址表数量为500,设置BD域mac地址表数量为2,再此验证一下是否可以学习tap3接口的mac地址。
我们通过命令行set bridge-domain learn-limit 设置BD域的mac地址学习数量已经修改为2。
pdk-vpp源码分析: set bridge-domain learn-limit 1 2
dpdk-vpp源码分析: show bridge-domain 1
BD-ID Index BSN Age(min) Learning U-Forwrd UU-Flood Flooding ARP-Term arp-ufwd Learn-co Learn-li BVI-Intf
1 1 0 off on on flood on off off 3 2 N/A
接下来我们验证是否可以限制最大学习数量,再次执行ping 192.168.1.3,无法学习到tap3接口的mac地址的。确实是生效的。
接下来学习一下老化时间的设置, set bridge-domain mac-age 1 2 设置BD 1的MAC地址老化时间为2分钟的。等待3分钟之后,查询mac表是否老化了。
总结一下,MAC地址表老化处理函数默认是1分钟检测一次,在检测期间会更新L2fib表的老化时间,检测大于2分钟时,此mac地址表就会被删除掉。当有流量时,mac地址表老化时间会更新为0。重新计算老化周期。
总结一下,本文介绍了mac地址老化时间如何设置及mac地址学习最大数量限制的配置,并通过实际环境中验证了相应功能。希望本文对你了解L2交换有所帮助。后面我们将继续学习bd域其他功能。
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!