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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 
基于交换芯片的五元组的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 												
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.实现此功能分两步:  一, 过滤出源端口号大于或等于80的报文, 命中规则的报文进入第二阶段, 没有命中规则的报文不跳出判断,  不执行PCL动作1,交给下个报文处理机制处理.二, 过滤出源端口号大于或等于8001的报文,  命中规则的报文执行PCL_ACT_NOT处理.命中规则的报文执行PCL_ACT_FOR处理, 即实现PCL动作1.Note :  PCL的动作处理类型有三种为 :PCL_ACT_FOR  		转发报文PCL_ACT_DROP		丢弃报文PCL_ACT_NOT默认的类型为 PCL_ACT_FOR. 默认转发.第一阶段, 根据80-8000 中的下限80得出以下mask数组:80 : 			0000 0000 0101 0000mask1:			1111 1111 1000 0000	
mask2:			0000 0000 0110 0000	
mask3:			0000 0000 0101 0000	pattern1-2:		0100 0000 0000 0000
pattern1-3:		0010 0000 0000 0000
pattern1-4:		0001 0000 0000 0000
pattern1-5:		0000 1000 0000 0000
pattern1-6:		0000 0100 0000 0000
pattern1-7:		0000 0010 0000 0000
pattern1-8:		0000 0001 0000 0000
pattern1-9:		0000 0000 1000 0000pattern2:		0000 0000 0110 0000
pattern3:		0000 0000 0101 0000
note: 如果(x & mask )== pattern  ,那么这是一次成功匹配.每个mask被分别制定为相应的PCL规则 ,其对报文的处理类型是 PCL_ACT_FOR报文依次配置mask1,mask2,mask3,如命中任意一个mask, 那么进入第二阶段进行范围上限的过滤, 其他情况的报文不再执行本系列PCL的过滤.第二阶段 , 由于本算法作用是过滤出大于或等于一个数的范围,那么对于80-8000的上线8000,需要定义一个uint16_t mask_ceiling = 8001. 按此值得出mask数组:8001 :			0001 1111 0100 0001mask1:			1110 0000 0000 0000		
mask2:			0001 0000 0000 0000		
mask3:			0000 1000 0000 0000		
mask4:			0000 0100 0000 0000
mask5:			0000 0010 0000 0000		
mask6:			0000 0001 1000 0000		
mask7:			0000 0000 0100 0000		
mask8:			0000 0000 0011 1110			
mask9:			0000 0000 0000 0001		pattern1-1:		1000 0000 0000 0000
pattern1-2:		0100 0000 0000 0000
pattern1-3:		0010 0000 0000 0000
pattern2:		0001 0000 0000 0000
pattern3:		0000 1000 0000 0000
pattern4:		0000 0100 0000 0000
pattern5:		0000 0010 0000 0000
pattern6-1:		0000 0001 0000 0000
pattern6-2:		0000 0000 1000 0000
pattern7:		0000 0000 0100 0000
pattern8-1:		0000 0000 0010 0000
pattern8-2:		0000 0000 0001 0000
pattern8-3:		0000 0000 0000 1000
pattern8-4:		0000 0000 0000 0100
pattern8-5:		0000 0000 0000 0010
pattern9:		0000 0000 0000 0001如果报文命中了任一一个mask, 说明报文的源端口号大于或等于8001, 即,不在80-8000 范围之内,则将报文执行PCL_ACT_NOT处理.这样, 源端口号在80-8000范围内的报文执行PCL_ACT_FOR处理, 不在此范围内的报文执行PCL_ACT_NOT处理,即不经过次系列PCL处理.根据交换芯片datasheet.  TCAM 的匹配查找可以分为两次, IPCL0 Lookup 和IPCL1 Lookup那么, 将IPCL0 Lookup阶段的匹配动作设定为 PCL_ACT_FOR, IPCL1 Lookup 阶段的匹配动作设PCL_ACT_NOT, 即可实现如下处理流程:Packet ----> IPCL0 Lookup 	        NO|			----->	  	PCL_ACT_NOTY	|E	|	S	|	|	↓		IPCL1 Lookup	  	NO|			----->	  	IPCL0 ACTIONY	|E	|	S	|	|	↓PCL_ACT_NOT					第一阶段,  过滤出源端口号大于或等于80的报文, 命中规则的报文带着PCL_ACT_FOR的动作命令进入第二阶段再次进行过滤.第二阶段,  过滤出源端口号大于或等于8001的报文, 命中规则的报文执行 PCL_ACT_NOT,取消PCL规则转发, 没有命中IPCL1阶段的报文, 即小于8001的报文,执行IPCL0阶段的动作.实现转发到指定接口或VLAN.总上, 完成此功能需要的PCL规则共有如下:IPCL0 : mask1:			1111 1111 1000 0000	mask1:			1111 1111 1000 0000	
pattern1-2:		0100 0000 0000 0000mask1:			1111 1111 1000 0000	
pattern1-3:		0010 0000 0000 0000mask1:			1111 1111 1000 0000	
pattern1-4:		0001 0000 0000 0000mask1:			1111 1111 1000 0000	
pattern1-5:		0000 1000 0000 0000mask1:			1111 1111 1000 0000	
pattern1-6:		0000 0100 0000 0000mask1:			1111 1111 1000 0000	
pattern1-7:		0000 0010 0000 0000mask1:			1111 1111 1000 0000	
pattern1-8:		0000 0001 0000 0000mask1:			1111 1111 1000 0000	
pattern1-9:		0000 0000 1000 0000mask2:			0000 0000 0110 0000	
pattern2:		0000 0000 0110 0000mask3:			0000 0000 0101 0000	
pattern3:		0000 0000 0101 0000IPCL1:mask1:			1110 0000 0000 0000		
pattern1-1:		1000 0000 0000 0000mask1:			1110 0000 0000 0000
pattern1-2:		0100 0000 0000 0000mask1:			1110 0000 0000 0000
pattern1-3:		0010 0000 0000 0000mask2:			0001 0000 0000 0000	
pattern2:		0001 0000 0000 0000mask3:			0000 1000 0000 0000			
pattern3:		0000 1000 0000 0000mask4:			0000 0100 0000 0000
pattern4:		0000 0100 0000 0000mask5:			0000 0010 0000 0000	
pattern5:		0000 0010 0000 0000mask6:			0000 0001 1000 0000	
pattern6-1:		0000 0001 0000 0000
mask6:			0000 0001 1000 0000	
pattern6-2:		0000 0000 1000 0000mask7:			0000 0000 0100 0000	
pattern7:		0000 0000 0100 0000mask8:			0000 0000 0011 1110			
pattern8-1:		0000 0000 0010 0000mask8:			0000 0000 0011 1110
pattern8-2:		0000 0000 0001 0000mask8:			0000 0000 0011 1110
pattern8-3:		0000 0000 0000 1000mask8:			0000 0000 0011 1110
pattern8-4:		0000 0000 0000 0100mask8:			0000 0000 0011 1110
pattern8-5:		0000 0000 0000 0010mask9:			0000 0000 0000 0001	
pattern9:		0000 0000 0000 0001详细列表如下:(0) mask1 + pattern1-1 + (1) mask1 + pattern1-1
(0) mask1 + pattern1-2 + (1) mask1 + pattern1-1
(0) mask1 + pattern1-3 + (1) mask1 + pattern1-1
(0) mask1 + pattern1-4 + (1) mask1 + pattern1-1
(0) mask1 + pattern1-5 + (1) mask1 + pattern1-1
(0) mask1 + pattern1-6 + (1) mask1 + pattern1-1
(0) mask1 + pattern1-7 + (1) mask1 + pattern1-1
(0) mask1 + pattern1-8 + (1) mask1 + pattern1-1
(0) mask1 + pattern1-9 + (1) mask1 + pattern1-1(0) mask1 + pattern1-1 + (1) mask1 + pattern1-2
(0) mask1 + pattern1-2 + (1) mask1 + pattern1-2
(0) mask1 + pattern1-3 + (1) mask1 + pattern1-2
(0) mask1 + pattern1-4 + (1) mask1 + pattern1-2
(0) mask1 + pattern1-5 + (1) mask1 + pattern1-2
(0) mask1 + pattern1-6 + (1) mask1 + pattern1-2
(0) mask1 + pattern1-7 + (1) mask1 + pattern1-2
(0) mask1 + pattern1-8 + (1) mask1 + pattern1-2
(0) mask1 + pattern1-9 + (1) mask1 + pattern1-2(0) mask1 + pattern1-1 + (1) mask1 + pattern1-3
(0) mask1 + pattern1-2 + (1) mask1 + pattern1-3
(0) mask1 + pattern1-3 + (1) mask1 + pattern1-3
(0) mask1 + pattern1-4 + (1) mask1 + pattern1-3
(0) mask1 + pattern1-5 + (1) mask1 + pattern1-3
(0) mask1 + pattern1-6 + (1) mask1 + pattern1-3
(0) mask1 + pattern1-7 + (1) mask1 + pattern1-3
(0) mask1 + pattern1-8 + (1) mask1 + pattern1-3
(0) mask1 + pattern1-9 + (1) mask1 + pattern1-3(0) mask1 + pattern1-1 + (1) mask2 + pattern2
(0) mask1 + pattern1-2 + (1) mask2 + pattern2
(0) mask1 + pattern1-3 + (1) mask2 + pattern2
(0) mask1 + pattern1-4 + (1) mask2 + pattern2
(0) mask1 + pattern1-5 + (1) mask2 + pattern2
(0) mask1 + pattern1-6 + (1) mask2 + pattern2
(0) mask1 + pattern1-7 + (1) mask2 + pattern2
(0) mask1 + pattern1-8 + (1) mask2 + pattern2
(0) mask1 + pattern1-9 + (1) mask2 + pattern2(0) mask1 + pattern1-1 + (1) mask3 + pattern3
(0) mask1 + pattern1-2 + (1) mask3 + pattern3
(0) mask1 + pattern1-3 + (1) mask3 + pattern3
(0) mask1 + pattern1-4 + (1) mask3 + pattern3
(0) mask1 + pattern1-5 + (1) mask3 + pattern3
(0) mask1 + pattern1-6 + (1) mask3 + pattern3
(0) mask1 + pattern1-7 + (1) mask3 + pattern3
(0) mask1 + pattern1-8 + (1) mask3 + pattern3
(0) mask1 + pattern1-9 + (1) mask3 + pattern3(0) mask1 + pattern1-1 + (1) mask4 + pattern4
(0) mask1 + pattern1-2 + (1) mask4 + pattern4
(0) mask1 + pattern1-3 + (1) mask4 + pattern4
(0) mask1 + pattern1-4 + (1) mask4 + pattern4
(0) mask1 + pattern1-5 + (1) mask4 + pattern4
(0) mask1 + pattern1-6 + (1) mask4 + pattern4
(0) mask1 + pattern1-7 + (1) mask4 + pattern4
(0) mask1 + pattern1-8 + (1) mask4 + pattern4
(0) mask1 + pattern1-9 + (1) mask4 + pattern4(0) mask1 + pattern1-1 + (1) mask5 + pattern5
(0) mask1 + pattern1-2 + (1) mask5 + pattern5
(0) mask1 + pattern1-3 + (1) mask5 + pattern5
(0) mask1 + pattern1-4 + (1) mask5 + pattern5
(0) mask1 + pattern1-5 + (1) mask5 + pattern5
(0) mask1 + pattern1-6 + (1) mask5 + pattern5
(0) mask1 + pattern1-7 + (1) mask5 + pattern5
(0) mask1 + pattern1-8 + (1) mask5 + pattern5
(0) mask1 + pattern1-9 + (1) mask5 + pattern5(0) mask1 + pattern1-1 + (1) mask6 + pattern6-1
(0) mask1 + pattern1-2 + (1) mask6 + pattern6-1
(0) mask1 + pattern1-3 + (1) mask6 + pattern6-1
(0) mask1 + pattern1-4 + (1) mask6 + pattern6-1
(0) mask1 + pattern1-5 + (1) mask6 + pattern6-1
(0) mask1 + pattern1-6 + (1) mask6 + pattern6-1
(0) mask1 + pattern1-7 + (1) mask6 + pattern6-1
(0) mask1 + pattern1-8 + (1) mask6 + pattern6-1
(0) mask1 + pattern1-9 + (1) mask6 + pattern6-1(0) mask1 + pattern1-1 + (1) mask6 + pattern6-2
(0) mask1 + pattern1-2 + (1) mask6 + pattern6-2
(0) mask1 + pattern1-3 + (1) mask6 + pattern6-2
(0) mask1 + pattern1-4 + (1) mask6 + pattern6-2
(0) mask1 + pattern1-5 + (1) mask6 + pattern6-2
(0) mask1 + pattern1-6 + (1) mask6 + pattern6-2
(0) mask1 + pattern1-7 + (1) mask6 + pattern6-2
(0) mask1 + pattern1-8 + (1) mask6 + pattern6-2
(0) mask1 + pattern1-9 + (1) mask6 + pattern6-2(0) mask1 + pattern1-1 + (1) mask7 + pattern7
(0) mask1 + pattern1-2 + (1) mask7 + pattern7
(0) mask1 + pattern1-3 + (1) mask7 + pattern7
(0) mask1 + pattern1-4 + (1) mask7 + pattern7
(0) mask1 + pattern1-5 + (1) mask7 + pattern7
(0) mask1 + pattern1-6 + (1) mask7 + pattern7
(0) mask1 + pattern1-7 + (1) mask7 + pattern7
(0) mask1 + pattern1-8 + (1) mask7 + pattern7
(0) mask1 + pattern1-9 + (1) mask7 + pattern7(0) mask1 + pattern1-1 + (1) mask8 + pattern8-1
(0) mask1 + pattern1-2 + (1) mask8 + pattern8-1
(0) mask1 + pattern1-3 + (1) mask8 + pattern8-1
(0) mask1 + pattern1-4 + (1) mask8 + pattern8-1
(0) mask1 + pattern1-5 + (1) mask8 + pattern8-1
(0) mask1 + pattern1-6 + (1) mask8 + pattern8-1
(0) mask1 + pattern1-7 + (1) mask8 + pattern8-1
(0) mask1 + pattern1-8 + (1) mask8 + pattern8-1
(0) mask1 + pattern1-9 + (1) mask8 + pattern8-1(0) mask1 + pattern1-1 + (1) mask8 + pattern8-2
(0) mask1 + pattern1-2 + (1) mask8 + pattern8-2
(0) mask1 + pattern1-3 + (1) mask8 + pattern8-2
(0) mask1 + pattern1-4 + (1) mask8 + pattern8-2
(0) mask1 + pattern1-5 + (1) mask8 + pattern8-2
(0) mask1 + pattern1-6 + (1) mask8 + pattern8-2
(0) mask1 + pattern1-7 + (1) mask8 + pattern8-2
(0) mask1 + pattern1-8 + (1) mask8 + pattern8-2
(0) mask1 + pattern1-9 + (1) mask8 + pattern8-2(0) mask1 + pattern1-1 + (1) mask8 + pattern8-3
(0) mask1 + pattern1-2 + (1) mask8 + pattern8-3
(0) mask1 + pattern1-3 + (1) mask8 + pattern8-3
(0) mask1 + pattern1-4 + (1) mask8 + pattern8-3
(0) mask1 + pattern1-5 + (1) mask8 + pattern8-3
(0) mask1 + pattern1-6 + (1) mask8 + pattern8-3
(0) mask1 + pattern1-7 + (1) mask8 + pattern8-3
(0) mask1 + pattern1-8 + (1) mask8 + pattern8-3
(0) mask1 + pattern1-9 + (1) mask8 + pattern8-3(0) mask1 + pattern1-1 + (1) mask8 + pattern8-4
(0) mask1 + pattern1-2 + (1) mask8 + pattern8-4
(0) mask1 + pattern1-3 + (1) mask8 + pattern8-4
(0) mask1 + pattern1-4 + (1) mask8 + pattern8-4
(0) mask1 + pattern1-5 + (1) mask8 + pattern8-4
(0) mask1 + pattern1-6 + (1) mask8 + pattern8-4
(0) mask1 + pattern1-7 + (1) mask8 + pattern8-4
(0) mask1 + pattern1-8 + (1) mask8 + pattern8-4
(0) mask1 + pattern1-9 + (1) mask8 + pattern8-4(0) mask1 + pattern1-1 + (1) mask8 + pattern8-5
(0) mask1 + pattern1-2 + (1) mask8 + pattern8-5
(0) mask1 + pattern1-3 + (1) mask8 + pattern8-5
(0) mask1 + pattern1-4 + (1) mask8 + pattern8-5
(0) mask1 + pattern1-5 + (1) mask8 + pattern8-5
(0) mask1 + pattern1-6 + (1) mask8 + pattern8-5
(0) mask1 + pattern1-7 + (1) mask8 + pattern8-5
(0) mask1 + pattern1-8 + (1) mask8 + pattern8-5
(0) mask1 + pattern1-9 + (1) mask8 + pattern8-5(0) mask1 + pattern1-1 + (1) mask9 + pattern9
(0) mask1 + pattern1-2 + (1) mask9 + pattern9
(0) mask1 + pattern1-3 + (1) mask9 + pattern9
(0) mask1 + pattern1-4 + (1) mask9 + pattern9
(0) mask1 + pattern1-5 + (1) mask9 + pattern9
(0) mask1 + pattern1-6 + (1) mask9 + pattern9
(0) mask1 + pattern1-7 + (1) mask9 + pattern9
(0) mask1 + pattern1-8 + (1) mask9 + pattern9
(0) mask1 + pattern1-9 + (1) mask9 + pattern9(0) mask2 + pattern2 + (1) mask1 + pattern1-1
(0) mask2 + pattern2 + (1) mask1 + pattern1-2
(0) mask2 + pattern2 + (1) mask1 + pattern1-3
(0) mask2 + pattern2 + (1) mask2 + pattern2
(0) mask2 + pattern2 + (1) mask3 + pattern3
(0) mask2 + pattern2 + (1) mask4 + pattern4
(0) mask2 + pattern2 + (1) mask5 + pattern5
(0) mask2 + pattern2 + (1) mask6 + pattern6-1
(0) mask2 + pattern2 + (1) mask6 + pattern6-2
(0) mask2 + pattern2 + (1) mask7 + pattern7
(0) mask2 + pattern2 + (1) mask8 + pattern8-1
(0) mask2 + pattern2 + (1) mask8 + pattern8-2
(0) mask2 + pattern2 + (1) mask8 + pattern8-3
(0) mask2 + pattern2 + (1) mask8 + pattern8-4
(0) mask2 + pattern2 + (1) mask8 + pattern8-5
(0) mask2 + pattern2 + (1) mask9 + pattern9(0) mask3 + pattern3 + (1) mask2 + pattern2
(0) mask3 + pattern3 + (1) mask3 + pattern3
(0) mask3 + pattern3 + (1) mask4 + pattern4
(0) mask3 + pattern3 + (1) mask5 + pattern5
(0) mask3 + pattern3 + (1) mask6 + pattern6-1
(0) mask3 + pattern3 + (1) mask6 + pattern6-2
(0) mask3 + pattern3 + (1) mask7 + pattern7
(0) mask3 + pattern3 + (1) mask8 + pattern8-1
(0) mask3 + pattern3 + (1) mask8 + pattern8-2
(0) mask3 + pattern3 + (1) mask8 + pattern8-3
(0) mask3 + pattern3 + (1) mask8 + pattern8-4
(0) mask3 + pattern3 + (1) mask8 + pattern8-5
(0) mask3 + pattern3 + (1) mask9 + pattern9鉴于此部分在软件上做起来比较麻烦, 同时,考虑到为实现一个功能而一次下发100多条规则的效率问题, 所以这类功能可以交给CPU来做,用户层判断出此需求后, 将报文全部交给CPU,后者解析出报文后, if(sport >= 80 && sport <=8000)即可作出判断, 相比起来将更为可取.

