三層交換機之ACL


概述

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命令

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM