前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >learning vnet:L2 vSwitch mac地址老化及mac地址表最大规格(2)

learning vnet:L2 vSwitch mac地址老化及mac地址表最大规格(2)

作者头像
dpdk-vpp源码解读
发布2024-04-28 14:58:02
960
发布2024-04-28 14:58:02
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

在前面文章《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数量。

代码语言:javascript
复制
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 地址存储规格的限制。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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流程,发现其走了未知单播泛洪。如下:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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域其他功能。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-26,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com