转载于:https://my.oschina.net/handawei/blog/95815

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python生成树状图_python 生成 树状结构

forwarding_recp re.compile(".*?发件人:(.*?);.*?发送时间:.*?收件人:(.*?)主题", re.S)def parse_addr(addr, split_str,): l[]ifaddr:for a inaddr.split(split_str): l.append(utils.parseaddr(a)[1])returnldef gen_forwarding(con): #参数是解析过后的邮…

remove()与empty()的区别

1、empty() - 从被选元素中删除子元素&#xff1b; 2、remove() - 删除被选元素(及其子元素)&#xff1b; 3、remove() 方法也可接受一个参数&#xff0c;允许您对被删元素进行过滤。转载于:https://www.cnblogs.com/hwldyz/p/9335717.html

2013年6月和12月CISA考试报名,认证,CPE维持和备考要点

2013年6月和12月CISA考试报名,认证,CPE维持和备考要点 2013年6月和12月CISA考试报名,认证,CPE维持和备考要点 消息来源&#xff1a;http://www.isaca.org/CERTIFICATION/CISA-CERTIFIED-INFORMATION-SYSTEMS-AUDITOR/REGISTER-FOR-THE-EXAM/Pages/default.aspx在线报名费用 早…

全国计算机等级考试题库二级C操作题100套(第10套)

