三层交换机之L2
BCM56440芯片支持以下L2特性:
1)Learning - MAC地址学习
2)Station Movement Control - MAC地址漂移
3)L2 Address Aging - MAC地址老化
4)L2 Address Learning Limits - MAC地址学习限制
5)L2 Multicast - 二层组播
6)L2 User Entry - 二层表项
7)My Station
8)L2 Port Bridge
9)Spanning Tree - 分发树
概述
通常情况下,二层学习是根据OVID+SMAC学习L2表项,二层转发是根据OVID+DMAC查表转发,其核心是L2_ENTRY表。二层转发时,当查找到表项时,L2 User Entry提供module ID(芯片ID), port ID, TGID或者VPG等信息。如果没有找到表项,则为DLF(Destination Lookup Failure)报文,在整个VLAN内洪泛,广播报文也在VLAN内洪泛(或者广播)。
Learning
L2_ENTRY表支持基于VLAN的硬件学习。当接收报文的SMAC在VLAN内未知时,如果CML(CPU managed Learning)使能时,则硬件学习OVID+SMAC到L2_ENTRY表项。
CML包含两个4bits的属性值,即CML_FLAG_NEW和CML_FLAG_MOVE,可以配置到每个物理端口或者虚端口。(PORT/LPORT/SOURCE_VP表)
CML_FLAG_NEW控制未知报文的学习动作,CML_FLAG_MOVE控制入端口不匹配L2_ENTRY表项,但是OVID+SMAC匹配场景(即MAC MOVE场景)的学习动作。
BCM.0> dump chg PORT_TAB 0 10 CML_FLAGS_NEW CML_FLAGS_MOVE
PORT.ipipe0[0]: <CML_FLAGS_MOVE=4,>
PORT.ipipe0[1]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
PORT.ipipe0[2]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
PORT.ipipe0[3]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
PORT.ipipe0[4]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
PORT.ipipe0[5]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
PORT.ipipe0[6]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
PORT.ipipe0[7]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
PORT.ipipe0[8]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
PORT.ipipe0[9]: <CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,>
Station Movement Control
如果L2_ENTRY表中已经存在PORT_A+OVID+SMAC表项,此时,从PORT_B学习到PORT_B+OVID+SMAC表项,则称为MAC MOVE事件。此时,如果MAC MOVE使能,则PORT_A+OVID+SMAC表项被PORT_B+OVID+SMAC表项替换;如果MAC MOVE去使能,则PORT_B+OVID+SMAC的报文上送CPU,标记为MAC MOVE报文。还有一种特殊的情况是,如果PORT_A+OVID+SMAC表项的L2_ENTRY.STATIC位置位(即静态MAC),无论MAC MOVE使能还是去使能,PORT_B+OVID+SMAC表项均不能替换PORT_A+OVID+SMAC表项。
博通交换芯片设计了一种基于端口的优先级可配置的Class-Based Station Movement,每个端口的PORT_TAB.CLASS_BASED_SM_ENABLE位控制是否使能MAC MOVE。每个端口可以配置一个优先级(共4个优先级),如果发生MAC MOVE事件时,优先级高的端口产生MAC MOVE事件的报文学习的L2_ENTRY表项覆盖优先级低的端口已学习的表项。如果发生MAC MOVE事件的两个端口优先级相同,则根据CBL_ATTRIBUTE寄存器(4个,对应4个优先级)的ALLOW_MOVE_IN_CLASS域配置决定。
BCM.0> listreg CBL_ATTRIBUTE Register: CBL_ATTRIBUTE(0).ipipe0 general register address 0x0b180602 Flags: array[0-3] Blocks: ipipe0 (1 copy) Description: Class based station movement attribute register, index from PORT_CBL_TABLE Displaying: reset defaults, reset value 0 mask 7 PORT_LEARNING_PRIORITY<2:1> = 0 ALLOW_MOVE_IN_CLASS<0> = 0 BCM.0> getreg CBL_ATTRIBUTE CBL_ATTRIBUTE(0).ipipe0[0xb180602]=1: <PORT_LEARNING_PRIORITY=0, ALLOW_MOVE_IN_CLASS=1> CBL_ATTRIBUTE(1).ipipe0[0xb180603]=0: <PORT_LEARNING_PRIORITY=0, ALLOW_MOVE_IN_CLASS=0> CBL_ATTRIBUTE(2).ipipe0[0xb180604]=0: <PORT_LEARNING_PRIORITY=0, ALLOW_MOVE_IN_CLASS=0> CBL_ATTRIBUTE(3).ipipe0[0xb180605]=0: <PORT_LEARNING_PRIORITY=0, ALLOW_MOVE_IN_CLASS=0>
每个端口的优先级是通过port index的PORT_CBL_TABLE表配置的,包括物理端口和虚端口。物理端口通过(MODID,PORT)索引(PORT_CBL_TABLE.PORT_LEARNING_CLASS),虚端口通过DVP或者SVP端口号索引(PORT_CBL_TABLE.VIRTUAL_PORT_LEARNING_CLASS)。
除物理端口和虚端口外,Trunk组也可以通过TGID索引的TRUNK_CBL_TABLE.PORT_LEARNING_CLASS配置优先级。
上述PORT_LEARNING_CLASS索引到4个CBL_ATTRIBUTE寄存器中的一个,具体优先级由CBL_ATTRIBUTE.PORT_LEARNING_PRIORITY指定。
L2 Multicast
二层组播转发,首先在L2表中查找OVID+DA表项,找到的L2_ENTRY表项中包含一个指向L2MC表的指针(L2MC_PTR),L2MC表项中获取目的端口的位映射表,即组播成员端口列表。
L2MC表包含1024个表项。
每个VLAN可以配置三种PFM(Port Filtering Mode)配置:
VLAN.VLAN_PROFILE_PRT指向VLAN_PROFILE表,VLAN_PROFILE.L2_PFM即该PFM属性。
实际上,所有的组播报文,都是目的MAC为组播MAC地址,但是L2学习的是源MAC,而不是目的MAC。博通SDK针对这种情况,在创建组播组时,在CPU端口添加了一个静态表项,该表项不用做报文转发,仅为快速查找组播组信息。因此,首先l2 show查看CPU端口的组播MAC静态表项,其中的MCast字段表示组播组序号,然后通过multicast show命令查看组播组硬表,Group ID与MCast一一对应,这样可以快速查找到组播组的成员端口。
BCM.0> mcast Usage (MCAST): Usages: For Switch Devices: mcast add MACaddress=<val> Vlanid=<val> Cos=<val> PortBitMap=<val> UntagBitMap=<val> Index=<val> mcast delete MACaddress=<val> Vlanid=<val> mcast join MACaddress=<val> Vlanid=<val> PortBitMap=<val> mcast leave MACaddress=<val> Vlanid=<val> PortBitMap=<val> mcast padd MACaddress=<val> Vlanid=<val> PortBitMap=<val> mcast premove MACaddress=<val> Vlanid=<val> PortBitMap=<val> For Fabric Devices: mcast bitmap max mcast bitmap set Port=<val> PortBitMap=<val> Index=<val> mcast bitmap del Port=<val> PortBitMap=<val> Index=<val> mcast bitmap get Port=<val> Index=<val> BCM.0> mcast add macaddress=01:00:5e:00:00:76 vlanid=102 PortBitmap=0x1ffe0001 BCM.0> l2 show mac=00:0a:88:88:88:01 vlan=4089 GPORT=0x10 modid=0 port=16/xe14 Hit mac=01:00:5e:00:00:76 vlan=102 GPORT=0x0 modid=0 port=0/cpu0 Static CPU MCast=1 mac=00:0a:88:88:88:05 vlan=4089 GPORT=0x8 modid=0 port=8/xe7 Hit BCM.0> multicast show Group 0x1000001 (L2) port cpu0, encap id -1 port xe15, encap id -1 port xe16, encap id -1 port xe17, encap id -1 port xe18, encap id -1 port xe19, encap id -1 port xe20, encap id -1 port xe21, encap id -1 port xe22, encap id -1 port ge0, encap id -1 port ge1, encap id -1 port ge2, encap id -1 port ge3, encap id -1 BCM.0> pbmp 0x1ffe0001 (实测无论pbmp是否添加cpu端口,l2 show时cpu端口均显示) 0x000000000000000000000000000000000000000000000000000000001ffe0001 ==> cpu,ge,xe15-xe22
L2 User Entry
L2_USER_ENTRY一般有128个表项,一般是软件编辑BPDU地址信息,其表项为MAC_DA+VLAN构成,不受硬件老化机制影响。在查表转发时,优先于L2_ENTRY进行查找。
L2 Port Bridge
正常情况下,交换芯片禁止报文从源端口转发出去,但是使能端口PORT_TAB.PORT_BRIDGE位以后,则允许报文从源端口转发出去。
如果Trunk组需要支持Port Bridge特性,则Trunk组所有成员端口需要同时配置PORT_BRIDGE_BMAP表中的对应pbmp位。
L2 Aging
MAC地址老化的机制是:交换芯片内部有个定时器,称为age timer。每次查找L2 TABLE时(包括SMAC查找和DMAC地址查找,可以配置),如果命中,就会设置Hit标志。当老化时间到后,交换芯片把Hit标志清除,当下一个老化时间到后,交换芯片把Hit为0的地址设置为无效。这就是为什么实际地址老化的时间为1~2倍age time的原因。