2. Broadcom交换芯片架构与SDK概览
Broadcom的交换芯片(如Trident、Tomahawk、Jericho系列)是数据中心与园区交换机中最常见的转发核心之一。理解它的架构,关键不是记住某个型号的规格,而是建立一张“分层地图”:哪些工作由芯片硬件完成,哪些由SDK驱动完成,哪些必须交给上层网络操作系统(NOS)决策。只有把这三者的职责边界划清,后续的SDK初始化、表项下发、端口配置和故障排查才有稳定的参照系。
一、数据平面、控制平面与管理平面的分工
交换芯片内部通常可以按三个平面来理解。数据平面(Data Plane)是芯片的转发引擎,负责在纳秒到微秒级完成报文解析、查表、改写和转发。它包含入方向解析器(Parser)、入方向流水线(Ingress Pipeline)、流量管理器(TM)、出方向流水线(Egress Pipeline)以及报文修改器。控制平面(Control Plane)负责运行协议、维护转发表、处理异常报文,通常由CPU上的NOS承担。管理平面则负责配置下发、状态采集和带外管理。
需要特别强调的是:芯片本身不会“自己学习”路由或MAC。它只执行已经写入表项的动作。所谓“学习”,是NOS或SDK在收到CPU上送的报文后,决定是否新增一条表项,再通过SDK把这条表项写进芯片。因此,数据平面是执行者,控制平面是决策者,SDK是两者之间的翻译与搬运层。
二、典型交换芯片的内部结构
以Trident类芯片为例,其内部大致包含以下关键单元:
- 端口宏(Port Macro / SerDes):完成高速串行信号的收发、均衡与时钟恢复,是芯片与光模块/背板之间的物理接口。
- 入方向解析器:按可编程的解析图(Parse Graph)逐层剥离以太网、VLAN、IPv4/IPv6、TCP/UDP、隧道头等字段,生成内部报文头(如HiGig或内部元数据)。
- 入方向流水线:由多个查表阶段(Lookup Stage)组成,依次完成VLAN成员判断、MAC表查找、路由表查找、ACL匹配、隧道解封装等。
- 流量管理器:负责缓存分配、队列调度、拥塞管理(如WRED、PFC、ECN),决定报文何时从出端口发出。
- 出方向流水线:完成出方向ACL、镜像、TTL递减、报文改写(Rewrite)等。
- CPU通道:把需要软件处理的报文(如协议报文、未知单播、TTL超时)上送CPU,也接收CPU下发的控制报文。
这些单元共同构成一条“解析—查表—调度—改写—发送”的流水线。理解这条流水线,是理解SDK API为什么按“表项类型”和“流水线阶段”组织的基础。
三、表项资源:芯片的“内存地图”
交换芯片的转发能力,本质上受限于各类表项的容量和查找宽度。常见表项资源包括:
| 表项类型 | 典型用途 | 关键约束 |
|---|---|---|
| L2 MAC表 | 二层转发、VLAN成员 | 条目数、老化时间、哈希冲突 |
| L3 主机表/路由表 | IPv4/IPv6 转发 | 前缀长度、ECMP组数、下一跳表 |
| ACL/TCAM | 安全策略、流分类 | TCAM深度、宽度、优先级顺序 |
| 隧道表 | VXLAN、GRE、MPLS | 隧道端点、封装格式 |
| 队列/计数器 | QoS、统计 | 队列数、计数器宽度 |
这些资源不是无限的。例如某型号芯片的L3主机表可能只有几万条,而ACL TCAM可能只有几千条。SDK的职责之一,就是把这些物理资源抽象成逻辑表,并在资源不足时返回明确错误,而不是静默丢弃。NOS则要根据业务需求决定哪些表项优先占用资源。
四、SDK分层结构:从API到硬件
Broadcom SDK(通常称为OpenNSL、SAI或厂商SDK)采用分层设计,从上层到硬件大致分为:
- 应用/适配层:NOS通过SDK提供的API(如bcm_l2_addr_add、bcm_l3_route_add)调用转发功能。
- API层:对表项操作进行统一封装,屏蔽不同芯片型号的差异。
- 组件层(Component):如L2、L3、ACL、QoS、端口等模块,负责逻辑表到物理表的映射。
- 芯片抽象层(CDK/硬件抽象):把逻辑操作翻译成寄存器读写、DMA描述符和内存访问。
- 驱动/总线层:通过PCIe、SPI、I2C等总线访问芯片寄存器。
这种分层带来的直接好处是:NOS不需要知道某个表项具体写在哪个内存地址,只需要调用语义正确的API。但代价是,当API返回失败时,必须理解失败发生在哪一层——是资源不足、参数非法,还是硬件访问超时。
五、NOS与SDK的职责边界
在实际工程中,最容易出问题的地方往往不是“不会调API”,而是“不清楚该由谁负责”。可以用下面几条边界来约束:
- 表项内容由NOS决定,表项写入由SDK执行。NOS决定某条MAC应该指向哪个端口,SDK负责把它写进芯片并返回成功或失败。
- 资源分配由NOS规划,资源检查由SDK完成。NOS根据业务规模规划ACL条目数,SDK在写入时检查TCAM是否还有空间。
- 协议报文由NOS处理,异常上送由SDK配置。SDK负责设置哪些报文上送CPU,NOS负责解析并响应。
- 端口状态由SDK采集,链路决策由NOS执行。SDK读取SerDes状态和链路事件,NOS据此决定是否启用端口或切换保护。
六、一个具体的表项下发示例
假设NOS需要添加一条静态MAC表项:MAC地址00:11:22:33:44:55,VLAN 100,出端口Ethernet1/1。NOS内部先完成端口映射和VLAN成员检查,然后调用SDK:
bcm_l2_addr_t l2addr;
bcm_l2_addr_t_init(&l2addr, mac, vlan);
l2addr.port = port;
l2addr.flags = BCM_L2_STATIC;
rv = bcm_l2_addr_add(unit, &l2addr);
if (rv != BCM_E_NONE) {
/* 资源不足或参数错误,NOS决定重试或告警 */
}
SDK收到后,组件层把这条逻辑表项映射到芯片的L2表内存,CDK层通过DMA写入表项,最后返回BCM_E_NONE。如果返回BCM_E_FULL,说明L2表已满,NOS需要触发老化或拒绝新学习。整个过程清晰体现了“NOS决策、SDK执行、芯片转发”的分工。