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.hor...@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.hor...@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 */

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to