1. # BCM包处理原理


L2转发流程



  1. # L2转发流程

对于交换芯片来说,L2转发是一个最基本的功能。

2.1 L2功能主要包括

ingress过滤、

MAC学习和老化、

根据MAC+VLAN转发、

广播与洪泛、

生成树控制等基本功能。

2.2 L2转发的具体流程如图3所示:


图3 L2转发流程

2.3 L2转发流程

从端口进入交换芯片的包首先检查TAG,对于tagged包,判断是否是802.1p的包,(802.1p的包vid为0),对于untagged的包和802.1p的包,根据系统配置加上tag(这些配置包括:基于MAC的vlan、基于子网的vlan、基于协议的vlan和基于端口的vlan)。经过这一步以后,到交换芯片内部的包都变成802.1Q的tagged包了(vid为1-4094,4095保留),

如果设置了ingress过滤,就会检查本端口是否在该vid对应的VLAN中,对于本端口不在该vid对应的VLAN中的包就丢弃。对于没有设置ingress过滤,或者设置ingress过滤但本端口在该vid对应的VLAN中的包进行STP端口状态检查,对于BPDU以外的包,只有端口处于forwarding状态,才允许包进入。

然后进行原MAC地址检查,以原MAC+VID的哈希为索引查找L2 TABLE

如果没有找到,就把这个表项(原MAC+VID)以及对应的端口写到L2 TABLE中,这个过程称为MAC地址学习。当然地址学习的方法有很多种,可以是硬件学习,也可以是软件学习,可以根据PORT表中的CMI字段的配置来进行。

下一步进行目的MAC地址检查:目的MAC地址为广播地址(0xffffffff)的包,在vlan内广播出去;目的MAC地址为组播地址的包,进行组播流程的处理;对于单播包,查找L2 TABLE,如果没有找到,就在vlan内进行洪泛;

如果找到,检查表项中的L3 bit是否设置,

如果设置了L3 bit,就进行L3流程的转发;

否则就转发到L2 TABLE表项中的端口去,在egress方向,也有egress过滤设置(默认是使能的),如果egress端口不在vlan中也是不能转发的。

至此,L2转发流程完成了。

与地址学习相反的过程是地址老化。地址老化的机制是:ASIC内部有个定时器,称为age timer,命令行可以对这个寄存器进行设置,每次查找L2 TABLE时(包括原地址查找和目的地址查找,可以配置),如果命中,就会设置hit标志。当老化时间到后,ASIC把hit标志清除,当下一个老化时间到后,ASIC把hit为0的地址设置为无效,这就是为什么实际地址老化的时间为1~2倍agingTime的原因。

2.4 L2转发相关的表项

2.4.1 port表


图4 port表

Port表是一个非常重要的表,有很多与端口相关的控制都在这里设置。每个端口对应一个表项,按端口号进行索引。

下面介绍一下重要的设置:

1) PVID :设置PORT_VID

2) 缺省优先级 :设置PORT_PRI

3) 流分类使能 :设置FILTER_ENABLE

4) VLAN转换使能 :设置VT_ENABLE和VT_MISS_DROP

5) Ingress过滤使能:设置EN_IFILTER

6) 信任COS还是信任DSCP :对于IPV4:TRUST_DSCP_V4=0:信任COS;

TRUST_DSCP_V4=1 : 信任DSCP,对于IPV6:同样设置TRUST_DSCP_V6。

7) Ingress方向mirror使能:设置MIRROR

8) MAC地址学习方式 :设置CML

9) IP组播是否使用VLAN信息:设置IPMC_DO_VLAN

10) L3转发使能 :设置V4L3_ENABLE和V6L3_ENABLE

11) 是否丢弃BPDU :设置DROP_BPDU

12) 控制是否转发带tag和不带tag的包:设置PORT_DIS_TAG和PORT_DIS_UNTAG

13) Pause帧控制 :设置PASS_CONTROL_FRAMES

14) 基于子网的VLAN使能 :设置SUBNET_BASED_VID_ENABLE

15) 基于MAC的VLAN使能 :设置MAC_BASED_VID_ENABLE

16) 设置堆叠口 :HIGIG_PACKET

17) 设置NNI口 :NNI_PORT

18) 修改优先级使能 :MAP_TAG_PACKET_PRIORITY

19) 堆叠口modid设置 :MY_MODID

20) Out tpid设置 :OUTER_TPID

21) 基于MAC和基于子网的VLAN优先级设置:VLAN_PRECEDENCE

22) 是否允许单臂桥功能 :PORT_BRIDGE