第10套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;判定形参a所指的NN&#xff08;规定N为奇数&#xff09;的矩阵是否是"幻方"&#xff0c;若是&#xff0c;函数返回值为1&#xff1b; 不是&#xff0c;函数返回值为0。“幻方"的判定条件是…

mysql字节对齐_结构体字节对齐(转)

结构体字节对齐在用sizeof运算符求算某结构体所占空间时&#xff0c;并不是简单地将结构体中所有元素各自占的空间相加&#xff0c;这里涉及到内存字节对齐的问题。从理论上讲&#xff0c;对于任何变量的访问都可以从任何地址开始访问&#xff0c;但是事实上不是如此&#xff0…

python docx 合并文档 图片_不再为处理PDF烦恼,python处理操作PDF全攻略

本篇聊下Python对pdf的各种操作&#xff0c;包含pdf转word&#xff0c;pdf转图片&#xff0c;pdf翻转&#xff0c;加密&#xff0c;加水印等。pdf转换word文档 保留格式pdf转换为word文档&#xff0c;被大众经常使用的是纯Python库pdfminer和python-docx搭配使用&#xff0c;不…

new blog

new blog转载于:https://www.cnblogs.com/uuzlove/p/9336405.html

windows server 2012 初安装体验

昨天晚上的windows server 2012 已时行 了发布了&#xff0c;为之在之前我已进行了下载测试安装&#xff0c;本来晚间想用来在虚拟机下进行安装VM-tool工具的&#xff0c;但是却因种种原因没有成功&#xff0c;为之补一下前面没有安装的过程截图。 进入下载页后&#xff0c;下载…

