基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫@吉林师范大学2012.12.10Not Approved by Document Control
Review Copy Only基于Marvell 98DX51xx/81xx交换芯片的五元组等的策略规则(PCL)过滤功能.现将部分的功能的底层实现予以简单介绍.Contact author for detailed information: handawei@jusontech.comForward: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-IDpcl_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,                   //VLANPCL_INTF_TRUNK,               //trunkPCL_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] 中. 最后, 将此key_info.sip [] 封装到一个数据结构msg中, 通过socket发送到底层驱动,底层函数收到此msg, 解析出key_info.sip [] 的成员, 将4个成员以网络字节序分步填充一个uint32_t类型的成员.pattern->ruleStdIpv4L4.sip.u32Ip  |= (key_info.sip[0] & 0xff) << 24; pattern->ruleStdIpv4L4.sip.u32Ip  |= (key_info.sip[1] & 0xff) << 16;                                                        pattern->ruleStdIpv4L4.sip.u32Ip  |= (key_info.sip[2] & 0xff) << 8;pattern->ruleStdIpv4L4.sip.u32Ip  |= (key_info.sip[3] & 0xff) << 0;note :
key_info.sip[]承载的是此IP地址, 即192.163.10.10
pattern->ruleStdIpv4L4.sip.u32Ip  就是底层需要填充的uint32_t成员, 配置交换芯片寄存器时,依赖的即此变量与mask部分中对应变量的按bit相与的结果.同时, 需要将掩码24也传至底层, 填充u32Ip同时配置一个相应的uint32_t mask 的掩码.mask->ruleStdIpv4L4.sip.u32Ip = ~0<<(32 - key_info.smask);    (如果key_info.smask 为24, 得出结果为: 0xffffff00)note :
key_info.smask 承载的是此IP地址的掩码, 即24.
mask->ruleStdIpv4L4.sip.u32Ip 是需要配置的掩码, 配置交换芯片寄存器时, 需要将pattern部分与此mask的相应部分按bit相与, 其结果为寄存器真正的有效位.最后还要:pattern->ruleStdIpv4L4.sip.u32Ip &= mask->ruleStdIpv4L4.sip.u32Ip;要保证mask为0 的部分 pattern的也为0 .例:如 mask->ruleStdIpv4L4.sip.u32Ip 为 0xffffff00 (mask 为24) ,
pattern->ruleStdIpv4L4.sip.u32Ip 为  0xc0a30a0a( IP为 192.163.10.10)那么pattern->ruleStdIpv4L4.sip.u32Ip最后需要变为 0xc0a30a00.使用目的IP地址 + 掩码 作为过滤的判定条件, 如 192.163.10.20/24
则将192.163.20.10 分成四个uint8_t 类型的数值, 装在 uint8_t key_info.dip[4]中, 其他原理同上. 使用源端口号作为过滤判定条件, 如 200 .  需要将此数值 传入uint16_t类型的key_info.sport.  通过msg发送出去, 在底层, 将此值拆成两个uint8_t 数值, 按网络字节序传入 pattern->ruleStdIpv4L4.l4Byte1和 pattern->ruleStdIpv4L4.l4Byte0中. 其对应的掩码使用0xff.mask->ruleStdIpv4L4.l4Byte1          = 0xff;pattern->ruleStdIpv4L4.l4Byte1       = (GT_U8)(key_info.sport & 0xff);mask->ruleStdIpv4L4.l4Byte0           = 0xff;pattern->ruleStdIpv4L4.l4Byte0        = (GT_U8)(key_info.sport >> 8);                                                        使用协议号作为过滤判定条件, 将数值传入 key_info.protocol,底层驱动中填入mask和pattern的如下部分.mask->ruleStdIpv4L4.commonStdIp.ipProtocol      = 0xff;
        pattern->ruleStdIpv4L4.commonStdIp.ipProtocol   = key_info.protocol;使用目的端口号作为过滤的判定条件, 将数值传入key_info.dport, 其他原理同上.************** ************************************以下部分与驱动无关,可以略过.***************** *********************************使用一段范围的源端口号作为过滤的判定条件,  如 80-8080.需要使用一个或多个配合端口号的掩码共同使用.简单的应用例子:源端口号64-65535,即大于源端口号大于等于64的范围内作为过滤判定条件.64 的二进制 为:  0000 0000 0100 0000那么需要的掩码为: 1111 1111 1100 0000 即0xffc0令  key_info.sport   = 64;
key_info.spmask = 0xffc0;在底层:mask->ruleStdIpv4L4.l4Byte1          = (GT_U8)(key_info.spmask & 0xff); pattern->ruleStdIpv4L4.l4Byte1       = (GT_U8)(key_info.sport  & 0xff);mask->ruleStdIpv4L4.l4Byte0           = (GT_U8)(key_info.spmask >> 8); pattern->ruleStdIpv4L4.l4Byte0        = (GT_U8)(key_info.sport  >> 8);                                                        如果源端口号的二进制中1的bit为多个, 那么需要多个mask来配合使用. 即多个PCL规则配合使用.如: value = 80   根据特定算法, 可以得出一下几个mask:80:          0000 0000 0101 0000mask1:   1111 1111 1000 0000   mask2:    0000 0000 0110 0000 mask3:      0000 0000 0101 0000 note:文档附录中包含此计算掩码数组的函数pattern1: 1000 0000 0000 0000
pattern1:   0100 0000 0000 0000
pattern1:   0010 0000 0000 0000
pattern1:   0001 0000 0000 0000
pattern1:   0000 1000 0000 0000
pattern1:   0000 0100 0000 0000
pattern1:   0000 0010 0000 0000
pattern1:   0000 0001 0000 0000
pattern1:   0000 0000 1000 0000pattern2:    0000 0000 0110 0000
pattern3:   0000 0000 0101 0000note: 如果(x & mask )== pattern  ,那么这是一次成功匹配.每个mask均有相同的转发规则, 报文依次匹配mask1,mask2,mask3 , 命中任一个mask,说明报文的源端口号大于或等于80.执行PCL的设定的转发动作, 如果都没有匹配成功, 不在次范围内, 不执行次系列的PCL转发规则.由于通过掩码的方式只能判断出一个数是否在一个值之上,即是否大于或等于一个数,因此,在处理一个范围的上限时, 需要对PCL的动作进行设定, 即, 当判断出一个数大于此范围的最大值时, 需要对其执行丢弃或不执行此系列的PCL转发规则处理.例: 过滤出源端口号为: 80-8000范围内的报文,执行PCL动作1.实现此功能分两步 可以使用比较器, marvell xcat DX3支持8个比较器, 通过设置端口号范围的上,下限即刻过滤出一段范围的端口号