23) IP组播位图设置 :IGNORE_IPMC_L2_BITMAP和IGNORE_IPMC_L3_BITMAP

2.4.2 L2地址表


图6 L2地址表

56504的L2地址表大小为16K,5630X的L2地址表大小为8K,地址表使用MAC+VID的hash值作为索引查表。实际上56504的L2地址表hash值为4K,每个hash值对应4条地址,这样最多可以保存4条hash冲突的地址。地址表中每个表项都保存了MAC_ADDR和VLAN_ID。MAC学习的时候使用原MAC+VID的hash查表,把表中的MAC+VID与包中的MAC+VID进行比较,如果完全相等,表示找到了。然后看端口(TGID_PORT)是否相等,如果不相等表示地址发生了迁移,

对于动态学习的地址需要更新port;如果相等表示命中,更新hit标志。其他几个重要的功能介绍如下:

1) 设置静态地址 :STATIC_BIT=1

2) 设置L3转发标志 :L3=1

3) 设置本地址的包都转发到CPU去:CPU=1

4) 设置本地址匹配的包丢弃:SRC_DISCARD=1、DST_DISCARD=1

5) 设置本地址匹配的包对某些端口阻塞:MAC_BLOCK_INDEX

6) 设置本地址匹配的包镜像:MIRROR=1

7) 设置组播索引:L2MC_PTR

8) 地址有效标志:VALID=1

2.4.3 VLAN表

Vlan表分为ingress和egress两个部分,分别对应入口控制和出口控制。


图7 ingress vlan表

Ingress Vlan表中主要包含了端口列表,用于ingress filter功能。PFM是用于控制组播洪泛的开关。PFM=0,组播在vlan内洪泛;PFM=1,注册的组播按组播表转发,未注册的组播在vlan内洪泛;PFM=2,注册的组播按组播表转发,未注册的组播丢弃。STG用于标识本vlan所属的生成树组。


图8 egress vlan表

Egress vlan表中除了PFM和STG外,还包含了出口方向的端口位图,以及哪些端口以untag的方式发送本vlan的包。

2.4.4 egress port表


图5 egress port表

EGR_PORT是一组寄存器,每个端口一个,用于EGRESS方向的控制,有几个重要设置介绍如下:

1) 设置egress端口类型:PORT_TYPE=0,UNI端口;PORT_TYPE=1,NNI端口

2) 设置egress过滤:EN_EFILTER=1



  1. # L3转发流程


图9 L3转发流程

如果查目的MAC地址表的时候发现L3bit置位了,就进入到L3转发流程。与L2交换相比,L3交换可以实现跨VLAN转发,而且它的转发依据不是根据目的MAC地址,而是根据目的IP。

  1. 涉及到的表:

主机路由表

子网路由表

EGRESS下一跳表 终端设备信息 修改目的信息的依据

接口表 交换设备信息 修改源的信息的依据

INGRESS下一跳表 找到物理端口

  1. L3转发的流程

第一步: 对L3头部进行校验,校验和错的包直接丢弃;

第二步: 进行原IP地址查找

如果主机路由表中没有找到,会上报给CPU,CPU会进行相应的处理,并更新L3表;(先以源地址查找是想确认下是否有站点漂移的现象和更新L3表。An example of a station movement is when a connection from port 1 is moved to port 2 but the SIP remains the same.
Unless the software updates the L3 table, packets that are destined to that DIP are forwarded to port 1.)


第三步:进行目的IP地址查找,

如果主机路由表中没有找到,就会在子网路由表中进行查找,在子网路由表中进行最长子网匹配的查找算法,如果在子网路由表中还没有找到,则送给CPU进行处理,

如果主机路由表子网路由表中找到了,

就会得到INGRESS/EGRESS下一跳的指针NEXT_HOP_INDEX(ING_L3_NEXT_HOP和EGR_L3_NEXT_HOP)。


:经过查看sdk可以发现路由表和EGRESS下一跳表在一个结构体中定义的。

如果ECMP使能的话,会得到ECMP的指针和ECMP的个数,从而根据hash算法得到一个下一跳指针下一条表项中包含了下一跳的MAC地址和接口表的索引。

最后在包转发出去的时候,

EGRESS下一跳表 查到 目的MAC地址 替换掉包的目的MAC地址

EGRESS下一跳表 查到 接口表

接口表 查到 接口MAC地址和VLAN替换掉包的原MAC地址和VLAN

INGRESS下一跳表 查到 出端口

注意:通过代码分析,我们的56151并没有用到EGRESS/INGRESS

