1.三层组播芯片原理
IPv4 组播地址与单播地址的区分是通过地址的前 4 位来辨别的。值 0xE 确定了一个地址为组播地址;任何其他值被认为是一个单播地址。
IPMC使能开关:
PORT.V4IPMC_ENABL IPV4 的 IPMC 使能位
PORT.V6IPMC_ENABLE IPV6 的 IPMC 使能位
VLAN_PROFILE.IPMCV4_ENABLE IPV4 的 IPMC 使能位
VLAN_PROFILE.IPMCV6_ENABLE IPV6 的 IPMC 使能位
如果要开启IPMC,上面PORT表和VLAN_PROFILE表都需要设置
IPMC 数据包转发有三种模式:
1)基于(SGV,*GV)进行 L3 转发:依据(S,G,V)或者(*,G,V)在 L3 表和 IPMC 表中查找进行 IPMC 数据包的转发。
2)基于 MACDA 进行 L2 转发:依据(MACDA,VLAN)在 L2 表和 L2MC 表中进行查找进行 IPMC 数据包的转发。这种转发是当 IPMC 在 L3_ENTRY 表中查找失败时才发生。此种转发是基于L2MC 表(PFM=2)的位图和VLAN表(PFM=0)进行转发的。
3)基于(SGV,*GV)进行 L2 转发:因为不支持 IPMC,IPMC 数据包基于(S,G,V)或
者(*,G,V)在 L3 表和 IPMC 表中查找只在 IPMC 组的 L2 成员内进行转发。这一选择 可 以 通 过PORT表和 VLAN PROFILE 表 中 的 IPMCv4_L2_ENABLE 和 IPMCV6_L2_ENABLE 使能。在此模式下,RPF 检查,IP 头选择检查和 TTL 检查不被支持。
2.三层组播复制原理
1) 从二层上看是否DMAC[40]==1 ,成立则为组播数据包,再分析PORT表和VLAN PROFILE表里的IPMC_EN==1&DA==01:00:5E:X 成立的话就进行三层的组播数据处理。组播数据报文根据{S,G,V}或{*,G,V}查找 L3 表;
2) 当查找到 L3 表中匹配的组播表项时,从中获得索引 IPMC_INDEX, IPMC_INDEX 同时索引 L3_IPMC 表和 REPL_GROUP 表以及 EGR_IPMC 表;
3) IPMC_INDEX 索引到 L3_IPMC 表中对应的表项后,从表项中的 L2_BITMAP获取组播交换的出端口位图,L3_BITMAP 获取组播路由的出端口位图;
4) IPMC_INDEX 索引到 REPL_GROUP 表中对应的表项和REPL_HEAD表,决定组播报文需要复制到三层接口列表的物理端口指针;
5) 由 REPL_HEAD表的端口指针索引到相应的 IPMC_VLAN 表项,用来提供组播路由报文需要进行复制到这个物理端口的三层出接口列表;
6) 根据 EGR_IPMC_CFG2 的设置,进行组播报文的源地址复制,TTL 减操作和 TAG 标记操作。
3.调试过程
BCM.0> ipmc init
BCM.0> ipmc config enable=1
BCM.0> sc l3egressmode=1
BCM.0> sc IpmcReplicationSharing=1
BCM.0> sc IpmcSameVlanL3Route =1
BCM.0> l3 intf add mac=00:00:4f:ff:00:56 vlan=1 intf=1
BCM.0> multicast create type=l3
group id 0x2000001BCM.0> vlan MulticastFlood 1 2
BCM.0> vlan show
vlan 1 ports ge,xe (0x00000000000000000000000000000000000000000000000003fffffffffffffe), untagged ge,xe (0x00000000000000000000000000000000000000000000000003fffffffffffffe) MCAST_FLOOD_UNKNOWN
BCM.0> vlan remove 1 pbm=cpu,ge2
ge1发包,ge0收包,两个端口都在vlan 1内,走三层组播路由转发
查看相应的表项
BCM.0> ipmc table show
SRC IP ADDRESS MC IP ADDRESS VLAN MOD PORT V COS TS GROUP VRF
CLASS HIT
20.1.1.2 239.1.1.1 1 -1 -1 1 -1 0 0x2000001 0
0 y
BCM.0> d chg l3_entry_2
L3_ENTRY_2.ism0[852]:
BCM.0> d chg ipmc
L3_IPMC.ipipe0[1]:
BCM.0> d chg repl_group
REPL_GROUP.mmu0[1]:
BCM.0> d chg repl_head
REPL_HEAD.mmu0[1]:
BCM.0> d chg ipmc_vlan
IPMC_VLAN.mmu0[1]:
BCM.0> d chg egr_l3_next_hop
EGR_L3_NEXT_HOP.epipe0[1]:
EGR_L3_NEXT_HOP.epipe0[2]:
BCM.0> d chg egr_l3_intf
EGR_L3_INTF.epipe0[1]:
EGR_L3_INTF.epipe0[8191]:
值得注意的是,vlan是否作为关键字来查找三层组播表l3_entry_2(与单播表共用),需要通过设置端口表即PORT表的IPMC_DO_VLAN域,IPMC_DO_VLAN为0表示不关心VLAN,否则为1表示关心VLAN。