1 S9999 Vlan的实现方式
1.1 普通端口之间的报文处理流程
S9999 在普通端口模式下(access与trunk)在芯片内部使用Inner Vlan进行转发,QinQ端口使用Outer Vlan进行转发。所有的端口,不论是access、trunk,还是QinQ模式的端口,Outer TPID掩码都配置为0x0,即不再识别报文的outer tag。
1.1.1 Ingress报文Tag识别流程
报文Tag识别流程如下图:
从流程图中可以看出,当报文到达以后,首先匹配的O-TPID,之后是I-TPID,在现有的Vlan实现中,O-TPID的mask配置为0,即不会识别出报文的Outer Tag,认为报文都是Outer Untag的,之后在芯片内部为报文加上O-TPID。
a . untag报文被识别成inner untag + outer untag类型的报文。报文进入芯片后被加上了Inner PVID和Outer PVID
b. single tag报文被识别成了inner tag + outer untag类型的报文,报文进入芯片内部以后被加上了Outer PVID
c. double tag报文被识别成了inner tag + outer untag类型的报文,报文进入芯片内部后被加上了Outer PVID,原始报文中的TagB在芯片内部当做数据,不再走Vlan处理流程。
1.1.2 Access(Trunk)与Access(Trunk)类型的端口之间Untag报文与Single Tag的报文处理过程
Vlan实现时,Access、Trunk口Ingress的Keep值为:
IGR_P_ITAG_KEEP=0,
IGR_P_OTAG_KEEP=1
Vlan实现时,Access、Trunk口Egress的Keep值为:
EGR_P_ITAG_KEEP=1
EGR_P_OTAG_KEEP=1
Access与Trunk使用Inner Vlan转发,untag报文的inner vlan来自于端口的Inner PVID,single tag报文来自于原始报文的Vlan。这两种类型的报文在芯片类型的处理方式类似。
报文经过VLAN Table Loopup、L2 Process之后,到达出端口,在出端口的时候,满足,Rx_Port.IGR_P_OTAG_KEEP=1&Tx_Port.Egr_P_OTAG_KEEP=1,报文在出口时,会再次剥掉Outer Vlan,和原始报文保持一致。
在出端口的时候, Rx_Port.IGR_P_ITAG_KEEP=0&& Tx_Port.Egr_P_OTAG_KEEP=1,Inner Tag不能保持原始报文状态,会根据vlan中该端口的tag/untag状态去选择剥除vlan或者保留vlan。
1.1.3 Access(Trunk)与Access(Trunk)类型的端口之间Double Tag的报文处理过程
与Access、Trunk下single报文类似,double tag报文进入芯片之后,还是会由于Outer TPID的识别模式,而加上一层Outer PVID。
TagA在内部当做Inner Tag,用于进行转发,TagB被当做数据处理,始终不会有变化。在Egress出,Outer VLAN(来自于O-PVID),根据KEEP值被剥除,TagA根据Vlan下的端口状态选择剥除或者不剥除。
1.2 QinQ端口与Trunk口之间的报文处理流程
Vlan实现时,QinQ端口Ingress的Keep值与一般模式有区别,为:
IGR_P_ITAG_KEEP=1,
IGR_P_OTAG_KEEP=0
Vlan实现时,QinQ端口Egress的Keep值与一般模式相同,为:
EGR_P_ITAG_KEEP=1
EGR_P_OTAG_KEEP=1
QinQ端口使用Outer Vlan转发,untag报文的inner vlan为来自于端口的Inner PVID,single tag报文来自于原始报文的Vlan。
QinQ端口处理untag报文时,端口设置成outer vlan转发和inner vlan转发的效果是一样的,因为实现vlan时所以的端口的 Outer PVID和Inner PVID的值是一样的。
QinQ端口处理single tag报文时,与其它端口在业务上的区别是,QinQ端口不能使用原始报文中的Vlan来进行转发,只能使用端口的PVID进行转发,原始报文的vlan在芯片内部识别成inner vlan,不能设置QinQ端口为Inner Vlan转发模式,所以QinQ端口必须设置成Outer Vlan转发模式。
1.2.1 上行QinQ业务流
上行QinQ业务流是指从QinQ端口到Trunk口的业务流。从QinQ端口进来的流分为两种,untag报文、single tag报文,对应的从Trunk口出去的报文为single tag、double tag报文。
这两种类型的报文在芯片类型的处理方式类似。
a.上行untag报文
上行的untag报文会同时被打上Inner PVID、Outer PVID,此时使用内层Vlan转发与使用外层Vlan转发的效果是一样的。
在从Trunk口出去的时候,Rx_Port.IGR_P_ITAG_KEEP=1&& Tx_Port.Egr_P_ITAG_KEEP=1,Inner Vlan会保持原有状态,被剥除。
在从Trunk口出去的时候,Rx_Port.IGR_P_OTAG_KEEP=0&& Tx_Port.Egr_P_OTAG_KEEP=1,Outer Vlan,会根据vlan中该端口的tag/untag状态去选择剥除vlan或者保留outer vlan.
b.上行single tag报文
QinQ端口特殊的地方在于,QinQ端口不能使用原始报文中的Vlan来进行转发,只能使用端口的PVID进行转发。
当Single Tag报文进入到QinQ端口时,会打上O-PVID,由于配置了外层转发模式,所以QinQ端口的报文进入Vlan Table Lookup的时候会根据Outer Vlan(通过Outer PVID得到)来转发。
1.2.2 下行QinQ业务流
a、下行single tag报文
下行的single tag报文,进入到trunk口,被打上outer pvid,根据outer vlan进行转发,发送到QinQ端口,由于:
Rx_Port.IGR_P_OTAG_KEEP=1&& Tx_Port.Egr_P_OTAG_KEEP=1,Outer Vlan直接剥掉。由于:
Rx_Port.IGR_P_ITAG_KEEP=0&& Tx_Port.Egr_P_ITAG_KEEP=1,Inner Vlan会根据vlan中该端口的tag/untag状态去选择剥除inner vlan。
b、下行double tag报文
TagA在内部当做Inner Tag,用于进行转发,TagB被当做数据处理,始终不会有变化。Trunk口设置成了Inner Vlan转发,会有以下处理流程:
a、Inner Vlan也就是TagA所在的Vlan是Vlan-A
b、我的端口是Port Num,该端口加入了Vlan-A吗?
c、如果没有加入,丢弃该报文;如果加入了,则在该Vlan里面查找端口,会根据L2 Mac地址表查找,查找完以后,会发送到目的端口,如QinQ。到达QinQ端口以后,由于
Rx_Port.IGR_P_OTAG_KEEP=1&& Tx_Port.Egr_P_OTAG_KEEP=1 Outer Vlan直接剥掉。由于:
Rx_Port.IGR_P_ITAG_KEEP=0&& Tx_Port.Egr_P_ITAG_KEEP=1, Inner Vlan会根据vlan中该端口的tag/untag状态去选择剥除outer vlan,出去的时候,报文只带有TagB。
1.3 QinQ端口与Trunk口的对比
Tag、报文处理
出口 入口 | Trunk | QinQ |
Trunk | Keep剥除Outer Vlan,Inner Vlan转发 | Keep剥除Outer Vlan,Inner Vlan转发 |
QinQ | Keep剥除Inner Vlan,Outer Vlan转发 |
|