[ovs-dev,ovs,V4,00/24] Introducing HW offload support for openvswitch

Submitted by Simon Horman on March 13, 2017, 6:38 p.m.

Details

Message ID 20170313183833.GA10407@penelope.horms.nl
State Superseded
Headers show

Commit Message

Simon Horman March 13, 2017, 6:38 p.m.
On Mon, Mar 13, 2017 at 03:36:50PM +0200, Roi Dayan wrote:
> This patch series introduces rule offload functionality to dpif-netlink
> via netdev ports new flow offloading API. The user can specify whether to
> enable rule offloading or not via OVS configuration. Netdev providers
> are able to implement netdev flow offload API in order to offload rules.
> 
> This patch series also implements one offload scheme for netdev-linux,
> using TC flower classifier, which was chosen because its sort of natural
> to state OVS DP rules for this classifier. However, the code can be
> extended to support other classifiers such as U32, eBPF, etc which support
> offload as well.
> 
> The use-case we are currently addressing is the newly sriov switchdev mode
> in the Linux kernel which was introduced in version 4.8 [1][2].
> This series was tested against sriov vfs vports representors of the
> Mellanox 100G ConnectX-4 series exposed by the mlx5 kernel driver.
> 
> 
> V3->V4:
>     - Move declarations to the right commit with implementation
>     - Fix tc_get_flower flow return false success 
>     - Fix memory leaks - not releasing tc_transact replies
>     - Fix travis failure for OSX compilation
>     - Fix loop in dpif_netlink_flow_dump_next
>     - Fix declared default value for tc-policy in vswitch.xml
>     - Refactor loop in netdev_tc_flow_dump_next
>     - Add missing error checks in parse_flow_put
>     - Fix handling modify request where old rule is in hw and new
>       rule is not supported and needs to be in sw.
>     - Use 2 hashmaps instead of 1 for faster reverse lookup of ufid from tc
>     - Init ports when enabling hw-offload after OVS is running
> 
>     TODO: Fix breaking of datapath compilation
>           Fix testsuite failures

Hi Roi,

thanks for posting the update. I took a stab at resolving the first of the
TODO items listed above. It is supposed to allow compilation to work
against all (supported) kernels.  Feel free to squash it into your
patch-set as you see fit.


From: Simon Horman <simon.horman@netronome.com>

* Do not use compat code when compiling kernel datapath;
  there is no need for it as TC compatibility is not provided there.
  In other words, the compat code is only used when compiling user-space
  code against old kernel headers.

* Check for TCA_VLAN_PUSH_VLAN_PRIORITY rather than TCA_VLAN_PUSH_VLAN_ID
  as the latter former is newer.

* Also, not strictly related, strip down compat headers to only provide
  enums, structs and groups of #defines that are used.

Signed-off-by: Simon Horman <simon.horman@netronome.com>

---

This patch is against the hw-offload-fixes-for-v4-3 branch of
https://github.com/roidayan/ovs/
---
 acinclude.m4                         |   6 +-
 include/linux/pkt_cls.h              | 419 +----------------------------------
 include/linux/tc_act/tc_tunnel_key.h |   6 +-
 include/linux/tc_act/tc_vlan.h       |  13 +-
 4 files changed, 12 insertions(+), 432 deletions(-)

Comments

Roi Dayan March 14, 2017, 8:41 a.m.
On 13/03/2017 20:38, Simon Horman wrote:
> On Mon, Mar 13, 2017 at 03:36:50PM +0200, Roi Dayan wrote:
>> This patch series introduces rule offload functionality to dpif-netlink
>> via netdev ports new flow offloading API. The user can specify whether to
>> enable rule offloading or not via OVS configuration. Netdev providers
>> are able to implement netdev flow offload API in order to offload rules.
>>
>> This patch series also implements one offload scheme for netdev-linux,
>> using TC flower classifier, which was chosen because its sort of natural
>> to state OVS DP rules for this classifier. However, the code can be
>> extended to support other classifiers such as U32, eBPF, etc which support
>> offload as well.
>>
>> The use-case we are currently addressing is the newly sriov switchdev mode
>> in the Linux kernel which was introduced in version 4.8 [1][2].
>> This series was tested against sriov vfs vports representors of the
>> Mellanox 100G ConnectX-4 series exposed by the mlx5 kernel driver.
>>
>>
>> V3->V4:
>>     - Move declarations to the right commit with implementation
>>     - Fix tc_get_flower flow return false success
>>     - Fix memory leaks - not releasing tc_transact replies
>>     - Fix travis failure for OSX compilation
>>     - Fix loop in dpif_netlink_flow_dump_next
>>     - Fix declared default value for tc-policy in vswitch.xml
>>     - Refactor loop in netdev_tc_flow_dump_next
>>     - Add missing error checks in parse_flow_put
>>     - Fix handling modify request where old rule is in hw and new
>>       rule is not supported and needs to be in sw.
>>     - Use 2 hashmaps instead of 1 for faster reverse lookup of ufid from tc
>>     - Init ports when enabling hw-offload after OVS is running
>>
>>     TODO: Fix breaking of datapath compilation
>>           Fix testsuite failures
>
> Hi Roi,
>
> thanks for posting the update. I took a stab at resolving the first of the
> TODO items listed above. It is supposed to allow compilation to work
> against all (supported) kernels.  Feel free to squash it into your
> patch-set as you see fit.
>


thanks!

>
> From: Simon Horman <simon.horman@netronome.com>
>
> * Do not use compat code when compiling kernel datapath;
>   there is no need for it as TC compatibility is not provided there.
>   In other words, the compat code is only used when compiling user-space
>   code against old kernel headers.
>
> * Check for TCA_VLAN_PUSH_VLAN_PRIORITY rather than TCA_VLAN_PUSH_VLAN_ID
>   as the latter former is newer.
>
> * Also, not strictly related, strip down compat headers to only provide
>   enums, structs and groups of #defines that are used.
>
> Signed-off-by: Simon Horman <simon.horman@netronome.com>
>
> ---
>
> This patch is against the hw-offload-fixes-for-v4-3 branch of
> https://github.com/roidayan/ovs/
> ---
>  acinclude.m4                         |   6 +-
>  include/linux/pkt_cls.h              | 419 +----------------------------------
>  include/linux/tc_act/tc_tunnel_key.h |   6 +-
>  include/linux/tc_act/tc_vlan.h       |  13 +-
>  4 files changed, 12 insertions(+), 432 deletions(-)
>
> diff --git a/acinclude.m4 b/acinclude.m4
> index 0e466b3e32d1..4fc9985a0594 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -168,10 +168,10 @@ AC_DEFUN([OVS_CHECK_LINUX_TC], [
>
>    AC_COMPILE_IFELSE([
>      AC_LANG_PROGRAM([#include <linux/tc_act/tc_vlan.h>], [
> -        int x = TCA_VLAN_PUSH_VLAN_ID;
> +        int x = TCA_VLAN_PUSH_VLAN_PRIORITY;
>      ])],
> -    [AC_DEFINE([HAVE_TCA_VLAN_PUSH_VLAN_ID], [1],
> -               [Define to 1 if TCA_VLAN_PUSH_VLAN_ID is avaiable.])])
> +    [AC_DEFINE([HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY], [1],
> +               [Define to 1 if TCA_VLAN_PUSH_VLAN_PRIORITY is avaiable.])])
>
>    AC_COMPILE_IFELSE([
>      AC_LANG_PROGRAM([#include <linux/tc_act/tc_tunnel_key.h>], [
> diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h
> index 9b6865bf15f9..50f81fa6ea1d 100644
> --- a/include/linux/pkt_cls.h
> +++ b/include/linux/pkt_cls.h
> @@ -1,68 +1,13 @@
>  #ifndef __LINUX_PKT_CLS_WRAPPER_H
>  #define __LINUX_PKT_CLS_WRAPPER_H 1
>
> -#ifdef HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT
> +#if defined(__KERNEL__) || defined(HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT)
>  #include_next <linux/pkt_cls.h>
>  #else
>
>  #include <linux/types.h>
>  #include <linux/pkt_sched.h>
>
> -#ifdef __KERNEL__
> -/* 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))
> -
> -#define MAX_REC_LOOP 4
> -#define MAX_RED_LOOP 4
> -#endif
> -
>  /* Action attributes */
>  enum {
>  	TCA_ACT_UNSPEC,
> @@ -95,16 +40,6 @@ enum {
>  #define TC_ACT_REDIRECT		7
>  #define TC_ACT_JUMP		0x10000000
>
> -/* Action type identifiers*/
> -enum {
> -	TCA_ID_UNSPEC=0,
> -	TCA_ID_POLICE=1,
> -	/* other actions go here */
> -	__TCA_ID_MAX=255
> -};
> -
> -#define TCA_ID_MAX __TCA_ID_MAX
> -
>  struct tc_police {
>  	__u32			index;
>  	int			action;
> @@ -131,11 +66,6 @@ struct tcf_t {
>  	__u64   firstuse;
>  };
>
> -struct tc_cnt {
> -	int                   refcnt;
> -	int                   bindcnt;
> -};
> -
>  #define tc_gen \
>  	__u32                 index; \
>  	__u32                 capab; \
> @@ -156,210 +86,10 @@ enum {
>  #define TCA_POLICE_RESULT TCA_POLICE_RESULT
>  };
>
> -#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)
> -
>  /* tca flags definitions */
>  #define TCA_CLS_FLAGS_SKIP_HW	(1 << 0)
>  #define TCA_CLS_FLAGS_SKIP_SW	(1 << 1)
>
> -/* 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)
> -
> -enum {
> -	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,
> -	TCA_U32_FLAGS,
> -	TCA_U32_PAD,
> -	__TCA_U32_MAX
> -};
> -
> -#define TCA_U32_MAX (__TCA_U32_MAX - 1)
> -
> -struct tc_u32_key {
> -	__be32		mask;
> -	__be32		val;
> -	int		off;
> -	int		offmask;
> -};
> -
> -struct tc_u32_sel {
> -	unsigned char		flags;
> -	unsigned char		offshift;
> -	unsigned char		nkeys;
> -
> -	__be16			offmask;
> -	__u16			off;
> -	short			offoff;
> -
> -	short			hoff;
> -	__be32			hmask;
> -	struct tc_u32_key	keys[0];
> -};
> -
> -struct tc_u32_mark {
> -	__u32		val;
> -	__u32		mask;
> -	__u32		success;
> -};
> -
> -struct tc_u32_pcnt {
> -	__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 */
> -
> -enum {
> -	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 )
> -
> -struct tc_rsvp_gpi {
> -	__u32	key;
> -	__u32	mask;
> -	int	offset;
> -};
> -
> -struct tc_rsvp_pinfo {
> -	struct tc_rsvp_gpi dpi;
> -	struct tc_rsvp_gpi spi;
> -	__u8	protocol;
> -	__u8	tunnelid;
> -	__u8	tunnelhdr;
> -	__u8	pad;
> -};
> -
> -/* ROUTE filter */
> -
> -enum {
> -	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 */
> -
> -enum {
> -	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 */
> -	TCA_FW_MASK,
> -	__TCA_FW_MAX
> -};
> -
> -#define TCA_FW_MAX (__TCA_FW_MAX - 1)
> -
> -/* TC index filter */
> -
> -enum {
> -	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)
> -
> -/* Flow filter */
> -
> -enum {
> -	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,
> -	FLOW_KEY_VLAN_TAG,
> -	FLOW_KEY_RXHASH,
> -	__FLOW_KEY_MAX,
> -};
> -
> -#define FLOW_KEY_MAX	(__FLOW_KEY_MAX - 1)
> -
> -enum {
> -	FLOW_MODE_MAP,
> -	FLOW_MODE_HASH,
> -};
> -
> -enum {
> -	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,
> -	TCA_FLOW_PERTURB,
> -	__TCA_FLOW_MAX
> -};
> -
> -#define TCA_FLOW_MAX	(__TCA_FLOW_MAX - 1)
> -
>  /* Basic filter */
>
>  enum {
> @@ -371,42 +101,6 @@ enum {
>  	__TCA_BASIC_MAX
>  };
>
> -#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1)
> -
> -
> -/* Cgroup classifier */
> -
> -enum {
> -	TCA_CGROUP_UNSPEC,
> -	TCA_CGROUP_ACT,
> -	TCA_CGROUP_POLICE,
> -	TCA_CGROUP_EMATCHES,
> -	__TCA_CGROUP_MAX,
> -};
> -
> -#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1)
> -
> -/* BPF classifier */
> -
> -#define TCA_BPF_FLAG_ACT_DIRECT		(1 << 0)
> -
> -enum {
> -	TCA_BPF_UNSPEC,
> -	TCA_BPF_ACT,
> -	TCA_BPF_POLICE,
> -	TCA_BPF_CLASSID,
> -	TCA_BPF_OPS_LEN,
> -	TCA_BPF_OPS,
> -	TCA_BPF_FD,
> -	TCA_BPF_NAME,
> -	TCA_BPF_FLAGS,
> -	TCA_BPF_FLAGS_GEN,
> -	TCA_BPF_TAG,
> -	__TCA_BPF_MAX,
> -};
> -
> -#define TCA_BPF_MAX (__TCA_BPF_MAX - 1)
> -
>  /* Flower classifier */
>
>  enum {
> @@ -462,118 +156,9 @@ enum {
>  	TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK,	/* be16 */
>  	TCA_FLOWER_KEY_ENC_UDP_DST_PORT,	/* be16 */
>  	TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK,	/* be16 */
> -
> -	TCA_FLOWER_KEY_FLAGS,		/* be32 */
> -	TCA_FLOWER_KEY_FLAGS_MASK,	/* be32 */
> -
> -	TCA_FLOWER_KEY_ICMPV4_CODE,	/* u8 */
> -	TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */
> -	TCA_FLOWER_KEY_ICMPV4_TYPE,	/* u8 */
> -	TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */
> -	TCA_FLOWER_KEY_ICMPV6_CODE,	/* u8 */
> -	TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */
> -	TCA_FLOWER_KEY_ICMPV6_TYPE,	/* u8 */
> -	TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */
> -
>  	__TCA_FLOWER_MAX,
>  };
>
> -#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)
> -
> -enum {
> -	TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0),
> -};
> -
> -/* Match-all classifier */
> -
> -enum {
> -	TCA_MATCHALL_UNSPEC,
> -	TCA_MATCHALL_CLASSID,
> -	TCA_MATCHALL_ACT,
> -	TCA_MATCHALL_FLAGS,
> -	__TCA_MATCHALL_MAX,
> -};
> -
> -#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1)
> -
> -/* Extended Matches */
> -
> -struct tcf_ematch_tree_hdr {
> -	__u16		nmatches;
> -	__u16		progid;
> -};
> -
> -enum {
> -	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)
> -
> -struct tcf_ematch_hdr {
> -	__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)
> -
> -enum {
> -	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
> - */
> -#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
> -#define	TCF_EM_VLAN		6
> -#define	TCF_EM_CANID		7
> -#define	TCF_EM_IPSET		8
> -#define	TCF_EM_MAX		8
> -
> -enum {
> -	TCF_EM_PROG_TC
> -};
> -
> -enum {
> -	TCF_EM_OPND_EQ,
> -	TCF_EM_OPND_GT,
> -	TCF_EM_OPND_LT
> -};
> -
> -#endif /* HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT */
> +#endif /* __KERNEL__ || !HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT */
>
>  #endif /* __LINUX_PKT_CLS_WRAPPER_H */
> diff --git a/include/linux/tc_act/tc_tunnel_key.h b/include/linux/tc_act/tc_tunnel_key.h
> index 3b849f952a82..0e498349a8e7 100644
> --- a/include/linux/tc_act/tc_tunnel_key.h
> +++ b/include/linux/tc_act/tc_tunnel_key.h
> @@ -1,7 +1,7 @@
>  #ifndef __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H
>  #define __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H 1
>
> -#ifdef HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT
> +#if defined(__KERNEL__) || defined(HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT)
>  #include_next <linux/tc_act/tc_tunnel_key.h>
>  #else
>
> @@ -17,8 +17,6 @@
>
>  #include <linux/pkt_cls.h>
>
> -#define TCA_ACT_TUNNEL_KEY 17
> -
>  #define TCA_TUNNEL_KEY_ACT_SET	    1
>  #define TCA_TUNNEL_KEY_ACT_RELEASE  2
>
> @@ -43,6 +41,6 @@ enum {
>
>  #define TCA_TUNNEL_KEY_MAX (__TCA_TUNNEL_KEY_MAX - 1)
>
> -#endif /* HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT */
> +#endif /* __KERNEL__ || HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT */
>
>  #endif /* __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H */
> diff --git a/include/linux/tc_act/tc_vlan.h b/include/linux/tc_act/tc_vlan.h
> index e20965ace446..140702ef218a 100644
> --- a/include/linux/tc_act/tc_vlan.h
> +++ b/include/linux/tc_act/tc_vlan.h
> @@ -1,7 +1,8 @@
>  #ifndef __LINUX_TC_ACT_TC_VLAN_WRAPPER_H
> -#define __LINUX_TC_ACT_TC_VLAN_KEY_WRAPPER_H 1
> +#define __LINUX_TC_ACT_TC_VLAN_WRAPPER_H 1
>
> -#ifdef HAVE_TCA_VLAN_PUSH_VLAN_ID
> +#if defined(__KERNEL__) || defined(HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY)
> +#error hello
>  #include_next <linux/tc_act/tc_vlan.h>
>  #else
>
> @@ -14,10 +15,6 @@
>   * (at your option) any later version.
>   */
>
> -#include <linux/pkt_cls.h>
> -
> -#define TCA_ACT_VLAN 12
> -
>  #define TCA_VLAN_ACT_POP	1
>  #define TCA_VLAN_ACT_PUSH	2
>  #define TCA_VLAN_ACT_MODIFY	3
> @@ -39,6 +36,6 @@ enum {
>  };
>  #define TCA_VLAN_MAX (__TCA_VLAN_MAX - 1)
>
> -#endif /* HAVE_TCA_VLAN_PUSH_VLAN_ID */
> +#endif /* __KERNEL__ || HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY */
>
> -#endif /* __LINUX_TC_ACT_TC_VLAN_KEY_WRAPPER_H */
> +#endif /* __LINUX_TC_ACT_TC_VLAN_WRAPPER_H */
>

Patch hide | download patch | download mbox

diff --git a/acinclude.m4 b/acinclude.m4
index 0e466b3e32d1..4fc9985a0594 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -168,10 +168,10 @@  AC_DEFUN([OVS_CHECK_LINUX_TC], [
 
   AC_COMPILE_IFELSE([
     AC_LANG_PROGRAM([#include <linux/tc_act/tc_vlan.h>], [
-        int x = TCA_VLAN_PUSH_VLAN_ID;
+        int x = TCA_VLAN_PUSH_VLAN_PRIORITY;
     ])],
-    [AC_DEFINE([HAVE_TCA_VLAN_PUSH_VLAN_ID], [1],
-               [Define to 1 if TCA_VLAN_PUSH_VLAN_ID is avaiable.])])
+    [AC_DEFINE([HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY], [1],
+               [Define to 1 if TCA_VLAN_PUSH_VLAN_PRIORITY is avaiable.])])
 
   AC_COMPILE_IFELSE([
     AC_LANG_PROGRAM([#include <linux/tc_act/tc_tunnel_key.h>], [
diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h
index 9b6865bf15f9..50f81fa6ea1d 100644
--- a/include/linux/pkt_cls.h
+++ b/include/linux/pkt_cls.h
@@ -1,68 +1,13 @@ 
 #ifndef __LINUX_PKT_CLS_WRAPPER_H
 #define __LINUX_PKT_CLS_WRAPPER_H 1
 
-#ifdef HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT
+#if defined(__KERNEL__) || defined(HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT)
 #include_next <linux/pkt_cls.h>
 #else
 
 #include <linux/types.h>
 #include <linux/pkt_sched.h>
 
-#ifdef __KERNEL__
-/* 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))
-
-#define MAX_REC_LOOP 4
-#define MAX_RED_LOOP 4
-#endif
-
 /* Action attributes */
 enum {
 	TCA_ACT_UNSPEC,
@@ -95,16 +40,6 @@  enum {
 #define TC_ACT_REDIRECT		7
 #define TC_ACT_JUMP		0x10000000
 
-/* Action type identifiers*/
-enum {
-	TCA_ID_UNSPEC=0,
-	TCA_ID_POLICE=1,
-	/* other actions go here */
-	__TCA_ID_MAX=255
-};
-
-#define TCA_ID_MAX __TCA_ID_MAX
-
 struct tc_police {
 	__u32			index;
 	int			action;
@@ -131,11 +66,6 @@  struct tcf_t {
 	__u64   firstuse;
 };
 
-struct tc_cnt {
-	int                   refcnt;
-	int                   bindcnt;
-};
-
 #define tc_gen \
 	__u32                 index; \
 	__u32                 capab; \
@@ -156,210 +86,10 @@  enum {
 #define TCA_POLICE_RESULT TCA_POLICE_RESULT
 };
 
-#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)
-
 /* tca flags definitions */
 #define TCA_CLS_FLAGS_SKIP_HW	(1 << 0)
 #define TCA_CLS_FLAGS_SKIP_SW	(1 << 1)
 
-/* 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)
-
-enum {
-	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,
-	TCA_U32_FLAGS,
-	TCA_U32_PAD,
-	__TCA_U32_MAX
-};
-
-#define TCA_U32_MAX (__TCA_U32_MAX - 1)
-
-struct tc_u32_key {
-	__be32		mask;
-	__be32		val;
-	int		off;
-	int		offmask;
-};
-
-struct tc_u32_sel {
-	unsigned char		flags;
-	unsigned char		offshift;
-	unsigned char		nkeys;
-
-	__be16			offmask;
-	__u16			off;
-	short			offoff;
-
-	short			hoff;
-	__be32			hmask;
-	struct tc_u32_key	keys[0];
-};
-
-struct tc_u32_mark {
-	__u32		val;
-	__u32		mask;
-	__u32		success;
-};
-
-struct tc_u32_pcnt {
-	__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 */
-
-enum {
-	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 )
-
-struct tc_rsvp_gpi {
-	__u32	key;
-	__u32	mask;
-	int	offset;
-};
-
-struct tc_rsvp_pinfo {
-	struct tc_rsvp_gpi dpi;
-	struct tc_rsvp_gpi spi;
-	__u8	protocol;
-	__u8	tunnelid;
-	__u8	tunnelhdr;
-	__u8	pad;
-};
-
-/* ROUTE filter */
-
-enum {
-	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 */
-
-enum {
-	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 */
-	TCA_FW_MASK,
-	__TCA_FW_MAX
-};
-
-#define TCA_FW_MAX (__TCA_FW_MAX - 1)
-
-/* TC index filter */
-
-enum {
-	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)
-
-/* Flow filter */
-
-enum {
-	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,
-	FLOW_KEY_VLAN_TAG,
-	FLOW_KEY_RXHASH,
-	__FLOW_KEY_MAX,
-};
-
-#define FLOW_KEY_MAX	(__FLOW_KEY_MAX - 1)
-
-enum {
-	FLOW_MODE_MAP,
-	FLOW_MODE_HASH,
-};
-
-enum {
-	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,
-	TCA_FLOW_PERTURB,
-	__TCA_FLOW_MAX
-};
-
-#define TCA_FLOW_MAX	(__TCA_FLOW_MAX - 1)
-
 /* Basic filter */
 
 enum {
@@ -371,42 +101,6 @@  enum {
 	__TCA_BASIC_MAX
 };
 
-#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1)
-
-
-/* Cgroup classifier */
-
-enum {
-	TCA_CGROUP_UNSPEC,
-	TCA_CGROUP_ACT,
-	TCA_CGROUP_POLICE,
-	TCA_CGROUP_EMATCHES,
-	__TCA_CGROUP_MAX,
-};
-
-#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1)
-
-/* BPF classifier */
-
-#define TCA_BPF_FLAG_ACT_DIRECT		(1 << 0)
-
-enum {
-	TCA_BPF_UNSPEC,
-	TCA_BPF_ACT,
-	TCA_BPF_POLICE,
-	TCA_BPF_CLASSID,
-	TCA_BPF_OPS_LEN,
-	TCA_BPF_OPS,
-	TCA_BPF_FD,
-	TCA_BPF_NAME,
-	TCA_BPF_FLAGS,
-	TCA_BPF_FLAGS_GEN,
-	TCA_BPF_TAG,
-	__TCA_BPF_MAX,
-};
-
-#define TCA_BPF_MAX (__TCA_BPF_MAX - 1)
-
 /* Flower classifier */
 
 enum {
@@ -462,118 +156,9 @@  enum {
 	TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK,	/* be16 */
 	TCA_FLOWER_KEY_ENC_UDP_DST_PORT,	/* be16 */
 	TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK,	/* be16 */
-
-	TCA_FLOWER_KEY_FLAGS,		/* be32 */
-	TCA_FLOWER_KEY_FLAGS_MASK,	/* be32 */
-
-	TCA_FLOWER_KEY_ICMPV4_CODE,	/* u8 */
-	TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */
-	TCA_FLOWER_KEY_ICMPV4_TYPE,	/* u8 */
-	TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */
-	TCA_FLOWER_KEY_ICMPV6_CODE,	/* u8 */
-	TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */
-	TCA_FLOWER_KEY_ICMPV6_TYPE,	/* u8 */
-	TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */
-
 	__TCA_FLOWER_MAX,
 };
 
-#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)
-
-enum {
-	TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0),
-};
-
-/* Match-all classifier */
-
-enum {
-	TCA_MATCHALL_UNSPEC,
-	TCA_MATCHALL_CLASSID,
-	TCA_MATCHALL_ACT,
-	TCA_MATCHALL_FLAGS,
-	__TCA_MATCHALL_MAX,
-};
-
-#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1)
-
-/* Extended Matches */
-
-struct tcf_ematch_tree_hdr {
-	__u16		nmatches;
-	__u16		progid;
-};
-
-enum {
-	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)
-
-struct tcf_ematch_hdr {
-	__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)
-
-enum {
-	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
- */
-#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
-#define	TCF_EM_VLAN		6
-#define	TCF_EM_CANID		7
-#define	TCF_EM_IPSET		8
-#define	TCF_EM_MAX		8
-
-enum {
-	TCF_EM_PROG_TC
-};
-
-enum {
-	TCF_EM_OPND_EQ,
-	TCF_EM_OPND_GT,
-	TCF_EM_OPND_LT
-};
-
-#endif /* HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT */
+#endif /* __KERNEL__ || !HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT */
 
 #endif /* __LINUX_PKT_CLS_WRAPPER_H */
diff --git a/include/linux/tc_act/tc_tunnel_key.h b/include/linux/tc_act/tc_tunnel_key.h
index 3b849f952a82..0e498349a8e7 100644
--- a/include/linux/tc_act/tc_tunnel_key.h
+++ b/include/linux/tc_act/tc_tunnel_key.h
@@ -1,7 +1,7 @@ 
 #ifndef __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H
 #define __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H 1
 
-#ifdef HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT
+#if defined(__KERNEL__) || defined(HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT)
 #include_next <linux/tc_act/tc_tunnel_key.h>
 #else
 
@@ -17,8 +17,6 @@ 
 
 #include <linux/pkt_cls.h>
 
-#define TCA_ACT_TUNNEL_KEY 17
-
 #define TCA_TUNNEL_KEY_ACT_SET	    1
 #define TCA_TUNNEL_KEY_ACT_RELEASE  2
 
@@ -43,6 +41,6 @@  enum {
 
 #define TCA_TUNNEL_KEY_MAX (__TCA_TUNNEL_KEY_MAX - 1)
 
-#endif /* HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT */
+#endif /* __KERNEL__ || HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT */
 
 #endif /* __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H */
diff --git a/include/linux/tc_act/tc_vlan.h b/include/linux/tc_act/tc_vlan.h
index e20965ace446..140702ef218a 100644
--- a/include/linux/tc_act/tc_vlan.h
+++ b/include/linux/tc_act/tc_vlan.h
@@ -1,7 +1,8 @@ 
 #ifndef __LINUX_TC_ACT_TC_VLAN_WRAPPER_H
-#define __LINUX_TC_ACT_TC_VLAN_KEY_WRAPPER_H 1
+#define __LINUX_TC_ACT_TC_VLAN_WRAPPER_H 1
 
-#ifdef HAVE_TCA_VLAN_PUSH_VLAN_ID
+#if defined(__KERNEL__) || defined(HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY)
+#error hello
 #include_next <linux/tc_act/tc_vlan.h>
 #else
 
@@ -14,10 +15,6 @@ 
  * (at your option) any later version.
  */
 
-#include <linux/pkt_cls.h>
-
-#define TCA_ACT_VLAN 12
-
 #define TCA_VLAN_ACT_POP	1
 #define TCA_VLAN_ACT_PUSH	2
 #define TCA_VLAN_ACT_MODIFY	3
@@ -39,6 +36,6 @@  enum {
 };
 #define TCA_VLAN_MAX (__TCA_VLAN_MAX - 1)
 
-#endif /* HAVE_TCA_VLAN_PUSH_VLAN_ID */
+#endif /* __KERNEL__ || HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY */
 
-#endif /* __LINUX_TC_ACT_TC_VLAN_KEY_WRAPPER_H */
+#endif /* __LINUX_TC_ACT_TC_VLAN_WRAPPER_H */