VLAN是用來划分廣播域,BCM56440支持4094個VLAN(博通后續芯片都是支持4096個VLAN),同時支持IEEE 802.1Q tagged, MAC-based, IP subnet-based, protocol-based, port-based, and flow-based VLANs。
Tagging Status Decision
每個VLAN支持一組成員端口,由VLAN表管理,每個端口可以在多個VLAN廣播域。
VLAN表是一個以VLAN ID為索引的表,每個表項描述了VLAN廣播域的屬性,其中PORT_BITMAP字段是成員端口的位映射表。
BCM.0> dump chg vlan 100 1 VLAN.ipipe0[100]: <VLAN_PROFILE_PTR=1,VALID_0=1,VALID=1,STG=1,PORT_BITMAP_W1=0x1f8,PORT_BITMAP_W0=0x1e0001ff,PORT_BITMAP=0x0000000000000000000000000000000001f81e0001ff,>
BCM.0> pbmp 0x1e0001ff
0x000000000000000000000000000000000000000000000000000000001e0001ff ==> cpu,ge0-ge10,xe
BCM56440支持4個全局外層TPID,由ING_OUTER_TPID_0/1/2/3四個寄存器配置,每個端口的PORT.OUTER_TPID_ENABLE字段包含4個bit位,表示端口支持哪些外層TPID。全局內層TPID通過VLAN_CTRL.INNER_TPID字段配置,對所有端口默認生效。
BCM.0> getreg ING_OUTER_TPID_0 ING_OUTER_TPID_0.ipipe0[1][0xa001700]=0x8100: <TPID=0x8100> BCM.0> getreg ING_OUTER_TPID_1 ING_OUTER_TPID_1.ipipe0[1][0xa001800]=0x9100: <TPID=0x9100> BCM.0> getreg ING_OUTER_TPID_2 ING_OUTER_TPID_2.ipipe0[1][0xa001900]=0x88a8: <TPID=0x88a8> BCM.0> getreg ING_OUTER_TPID_3 ING_OUTER_TPID_3.ipipe0[1][0xa001a00]=0: <TPID=0> BCM.0> getreg VLAN_CTRL VLAN_CTRL.ipipe0[1][0x6000200]=0x10200000: <USE_LEARN_VID=0,LEARN_VID=0, INNER_TPID=0x8100> BCM.0> dump chg PORT 1 1 PORT.ipipe0[1]: <VT_PORT_TYPE_SELECT_2=1,VT_PORT_TYPE_SELECT=1,VT_KEY_TYPE_2=4,VT_KEY_TYPE=0xf,VT_ENABLE=1,VLAN_PROTOCOL_DATA_INDEX=1,VFP_ENABLE=1,V6L3_ENABLE=1,V4L3_ENABLE=1,TRUST_INCOMING_VID=1,SUBNET_BASED_VID_ENABLE=1,STORM_CONTROL_PTR=1,PRI_MAPPING=0xfac688,PORT_VID=0xff8,OVID=0xff8,OUTER_TPID_ENABLE=5,OAM_ENABLE=1,MPLS_ENABLE=1,MIM_TERM_ENABLE=1,MAC_BASED_VID_ENABLE=1,IPRI_MAPPING=0xfac688,INNER_TPID_ENABLE=1,ICFI_1_MAPPING=1,FP_PORT_FIELD_SEL_INDEX=1,FILTER_ENABLE=1,DATA_3=0x08000000000000080000000000,DATA_2=0x00001f58d108040000000000000000,DATA_1=0x160000002000000000040df58d1111,DATA_0=0x00114f000a800080000007fc618000,CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,CLASS_BASED_SM_ENABLE=1,CFI_1_MAPPING=1,>
對於入端口報文,按照以下策略判斷報文類型:
1)Double Tagged(DT) 第12,13字節匹配端口任意外層TPID,第16,17字節匹配全局內層TPID;
2)Single Outer-tagged(SOT) 第12,13字節匹配端口任意外層TPID,第16,17字節不匹配全局內層TPID;
3)Single Inner-tagged(SIT) 第12,13字節不匹配端口任意外層TPID,但是匹配全局內層TPID;
4)Untagged 第12,13字節不匹配端口任意外層TPID且不匹配全局內層TPID。
BCM SDK API接口:
bcm_port_tpid_set() bcm_port_tpid_get()
bcm_port_tpid_add() bcm_port_tpid_delete()
bcm_port_inner_tpid_set() bcm_port_inner_tpid_get()
IEEE 802.1Q標准規定VLAN TAG報文TPID值為0x8100,因此,通常情況下,報文的內外層VLAN的TPID值均為0x8100。
QinQ封裝的IEEE 802.1ad標准在2006年5月才通過,該標准規定外層VLAN的TPID值為0x88a8。此時,部分廠家已使用0x9100和0x9200作為外層TPID,因此,通常情況下需要兼容0x8100/0x88a8/0x9100/0x9200四種外層TPID。
Ingress Filtering是BCM56440芯片的一個特性,如果使能PORT.EN_IFILTER位,會丟棄除端口所在VLAN域以外的其他VLAN tagged的報文。
VLAN Assignment
MAC地址學習和轉發的VLAN通過以下配置指定:
1) Packet's tags 入端口報文攜帶的VLAN標簽
2) VFP classifying flow based on L2/L3/L4 fields
3) VLAN translation
4) VLAN_SUBNET table
5) VLAN_PROTOCOL table
6) Default port based outer VLAN 端口默認外層VLAN
Ingress方向,報文首先匹配VFP表項,VFP表項通常用來實現靈活QinQ域,因為VFP表項在執行VLAN編輯的動作之前,可以檢查報文的其他字段,如以太網類型、IP協議類型、L4端口號、目的MAC、源MAC等。VFP表項自帶action,配置到VFP_POLICY_TABLE表。
如果報文沒有命中VFP表項,而PORT.VT_ENABLE使能,則進一步匹配VLAN_XLATE表項。VLAN_XLATE表為Hash索引,索引的KEY值由PORT.VT_KEY_TYPE和PORT.VT_KEY_TYPE_USE_GLP決定。如果找到匹配的VLAN_XLATE表項,則從VLAN_XLATE表項中獲取VLAN ID,VLAN_XLATE.TAG_ACTION_PROFILE_PTR指向ING_VLAN_TAG_ACTION_PROFILE,從中獲取action,共同實現VLAN編輯。
如果PORT.VT_ENABLE使能,但是報文未命中VLAN_XLATE表項。此時,如果PORT.VT_MISS_DROP使能,則丟棄報文,否則,進入下一步處理流程。
如果沒有命中VLAN_XLATE表項且報文是SIT的,則檢查PORT.USE_IVID_AS_OVID,如果為1,則在后續的處理過程中,將IVID當OVID使用。
接下來,由PORT.VLAN_PRECEDENCE位決定匹配subnet表(包括VLAN_SUBNET表和VLAN_SUBNET_DATA表)和MAC表(VLAN_MAC表)的先后順序,如果為1,則先匹配subnet表,否則,先匹配MAC表。
如果subnet表和MAC表都未命中,則匹配protocol-based VLAN表(包括VLAN_PROTOCOL表和VLAN_PROTOCOL_DATA表)。
如果protocol-based VLAN表也沒有命中,則使用PORT表中的默認VLAN ID。
需要注意的是,subnet/MAC/protocol/port-based表的action都是從ING_VLAN_TAG_ACTION_PROFILE獲取。
查看VLAN_XLATE/EGR_VLAN_XLATE表項時,主要關注以下字段即可:
BCM.0> dump chg vlan_xlate PORT_NUM IVID OVID NEW_IVID NEW_OVID TAG_ACTION_PROFILE_PTR VLAN_XLATE.ipipe0[96]: <TAG_ACTION_PROFILE_PTR=1,PORT_NUM=1,OVID=5,NEW_OVID=0x12c,NEW_IVID=0x14a,IVID=0xe6,> VLAN_XLATE.ipipe0[320]: <TAG_ACTION_PROFILE_PTR=1,PORT_NUM=1,OVID=5,NEW_OVID=0x12c,NEW_IVID=0xec,IVID=0x88,> VLAN_XLATE.ipipe0[544]: <TAG_ACTION_PROFILE_PTR=1,PORT_NUM=1,OVID=5,NEW_OVID=0x12c,NEW_IVID=0x135,IVID=0xd1,> VLAN_XLATE.ipipe0[768]: <TAG_ACTION_PROFILE_PTR=1,PORT_NUM=1,OVID=5,NEW_OVID=0x12c,NEW_IVID=0x123,IVID=0xbf,>
VLAN Tag Action
在Ingress方向,經過Ingress VLAN tag actions,交換機內部所有報文都會變成SOT或者DT報文。轉換后的Outer VLAN ID用來進行L2/L3處理。outer VLAN ID,inner priority和packet priority可以被IFP規則更改。
在Egress方向,內外層VLAN ID可以被EGR_VLAN_XLATE和egress VLAN actions更改,因此,出口報文可以是untagged,SIT,SOT或者DT報文。每個egress端口可以配置端口級或者VLAN級的outer TPID,inner TPID則是系統級配置。內外層VLAN tag也可以被EFP規則更改。
當EGR_VLAN_CONTROL_1[egress_port].OUTER_TPID_SEL決定是從EGR_VLAN_CONTROL_1[egress_port].OUTER_TPID_INDEX還是EGR_VLAN[outer VLAN ID].OUTER_TPID_INDEX獲取outer TPID索引,該索引為2bits,正向EGR_OUTER_TPID表。出口報文inner TPID由EGR_CONTROL.INNER_TPID決定。
BCM.0> getreg EGR_OUTER_TPID EGR_OUTER_TPID(0).epipe0[2][0xa000000]=0x8100: <TPID=0x8100> EGR_OUTER_TPID(1).epipe0[2][0xa000100]=0x9100: <TPID=0x9100> EGR_OUTER_TPID(2).epipe0[2][0xa000200]=0x88a8: <TPID=0x88a8> EGR_OUTER_TPID(3).epipe0[2][0xa000300]=0: <TPID=0>
VLAN Check
經過前面的處理流程之后,入端口報文被轉成DT或者SOT報文,緊接着是VLAN check,即VLAN表和VAN_STG表檢查,其目的是進行L2轉發。
VLAN表提供了FID、L2_ENTRY_KEY_TYPE等轉發信息。當SVL(Shared VLAN)特性使能時,FID被用來進行學習和轉發。L2_ENTRY_KEY_TYPE配置的L2 Lookup的KEY值。
Shared VLAN
BCM56440支持IVL(Independent VLAN Learning)和SVL(Shared VLAN Learning)兩種模式。IVL模式下,每個VLAN獨自學習MAC生成轉發表,VLAN之間不能共享轉發表項。SVL模式可以通過ING_CONFIG_64寄存器配置(芯片級配置),當使能SVL模式時,通過VLAN表的FID字段(VLAN.FID_ID)將多個VLAN關聯起來,所有的學習和轉發都基於FID+MAC表項,而不是VID+MAC表項。組播轉發如果要使用FID轉發,可以通過ING_CONFIG_64.LOOKUP_L2MC_WITH_FID_ID配置。
BCM.0> getreg ING_CONFIG_64 SVL_ENABLE LOOKUP_L2MC_WITH_FID_ID ING_CONFIG_64.ipipe0[0x1180600]=0x1802080300a: <SVL_ENABLE=0,LOOKUP_L2MC_WITH_FID_ID=0>
關於FID,描述如下:
Addressing information that the device learns about a VLAN is stored in the filtering database assigned to that VLAN. Several VLANs can be assigned to the same FID to allow those VLANs to share addressing information. This enables the devices in the different VLANs to communicate with each other when the individual ports have been configured to allow communication to occur. The configuration is accomplished using the Local Management VLAN Forwarding Configuration screen. By default a VLAN is assigned to the FID that matches its VLAN ID.