概述
ACL(Access Control List)訪問控制列表,俗稱“防火牆”,它的作用是對入端口報文進行分類和過濾。
博通XGS系列交換芯片使用ContentAwareTM核(早期稱為Fast Filter Processor)實現ACL功能,包括以下三種:
- VLAN ContentAware Processor (VCAP,也稱為VFP - VLAN Filter Processor)
- Ingress ContentAware Processor (ICAP,也稱為IFP - Ingress Filter Processor)
- Egress ContentAware Processor (ECAP,也稱為EFP - Egress Filter Processor)
它們在報文處理流水線中的位置如下圖所示:
如下圖所示,每個ContentAwreTM核包含多個並行的引擎隊(Slices)。每個Slice由一組Intelligent Protocol Aware Selector、Look-up Engine、Policy Engine、Metering Stats Engine組成,主要負責報文分類、轉發策略、限速和包統計,應用於QoS、ACLs和DSCP等場景。
通俗講,就是VFP/IFP/EFP分別包含多個Slices,每個Slice(可以創建一個Group)包含多個Entries,每個Entry可以實現一個ACL規則(亦稱“FP規則”)。因此一個報文可以同時匹配到不同Slice的ACL規則。當一個報文匹配到多個ACL規則時,如果Action不沖突,則都會進行處理;如果Action沖突,則優先級高的Action生效。
默認情況下,一個Slice是Single-Wide模式,匹配的報文字段位寬比較有限。如果需要匹配更多的字段,則需要按照下圖所示進行拼接。
第一種是將一個Slice的規則分為前后兩部分,拼成Double-Wide模式。第二種是用兩個Slice,拼成Slice-Paring模式。
有的芯片還可以同時支持上述兩種拼接方式,構成Quad-Wide模式,如下圖所示。這種模式一般用來匹配IPv6報文。
原則上,不同Slice(Group)之間,Slice序號越大,優先級越高。同一個Slice內部,不同FP Entries,根據優先級屬性決定優先級順序,數字越大,優先級越高。
原理分析
1、Intelligent Protocol-Aware Selector根據Slice配置的key(即創建FP Group時是指定的qset字段)解析報文,生成一組key值;
2、Lookup Engine將前面獲取的一組key值與Slice內每個FP Entry(按照優先級從高到低的順序)的Qualifer配置進行比較,找到第一個匹配的FP Entry;
3、Policy Engine根據前面匹配的FP Entry,選擇其配置的Action;
4、Metering and Statistics Engine負責響應前面匹配的FP Entry的meter和stat動作;
5、Action Resolution Engine負責對匹配多個ACL規則的報文的轉發action進行裁決,決定報文如何轉發。
VFP(VLAN Filter Processor)
VFP支持VLAN編輯、可以匹配其他報文字段,因此,通常用來實現靈活QinQ域功能。
IFP(Ingress Filter Processor)
主要對入端口報文進行處理,包括入口ACL、流重定向、流鏡像、設置下一跳、為QoS數據報文分類等用途;
EFP(Egress Filter Processor)
用途與IFP類似,但是在出端口之前進行處理。
表項資源
FP本質上是一組相互之間有關聯的表(Tables),FP查找主要用到Index查找和TCAM查找。
Qualifier
SDK命令fp list qualifiers可以列出所有支持的Qualifier類型,以下只介紹幾個關鍵的、生僻的字段。
IpInfo
報文IP頭狀態
IpInfo (3bit) | 類型 | 描述 |
0 | FIRST_FRAGMENT | IPv4/IPv6超長幀在網絡中通常會進行分片傳輸。 對於IPv4報文(無論是分片包還是完整包),IPv4頭的Fragment Offset域為0則匹配規則。 對於Ipv6報文,找不到Fragment擴展頭或者Fragment擴展頭的Fragment Offset域為0則匹配規則。 |
1 | WHOLE_PACKET | 只匹配IPv4/IPv6整包。 對於IPv4報文,IPv4頭的MF位為0且Offset域為0則匹配規則。 對於IPv6報文,找不到Fragment擴展頭或者Fragment擴展頭的Fragment Offset域和MF位為0則匹配規則。 |
2 | IP4_GOOD_CHKSUM | IPv4校驗OK則匹配,對於IPv6報文,不感知。 |
PacketRes
Packet Resolution Status (4bit) | 報文類型 | 描述 |
4'd0 | Unknown Packet | 以下列出的報文類型之外的報文 |
4'd1 | Control Packet | EtherType 0x8808的以太網控制幀 |
4'd2 | BPDU Packet | L2_USER_ENTRY table hit with BPDU bit set |
4'd3 | L2 Broadcast Packet | 目的MAC為全F的廣播報文 在VLAN內洪泛的IGMP_MLD_PKT_CONTROL寄存器定義的協議報文 |
4'd4 | L2 Unicast Packet | 在L2/L2_USER_ENTRY中查找到目的MAC的報文 |
4'd5 | L2 Destination Lookup Failure Packet | 在L2/L2_USER_ENTRY中查找不到目的MAC的報文 目的MAC和SVLAN在L2/L2_USER_ENTRY中查找到的表項為Pending狀態的報文 |
4'd6 | Unknown IP Multicast Packet | IPv4頭校驗失敗報文 DIP不是組播地址,或者SIP是Martian地址 IPv4的目的MAC低23位和DIP不匹配 IPv6的目的MAC低32位和DIP不匹配 查找IPMC表失敗 L3_ENTRY表中找到IPMC索引,但是IPMC索引非法或者端口匹配失敗 |
4d'7 | Known IP Multicast Packet | L2_ENTRY查表找到表項,且IPMC索引有效 |
4d‘8 | Known L2 Multicast Packet | 包括L2組播包和GPON/VPLS組播包 |
4d'9 | Unknown L2 Multicast Packet | 非法組播報文 目的MAC查找失敗 目的MAC查找到L2表項,但是L2MC索引無效或者L2MC表項的VALID位置0 查找到無效IPMC索引的GPON/VPLS組播報文 |
4d'10 | Known L3 Unicast Packet | 目的IP查找到L3 Table表項 |
4d'11 | Unknown L3 Unicast Packet | 目的IP查找L3 Table表項失敗 包含Hop-By-Hop擴展頭的IPv6報文 L3 SIP或者DIP不是有效的單播地址 TTL為0 IPv4 packet with options present and TTL is 1 校驗失敗的IPv4報文 |
4d'12 | Known MPLS Packet | MPLS_ENTRY lookup hit and not terminated |
4d'13 | Known L3 MPLS Packet | Terminated L3 MPLS packet |
4d'14 | Known L2 MPLS Packet | Terminated VPLS/VPWS packet |
4d'15 | Unknown MPLS Packet | MPLS_ENTRY表查找失敗 MPLS_ENTRY表查找成功,但是MPLS_ENTRY表項ACTION域無效 Payload is IPv4 (or IPv6) but V4_ENABLE (or V6_ENABLE) bit in matched MPLS_ENTRY entry is not set |
UDF(User Defined Field)
UDF自定義字段,可以匹配報文前128字節的任意字段,以4字節為單位,但是可以通過掩碼匹配任意位寬。
命令測試:
BCM.0> fp init
BCM.0> BCM.0> fp data create OffsetBase=PacketStart offset=12 length=2 (PacketStart指從報文L2頭開始,即目的MAC字段開始,length指定長度) Data qualifier created with id: 4 (返回QualId) BCM.0> BCM.0> fp data format add QualId=4 RelativeOffset=0 L2=any VlanTag=any OuterIp=any InnerIp=any Tunnel=Any mpls=any BCM.0> BCM.0> fp qset add data 4 BCM.0> BCM.0> fp group create 0 1 BCM.0> BCM.0> fp entry create 1 100 BCM.0> BCM.0> fp qual 100 data 4 0x8100 0xffff BCM.0> BCM.0> fp action add 100 drop
BCM.0> BCM.0> fp entry install 100
查看FP規則:
BCM.0> fp show entry 100 EID 0x00000064: gid=0x1, slice=0, slice_idx=0, part =0 prio=0, flags=0x10202, Installed, Enabled tcam: color_indep=0, Stage _bcmFieldQualifyData Offset: 51 Width: 128 (此處,Offset顯示不准確,實際以命令或者代碼配置為准) DATA=0x00008100 00000000 00000000 00000000 MASK=0x0000ffff 00000000 00000000 00000000 action={act=Drop, param0=0(0), param1=0(0), param2=0(0), param3=0(0)} policer= statistics=NULL
相關API接口:
基於(base_offset + offset) / length 創建自定義qualifier
extern int bcm_field_data_qualifier_create(int unit, bcm_field_data_qualifier_t *data_qualifier);
獲取指定qualid的qualifier配置
extern int bcm_field_data_qualifier_get(int unit, int qual_id, bcm_field_data_qualifier_t *qual);
刪除指定qualid的qualifier
extern int bcm_field_data_qualifier_destroy(int unit, int qual_id);
配置UDF字段的匹配信息
extern int bcm_field_qualify_data(int unit, bcm_field_entry_t eid, int qual_id, uint8 *data, uint8 *mask, uint16 length);
Actions
SDK命令fp list actions可以列出所有支持的Action動作。
動作的優先級順序為:Drop > Replace > Redirect > EgressMask > CopyToCpu。
SDK命令