当前位置:编程学习 > 网站相关 >>

基于交换芯片的五元组过滤功能

基于交换芯片的五元组的PCL规则过滤功能
 
 
作者: 韩大卫@吉林师范大学
 
2012.12.10
 
Not Approved by Document Control
Review Copy Only
 
 
基于Marvell 98DX51xx/81xx交换芯片的五元组等的策略规则(PCL)过滤功能.现将部分的功能的底层实现予以简单介绍.
 
Contact author for detailed information: handawei@jusontech.com
 
 
Forward:
 
Marvell对PCL概念的定义是:
 
The Policy engine performs per-flow processing of packets received and  transmitted by the device.A packet can be bound to one or more sets of policy rules, which we call Policy Control Lists (PCL).
 
PCL:策略控制列表.可以理解为在交换芯片上实现的过滤规则列表.有一种类似的概念叫ACL.
 
ACL:Access Control List . 访问控制列表
 
一般来讲,ACL是用户层上下发的规则, 最终通过交换芯片或CPU来实现的,是一种用户层上定义的规则.PCL是底层的概念, 是交换芯片内部对此功能的定义,驱动工程师在操作系统底层软件提取出此交换芯片的PCL过滤功能(比如根据五元组,根据VLAN-ID, 根据是否ARP报文等等),封装成API类库供用户层使用, 用户层就可以综合使用这些API做成一条条过滤规则.
 
PCL是交换芯片较高级的功能,一般普通的二层/三层交换机的使用的低端交换芯片是没有的此功能的.很多网络安全设备(如防火墙,分流器等)的一部分实现也是基于此机制.
 
 
根据Marvell的datasheet, PCL对报文的处理是在L2/L3/L4之前,即
 
       Ingress Egress
Packet   -------------->    PCL     ----->  L2    ------> L3 -------> L4 ...-------------->  
 
 
报文 首先经过IPCL(Ingress PCL) Engine  处理, 根据报文的类型和PCL-ID生成一张IPCL Table , 此表的数据结构大致为:
 
9bit---0bit  PCL-ID
..
29bit---18bit   VID
..
49bit---42bit  Ip Protocol
..
130bit---99bit  SIP[4]
162bit---131bit  DIP[4]
 
...
 
 
完成此IPCL table后, 拿此表在TCAM中进行查找匹配, 匹配成功的条件是: 首先要PCL-ID相同, 如果规则制定了过滤条件, 那么依次匹配自定义的成员, 例如: 如想过滤出报文中VID为100的,那么只有IPCL table中VID位置为100 的数据结构(即相应的报文)可以被筛选出来, 进而执行TCAM中此表对对应的ACTION.从而完成了一次PCL过滤.
 
根据以上描述, 可以这样定义一个数据结构用来作为函数参数, 传递用户层的PCL指定规则
 
以下是PCL动作部分的定义, 关于IPCL Table等部分的制作略.
 
typedef struct  sw_pcl_action {
    BOOL_T                      enable;
    uint32_t                 index; //规则编号
    uint16_t                 pclid; //PCL-ID
    pcl_rule_key_t       pcl_key;     //过滤依据
    pcl_rule_action_t          pcl_action;       //动作描述
}sw_pcl_action_t;                                                                                                                
 
index即为TCAM查表做匹配时要匹配的表的编号.一个index编号为一条PCL规则, 有多少规则就需要执行多少次匹配查找.
 
 
其中,
typedef struct pcl_rule_key {
    char                     sip[4]; //源ip地址
    uint8_t                 smask; //源ip地址掩码
    char                   dip[4];
    uint8_t                 dmask;
    uint16_t               sport;               //源端口号
    uint16_t               spmask; //掩码
    uint16_t               dport;      
    uint16_t               dpmask;
    uint8_t                 protocol;         //协议号
    uint8_t                 tag;
    uint16_t                vid; //VID
....
}pcl_rule_key_t;
 
 
typedef struct  pcl_rule_action {    
    uint32_t               intf_id; //出接口
    pcl_action_cmd_type     intf_cmd; //动作类型
    InterFace_Type           intf_type; //接口类型
}pcl_rule_action_t;     
 
//动作类型
typedef enum {
    PCL_ACT_FOR = 0, //默认转发
    PCL_ACT_DROP, //丢弃
    PCL_ACT_NOT //不做动作
}pcl_action_cmd_type;
 
//接口类型
typedef enum {
    PCL_INTF_PORT = 0, //默认是端口
    PCL_INTF_VLAN, //VLAN
    PCL_INTF_TRUNK, //trunk
    PCL_INTF_DEV, ...
    PCL_INTF_VIDX,
    PCL_INTF_INDEX,
 ....
}InterFace_Type;
 
 
常用的过滤有如下:
 
基于五元组, 即基于源IPv4地址,源端口号,目的IPv4地址,目的端口号,协议号.
 
基于报文本身是否有tag.
 
基于报文本身的VLAN-ID.
 
基于报文是否为ARP报文.
 
基于报文是否为IP报文.
 
基于报文是否为IPv4/v6报文.
 
基于报文是否有分片.
 
 
如果使用VID子作为过滤条件, 此VID为进过PVID处理后, 报文此时携带的tag中的VLAN-ID.
 
 
将VID装入 pcl_action.pcl_key.vid , 通过msg发送至底层驱动.底层函数解析出此vid,将其赋值给配置寄存器的数据结构.
 
  
mask->ruleStdIpv4L4.common.vid                  = 0xffff;
pattern->ruleStdIpv4L4.common.vid               = key_info.vid;
 
理论上此VLAN-ID可配合掩码使用,实现过滤指定范围内的VLAN-ID. 但此功能目前尚未提供.
可参考后面端口号 + 掩码部分.
 
 
 
基于五元组的过滤可以使用掩码.说明如下:
 
如果使用基于源IP地址 + 掩码作为过滤条件, 如192.163.10.10/24
 
 
需要将192.163.10.10 分成四个uint8_t 类型的数值, 装在 uint8_t key_info.sip[4] 中. 
 
最后, 将此k
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,