python 多进程 调用模块内函数_python子进程模块subprocess详解与应用实例 之一

分类&#xff1a; Python/Ruby 2014-09-09 10:59:42 subprocess--子进程管理器 一、subprocess 模块简介 subprocess最早是在2.4版本中引入的。 subprocess模块用来生成子进程&#xff0c;并可以通过管道连接它们的输入/输出/错误&#xff0c;以及获得它们的返回值。 它用来代替…

安卓APP_ 控件(1)—— TextView

摘自&#xff1a;安卓APP_ 控件&#xff08;1&#xff09;—— TextView 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-28 21:53:49 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115283233 本文为学习笔记&#xff0c;是安卓APP学习的…

python udp 大文件_Python:通过UDP发送大对象

我是套接字编程的新手&#xff0c;最近为它挑选了Python。我有几个问题&#xff0c;我似乎无法找到明确的答案。Python&#xff1a;通过UDP发送大对象我正在研究通过UDP发送数据&#xff0c;并写了一个简单的python脚本来做到这一点。可以很好地发送小对象(准确地说是小腌制对象…

Flask入门系列(转载)

一、入门系列&#xff1a; Flask入门系列(一)–Hello World 项目开发中&#xff0c;经常要写一些小系统来辅助&#xff0c;比如监控系统&#xff0c;配置系统等等。用传统的Java写&#xff0c;太笨重了&#xff0c;连PHP都嫌麻烦。一直在寻找一个轻量级的后台框架&#xff0c;学…

