简介:这份PDF资料聚焦博通BCM系列交换芯片的工作原理,面向网络设备研发、驱动开发与运维工程师,以及需要理解数据中心交换底层机制的技术人员。内容从Architectural系统逻辑视图切入,梳理Ingress Chip、Switch Fabric与Egress Chip三级管道,并展开TCAM三态匹配、FM特性管理器、GPIC、HiGig、CMIC等硬件组件,以及Intelligent Parser、Security Engine、L2/L3转发、CAP、Buffer Management与Modification等处理流程,还涉及寄存器配置与CoS队列调度仲裁。资源包共1个PDF文件,大小约3.15MB,便于离线查阅与随查随用。目前已有871人学习下载,适合希望系统掌握BCM交换芯片架构、寄存器机制与报文处理链路的读者作为案头参考。
1. 从一次链路不通说起:Broadcom 交换芯片到底在干什么
机房上架一台新交换机,端口灯亮着,ethtool看 PHY 也是 up,但对端死活收不到包。抓包发现 ARP 请求从 CPU 口出去了,却没从目标物理口发出来。查到最后是 VLAN 成员表没把那个口加进去——芯片的入向流水线在 VLAN 检查阶段直接把帧丢了,CPU 侧完全无感知。这类问题逼着人去翻 Broadcom 交换芯片的转发模型:帧从 MAC 进来,经过解析、查表、编辑、排队,最后从某个口出去,每一步都有独立的表项和计数器。搞不清这条流水线,排障就只能靠猜。
Broadcom 的交换芯片(业内常说的 StrataXGS、Trident、Tomahawk 系列,以及接入侧的 Robo 系列)是数据中心和园区交换机里出货量最大的转发 ASIC 之一。它对外暴露的是一组寄存器、内存表和 DMA 描述符,SDK 负责把这些底层资源抽象成 VLAN、L2 转发表、L3 路由表、ACL、QoS 队列等逻辑对象。这份资料的价值在于把“芯片内部怎么走包”和“SDK 怎么配表”对应起来,适合做交换机驱动、SDK 适配、网络排障的工程师,也适合想从“会敲命令”往“知道命令改了哪张表”进阶的人。
2. 入向流水线与表项查找:一帧包在芯片里到底走了哪几步
2.1 从 MAC 到解析器:帧头被拆成了哪些字段
帧从 SerDes 进来,先过 MAC 层做前导码对齐、FCS 校验。校验失败的帧直接丢,不会进流水线,所以端口计数里的RX_ERR和RX_CRC_ERR是排查物理链路的第一站。校验通过的帧进入解析器(Parser),解析器按可编程的协议模板逐层剥离:先看 EtherType,判断是 IPv4、IPv6、ARP 还是 MPLS;如果是 IPv4,继续看协议号判断 TCP/UDP/ICMP;如果是带 VLAN Tag 的帧,先把 Tag 信息提取出来。
解析结果不是原始字节,而是一组内部字段,比如L3_TYPE、L4_DST_PORT、SRC_PORT、VLAN_ID。这些字段后面会被查表逻辑当作 Key 使用。解析器支持可编程,意味着非标准封装(比如自定义的隧道头)可以通过修改解析模板来识别,但改错了会导致后续所有查表 Key 错位,现象是“包能进来但转发行为完全不对”。
2.2 查表顺序:为什么 ACL 能覆盖路由结果
解析完的字段进入查表阶段。Broadcom 芯片的典型顺序是:入向端口/VLAN 检查 → MAC 层查表(L2)→ 如果命中 L3 就查路由表 → ACL 策略检查 → 最终决定出向端口和编辑动作。这个顺序不是随便定的,它决定了策略的优先级。
举个例子,一条 ACL 规则可以把某个源 IP 的流量重定向到 CPU,即使路由表里有一条更具体的明细路由指向某个物理口。因为 ACL 在流水线里的位置晚于路由查找,但它的动作可以覆盖前面的转发决定。很多“路由明明对但包就是不走”的问题,根源是 ACL 里有一条隐式 deny 或者重定向规则。
L2 表通常用哈希实现,Key 是MAC + VLAN,结果是端口号或端口组。L3 路由表用 LPM(最长前缀匹配),底层是 TCAM 或算法化的多级表。TCAM 容量有限,所以主机路由和网段路由的条目数要心里有数,超了会出现“加不进去但不报错”的情况。
2.3 用 SDK 读一张表:从命令行到寄存器
实际调试时,SDK 提供的bcmshell 或 API 是最直接的入口。下面这段是常见的读 L2 表项和端口计数的方式,不同 SDK 版本命令名有差异,但思路一致。
# 进入 SDK shell(具体入口依平台而定) # 查看某个端口的收发包统计 bcm counter show port=1 # 输出示例: # RX_UNICAST: 1024 # TX_UNICAST: 980 # RX_DISCARD: 12 # 读 L2 转发表中某个 MAC 的表项 bcm l2 show mac=00:11:22:33:44:55 vlan=100 # 输出示例: # MAC=00:11:22:33:44:55 VLAN=100 PORT=3 MODID=0counter show里的RX_DISCARD很关键,它统计的是进了芯片但因为各种原因被丢的帧。如果这个数在涨,说明流水线里有表项没配好,而不是物理链路问题。l2 show用来确认某个 MAC 是否真的学到了、学在了哪个口、VLAN 对不对。参数port和vlan是过滤条件,不写会输出大量条目,实际排障时一定要带过滤。
2.4 出向编辑与排队:包出去之前还被改了什么
查表决定出向端口后,帧还要过编辑模块。编辑动作包括:加 VLAN Tag、去 VLAN Tag、改 TTL、改 DSCP、加隧道封装头。这些动作由表项里的EDIT字段控制,SDK 里通常通过l3 intf或tunnel相关 API 配置。
编辑完进入排队和调度。每个出向端口有一组队列,队列到 TC(Traffic Class)的映射、调度算法(SP、WRR、WFQ)、整形速率都在 QoS 配置里。如果发现“高优先级流量和低优先级流量抢带宽”,先查队列映射表,再看调度器权重。芯片内部的 buffer 是共享的,一个口拥塞可能吃掉其他口的 buffer,导致全局丢包,这时候要看PG(Priority Group)和shared buffer的水线配置。
3. 把表配起来:VLAN、L2、L3 的最小可用配置路径
3.1 VLAN 成员表:端口进哪个 VLAN 由它决定
VLAN 成员表(VLAN Membership)决定一个物理口或 LAG 属于哪些 VLAN,以及帧进出时是否带 Tag。配置顺序通常是先建 VLAN,再把端口加进去,最后设 PVID(Port VLAN ID)处理 untagged 帧。
# 创建 VLAN 100 bcm vlan create vlan=100 # 把端口 1 以 tagged 方式加入 VLAN 100 bcm vlan add vlan=100 port=1 tagged=1 # 把端口 2 以 untagged 方式加入,并设 PVID=100 bcm vlan add vlan=100 port=2 tagged=0 bcm vlan set port=2 pvid=100tagged=1表示从这个口出去的帧带 VLAN Tag,tagged=0表示去 Tag。PVID 是给 untagged 入向帧打默认 VLAN 用的。常见坑是端口加了 VLAN 但 PVID 没设,untagged 帧进来后 VLAN 为 0,查不到成员表直接被丢。另一个坑是同一个口既做 tagged 又做 untagged 时,PVID 和 tagged 成员的关系没理清,导致帧的 Tag 状态和预期相反。
3.2 L2 转发表:静态和动态条目怎么共存
L2 表可以静态写,也可以由芯片学习。静态条目优先级高于动态,适合固定拓扑的上联口。动态条目有老化时间,默认通常 300 秒,流量稀疏时表项会被老化掉,导致短暂泛洪。
# 静态添加一条 L2 表项 bcm l2 add mac=00:aa:bb:cc:dd:ee vlan=100 port=3 static=1 # 查看老化时间 bcm l2 age show # 修改老化时间为 600 秒 bcm l2 age set timeout=600static=1的表项不会被老化,也不会被学习覆盖。如果发现某个 MAC 一会儿在端口 3 一会儿在端口 4,说明网络里有环路或者 MAC 漂移,先查 STP 状态和端口镜像配置,不要急着加静态条目掩盖问题。
3.3 L3 路由与下一跳:主机路由和网段路由的容量边界
L3 转发需要配接口(intf)、路由表项和下一跳(nexthop)。接口对应一个 VLAN 或隧道,路由表项指向下一跳,下一跳里包含出向端口和重写信息。
# 创建 L3 接口,绑定 VLAN 100 bcm l3 intf create intf=100 vlan=100 # 添加一条网段路由 10.0.0.0/24,下一跳是 192.168.1.1 bcm l3 route add prefix=10.0.0.0/24 nexthop=192.168.1.1 intf=100 # 查看路由表条目数 bcm l3 route count主机路由(/32)和网段路由在底层可能用不同的表,主机路由通常放 TCAM,容量小但查找快。如果主机路由条目接近上限,新加的路由会静默失败。l3 route count能看到当前用量,规划时要留余量。下一跳的 MAC 地址需要 ARP 解析,如果 ARP 没通,路由表里有条目但包发不出去,现象是“路由存在但 ping 不通”。
3.4 用计数器验证配置是否生效
配完表不能只看命令行回显,要回到计数器确认包真的按预期走了。
# 查看端口 3 的出向单播计数 bcm counter show port=3 | grep TX_UNICAST # 查看 VLAN 100 的入向计数 bcm counter show vlan=100 # 查看 ACL 命中计数 bcm acl counter show acl_id=10TX_UNICAST在涨说明包确实从端口 3 出去了。如果路由表有、下一跳有、但TX_UNICAST不动,回去查出向 VLAN 成员表和编辑动作。ACL 计数器能确认策略是否命中,命中数为 0 说明 Key 没匹配上,要检查 ACL 的字段掩码和解析器字段是否对齐。
4. 避坑与排查:那些让包“消失”的配置细节
4.1 现象:端口 up 但收不到包,计数器无增长
原因:SerDes 链路协商成功但 MAC 层没使能,或者端口被 STP 置为 blocking。芯片侧端口状态和 PHY 状态是两回事,PHY up 不代表 MAC 在收包。
解决:先看bcm port show port=1里的ENABLE和STP_STATE,确认 MAC 使能且 STP 为 forwarding。再看RX_UNICAST是否增长,不增长就是入向被挡了。
4.2 现象:VLAN 配了但跨 VLAN 不通
原因:VLAN 成员表只加了入向口没加出向口,或者 PVID 配错导致入向帧 VLAN 不对。跨 VLAN 需要 L3 接口,纯 L2 不会跨 VLAN 转发。
解决:bcm vlan show vlan=100确认两个口都在成员表里。跨 VLAN 场景检查l3 intf是否绑定正确 VLAN,路由表下一跳是否指向对应接口。
4.3 现象:ACL 规则不生效,计数器为 0
原因:ACL 的 Key 字段和解析器输出的字段名不一致,或者规则顺序被前面的规则拦截。TCAM 里规则按优先级排列,先匹配先动作。
解决:bcm acl show看规则顺序和优先级,确认 Key 字段拼写和 SDK 文档一致。用acl counter确认是否命中,不命中就逐字段缩小范围,先只匹配 EtherType,再逐步加条件。
4.4 现象:L3 路由加不进去,无报错
原因:TCAM 或主机路由表满了,SDK 返回成功但实际没写入。不同芯片的主机路由容量差异很大,规划时要查数据手册。
解决:bcm l3 route count看用量,接近上限时清理无用条目或改用网段路由聚合。加路由后立刻用l3 route show确认条目真的存在,不要只信返回值。
4.5 现象:高优先级流量被丢,低优先级反而正常
原因:队列到 TC 的映射配反了,或者共享 buffer 的水线设置让高优先级队列先触发丢弃。芯片的 buffer 是共享的,拥塞时按水线丢包,不是按队列优先级。
解决:bcm qos show确认队列映射和调度权重,检查PG水线配置。高优先级流量应该映射到高 TC,并且 PG 水线要留够 buffer。必要时用bcm counter show看每个队列的丢弃计数,定位是哪个队列在丢。
5. 进阶:用 SDK 日志和寄存器 dump 定位流水线断点
5.1 打开 SDK 调试日志,看包走了哪条路径
SDK 通常支持按模块打开日志,比如解析器、查表、编辑。日志会打印每个阶段的 Key 和查表结果,能直接看到包在哪一步被丢。
# 打开 L2 和 L3 模块的调试日志 bcm debug log module=l2 level=debug bcm debug log module=l3 level=debug # 查看日志输出(具体路径依平台) tail -f /var/log/sdk_debug.log日志里会看到类似l2_lookup: key=mac=00:11:22:33:44:55 vlan=100 result=miss的行,miss说明 L2 表没命中,接下来要么泛洪要么丢。如果看到l3_lookup: prefix=10.0.0.0/24 result=hit nexthop=192.168.1.1,说明路由命中了,问题在出向编辑或排队。
5.2 寄存器 dump:当表项和计数器都对不上时
有些问题表项看起来对、计数器也正常,但行为就是不对,这时候要 dump 寄存器看硬件实际状态。SDK 提供bcm reg系列命令,可以按寄存器名或地址读。
# 读端口 1 的 MAC 控制寄存器 bcm reg get reg=MAC_CTRL_PORT1 # 输出示例: # MAC_CTRL_PORT1 = 0x00000001 # bit0: RX_ENABLE = 1 # bit1: TX_ENABLE = 1寄存器值要和数据手册的位定义对照。比如RX_ENABLE为 0 但软件层面显示端口 up,说明软件状态和硬件状态不同步,需要重新初始化端口。寄存器 dump 是最后手段,但也是定位“玄学”问题最有效的手段。
5.3 一个可复用的排查顺序
我一般按这个顺序走:先看端口计数确认物理层和 MAC 层,再看 VLAN 成员表和 PVID,然后看 L2/L3 表项是否存在,接着看 ACL 是否拦截,最后看 QoS 和 buffer 丢弃。每一步都用计数器或日志验证,不靠猜。这套顺序能覆盖大部分“包不通”的场景,剩下的就是寄存器级别的硬件差异。
从那以后我每次配完一组表,都会强制走一遍“计数器确认”流程:配之前记下基线,配之后看增量,增量不对就立刻回退查表。这个习惯帮我省掉了大量“配置看起来对但实际没生效”的后悔药时间。希望帮到你。
本文还有配套的精品资源,点击获取