盛科SDK基础知识
CTC-SDK基础知识
概述
接触盛科芯片已经*年了,中间基于CTC5160做了很多项目,由于开发人员紧缺,基本上都是一个人负责整个功能模块的开发,难免要和SDK打交道,下面基于本人对盛科SDK的理解,做一些笔记,以便时常翻阅。资料主要来源盛科对外提供的资料。
ctc5160芯片介绍
CTC5160(GreatBelt)是一款多功能、高性能的IP/Ethernet交换芯片。集成了L2到L4包处理引擎、先进的流量管理单元和OAM引擎,可以达到120Gbps的线速处理能力。
支持的工作模式:
- 24X1GE + 8X10GE
- 48X1GE + 8X10GE
- 12X10GE
N-Cube架构
SDK常用的概念
架构
lport、gport、logic port
端口是交换芯片和其它设备进行对接传输数据的,盛科sdk中把端口划分成了本地端口(lport)、全局端口(gport)和逻辑端口(logic port)这三种类型。
lport
单芯片情况下的本地端口,包括物理口、芯片中保留端口、内部端口。
本地端口一般由芯片能出的MAC数目而决定,芯片支持的本地端口最大值:
- Greatbelt 支持128个本地端口
- Humber 支持256个本地端口
物理端口的作用:可以作为一些表项的索引,例如DsPhyPort、DsSrcPort、DsDestPort.
Greatbelt lport的组成
gport
如果单芯片情况下表示的就是lport,但是有时会出现多芯片场景的应用,例如分布式系统或者堆叠系统。使用lport是无法区分哪个芯片上的端口。此时就需要global port,简称gport。
像堆叠系统中,多台堆叠成员设备虚拟成一台网络设备,此时单播转发表的出端口必须要知道是哪个芯片上的端口,gport就携带芯片信息,然后经过堆叠口单播出去。
Global port的组成
logic port
盛科的逻辑端口是一种物理端口的映射,指的是一种业务在一个物理端口上的抽象,用在特殊的地方。
- VPLS:作为AC的logic port时,可以通过gport+vlan或gport映射得到,作为PW端口时可以通过VC Label映射得到。
- APS:两层保护切换网络,一对保护组的出口同时属于一个logic port,可通过Port模块的接口把两个端口配置属于同一个logic port。
FID
Greatbelt芯片最大支持16k个FID。
Forwarding Instance ID:转发实例号,盛科的芯片所有二层转发都基于MAC+FID进行的。FID的来源
- 基于VLAN的L2 Bridge转发
- IVL: vlan:fid是1:1关系
- SVL: vlan:fid是n:1关系,可通过配置DsVlan.fid对应的VLAN在SVL中的FID。
- 基于C+S VLAN的转发
上层用户可以通过Vlan mapping的接口ctc_vlan_add_vlan_mapping()把C+S映射到一个FID中进行转发。 - 基于VSI的VPLS的转发
在VPLS应用中,虚拟交换实例即VSI可映射为芯片中的FID,在配置AC端口或PW端口时指定在同一个VSI,相当于在同一个转发实例中转发。VSI范围4096 + 1K
Mcast Group ID
在芯片中,二层组播、三层组播、基于VLAN的泛洪、基于VSI的泛洪都采用组播复制的方式实现,每个组播组都是用组播ID来索引。
下面时默认Mcast Group ID分配情况
Mcast Type | Mcast Number | Mcast Group ID |
---|---|---|
Vlan based Broadcast | 4K | 0~4095 |
VSI based Broadcast | 1K | 4096~5119 |
L2 Multicast | 1K | 5120~6143 |
IP Mulitcast | 1K | 6144~7167 |
VRF ID
VRF:Virtual Routing Forwarding,虚拟路由转发实例。在一台交换机上启用VRF,可以虚拟多台交换机,三层之间相互隔离。每个VRF独立管理自己的路由表。
一般VRF在L3VPN中使用,在PE设备上,为每个直接相连的Site建立并维护专门的VRF实例,即VPN实例。每个实例有自己的IP路由表、标签转发表、与VPN实例绑定的接口以及VPN实例的管理信息。
在盛科SDK中,vrfid属于L3 interface的属性。
L3 interface
l3 interface 全局支持1k interface, 分为三种类型:
- physical interface: 为Routed port,仅仅可以配置三层属性,只有路由功能,相当于路由器上的接口,是基于物理port的,可以直接连接路由器。
- Vlan interface: 是三层交换机中vlan配置的路由接口,Vlan interface基于vlan,vlan接口集成了交换和路由的功能。
- Sub interface: 为Routed port,仅仅可以配置三层属性,只有路由功能,是基于port + vlan来区分的,在一个物理端口port上,可以通过vlan来划分不同的Interface。
Nexthop
NextHop在盛科芯片中是一个很重要的概念,它是对芯片中一系列表项的总称,这些表象包括DsFwd、DsNexthop、DsL2Edit、DsL3Edit。这些表项的作用就是决定将报文发往哪些端口,并且在出端口前对报文做哪些编辑等等。
NextHop 类型
- L2UC:二层单播,初始化创建,FDB使用。
- L2MC:二层组播,SDK维护,用于二层组播
- IPUC:三层单播,用户自己创建删除,可以add/update/remove.
- IPMC:三层组播,SDK维护,用于三层组播
- MPLS
- IP tunnel
可以归为两类:
- 用户可以管理的:IPUC, MPLS, IP tunnel
- SDK自己维护:L2UC, L2MC, IPMC
自定义上送CPU的报文类型
在开发私有协议时,有时会用到特殊的报文类型,芯片无法自动识别上送CPU,此时需要采用特殊手段,由芯片主动抓取,然后上送CPU进行处理。
创建Mcast Nexhop
用于识别出报文后,报文将要进行的动作,发往哪些端口。
/* 直接创建一个mcast nexthop即可,用于acl识别出报文关联 */
ctc_nh_add_mcast(mcast_nhid, &nh_mcast_group);
特殊报文识别
ACL报文抓取:
- ctc_acl_create_group —创建一个入方向的acl组。
- ctc_acl_add_entry — 创建acl表项,可以基于l2/l3/l4进行报文的识别。
- ctc_acl_install_group — 安装,使之生效。
{/* 根据l4类型或则端口号进行匹配 示例 */
acl_entry->entry_id = entry_id;
acl_entry->key.type = CTC_ACL_KEY_IPV4;
p_key->flag = CTC_ACL_IPV4_KEY_FLAG_L4_PROTOCOL;
p_key->l4_protocol = l4_protocol;
p_key->l4_protocol_mask = 0xff;
p_action->nh_id = nhid; /* 第一步创建的mcast nexthop */
p_action->flag |= CTC_ACL_ACTION_FLAG_REDIRECT;
ret = ctc_acl_add_entry(acl_group_id, acl_entry);
}
创建Misc Nexthop
使用的Misc Nexthop,用于关联cpu reason,上送CPU。
nh_param.type = CTC_MISC_NH_TYPE_TO_CPU;
nh_param.misc_param.cpu_reason.cpu_reason_id = reason_id;
ret = ctc_nh_add_misc(nhid, &nh_param);
自定义CPU Reason
- 创建一个CPU reason, 并映射到16个CPU group中的一个queue
que_cfg.type = CTC_QOS_QUEUE_CFG_QUEUE_REASON_MAP;
que_cfg.value.reason_map.cpu_reason = reason_id;
que_cfg.value.reason_map.queue_id = queue_id;
que_cfg.value.reason_map.reason_group = group_id;
ret = ctc_qos_set_queue(&que_cfg);
- 将CPU reason的目的地指向CPU
dest_type = CTC_PKT_CPU_REASON_TO_LOCAL_CPU;
que_cfg.type = CTC_QOS_QUEUE_CFG_QUEUE_REASON_DEST;
que_cfg.value.reason_dest.cpu_reason = reason_id;
que_cfg.value.reason_dest.dest_type = dest_type;
ret = ctc_qos_set_queue(&que_cfg);
- 最后将上述创建的上送CPU的Misc Nexthop关联这个CPU reason
nh_param.type = CTC_MISC_NH_TYPE_TO_CPU;
nh_param.misc_param.cpu_reason.cpu_reason_id = reason_id;
ret = ctc_nh_add_misc(nhid, &nh_param);
关联Mcast Nexthop和Misc Nexthop
这一步主要是将Misc-Nexthop添加到Mcast-Nexhop中去。上面使用Mcast-Nexthop的目的是为了不单单将自定义报文上送CPU,而且还要转发出去。如果仅仅时上送CPU,可以直接省略掉Mcast-Nexthop步骤,直接在ACL规则中关联Misc-Nexthop即可。
- 添加上送CPU的misc-nexthop
nh_mcast_group.mem_info.member_type = CTC_NH_PARAM_MEM_LOCAL_WITH_NH;
nh_mcast_group.opcode = CTC_NH_PARAM_MCAST_ADD_MEMBER;
nh_mcast_group.mem_info.ref_nhid = misc_nhid;
ret = ctc_nh_update_mcast(mcast_nhid, &nh_mcast_group);
- 添加普通的物理端口
nh_mcast_group.mem_info.member_type = CTC_NH_PARAM_MEM_BRGMC_LOCAL;
nh_mcast_group.opcode = CTC_NH_PARAM_MCAST_ADD_MEMBER;
nh_mcast_group.mem_info.destid = gport;
ret = ctc_nh_update_mcast(mcast_nhid, &nh_mcast_group);
本文地址:https://blog.csdn.net/mfs_bad/article/details/112567746