欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

盛科SDK基础知识

程序员文章站 2023-12-29 17:24:28
CTC-SDK开发笔记概述ctc5160芯片介绍SDK常用的概念架构lport、gport、logic portlportgportlogic portFIDMcast Group ID概述接触盛科芯片已经*年了,中间基于CTC5160做了很多项目,由于开发人员紧缺,基本上都是一个人负责整个功能模块的开发,难免要和SDK打交道,下面基于本人对盛科SDK的理解,做一些笔记,以便时常翻阅。资料主要来源盛科对外提供的资料。ctc5160芯片介绍CTC5160(GreatBelt)是一款多功能、高性能的I...

概述

接触盛科芯片已经*年了,中间基于CTC5160做了很多项目,由于开发人员紧缺,基本上都是一个人负责整个功能模块的开发,难免要和SDK打交道,下面基于本人对盛科SDK的理解,做一些笔记,以便时常翻阅。资料主要来源盛科对外提供的资料。

ctc5160芯片介绍

CTC5160(GreatBelt)是一款多功能、高性能的IP/Ethernet交换芯片。集成了L2到L4包处理引擎、先进的流量管理单元和OAM引擎,可以达到120Gbps的线速处理能力。

支持的工作模式:

  • 24X1GE + 8X10GE
  • 48X1GE + 8X10GE
  • 12X10GE

N-Cube架构
盛科SDK基础知识

SDK常用的概念

架构

lport、gport、logic port

端口是交换芯片和其它设备进行对接传输数据的,盛科sdk中把端口划分成了本地端口(lport)、全局端口(gport)和逻辑端口(logic port)这三种类型。

lport

单芯片情况下的本地端口,包括物理口、芯片中保留端口、内部端口

本地端口一般由芯片能出的MAC数目而决定,芯片支持的本地端口最大值:

  • Greatbelt 支持128个本地端口
  • Humber 支持256个本地端口

物理端口的作用:可以作为一些表项的索引,例如DsPhyPort、DsSrcPort、DsDestPort.

Greatbelt lport的组成
盛科SDK基础知识

gport

如果单芯片情况下表示的就是lport,但是有时会出现多芯片场景的应用,例如分布式系统或者堆叠系统。使用lport是无法区分哪个芯片上的端口。此时就需要global port,简称gport。
像堆叠系统中,多台堆叠成员设备虚拟成一台网络设备,此时单播转发表的出端口必须要知道是哪个芯片上的端口,gport就携带芯片信息,然后经过堆叠口单播出去。

Global port的组成
盛科SDK基础知识

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转发
    1. IVL: vlan:fid是1:1关系
    2. 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, 分为三种类型:

  1. physical interface: 为Routed port,仅仅可以配置三层属性,只有路由功能,相当于路由器上的接口,是基于物理port的,可以直接连接路由器。
  2. Vlan interface: 是三层交换机中vlan配置的路由接口,Vlan interface基于vlan,vlan接口集成了交换和路由的功能。
  3. 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
    可以归为两类:
  1. 用户可以管理的:IPUC, MPLS, IP tunnel
  2. SDK自己维护:L2UC, L2MC, IPMC

自定义上送CPU的报文类型

在开发私有协议时,有时会用到特殊的报文类型,芯片无法自动识别上送CPU,此时需要采用特殊手段,由芯片主动抓取,然后上送CPU进行处理。

创建Mcast Nexhop

用于识别出报文后,报文将要进行的动作,发往哪些端口。

/* 直接创建一个mcast nexthop即可,用于acl识别出报文关联 */
ctc_nh_add_mcast(mcast_nhid, &nh_mcast_group);

特殊报文识别

ACL报文抓取:

  1. ctc_acl_create_group —创建一个入方向的acl组。
  2. ctc_acl_add_entry — 创建acl表项,可以基于l2/l3/l4进行报文的识别。
  3. 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

  1. 创建一个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);
  1. 将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);
  1. 最后将上述创建的上送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即可。

  1. 添加上送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);
  1. 添加普通的物理端口
	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

上一篇:

下一篇: