2005-04-17 05:20:36 +07:00
|
|
|
#ifndef __LINUX_PKT_CLS_H
|
|
|
|
#define __LINUX_PKT_CLS_H
|
|
|
|
|
2009-01-30 23:35:32 +07:00
|
|
|
#include <linux/types.h>
|
2005-04-17 05:20:36 +07:00
|
|
|
#include <linux/pkt_sched.h>
|
|
|
|
|
2015-05-21 07:26:24 +07:00
|
|
|
#ifdef __KERNEL__
|
2005-04-17 05:20:36 +07:00
|
|
|
/* I think i could have done better macros ; for now this is stolen from
|
|
|
|
* some arch/mips code - jhs
|
|
|
|
*/
|
|
|
|
#define _TC_MAKE32(x) ((x))
|
|
|
|
|
|
|
|
#define _TC_MAKEMASK1(n) (_TC_MAKE32(1) << _TC_MAKE32(n))
|
|
|
|
#define _TC_MAKEMASK(v,n) (_TC_MAKE32((_TC_MAKE32(1)<<(v))-1) << _TC_MAKE32(n))
|
|
|
|
#define _TC_MAKEVALUE(v,n) (_TC_MAKE32(v) << _TC_MAKE32(n))
|
|
|
|
#define _TC_GETVALUE(v,n,m) ((_TC_MAKE32(v) & _TC_MAKE32(m)) >> _TC_MAKE32(n))
|
|
|
|
|
|
|
|
/* verdict bit breakdown
|
|
|
|
*
|
|
|
|
bit 0: when set -> this packet has been munged already
|
|
|
|
|
|
|
|
bit 1: when set -> It is ok to munge this packet
|
|
|
|
|
|
|
|
bit 2,3,4,5: Reclassify counter - sort of reverse TTL - if exceeded
|
|
|
|
assume loop
|
|
|
|
|
|
|
|
bit 6,7: Where this packet was last seen
|
|
|
|
0: Above the transmit example at the socket level
|
|
|
|
1: on the Ingress
|
|
|
|
2: on the Egress
|
|
|
|
|
|
|
|
bit 8: when set --> Request not to classify on ingress.
|
|
|
|
|
|
|
|
bits 9,10,11: redirect counter - redirect TTL. Loop avoidance
|
|
|
|
|
|
|
|
*
|
|
|
|
* */
|
|
|
|
|
|
|
|
#define S_TC_FROM _TC_MAKE32(6)
|
|
|
|
#define M_TC_FROM _TC_MAKEMASK(2,S_TC_FROM)
|
|
|
|
#define G_TC_FROM(x) _TC_GETVALUE(x,S_TC_FROM,M_TC_FROM)
|
|
|
|
#define V_TC_FROM(x) _TC_MAKEVALUE(x,S_TC_FROM)
|
|
|
|
#define SET_TC_FROM(v,n) ((V_TC_FROM(n)) | (v & ~M_TC_FROM))
|
|
|
|
#define AT_STACK 0x0
|
|
|
|
#define AT_INGRESS 0x1
|
|
|
|
#define AT_EGRESS 0x2
|
|
|
|
|
|
|
|
#define TC_NCLS _TC_MAKEMASK1(8)
|
|
|
|
#define SET_TC_NCLS(v) ( TC_NCLS | (v & ~TC_NCLS))
|
|
|
|
#define CLR_TC_NCLS(v) ( v & ~TC_NCLS)
|
|
|
|
|
|
|
|
#define S_TC_AT _TC_MAKE32(12)
|
|
|
|
#define M_TC_AT _TC_MAKEMASK(2,S_TC_AT)
|
|
|
|
#define G_TC_AT(x) _TC_GETVALUE(x,S_TC_AT,M_TC_AT)
|
|
|
|
#define V_TC_AT(x) _TC_MAKEVALUE(x,S_TC_AT)
|
|
|
|
#define SET_TC_AT(v,n) ((V_TC_AT(n)) | (v & ~M_TC_AT))
|
|
|
|
|
2015-05-21 07:26:24 +07:00
|
|
|
#define MAX_REC_LOOP 4
|
|
|
|
#define MAX_RED_LOOP 4
|
|
|
|
#endif
|
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* Action attributes */
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_ACT_UNSPEC,
|
|
|
|
TCA_ACT_KIND,
|
|
|
|
TCA_ACT_OPTIONS,
|
|
|
|
TCA_ACT_INDEX,
|
|
|
|
TCA_ACT_STATS,
|
2016-04-26 15:06:18 +07:00
|
|
|
TCA_ACT_PAD,
|
2005-04-17 05:20:36 +07:00
|
|
|
__TCA_ACT_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_ACT_MAX __TCA_ACT_MAX
|
|
|
|
#define TCA_OLD_COMPAT (TCA_ACT_MAX+1)
|
|
|
|
#define TCA_ACT_MAX_PRIO 32
|
|
|
|
#define TCA_ACT_BIND 1
|
|
|
|
#define TCA_ACT_NOBIND 0
|
|
|
|
#define TCA_ACT_UNBIND 1
|
|
|
|
#define TCA_ACT_NOUNBIND 0
|
|
|
|
#define TCA_ACT_REPLACE 1
|
|
|
|
#define TCA_ACT_NOREPLACE 0
|
|
|
|
|
|
|
|
#define TC_ACT_UNSPEC (-1)
|
|
|
|
#define TC_ACT_OK 0
|
|
|
|
#define TC_ACT_RECLASSIFY 1
|
|
|
|
#define TC_ACT_SHOT 2
|
|
|
|
#define TC_ACT_PIPE 3
|
|
|
|
#define TC_ACT_STOLEN 4
|
|
|
|
#define TC_ACT_QUEUED 5
|
|
|
|
#define TC_ACT_REPEAT 6
|
2015-09-16 13:05:43 +07:00
|
|
|
#define TC_ACT_REDIRECT 7
|
2005-04-17 05:20:36 +07:00
|
|
|
#define TC_ACT_JUMP 0x10000000
|
|
|
|
|
|
|
|
/* Action type identifiers*/
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_ID_UNSPEC=0,
|
|
|
|
TCA_ID_POLICE=1,
|
|
|
|
/* other actions go here */
|
|
|
|
__TCA_ID_MAX=255
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_ID_MAX __TCA_ID_MAX
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tc_police {
|
2005-04-17 05:20:36 +07:00
|
|
|
__u32 index;
|
|
|
|
int action;
|
|
|
|
#define TC_POLICE_UNSPEC TC_ACT_UNSPEC
|
|
|
|
#define TC_POLICE_OK TC_ACT_OK
|
|
|
|
#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY
|
|
|
|
#define TC_POLICE_SHOT TC_ACT_SHOT
|
|
|
|
#define TC_POLICE_PIPE TC_ACT_PIPE
|
|
|
|
|
|
|
|
__u32 limit;
|
|
|
|
__u32 burst;
|
|
|
|
__u32 mtu;
|
|
|
|
struct tc_ratespec rate;
|
|
|
|
struct tc_ratespec peakrate;
|
|
|
|
int refcnt;
|
|
|
|
int bindcnt;
|
|
|
|
__u32 capab;
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tcf_t {
|
2005-04-17 05:20:36 +07:00
|
|
|
__u64 install;
|
|
|
|
__u64 lastuse;
|
|
|
|
__u64 expires;
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tc_cnt {
|
2005-04-17 05:20:36 +07:00
|
|
|
int refcnt;
|
|
|
|
int bindcnt;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define tc_gen \
|
|
|
|
__u32 index; \
|
|
|
|
__u32 capab; \
|
|
|
|
int action; \
|
|
|
|
int refcnt; \
|
|
|
|
int bindcnt
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_POLICE_UNSPEC,
|
|
|
|
TCA_POLICE_TBF,
|
|
|
|
TCA_POLICE_RATE,
|
|
|
|
TCA_POLICE_PEAKRATE,
|
|
|
|
TCA_POLICE_AVRATE,
|
|
|
|
TCA_POLICE_RESULT,
|
|
|
|
__TCA_POLICE_MAX
|
|
|
|
#define TCA_POLICE_RESULT TCA_POLICE_RESULT
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)
|
|
|
|
|
2016-05-13 07:08:22 +07:00
|
|
|
/* tca flags definitions */
|
|
|
|
#define TCA_CLS_FLAGS_SKIP_HW (1 << 0)
|
2016-05-13 07:08:23 +07:00
|
|
|
#define TCA_CLS_FLAGS_SKIP_SW (1 << 1)
|
2016-05-13 07:08:22 +07:00
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* U32 filters */
|
|
|
|
|
|
|
|
#define TC_U32_HTID(h) ((h)&0xFFF00000)
|
|
|
|
#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20)
|
|
|
|
#define TC_U32_HASH(h) (((h)>>12)&0xFF)
|
|
|
|
#define TC_U32_NODE(h) ((h)&0xFFF)
|
|
|
|
#define TC_U32_KEY(h) ((h)&0xFFFFF)
|
|
|
|
#define TC_U32_UNSPEC 0
|
|
|
|
#define TC_U32_ROOT (0xFFF00000)
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_U32_UNSPEC,
|
|
|
|
TCA_U32_CLASSID,
|
|
|
|
TCA_U32_HASH,
|
|
|
|
TCA_U32_LINK,
|
|
|
|
TCA_U32_DIVISOR,
|
|
|
|
TCA_U32_SEL,
|
|
|
|
TCA_U32_POLICE,
|
|
|
|
TCA_U32_ACT,
|
|
|
|
TCA_U32_INDEV,
|
|
|
|
TCA_U32_PCNT,
|
|
|
|
TCA_U32_MARK,
|
2016-02-26 22:54:39 +07:00
|
|
|
TCA_U32_FLAGS,
|
2016-04-26 15:06:18 +07:00
|
|
|
TCA_U32_PAD,
|
2005-04-17 05:20:36 +07:00
|
|
|
__TCA_U32_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_U32_MAX (__TCA_U32_MAX - 1)
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tc_u32_key {
|
2008-03-18 12:46:46 +07:00
|
|
|
__be32 mask;
|
|
|
|
__be32 val;
|
2005-04-17 05:20:36 +07:00
|
|
|
int off;
|
|
|
|
int offmask;
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tc_u32_sel {
|
2005-04-17 05:20:36 +07:00
|
|
|
unsigned char flags;
|
|
|
|
unsigned char offshift;
|
|
|
|
unsigned char nkeys;
|
|
|
|
|
2008-03-18 12:46:46 +07:00
|
|
|
__be16 offmask;
|
2005-04-17 05:20:36 +07:00
|
|
|
__u16 off;
|
|
|
|
short offoff;
|
|
|
|
|
|
|
|
short hoff;
|
2008-03-18 12:46:46 +07:00
|
|
|
__be32 hmask;
|
2005-04-17 05:20:36 +07:00
|
|
|
struct tc_u32_key keys[0];
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tc_u32_mark {
|
2005-04-17 05:20:36 +07:00
|
|
|
__u32 val;
|
|
|
|
__u32 mask;
|
|
|
|
__u32 success;
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tc_u32_pcnt {
|
2005-04-17 05:20:36 +07:00
|
|
|
__u64 rcnt;
|
|
|
|
__u64 rhit;
|
|
|
|
__u64 kcnts[0];
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Flags */
|
|
|
|
|
|
|
|
#define TC_U32_TERMINAL 1
|
|
|
|
#define TC_U32_OFFSET 2
|
|
|
|
#define TC_U32_VAROFFSET 4
|
|
|
|
#define TC_U32_EAT 8
|
|
|
|
|
|
|
|
#define TC_U32_MAXDEPTH 8
|
|
|
|
|
|
|
|
|
|
|
|
/* RSVP filter */
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_RSVP_UNSPEC,
|
|
|
|
TCA_RSVP_CLASSID,
|
|
|
|
TCA_RSVP_DST,
|
|
|
|
TCA_RSVP_SRC,
|
|
|
|
TCA_RSVP_PINFO,
|
|
|
|
TCA_RSVP_POLICE,
|
|
|
|
TCA_RSVP_ACT,
|
|
|
|
__TCA_RSVP_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 )
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tc_rsvp_gpi {
|
2005-04-17 05:20:36 +07:00
|
|
|
__u32 key;
|
|
|
|
__u32 mask;
|
|
|
|
int offset;
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tc_rsvp_pinfo {
|
2005-04-17 05:20:36 +07:00
|
|
|
struct tc_rsvp_gpi dpi;
|
|
|
|
struct tc_rsvp_gpi spi;
|
|
|
|
__u8 protocol;
|
|
|
|
__u8 tunnelid;
|
|
|
|
__u8 tunnelhdr;
|
2005-06-29 02:56:45 +07:00
|
|
|
__u8 pad;
|
2005-04-17 05:20:36 +07:00
|
|
|
};
|
|
|
|
|
|
|
|
/* ROUTE filter */
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_ROUTE4_UNSPEC,
|
|
|
|
TCA_ROUTE4_CLASSID,
|
|
|
|
TCA_ROUTE4_TO,
|
|
|
|
TCA_ROUTE4_FROM,
|
|
|
|
TCA_ROUTE4_IIF,
|
|
|
|
TCA_ROUTE4_POLICE,
|
|
|
|
TCA_ROUTE4_ACT,
|
|
|
|
__TCA_ROUTE4_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1)
|
|
|
|
|
|
|
|
|
|
|
|
/* FW filter */
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_FW_UNSPEC,
|
|
|
|
TCA_FW_CLASSID,
|
|
|
|
TCA_FW_POLICE,
|
|
|
|
TCA_FW_INDEV, /* used by CONFIG_NET_CLS_IND */
|
|
|
|
TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */
|
2006-08-26 06:11:42 +07:00
|
|
|
TCA_FW_MASK,
|
2005-04-17 05:20:36 +07:00
|
|
|
__TCA_FW_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_FW_MAX (__TCA_FW_MAX - 1)
|
|
|
|
|
|
|
|
/* TC index filter */
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_TCINDEX_UNSPEC,
|
|
|
|
TCA_TCINDEX_HASH,
|
|
|
|
TCA_TCINDEX_MASK,
|
|
|
|
TCA_TCINDEX_SHIFT,
|
|
|
|
TCA_TCINDEX_FALL_THROUGH,
|
|
|
|
TCA_TCINDEX_CLASSID,
|
|
|
|
TCA_TCINDEX_POLICE,
|
|
|
|
TCA_TCINDEX_ACT,
|
|
|
|
__TCA_TCINDEX_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1)
|
|
|
|
|
[NET_SCHED]: Add flow classifier
Add new "flow" classifier, which is meant to extend the SFQ hashing
capabilities without hard-coding new hash functions and also allows
deterministic mappings of keys to classes, replacing some out of tree
iptables patches like IPCLASSIFY (maps IPs to classes), IPMARK (maps
IPs to marks, with fw filters to classes), ...
Some examples:
- Classic SFQ hash:
tc filter add ... flow hash \
keys src,dst,proto,proto-src,proto-dst divisor 1024
- Classic SFQ hash, but using information from conntrack to work properly in
combination with NAT:
tc filter add ... flow hash \
keys nfct-src,nfct-dst,proto,nfct-proto-src,nfct-proto-dst divisor 1024
- Map destination IPs of 192.168.0.0/24 to classids 1-257:
tc filter add ... flow map \
key dst addend -192.168.0.0 divisor 256
- alternatively:
tc filter add ... flow map \
key dst and 0xff
- similar, but reverse ordered:
tc filter add ... flow map \
key dst and 0xff xor 0xff
Perturbation is currently not supported because we can't reliable kill the
timer on destruction.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-02-01 09:37:42 +07:00
|
|
|
/* Flow filter */
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
[NET_SCHED]: Add flow classifier
Add new "flow" classifier, which is meant to extend the SFQ hashing
capabilities without hard-coding new hash functions and also allows
deterministic mappings of keys to classes, replacing some out of tree
iptables patches like IPCLASSIFY (maps IPs to classes), IPMARK (maps
IPs to marks, with fw filters to classes), ...
Some examples:
- Classic SFQ hash:
tc filter add ... flow hash \
keys src,dst,proto,proto-src,proto-dst divisor 1024
- Classic SFQ hash, but using information from conntrack to work properly in
combination with NAT:
tc filter add ... flow hash \
keys nfct-src,nfct-dst,proto,nfct-proto-src,nfct-proto-dst divisor 1024
- Map destination IPs of 192.168.0.0/24 to classids 1-257:
tc filter add ... flow map \
key dst addend -192.168.0.0 divisor 256
- alternatively:
tc filter add ... flow map \
key dst and 0xff
- similar, but reverse ordered:
tc filter add ... flow map \
key dst and 0xff xor 0xff
Perturbation is currently not supported because we can't reliable kill the
timer on destruction.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-02-01 09:37:42 +07:00
|
|
|
FLOW_KEY_SRC,
|
|
|
|
FLOW_KEY_DST,
|
|
|
|
FLOW_KEY_PROTO,
|
|
|
|
FLOW_KEY_PROTO_SRC,
|
|
|
|
FLOW_KEY_PROTO_DST,
|
|
|
|
FLOW_KEY_IIF,
|
|
|
|
FLOW_KEY_PRIORITY,
|
|
|
|
FLOW_KEY_MARK,
|
|
|
|
FLOW_KEY_NFCT,
|
|
|
|
FLOW_KEY_NFCT_SRC,
|
|
|
|
FLOW_KEY_NFCT_DST,
|
|
|
|
FLOW_KEY_NFCT_PROTO_SRC,
|
|
|
|
FLOW_KEY_NFCT_PROTO_DST,
|
|
|
|
FLOW_KEY_RTCLASSID,
|
|
|
|
FLOW_KEY_SKUID,
|
|
|
|
FLOW_KEY_SKGID,
|
2008-02-06 07:21:04 +07:00
|
|
|
FLOW_KEY_VLAN_TAG,
|
2010-08-21 13:23:15 +07:00
|
|
|
FLOW_KEY_RXHASH,
|
[NET_SCHED]: Add flow classifier
Add new "flow" classifier, which is meant to extend the SFQ hashing
capabilities without hard-coding new hash functions and also allows
deterministic mappings of keys to classes, replacing some out of tree
iptables patches like IPCLASSIFY (maps IPs to classes), IPMARK (maps
IPs to marks, with fw filters to classes), ...
Some examples:
- Classic SFQ hash:
tc filter add ... flow hash \
keys src,dst,proto,proto-src,proto-dst divisor 1024
- Classic SFQ hash, but using information from conntrack to work properly in
combination with NAT:
tc filter add ... flow hash \
keys nfct-src,nfct-dst,proto,nfct-proto-src,nfct-proto-dst divisor 1024
- Map destination IPs of 192.168.0.0/24 to classids 1-257:
tc filter add ... flow map \
key dst addend -192.168.0.0 divisor 256
- alternatively:
tc filter add ... flow map \
key dst and 0xff
- similar, but reverse ordered:
tc filter add ... flow map \
key dst and 0xff xor 0xff
Perturbation is currently not supported because we can't reliable kill the
timer on destruction.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-02-01 09:37:42 +07:00
|
|
|
__FLOW_KEY_MAX,
|
|
|
|
};
|
|
|
|
|
|
|
|
#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1)
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
[NET_SCHED]: Add flow classifier
Add new "flow" classifier, which is meant to extend the SFQ hashing
capabilities without hard-coding new hash functions and also allows
deterministic mappings of keys to classes, replacing some out of tree
iptables patches like IPCLASSIFY (maps IPs to classes), IPMARK (maps
IPs to marks, with fw filters to classes), ...
Some examples:
- Classic SFQ hash:
tc filter add ... flow hash \
keys src,dst,proto,proto-src,proto-dst divisor 1024
- Classic SFQ hash, but using information from conntrack to work properly in
combination with NAT:
tc filter add ... flow hash \
keys nfct-src,nfct-dst,proto,nfct-proto-src,nfct-proto-dst divisor 1024
- Map destination IPs of 192.168.0.0/24 to classids 1-257:
tc filter add ... flow map \
key dst addend -192.168.0.0 divisor 256
- alternatively:
tc filter add ... flow map \
key dst and 0xff
- similar, but reverse ordered:
tc filter add ... flow map \
key dst and 0xff xor 0xff
Perturbation is currently not supported because we can't reliable kill the
timer on destruction.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-02-01 09:37:42 +07:00
|
|
|
FLOW_MODE_MAP,
|
|
|
|
FLOW_MODE_HASH,
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
[NET_SCHED]: Add flow classifier
Add new "flow" classifier, which is meant to extend the SFQ hashing
capabilities without hard-coding new hash functions and also allows
deterministic mappings of keys to classes, replacing some out of tree
iptables patches like IPCLASSIFY (maps IPs to classes), IPMARK (maps
IPs to marks, with fw filters to classes), ...
Some examples:
- Classic SFQ hash:
tc filter add ... flow hash \
keys src,dst,proto,proto-src,proto-dst divisor 1024
- Classic SFQ hash, but using information from conntrack to work properly in
combination with NAT:
tc filter add ... flow hash \
keys nfct-src,nfct-dst,proto,nfct-proto-src,nfct-proto-dst divisor 1024
- Map destination IPs of 192.168.0.0/24 to classids 1-257:
tc filter add ... flow map \
key dst addend -192.168.0.0 divisor 256
- alternatively:
tc filter add ... flow map \
key dst and 0xff
- similar, but reverse ordered:
tc filter add ... flow map \
key dst and 0xff xor 0xff
Perturbation is currently not supported because we can't reliable kill the
timer on destruction.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-02-01 09:37:42 +07:00
|
|
|
TCA_FLOW_UNSPEC,
|
|
|
|
TCA_FLOW_KEYS,
|
|
|
|
TCA_FLOW_MODE,
|
|
|
|
TCA_FLOW_BASECLASS,
|
|
|
|
TCA_FLOW_RSHIFT,
|
|
|
|
TCA_FLOW_ADDEND,
|
|
|
|
TCA_FLOW_MASK,
|
|
|
|
TCA_FLOW_XOR,
|
|
|
|
TCA_FLOW_DIVISOR,
|
|
|
|
TCA_FLOW_ACT,
|
|
|
|
TCA_FLOW_POLICE,
|
|
|
|
TCA_FLOW_EMATCHES,
|
2008-07-15 10:36:32 +07:00
|
|
|
TCA_FLOW_PERTURB,
|
[NET_SCHED]: Add flow classifier
Add new "flow" classifier, which is meant to extend the SFQ hashing
capabilities without hard-coding new hash functions and also allows
deterministic mappings of keys to classes, replacing some out of tree
iptables patches like IPCLASSIFY (maps IPs to classes), IPMARK (maps
IPs to marks, with fw filters to classes), ...
Some examples:
- Classic SFQ hash:
tc filter add ... flow hash \
keys src,dst,proto,proto-src,proto-dst divisor 1024
- Classic SFQ hash, but using information from conntrack to work properly in
combination with NAT:
tc filter add ... flow hash \
keys nfct-src,nfct-dst,proto,nfct-proto-src,nfct-proto-dst divisor 1024
- Map destination IPs of 192.168.0.0/24 to classids 1-257:
tc filter add ... flow map \
key dst addend -192.168.0.0 divisor 256
- alternatively:
tc filter add ... flow map \
key dst and 0xff
- similar, but reverse ordered:
tc filter add ... flow map \
key dst and 0xff xor 0xff
Perturbation is currently not supported because we can't reliable kill the
timer on destruction.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-02-01 09:37:42 +07:00
|
|
|
__TCA_FLOW_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1)
|
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* Basic filter */
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_BASIC_UNSPEC,
|
|
|
|
TCA_BASIC_CLASSID,
|
|
|
|
TCA_BASIC_EMATCHES,
|
|
|
|
TCA_BASIC_ACT,
|
|
|
|
TCA_BASIC_POLICE,
|
|
|
|
__TCA_BASIC_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1)
|
|
|
|
|
2008-11-08 13:56:00 +07:00
|
|
|
|
|
|
|
/* Cgroup classifier */
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2008-11-08 13:56:00 +07:00
|
|
|
TCA_CGROUP_UNSPEC,
|
|
|
|
TCA_CGROUP_ACT,
|
|
|
|
TCA_CGROUP_POLICE,
|
|
|
|
TCA_CGROUP_EMATCHES,
|
|
|
|
__TCA_CGROUP_MAX,
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1)
|
|
|
|
|
net: sched: cls_bpf: add BPF-based classifier
This work contains a lightweight BPF-based traffic classifier that can
serve as a flexible alternative to ematch-based tree classification, i.e.
now that BPF filter engine can also be JITed in the kernel. Naturally, tc
actions and policies are supported as well with cls_bpf. Multiple BPF
programs/filter can be attached for a class, or they can just as well be
written within a single BPF program, that's really up to the user how he
wishes to run/optimize the code, e.g. also for inversion of verdicts etc.
The notion of a BPF program's return/exit codes is being kept as follows:
0: No match
-1: Select classid given in "tc filter ..." command
else: flowid, overwrite the default one
As a minimal usage example with iproute2, we use a 3 band prio root qdisc
on a router with sfq each as leave, and assign ssh and icmp bpf-based
filters to band 1, http traffic to band 2 and the rest to band 3. For the
first two bands we load the bytecode from a file, in the 2nd we load it
inline as an example:
echo 1 > /proc/sys/net/core/bpf_jit_enable
tc qdisc del dev em1 root
tc qdisc add dev em1 root handle 1: prio bands 3 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
tc qdisc add dev em1 parent 1:1 sfq perturb 16
tc qdisc add dev em1 parent 1:2 sfq perturb 16
tc qdisc add dev em1 parent 1:3 sfq perturb 16
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/ssh.bpf flowid 1:1
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/icmp.bpf flowid 1:1
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/http.bpf flowid 1:2
tc filter add dev em1 parent 1: bpf run bytecode "`bpfc -f tc -i misc.ops`" flowid 1:3
BPF programs can be easily created and passed to tc, either as inline
'bytecode' or 'bytecode-file'. There are a couple of front-ends that can
compile opcodes, for example:
1) People familiar with tcpdump-like filters:
tcpdump -iem1 -ddd port 22 | tr '\n' ',' > /etc/tc/ssh.bpf
2) People that want to low-level program their filters or use BPF
extensions that lack support by libpcap's compiler:
bpfc -f tc -i ssh.ops > /etc/tc/ssh.bpf
ssh.ops example code:
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ldh [20]
jset #0x1fff, drop
ldxb 4 * ([14] & 0xf)
ldh [%x + 14]
jeq #0x16, pass
ldh [%x + 16]
jne #0x16, drop
pass: ret #-1
drop: ret #0
It was chosen to load bytecode into tc, since the reverse operation,
tc filter list dev em1, is then able to show the exact commands again.
Possible follow-up work could also include a small expression compiler
for iproute2. Tested with the help of bmon. This idea came up during
the Netfilter Workshop 2013 in Copenhagen. Also thanks to feedback from
Eric Dumazet!
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Cc: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-10-28 22:43:02 +07:00
|
|
|
/* BPF classifier */
|
|
|
|
|
2015-09-16 13:05:42 +07:00
|
|
|
#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0)
|
|
|
|
|
net: sched: cls_bpf: add BPF-based classifier
This work contains a lightweight BPF-based traffic classifier that can
serve as a flexible alternative to ematch-based tree classification, i.e.
now that BPF filter engine can also be JITed in the kernel. Naturally, tc
actions and policies are supported as well with cls_bpf. Multiple BPF
programs/filter can be attached for a class, or they can just as well be
written within a single BPF program, that's really up to the user how he
wishes to run/optimize the code, e.g. also for inversion of verdicts etc.
The notion of a BPF program's return/exit codes is being kept as follows:
0: No match
-1: Select classid given in "tc filter ..." command
else: flowid, overwrite the default one
As a minimal usage example with iproute2, we use a 3 band prio root qdisc
on a router with sfq each as leave, and assign ssh and icmp bpf-based
filters to band 1, http traffic to band 2 and the rest to band 3. For the
first two bands we load the bytecode from a file, in the 2nd we load it
inline as an example:
echo 1 > /proc/sys/net/core/bpf_jit_enable
tc qdisc del dev em1 root
tc qdisc add dev em1 root handle 1: prio bands 3 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
tc qdisc add dev em1 parent 1:1 sfq perturb 16
tc qdisc add dev em1 parent 1:2 sfq perturb 16
tc qdisc add dev em1 parent 1:3 sfq perturb 16
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/ssh.bpf flowid 1:1
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/icmp.bpf flowid 1:1
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/http.bpf flowid 1:2
tc filter add dev em1 parent 1: bpf run bytecode "`bpfc -f tc -i misc.ops`" flowid 1:3
BPF programs can be easily created and passed to tc, either as inline
'bytecode' or 'bytecode-file'. There are a couple of front-ends that can
compile opcodes, for example:
1) People familiar with tcpdump-like filters:
tcpdump -iem1 -ddd port 22 | tr '\n' ',' > /etc/tc/ssh.bpf
2) People that want to low-level program their filters or use BPF
extensions that lack support by libpcap's compiler:
bpfc -f tc -i ssh.ops > /etc/tc/ssh.bpf
ssh.ops example code:
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ldh [20]
jset #0x1fff, drop
ldxb 4 * ([14] & 0xf)
ldh [%x + 14]
jeq #0x16, pass
ldh [%x + 16]
jne #0x16, drop
pass: ret #-1
drop: ret #0
It was chosen to load bytecode into tc, since the reverse operation,
tc filter list dev em1, is then able to show the exact commands again.
Possible follow-up work could also include a small expression compiler
for iproute2. Tested with the help of bmon. This idea came up during
the Netfilter Workshop 2013 in Copenhagen. Also thanks to feedback from
Eric Dumazet!
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Cc: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-10-28 22:43:02 +07:00
|
|
|
enum {
|
|
|
|
TCA_BPF_UNSPEC,
|
|
|
|
TCA_BPF_ACT,
|
|
|
|
TCA_BPF_POLICE,
|
|
|
|
TCA_BPF_CLASSID,
|
|
|
|
TCA_BPF_OPS_LEN,
|
|
|
|
TCA_BPF_OPS,
|
cls_bpf: add initial eBPF support for programmable classifiers
This work extends the "classic" BPF programmable tc classifier by
extending its scope also to native eBPF code!
This allows for user space to implement own custom, 'safe' C like
classifiers (or whatever other frontend language LLVM et al may
provide in future), that can then be compiled with the LLVM eBPF
backend to an eBPF elf file. The result of this can be loaded into
the kernel via iproute2's tc. In the kernel, they can be JITed on
major archs and thus run in native performance.
Simple, minimal toy example to demonstrate the workflow:
#include <linux/ip.h>
#include <linux/if_ether.h>
#include <linux/bpf.h>
#include "tc_bpf_api.h"
__section("classify")
int cls_main(struct sk_buff *skb)
{
return (0x800 << 16) | load_byte(skb, ETH_HLEN + __builtin_offsetof(struct iphdr, tos));
}
char __license[] __section("license") = "GPL";
The classifier can then be compiled into eBPF opcodes and loaded
via tc, for example:
clang -O2 -emit-llvm -c cls.c -o - | llc -march=bpf -filetype=obj -o cls.o
tc filter add dev em1 parent 1: bpf cls.o [...]
As it has been demonstrated, the scope can even reach up to a fully
fledged flow dissector (similarly as in samples/bpf/sockex2_kern.c).
For tc, maps are allowed to be used, but from kernel context only,
in other words, eBPF code can keep state across filter invocations.
In future, we perhaps may reattach from a different application to
those maps e.g., to read out collected statistics/state.
Similarly as in socket filters, we may extend functionality for eBPF
classifiers over time depending on the use cases. For that purpose,
cls_bpf programs are using BPF_PROG_TYPE_SCHED_CLS program type, so
we can allow additional functions/accessors (e.g. an ABI compatible
offset translation to skb fields/metadata). For an initial cls_bpf
support, we allow the same set of helper functions as eBPF socket
filters, but we could diverge at some point in time w/o problem.
I was wondering whether cls_bpf and act_bpf could share C programs,
I can imagine that at some point, we introduce i) further common
handlers for both (or even beyond their scope), and/or if truly needed
ii) some restricted function space for each of them. Both can be
abstracted easily through struct bpf_verifier_ops in future.
The context of cls_bpf versus act_bpf is slightly different though:
a cls_bpf program will return a specific classid whereas act_bpf a
drop/non-drop return code, latter may also in future mangle skbs.
That said, we can surely have a "classify" and "action" section in
a single object file, or considered mentioned constraint add a
possibility of a shared section.
The workflow for getting native eBPF running from tc [1] is as
follows: for f_bpf, I've added a slightly modified ELF parser code
from Alexei's kernel sample, which reads out the LLVM compiled
object, sets up maps (and dynamically fixes up map fds) if any, and
loads the eBPF instructions all centrally through the bpf syscall.
The resulting fd from the loaded program itself is being passed down
to cls_bpf, which looks up struct bpf_prog from the fd store, and
holds reference, so that it stays available also after tc program
lifetime. On tc filter destruction, it will then drop its reference.
Moreover, I've also added the optional possibility to annotate an
eBPF filter with a name (e.g. path to object file, or something
else if preferred) so that when tc dumps currently installed filters,
some more context can be given to an admin for a given instance (as
opposed to just the file descriptor number).
Last but not least, bpf_prog_get() and bpf_prog_put() needed to be
exported, so that eBPF can be used from cls_bpf built as a module.
Thanks to 60a3b2253c41 ("net: bpf: make eBPF interpreter images
read-only") I think this is of no concern since anything wanting to
alter eBPF opcode after verification stage would crash the kernel.
[1] http://git.breakpoint.cc/cgit/dborkman/iproute2.git/log/?h=ebpf
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Jiri Pirko <jiri@resnulli.us>
Acked-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2015-03-01 18:31:48 +07:00
|
|
|
TCA_BPF_FD,
|
|
|
|
TCA_BPF_NAME,
|
2015-09-16 13:05:42 +07:00
|
|
|
TCA_BPF_FLAGS,
|
net: sched: cls_bpf: add BPF-based classifier
This work contains a lightweight BPF-based traffic classifier that can
serve as a flexible alternative to ematch-based tree classification, i.e.
now that BPF filter engine can also be JITed in the kernel. Naturally, tc
actions and policies are supported as well with cls_bpf. Multiple BPF
programs/filter can be attached for a class, or they can just as well be
written within a single BPF program, that's really up to the user how he
wishes to run/optimize the code, e.g. also for inversion of verdicts etc.
The notion of a BPF program's return/exit codes is being kept as follows:
0: No match
-1: Select classid given in "tc filter ..." command
else: flowid, overwrite the default one
As a minimal usage example with iproute2, we use a 3 band prio root qdisc
on a router with sfq each as leave, and assign ssh and icmp bpf-based
filters to band 1, http traffic to band 2 and the rest to band 3. For the
first two bands we load the bytecode from a file, in the 2nd we load it
inline as an example:
echo 1 > /proc/sys/net/core/bpf_jit_enable
tc qdisc del dev em1 root
tc qdisc add dev em1 root handle 1: prio bands 3 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
tc qdisc add dev em1 parent 1:1 sfq perturb 16
tc qdisc add dev em1 parent 1:2 sfq perturb 16
tc qdisc add dev em1 parent 1:3 sfq perturb 16
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/ssh.bpf flowid 1:1
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/icmp.bpf flowid 1:1
tc filter add dev em1 parent 1: bpf run bytecode-file /etc/tc/http.bpf flowid 1:2
tc filter add dev em1 parent 1: bpf run bytecode "`bpfc -f tc -i misc.ops`" flowid 1:3
BPF programs can be easily created and passed to tc, either as inline
'bytecode' or 'bytecode-file'. There are a couple of front-ends that can
compile opcodes, for example:
1) People familiar with tcpdump-like filters:
tcpdump -iem1 -ddd port 22 | tr '\n' ',' > /etc/tc/ssh.bpf
2) People that want to low-level program their filters or use BPF
extensions that lack support by libpcap's compiler:
bpfc -f tc -i ssh.ops > /etc/tc/ssh.bpf
ssh.ops example code:
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ldh [20]
jset #0x1fff, drop
ldxb 4 * ([14] & 0xf)
ldh [%x + 14]
jeq #0x16, pass
ldh [%x + 16]
jne #0x16, drop
pass: ret #-1
drop: ret #0
It was chosen to load bytecode into tc, since the reverse operation,
tc filter list dev em1, is then able to show the exact commands again.
Possible follow-up work could also include a small expression compiler
for iproute2. Tested with the help of bmon. This idea came up during
the Netfilter Workshop 2013 in Copenhagen. Also thanks to feedback from
Eric Dumazet!
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Cc: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-10-28 22:43:02 +07:00
|
|
|
__TCA_BPF_MAX,
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_BPF_MAX (__TCA_BPF_MAX - 1)
|
|
|
|
|
2015-05-12 19:56:21 +07:00
|
|
|
/* Flower classifier */
|
|
|
|
|
|
|
|
enum {
|
|
|
|
TCA_FLOWER_UNSPEC,
|
|
|
|
TCA_FLOWER_CLASSID,
|
|
|
|
TCA_FLOWER_INDEV,
|
|
|
|
TCA_FLOWER_ACT,
|
|
|
|
TCA_FLOWER_KEY_ETH_DST, /* ETH_ALEN */
|
|
|
|
TCA_FLOWER_KEY_ETH_DST_MASK, /* ETH_ALEN */
|
|
|
|
TCA_FLOWER_KEY_ETH_SRC, /* ETH_ALEN */
|
|
|
|
TCA_FLOWER_KEY_ETH_SRC_MASK, /* ETH_ALEN */
|
|
|
|
TCA_FLOWER_KEY_ETH_TYPE, /* be16 */
|
|
|
|
TCA_FLOWER_KEY_IP_PROTO, /* u8 */
|
|
|
|
TCA_FLOWER_KEY_IPV4_SRC, /* be32 */
|
|
|
|
TCA_FLOWER_KEY_IPV4_SRC_MASK, /* be32 */
|
|
|
|
TCA_FLOWER_KEY_IPV4_DST, /* be32 */
|
|
|
|
TCA_FLOWER_KEY_IPV4_DST_MASK, /* be32 */
|
|
|
|
TCA_FLOWER_KEY_IPV6_SRC, /* struct in6_addr */
|
|
|
|
TCA_FLOWER_KEY_IPV6_SRC_MASK, /* struct in6_addr */
|
|
|
|
TCA_FLOWER_KEY_IPV6_DST, /* struct in6_addr */
|
|
|
|
TCA_FLOWER_KEY_IPV6_DST_MASK, /* struct in6_addr */
|
|
|
|
TCA_FLOWER_KEY_TCP_SRC, /* be16 */
|
|
|
|
TCA_FLOWER_KEY_TCP_DST, /* be16 */
|
|
|
|
TCA_FLOWER_KEY_UDP_SRC, /* be16 */
|
|
|
|
TCA_FLOWER_KEY_UDP_DST, /* be16 */
|
2016-03-08 17:42:29 +07:00
|
|
|
|
|
|
|
TCA_FLOWER_FLAGS,
|
2015-05-12 19:56:21 +07:00
|
|
|
__TCA_FLOWER_MAX,
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)
|
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* Extended Matches */
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tcf_ematch_tree_hdr {
|
2005-04-17 05:20:36 +07:00
|
|
|
__u16 nmatches;
|
|
|
|
__u16 progid;
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCA_EMATCH_TREE_UNSPEC,
|
|
|
|
TCA_EMATCH_TREE_HDR,
|
|
|
|
TCA_EMATCH_TREE_LIST,
|
|
|
|
__TCA_EMATCH_TREE_MAX
|
|
|
|
};
|
|
|
|
#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1)
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
struct tcf_ematch_hdr {
|
2005-04-17 05:20:36 +07:00
|
|
|
__u16 matchid;
|
|
|
|
__u16 kind;
|
|
|
|
__u16 flags;
|
|
|
|
__u16 pad; /* currently unused */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* 0 1
|
|
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
|
|
|
|
* +-----------------------+-+-+---+
|
|
|
|
* | Unused |S|I| R |
|
|
|
|
* +-----------------------+-+-+---+
|
|
|
|
*
|
|
|
|
* R(2) ::= relation to next ematch
|
|
|
|
* where: 0 0 END (last ematch)
|
|
|
|
* 0 1 AND
|
|
|
|
* 1 0 OR
|
|
|
|
* 1 1 Unused (invalid)
|
|
|
|
* I(1) ::= invert result
|
|
|
|
* S(1) ::= simple payload
|
|
|
|
*/
|
|
|
|
#define TCF_EM_REL_END 0
|
|
|
|
#define TCF_EM_REL_AND (1<<0)
|
|
|
|
#define TCF_EM_REL_OR (1<<1)
|
|
|
|
#define TCF_EM_INVERT (1<<2)
|
|
|
|
#define TCF_EM_SIMPLE (1<<3)
|
|
|
|
|
|
|
|
#define TCF_EM_REL_MASK 3
|
|
|
|
#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK)
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCF_LAYER_LINK,
|
|
|
|
TCF_LAYER_NETWORK,
|
|
|
|
TCF_LAYER_TRANSPORT,
|
|
|
|
__TCF_LAYER_MAX
|
|
|
|
};
|
|
|
|
#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1)
|
|
|
|
|
|
|
|
/* Ematch type assignments
|
|
|
|
* 1..32767 Reserved for ematches inside kernel tree
|
|
|
|
* 32768..65535 Free to use, not reliable
|
|
|
|
*/
|
2007-07-12 09:46:26 +07:00
|
|
|
#define TCF_EM_CONTAINER 0
|
|
|
|
#define TCF_EM_CMP 1
|
|
|
|
#define TCF_EM_NBYTE 2
|
|
|
|
#define TCF_EM_U32 3
|
|
|
|
#define TCF_EM_META 4
|
|
|
|
#define TCF_EM_TEXT 5
|
2012-07-04 10:32:03 +07:00
|
|
|
#define TCF_EM_VLAN 6
|
|
|
|
#define TCF_EM_CANID 7
|
2012-07-11 17:56:57 +07:00
|
|
|
#define TCF_EM_IPSET 8
|
|
|
|
#define TCF_EM_MAX 8
|
2005-04-17 05:20:36 +07:00
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCF_EM_PROG_TC
|
|
|
|
};
|
|
|
|
|
2009-11-05 00:50:58 +07:00
|
|
|
enum {
|
2005-04-17 05:20:36 +07:00
|
|
|
TCF_EM_OPND_EQ,
|
|
|
|
TCF_EM_OPND_GT,
|
|
|
|
TCF_EM_OPND_LT
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|