当前位置:首页 > Bcm56540与bcm56330 MPLS模块底层实现比较
Bcm56540与bcm56330 MPLS模块底层实现比较
本文结合SDK6.2.1与5.9.0,分析了56540系列交换芯片与56330系列芯片底层软件实现的差别。代码比较中,右侧默认为6.2.1SDK代码。
两款芯片MPLS模块底层软件实现的差异主要包括两个部分,其一是在5.9.0版本基础上做了一些的软件优化,以达到高效目的,其二56540较56330硬件上有所差别,包括一些表中增加了一些控制域,以及一些细微的硬件处理流程差异。
1、产品宏定义:
本文结合5.9.0版本SDK以及6.2.1版本SDK,根据产品宏,分析了56330系列与56540系列交换芯片底层SDK的MPLS模块的实现区别,另外,两类系列交换芯片对应的适配接口相同。
bcm56540定义宏
bcm56540芯片采用的产品宏如下:
#if defined(BCM_56640_A0) || defined(BCM_56640_B0) #define BCM_56640 #define BCM_56840 #define BCM_56634 #define BCM_56624 #define BCM_56304 #define BCM_56800
#define BCM_FIREBOLT_SUPPORT #define BCM_BRADLEY_SUPPORT #define BCM_SCORPION_SUPPORT #define BCM_TRIUMPH_SUPPORT #define BCM_TRIUMPH2_SUPPORT #define BCM_TRX_SUPPORT #define BCM_TRIDENT_SUPPORT #define BCM_TRIUMPH3_SUPPORT #define BCM_MPLS_SUPPORT #define BCM_CMICM_SUPPORT
#define BCM_EXTND_SBUS_SUPPORT #define BCM_TIMESYNC_SUPPORT #define BCM_SBUSDMA_SUPPORT #endif
bcm56338定义宏
bcm56338芯片采用的产品宏如下:
#if defined(BCM_56334_A0) || defined(BCM_56334_B0) #define BCM_56334 #define BCM_56624 #define BCM_56304 #define BCM_56800
#define BCM_FIREBOLT_SUPPORT #define BCM_BRADLEY_SUPPORT #define BCM_TRIUMPH_SUPPORT #define BCM_TRIUMPH2_SUPPORT #define BCM_ENDURO_SUPPORT #define BCM_TRX_SUPPORT #define BCM_MPLS_SUPPORT #endif
2、MPLS模块SDK代码实现对比
1、适配接口对应的SDK函数对比表
序号 1 2 3 4 bcm_tms_mpls_l3_enable_set bcm_tms_mpls_vpn_set_extend bcm_tms_mpls_vpn_del_extend bcm_tms_mpls_ing_xc_set_extend bcm_l2_tunnel_add bcm_mpls_vpn_id_create bcm_mpls_vpn_id_destroy bcm_mpls_tunnel_initiator_set 适配层接口 SDK层接口 bcm56540 (6.2.1版本) bcm_tr3_metro_myStation_add bcm_tr_mpls_vpn_id_create bcm_tr_mpls_vpn_id_destroy bcm_tr_mpls_tunnel_initiator_set 5 bcm_tms_mpls_ing_xc_del_extend bcm_mpls_tunnel_initiator_clear bcm_tr_mpls_tunnel_initiator_clear 6 bcm_tms_mpls_tran_xc_set_extend 7 bcm_tms_mpls_tran_xc_del_extend 8 bcm_tms_mpls_egr_xc_set bcm_mpls_tunnel_switch_add bcm_mpls_tunnel_switch_delete bcm_mpls_tunnel_switch_add bcm_tr3_mpls_tunnel_switch_add bcm_tr3_mpls_tunnel_switch_delete bcm_tr3_mpls_tunnel_switch_add 9 bcm_tms_mpls_egr_xc_del bcm_mpls_tunnel_switch_delete bcm_tr3_mpls_tunnel_switch_delete 10 bcm_tms_mpls_vpn_uni_port_set_extend bcm_tms_mpls_vpn_nni_port_set_bcm_mpls_port_add _bcm_tr_mpls_vpws_port_add _bcm_tr_mpls_vpls_port_add bcm_tr_mpls_tunnel_switch_delete 同 bcm_tr_mpls_tunnel_switch_delete bcm_tr_mpls_tunnel_switch_add bcm_tr_mpls_tunnel_switch_add 同 底层SDK函数 bcm56330 (5.9.0版本) bcm_trx_metro_l2_tunnel_add 同 同 同 extend
2、详细对比
本节,按照上一小节中列出的不同产品最终调用的SDK函数,详细分析两类芯片MPLS模块的软件实现差异。
1、MPLS使能
bcm_tr3_metro_myStation_add:将mac vlan信息写入MY_STATION_TCAM中。
bcm_trx_metro_l2_tunnel_add: 将本机mac以及vlan写入MPLS_STATION_TCAMm 另外,6.2.1版本SDK的mpls初始化中,增加了对EGR_MPLS_VC_AND_SWAP_LABEL_TABLE的第一个entry的预留处理,且将MPLS_LABEL_ACTIONf域设置为3;
2、创建/删除VPN
1、bcm_tr_mpls_vpn_id_create(int unit, bcm_mpls_vpn_config_t *info)
对于vpsw的需要分配vpn_id的情况,代码差异如下所示
6.2.1版本封装了_bcm_tr_vpws_vpn_alloc(int unit, bcm_vpn_t *vpn_id)函数,用来分配给vpws分配vpn_id
2、bcm_tr_mpls_vpn_id_destroy (int unit, bcm_vpn_t vpn) 对于vpws业务来说,差异如下
Sdk6.2.1中对于vpws的vpn_id与相应的vp的对应关系通过_bcm_tr_mpls_vpws_vp_map_set函数记录,删除操作会调用_bcm_tr_mpls_vpws_vp_map_clear实现清除软件记录以及vp free功能。
3、创建INGRESS LSP
函数bcm_tr_mpls_tunnel_initiator_set所实现的功能:
1、首先读取指定egr_l3_intf中的tunnel_index以及mpls_tunnel_index,如果
mpls_tunnel_index为0,则新分配一个egr_ip_tunnel_mpls索引。
2、将标签值等数据写入到egr_ip_tunnel_mpls(每个location中有四个entry)的某个entry中;通过设置该表项的push_action,可支持打两次标签业务。
3、 egr_ip_tunnel_mpls的entry的索引与tunnel_index做或运算写入
egr_l3_intf.mpls_tunnel_index。
代码中可以看见 mpls_index = tnl_index * 4;表示mpls_index是将tnl_index向左移动两位得到的,低两位用来表示四个entry的某一个。
4、egr_ip_tunnel与egr_ip_tunnel_mpls一一对应,一行egr_ip_tunnel_mpls有四个entry。bcm_xgs3_tnl_init_add只有在四个entry都用了的情况下,才会被调用,创建一个新的egr_ip_tunnel,只有此时才会调用_BCM_MPLS_IP_TNL_USED_SET标记该tnl_index为已用。这点也是该函数的精髓所在。
此外,6.2.1较5.9.0多了一些软件上记录处理:
1、如果将要设定的lsp的出标签以及push_action与硬件中的某个entry一致,6.2.1则采用同一个egr_ip_tunnel_mpls中的enry,相对于5.9.0来说节约的资源。但是通过分析可知,这样比较的效率很低,是通过逐一读取表项然后比较实现的。
2、_bcm_tr_mpls_egr_tunnel_ref_count_adjust函数用来记录mpls_tunnel_index的引用次数,此处将mpls_tunnel_index的引入次数增加1,在bcm_tr_mpls_tunnel_initiator_clear会将相应的mpls_tunnel_index的引用次数减一,减一后如果等于0,可清空EGR_IP_TUNNEL_MPLS表,否则只清空egr_l3_intf的mpls_tunnel_index域。
3、增加了对局部标签的处理,代码如下:
4、创建EGRESS LSP
bcm_tr3_mpls_tunnel_switch_add:主要增加了对P2MP以及FRR模式的处理,FRR模式中可以看到向L3_TUNNEL表里写入了标签以及弹出动作。 bcm_tr_mpls_tunnel_switch_add:
5、L2VPN
本节主要描述_bcm_tr_mpls_vpws_port_add/_bcm_tr_mpls_vpls_port_add函数在6.2.1版本的SDK与5.9.0的区别。
下面以该函数中vp is not valid的流程为例,介绍6.2.1与5.9.0的区别
共分享92篇相关文档