三层交换机之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位。

原文地址:https://www.cnblogs.com/justin-y-lin/p/14241816.html