iphone3G恢复到3.1.2遇到的问题

1.报错1015 2.进入DFU模式&#xff0c;刷到下载数据停止不动。 3.进入菠萝&#xff0c;进度条走到最后停止不动。 4.红雪走到waiting for reboot停止不动。 针对上述问题&#xff1a; 首先&#xff0c;要找到完全对应手机系统原版本的固件。然后&#xff0c;红雪进入DFU模式刷机…

用python做数据分析pdf_利用python进行数据分析pdf

利用python进行数据分析pdf微盘下载&#xff01;《利用python进行数据分析》利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接触科学计算的Python程序员。利用python进行数据分析简介&#xff1a; 还在苦苦寻觅用Python控…

安卓APP_ 控件(2)—— Button

摘自&#xff1a;安卓APP_ 控件&#xff08;2&#xff09;—— Button 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-29 14:20:54 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115290501 开篇&#xff1a;安卓APP_ 控件&#xff08;1…

python 列表自定义排序_自定义排序的Python列表

我有一个dicts列表: ldicts = [{name: 120-150}, {name: 90-120}, {name: 150-180}, {name: >= 180}, {name: <90}, {name: total}] 我想按值升序对其进行排序,以便输出如下: sortedldicts = [{name: total}, {name: <90}, {name: 90-120},{name: 120-150}, {name: …

HTML DOM知识点补充:

DOM Console 控制台对象提供了浏览器的debug的方法支持。 常用的&#xff1a;console.log()。 ⚠️coffeescript中&#xff0c;这个方法不加括号。 DOM Document 当一个HTML document加载到浏览器上&#xff0c;它就成为了一个document object。 它是root node 提供了大量docum…

python汇率编程_【菜鸟学Python】案例一:汇率换算

汇率换算V1.0 案例描述&#xff1a; 设计一个汇率换算器程序&#xff0c;其功能是将外币换算成人民币&#xff0c;或者相反 案例分析&#xff1a; 分析问题&#xff1a;分析问题的计算部分&#xff1b; 确定问题&#xff1a;将问题划分为输入、处理及输出部分&#xff1b; 设计…

2013年全球最佳工作

&#xfeff;&#xfeff;2013年即将到来&#xff0c;在新的一年中软件开发人士将继续保持良好的发展态势&#xff0c;通过信息技术及分析业务为企业带来竞争优势。系统分析师、网络/系统管理员、网络架构师以及数据库管理员也纷纷名列榜单前十五位。硅谷与华盛顿特区地铁体系则…

安卓APP_ 控件(3)—— EditText

摘自&#xff1a;安卓APP_ 控件&#xff08;3&#xff09;—— EditText 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-29 18:43:40 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115305883 开篇&#xff1a;安卓APP_ 控件&#xff08…