基于交换芯片的五元组过滤功能相关推荐

  1. 基于交换芯片的五元组的PCL规则过滤功能

    2019独角兽企业重金招聘Python工程师标准>>> 基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫@吉林师范大学2012.12.10Not Approved by Doc ...

  2. linux五元组结构体,一种基于分类优先级的五元组查询方法与流程

    本发明涉及网络传输技术,特别涉及一种基于分类优先级的五元组查询方法. 背景技术: 近年来,随着网络的快速发展,网络数据包的转发效率显的尤为重要:目前,信息技术快速发展,其对应的数据量也迅速增长,在对大 ...

  3. Marvell 交换芯片DSA(分布式交换架构)功能介绍

    Marvell DSA(分布式交换架构)by 韩大卫@吉林师范大学*************** 请参见 Marvell Prestera/Cheetah/xcat/lion 系列交换芯片手册获取更详 ...

  4. 智能宠物喂食器语音芯片应用设计方案(基于唯创语音芯片WT588E02-8S(C001)功能拓展)

    智能宠物喂食器语音芯片应用设计方案(基于唯创语音芯片WT588E02-8S(C001)功能拓展) 概述 本文主要通过使用唯创知音语音芯片扩展目录进行选型微定制,达到节省成本快速选型开发目的的应用介绍. ...

  5. 基于STM32F407ZGT6芯片,实现小车功能

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 基于STM32F407ZGT6芯片,实现小车前进后退,左转右转,ADC调速,红外以及蓝牙,寻迹,避障,屏幕显示功能 开源代码,共同提高 ...

  6. BCM交换芯片之L4分析

    1 ContentAware processor 1.1 各厂家的L4功能 交换芯片ACL功能在不同的厂家中有不同的叫法,BCM称为ContentAware processor,Marvell称为Po ...

  7. 基于贝叶斯算法的邮件过滤管理系统的设计和实现(Vue+SpringBoot)

    作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...

  8. BCM56330系列交换芯片学习心得

    因为所里面的任务的要求,所以要学习学习BCM交换芯片,导师也说过,学习BCM芯片的Datasheet或者Programmer guider是对以后是很有好处的,所以我就奔着学习英语的心态开始学习BCM ...

  9. MPB:上海交大肖湘组分享基于基因芯片的海洋微生物转录组学分析技术

    为进一步提高<微生物组实验手册>稿件质量,本项目新增大众评审环节.文章在通过同行评审后,采用公众号推送方式分享全文,任何人均可在线提交修改意见.公众号格式显示略有问题,建议点击文末阅读原文 ...

最新文章

  1. 数据库设计的三大范式
  2. python数据结构与算法:单向循环列表
  3. mysqli模块的安装
  4. Win7系统网页视频无法播放怎么办
  5. apache2.2.15与PHP5.3.3安装设置完成后,apache启动失败
  6. Duplicate keys detected: ‘checks‘. This may cause an update error. found in
  7. html5中的错误怎么调试,页面中css调试和问题 解决的一些经验总结
  8. 使用ACR及MIUI自带通话录音实现通话录音读取及上传
  9. 转载-一种基于陀螺仪传感器的准确计步器算法
  10. pcb外观维修_5种最常见的PCB维修
  11. android 手电筒开关,Android实现手电筒电源键关闭功能
  12. 7-18 二分法求多项式单根 (C语言)
  13. 【WLAN】【测试】如何使用MacBook进行WiFi无线空口抓包
  14. MapReduce概述及工作流程
  15. Python excel提取表格信息整理到word中
  16. 低成本2.4GHz 无线收发芯片--Ci24R1
  17. 如何让 wm6模拟器 通过GPRS 上网?
  18. 4月20日—4月24日三年级课程
  19. Mt.Gox 源代码、客户数据与员工信息遭泄露
  20. 冒个泡-工作还没找到

热门文章

  1. icon图标制作网站推荐
  2. 任意大小icon图标制作方法
  3. android程序设计报告 尤志宁,尤志宁 - 集美大学 - 计算机工程学院
  4. 电子竞技——靠智力取胜的体育项目
  5. 详讲全排列算法,及解决数字搭积木问题
  6. 【零信任落地案例】吉大正元某大型集团公司零信任实践案例
  7. 条码打印软件制作数字+字母的流水号二维码
  8. 基于Cycle Spinning的移不变小波去噪
  9. 睡眠质量不好怎么改善,这些助眠好物让你失眠快速入睡
  10. AI时代,APP运营是否会被淘汰