三层交换机之报文转发流程
本文以BCM56440交换芯片为例,介绍BCM StrataXGS系列芯片的报文转发流程,几乎所有交换芯片的报文转发流程都包括Ingress、MMU、Egress三个阶段。
BCM56440芯片的Ingress阶段流水线分为几个子阶段:
1、Packet Parser
首先检查数据帧的格式、长度(IEEE 802.3协议规定的64~1522字节报文,或者长达12KB的巨型帧)、字节对齐、CRC校验等,然后更新端口的包统计寄存器(show counters)、处理MAC Control控制帧等。由此决定入端口报文是否需要继续处理。
如果需要继续处理,则解析报文的前128字节,获取报文特征——目的MAC、源MAC、长度/类型、VLAN TAG、IP地址、UDP端口号、TCP端口号等,主要是提取Ingress Logic和ContentAware Processor需要的信息,这些信息都是后续L2转发和L3转发的依据。
2、Dos Checker
顾名思义,Dos Checker就是Dos攻击检查,该功能由Security Engine提供,主要是通过硬件机制检查DoS攻击。
3、Tunnel Termination(隧道终结)
隧道技术的实质是用一种网络层的协议来传输另一种网络层协议,其基本功能是封装和加密,主要利用网络隧道来实现。隧道的基本组成包括:隧道启动结点、隧道终结结点、IP网等路由的分组网络,隧道终结结点可以通过许多网络设备和软件实现,如企业网防火墙,VPN结点等。
4、VLAN处理
在交换机内部,所有的报文都必须携带VLAN Tag,入端口的报文可能是untagged、single-tagged或者double-tagged。
VLAN信息主要来自以下表项:
1) VLAN-based table (VCAP)
2) VLAN translation table (VLAN_XLATE)
3) Subnet-based table (VLAN_SUBNET)
4) Protocol-based table (VLAN_PROTOCOL)
5) Port-based table (default)
如果入端口报文是tagged的,使用报文携带的VLAN TAG进行后续处理。首先通过VLAN lookup table检查VLAN TAG是否合法。如果合法,则继续进行spanning tree, VLAN port bitmap和port filtering mode(PFM)检查(这些字段位于VLAN表中)。如果不合法,则丢弃或者上CPU。
需要注意的是,除了Ingress Filtering做VLAN检查之外,还要进行STP端口状态检查,对于非BPDU报文,只有端口处于forwarding状态时,才允许报文进入。
5、MPLS MinM
6、L2
L2主要分为两个阶段——MAC地址学习和查表转发。
首先检查L2_ENTRY表中是否已存在MAC_SA和VLAN ID表项,如果存在,则认为已学习;否则,由入端口的PORT_TABLE中的CML(CPU Managed Learning)配置决定是硬件学习、拷贝到CPU还是丢弃。这个地方还涉及到MAC MOVE,即MAC地址漂移。
接下来查找MAC_DA和VLAN ID的表项,首先在L2_USER_ENTRY表中查找,如果找到表项,则认为是BPDU报文,根据表项的BPDU位值决定处理策略。0表示转发到L2_USER_ENTRY表项的DST_MODID和DST_PORT(或者DST_TGID)字段指向的端口;1表示报文可以丢弃、拷贝到CPU或者在VLAN内洪泛。
如果L2_USER_ENTRY表中找不到表项,转而在L2_ENTRY表中查找。如果找到,则根据DST_MODID和DST_PORT/TGID转发。
任何单播DLF(Destination Lookup Failure)报文要可以在VLAN内洪泛、丢弃或者拷贝到CPU。选择哪种处理策略由VLAN_PROFILE表(VLAN表有4K个表项,其中VLAN_PROFILE_PTR字段指向64个VLAN_PROFILE表项)的L2_NON_UCAST_DROP和L2_NON_UCAST_TOCPU字段决定。
组播报文的处理流程与单播报文一样,如果在L2_ENTRY表中找到表项,则索引到L2MC表(8K表项)。
L2MC表中包含Port Bitmap表示报文转发的目的端口,但是首先要确认这些端口是不是VLAN域的成员,如果是,则为已知组播报文,否则为未知组播报文。转发策略由VLAN_PROFILE表项的L2_PFM字段决定。
L2_PFM为0时,所有组播报文在VLAN内洪泛。L2_PFM为1时,已知组播报文转发到L2MC表项的PORT_BITMAP指向的端口。未知组播在VLAN内洪泛。L2_PFM为2时,未知组播报文丢弃,已知组播报文转发到L2MC表项的PORT_BITMAP指向的端口。
广播报文的处理流程与单播报文一样,只不过在MAC地址学习之后,在VLAN内洪泛。
7、L3
交换芯片除了支持L2转发之外,还支持L3转发,即路由转发。路由转发允许不同VLAN的报文交互。路由转发基于目的IP,而不是目的MAC。
使能L3转发,需要使能PORT_TABLE或者LPORT_PROFILE_TABLE中的V4L3_ENABLE或者V6L3_ENABLE位,以及VLAN_PROFILE表中的IPV4L3_ENABLE或者IPV6L3_ENABLE位。
当报文进入L2查表转发流程时,如果在MY_STATION_TCAM表中找到表项且IPV4_TERMINATION_ALLOWED位或者IPV6_TERMINATION_ALLOWED位置位,则进入L3转发流程,否则执行L2转发流程。
L3转发第一阶段是在L3 Table中查找SIP,如果找不到,则L3 Hit不置位,转而查找DIP,报文可以被拷贝到CPU。如果找到SIP,则更新L3 Hit位,此时如果检测到Station Movement事件,则报文被转发到CPU并更新L3 interface table。
L3转发第二个阶段是在L3 Table中查找DIP,如果找到表项,则根据表项索引到ING_L3_NEXT_HOP或者EGR_L3_NEXT_HOP表。目的端口从ING_L3_NEXT_HOP表获取,下一跳MAC地址和指向EGR_L3_INTF表(包含路由MAC地址和VLAN for the egress port)的索引从EGR_L3_NEXT_HOP表获取。
8、IFP
IFP规则,主要是对指定类型的报文进行重定向、限速、包统计等动作,也可以编辑VLAN TAG信息。
9、Trunk
Trunk即聚合组,又称为链路聚合(Link Aggregation),是将多个物理端口聚合在一起达到更大带宽的手段,由IEEE 802.1ad协议定义。
BCM56440芯片最多支持128个聚合组,每个聚合组最多8个成员端口。
每个Trunk组维护一张TRUNK_GROUP表和一张TRUNK_BITMAP表。
TRUNK_GROUP表用来维护Trunk组信息,其中TG_SIZE字段表示成员端口数,BASE_PTR字段指向当前Trunk组在TRUNK_MEMBER表中的基地址(包含连续TG_SIZE个表项),RTAG字段配置Hash模式。
TRUNK_BITMAP表用来维护Trunk组成员端口位映射。
MMU阶段包括Buffering, Queue Shaper, Scheduler, Port Shaper几个子阶段,主要是报文缓存和入队列。
Egress阶段包括Packet Parser, L3 & Tunneling, EGR_VLAN_XLATE/VLAN/STP检查,Mirror, Packet Modify, ECAP,Loopback几个子阶段。