BCM芯片实现QinQ
背景
这篇文章主要讲解QinQ怎么在bcm芯片上实现,其实底层实现原理和盛科也差不多,就是在ingress方向对进入的报文进行802.1Q编辑。下面给出盛科QinQ开发文档连接,可供参考。
盛科芯片QinQ功能实现
56150芯片简介
博主使用的是bcm的一款56150 soc芯片,内部集成cpu。sdk软件版本为6.5.12不是最新的,但也不老。下面简单介绍下这款芯片对vlan的相关支持,有了这部分基础之后再进行开发。
芯片整体架构
vlan模块由VCAP处理器进行处理(Vlan ContentAware Processor)。
各个模块相当于一个个管道一样,组合成一个功能强大且丰富的集合。
VCAP
VCAP是博通芯片中一个针对vlan的感知处理器,VCAP包含以下功能模块。
bcm56150支持VFP、Vlan Translation、MAC Based Vlan、Subnet Based Vlan、Protocol Based Vlan、Port Based Vlan.下图就是介绍各个功能组件的组成以及各个组件的作用优先级。
- 报文首先经由Vlan Filter Process模块,如果匹配上就进入Ingress Tag Actions(一种vlan的操作集合,后面会介绍)编辑模式。
- VFP匹配失败,继续往下走,首先判断PORT有没有使能vlan translate,然后再匹配vlan xlate表项里面的规则,进而进入Ingress Tag Actions编辑模式。
- 同理第二部VT Hit失败后继续往下走,和本文无关的不多介绍。
- 当前面所有的组件都Hit不到时,进入port based规则,优先级最低。其实就是端口对vlan的默认操作,会使用ing_vlan_tag_action_profile 0的Ingress Tag Actions编辑规则,下面介绍cli时,针对untag–>double tag就是port based打上去的。
基于CLI的配置简介
借用vlan action进行port default配置以及translate配置。
为了便于理解ingress tag action配置,下面给出各种action解释。
每条vlan_xlate(Ingress vlan translate table)和egr_vlan_xlate(Egress vlan translate table)表项都会有一个指针,分别指向ING_VLAN_TAG_ACTION_PROFILE,EGR_VLAN_TAG_ACTION_PROFILE。每个profile都有以下成员。
VT_KEY_TYPE 索引值配置
基于端口QinQ
修改端口默认规则。
- vlan action port default add port=ge0 OuterVlan=1001(pvid) UtOuter=Add ItOuter=Add
- modi port 2 1 OUTER_TPID_ENABLE=0—关闭端口的tpid匹配规则,无需hit其他规则,直接进入port based.
灵活的QinQ
也可以叫做vlan-stacking技术,在原有的报文基础之上,外加一层vlan tag
- vlan action translate add Port=ge0 KeyType=PortInner OldInnerVlan=101 OuterVlan=1001 ItOuter=Add ItInner=None—添加一条vlan_xlate表项
- vlan action translate delete Port=ge0 KeyType=PortInner OldInnerVlan=101–删除vlan_xlate表项
- vlan action translate range add Port=ge0 InnerVlanLo=110 InnerVlanHi=120 OuterVlan=1001 ItOuter=Add ItInner=None—配置一条基于vlan range进行匹配的vlan_xlate表项
- vlan action translate range delete Port=ge0 InnerVlanLo=110 InnerVlanHi=120—删除基于vlan range匹配的vlan_xlate表项
- modi port 2 1 OUTER_TPID_ENABLE=4—修改相关寄存器,匹配tpid值
1:1Vlan-Mapping
- vlan action translate add Port=ge0 KeyType=PortInner OldInnerVlan=101 OuterVlan=1001 ItOuter=Add ItInner=None —基于指定tag匹配的vlan_xlate表项
基于action的动作ItInner =none:基于vlan的QinQ、=delete 1:1vlan mapping - vlan action translate delete Port=ge0 KeyType=PortInner OldInnerVlan=101—删除vlan_xlate表项
- vlan action translate range add Port=ge0 InnerVlanLo=110 InnerVlanHi=120 OuterVlan=1001 ItOuter=Add ItOuter=Add ItInner=Delete—基于vlan range匹配的vlan_xlate 表项
- vlan action translate range delete Port=ge0 InnerVlanLo=110 InnerVlanHi=120—删除vlan_xlate表项
- modi port 2 1 OUTER_TPID_ENABLE=4—和vlan stacking一样,需要匹配正确的tpid值
2:1、2:2Vlan-Mapping
所有的编辑方式上面都已阐述清楚,下面针对ingress double tag的报文进行编辑,从命令中就可以看到所要做的动作
- vlan action translate add Port=ge0 KeyType=PortDouble OldOuterVlan=101 OldInnerVlan=102 OuterVlan=1001 InnerVlan=2001 DtOuter=Replace
- vlan action translate delete Port=ge0 KeyType=PortDouble OldOuterVlan=101 OldInnerVlan=102
- modi port 2 1 VT_ENABLE=1(使能vlan translate) VT_KEY_TYPE_USE_GLP=1 VT_KEY_TYPE=0(匹配内外层tag)—基于端口的配置
- modi port 2 1 OUTER_TPID_ENABLE=1
- vlan action translate range add Port=ge0 OuterVlanLo=10 OuterVlanHi=100 OuterVlan=1001 InnerVlan=300 DtOuter=Replace DtInner=Replace—Inner Vlan是特指,Outer Vlan是区域匹配,目前sdk针对double tag的vlan range配置只支持这种配置
- modi port 2 1 VT_KEY_TYPE=4 默认为4,和vlan_xlate的type保持一致。上面有介绍基于OVID为健值匹配
Untag报文直接打双层标签
针对ingress方向的untag报文,走的是port based规则,并且按照UtOuter,UtInner配置的规则进行编辑。ItOuter=Add表示进入端口的单层tag报文,再打上一层Outertag,tag值就是port下配置的OuterVlan。
vlan action port default add port=ge0 OuterVlan=1001 InnerVlan=2001 UtOuter=Add UtInner=Add (ItOuter=Add 单层打上一层Outertag)