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