L3有关的几个重要的表介绍

  1. 3层主机路由表

v4单播:1024

v4组播:512

v6单播:512

v6组播: 256

  1. 3层LPM路由表

v4单播: 512

v6单播: 256

包含最长前缀匹配IPv4和IPv6子网路由,包括ECMP/ ECMP路由



  1. 接口表

a virtual interface corresponding to a particular routed VLAN

与特殊路由VLAN相对应的虚拟接口

and has an associated IP address and MAC address

并且关联IP地址和MAC地址

作用:包含交换机的接口mac地址,包在转发时替换愿mac地址

  1. EGRESS 下一跳表

作用:包含出接口下一跳的mac地址

包在转发时替换目的mac地址

相当于arp表
  1. INGRESS下一跳表

作用:包含目的端口

L3有关的几个重要的表详细信息

图10 L3单播主机路由表



图11 L3子网路由表



图14 接口表


图13 EGRESS 下一跳表


图15 INGRESS 下一跳表


图12 ECMP表


MPLS相关表



  1. # 特殊数据包上CPU设置

摘抄:BCM53115的CFP共支持256条规则。这些规则依次保存在物理的TCAM Entry(Ternary Content-Aware Memory)中,索引号0~255。

设置方法一: 已经封装好的特殊包上cpu接口

参考igmp:bcm_switch_control_set(ulUnit,bcmSwitchIgmpPktToCpu,FALSE);

设置方法二:利用策略上cpu

参考ptp:STATUS bcm_ssp_specified_dstmac_packet_tocpu(bcm_mac_t date,bcm_mac_t mask); 

fdb表初始化默认规则修改:

参考ptp:STATUS bcm_ssp_ptpd_pdelay_packet_tocpu(void)

BCM芯片FP原理及相关SDK数据结构介绍

http://www.dnsnat.com/forum.php?mod=viewthread&tid=1205&fromuid=1

BCM交换芯片策略路由功能

http://www.dnsnat.com/forum.php?mod=viewthread&tid=1204&fromuid=1



  1. # 代码分析

UNK可以说是UNP的内核形态,以下可以做UNP框架的参考:

根据以上框架可以确定开发的重点为SSP的开发。SSP是通过SDK封装的应用接口库。所以还需学习SDK提供的API函数。

BCM5615提供的SDK中包含的L3 API



L3 Ingress Interface APIs


L3 Egress Table APIs


L3 VRF


L3 VRRP


L3 NAT

SDK具体可参考:《56XX-PG632-RDS_API_decrypted.pdf》

SSP代码可参考:[bcmRoute.c][bcmRouteHw.c]

UNP库的使用

UNP注册函数

STATUS mvRouteHwapiInit()

{

STATUS rc = UNP_OK;

UNP_hwApiModuleReg_t routeHwApiModuleReg;

routeHwApiModuleReg.funcPortGet = NULL;

routeHwApiModuleReg.funcPortSet = NULL;

routeHwApiModuleReg.funcSwitchGet = NULL;

routeHwApiModuleReg.funcSwitchSet = mvRouteSwitchValueSet;

routeHwApiModuleReg.funcStructGet = NULL;

routeHwApiModuleReg.funcStructSet = mvRouteSwitchStructSet;

routeHwApiModuleReg.funcStructDel = NULL;

rc = UNP_hwapiModuleFuncReg(&routeHwApiModuleReg, UNP_MID_ROUTEMANAGE);

return rc;

}

使用注册函数

UNP_CHECK_ERROR(UNP_hwSwitchValueSet(UNP_HW_VRRPACCESS_ENABLE, ulVrrpEnable));



  1. # MPLS相关

    内核支持

MPLS can be built as a kernel module, or it can be built in a kernel.

To build MPLS first you need to run:

$ make menuconfig

and enable MPLS compiling from:

Network setup -> Networking options -> MPLS (Experimental)

If you’re running Debian based system, nice HOW-TO on compiling and installing custom kernel

can be found here:

https://help.ubuntu.com/community/Kernel/Compile

quagga支持

quagga已经有mpls的分支版本

–enable-mpls=linux –enable-ldpd

broadcom支持

Theory of Operation:没有提到

Network Switching Software Development Kit Release 6.3.2:

有相关api说明,并提到StrataXGS III provides MPLS functionality

临时总结:

其实路由表等不一定非要下硬件,只是下硬件后转发快了。

所以可以总结,控制信息有哪些, 路由信息有哪些。

哪些需要上cpu,哪些不需要上。

quagga保存的所有信息,和需要接收的所有信息。

 评论