The HW set the mark id that represents matching rule.
The hw-pipeline reads the mark id from fdir.hi

Signed-off-by: Shachar Beiser <[email protected]>
---
 lib/automake.mk       |  3 ++-
 lib/hw-pipeline.h     | 31 +++++++++++++++++++++++++++++++
 lib/netdev-bsd.c      |  1 +
 lib/netdev-dpdk.c     | 25 +++++++++++++++++++++++++
 lib/netdev-dpdk.h     | 14 +++++++++++---
 lib/netdev-dummy.c    |  1 +
 lib/netdev-linux.c    |  1 +
 lib/netdev-provider.h |  7 ++++++-
 lib/netdev-vport.c    |  1 +
 9 files changed, 79 insertions(+), 5 deletions(-)
 create mode 100644 lib/hw-pipeline.h

diff --git a/lib/automake.mk b/lib/automake.mk
index 54a1032..fa27aeb 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -378,7 +378,8 @@ endif
 if DPDK_NETDEV
 lib_libopenvswitch_la_SOURCES += \
        lib/dpdk.c \
-       lib/netdev-dpdk.c
+       lib/netdev-dpdk.c \
+       lib/hw-pipeline.h
 else
 lib_libopenvswitch_la_SOURCES += \
        lib/dpdk-stub.c
diff --git a/lib/hw-pipeline.h b/lib/hw-pipeline.h
new file mode 100644
index 0000000..4dcafa2
--- /dev/null
+++ b/lib/hw-pipeline.h
@@ -0,0 +1,31 @@
+/*
+ * hw-pipeline.h
+ *
+ *  Created on: 13 Oct 2016
+ *      Author: sugeshch
+ */
+
+#ifndef LIB_HW_PIPELINE_H_
+#define LIB_HW_PIPELINE_H_
+#include "unistd.h"
+#include "stdio.h"
+#include "sys/types.h"
+#include "sys/stat.h"
+#include "errno.h"
+#include "fcntl.h"
+#include "flow.h"
+#include "dpif-netdev.h"
+
+#define HW_NO_FREE_FLOW_TAG 0xffffffff
+
+enum pipeline_id {
+    DEFAULT_SW_PIPELINE = 0,
+    HW_OFFLOAD_PIPELINE
+};
+
+struct pipeline_md {
+    uint16_t id; 
+    uint32_t flow_tag;
+};
+
+#endif /* LIB_HW_PIPELINE_H_ */
diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c
index f863a18..b1acc5f 100644
--- a/lib/netdev-bsd.c
+++ b/lib/netdev-bsd.c
@@ -1493,6 +1493,7 @@ netdev_bsd_update_flags(struct netdev *netdev_, enum 
netdev_flags off,
     CONSTRUCT,                                       \
     netdev_bsd_destruct,                             \
     netdev_bsd_dealloc,                              \
+    NULL, /* get pipeline */                        \
     NULL, /* get_config */                           \
     NULL, /* set_config */                           \
     NULL, /* get_tunnel_config */                    \
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 251bd16..53f49ad 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -55,6 +55,7 @@
 #include "unaligned.h"
 #include "timeval.h"
 #include "unixctl.h"
+#include "hw-pipeline.h"
 
 VLOG_DEFINE_THIS_MODULE(netdev_dpdk);
 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
@@ -1125,6 +1126,29 @@ netdev_dpdk_get_config(const struct netdev *netdev, 
struct smap *args)
     return 0;
 }
 
+void
+netdev_dpdk_get_pipeline(__attribute__ ((unused))const struct netdev *netdev,
+                         struct dp_packet *packet,
+                         void *pipeline_res)
+{
+    struct pipeline_md *ppl_md = pipeline_res;
+    struct rte_mbuf *mbuf;
+
+    /*
+ *      * DPDK pipeline is defined by the ol_flags n the packet,
+ *           */
+    mbuf = (struct rte_mbuf *)packet;
+
+    if (mbuf->ol_flags & PKT_RX_FDIR_ID) {
+        ppl_md->id = HW_OFFLOAD_PIPELINE;
+        ppl_md->flow_tag = mbuf->hash.fdir.hi;
+    }
+    else{
+        ppl_md->id = DEFAULT_SW_PIPELINE;
+        ppl_md->flow_tag = HW_NO_FREE_FLOW_TAG;
+    }
+}
+
 static struct netdev_dpdk *
 netdev_dpdk_lookup_by_port_id(dpdk_port_t port_id)
     OVS_REQUIRES(dpdk_mutex)
@@ -3253,6 +3277,7 @@ unlock:
     CONSTRUCT,                                                \
     DESTRUCT,                                                 \
     netdev_dpdk_dealloc,                                      \
+    netdev_dpdk_get_pipeline,                                 \
     netdev_dpdk_get_config,                                   \
     SET_CONFIG,                                               \
     NULL,                       /* get_tunnel_config */       \
diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
index b7d02a7..a630da3 100644
--- a/lib/netdev-dpdk.h
+++ b/lib/netdev-dpdk.h
@@ -17,17 +17,25 @@
 #ifndef NETDEV_DPDK_H
 #define NETDEV_DPDK_H
 
-#include <config.h>
-
 #include "openvswitch/compiler.h"
+#include "openvswitch/types.h"
 
 struct dp_packet;
+struct netdev;
+struct dp_netdev;
+struct rte_flow_attr;
+struct rte_flow_item;
+struct rte_flow_action;
+struct rte_flow_error;
 
 #ifdef DPDK_NETDEV
 
 void netdev_dpdk_register(void);
 void free_dpdk_buf(struct dp_packet *);
-
+void
+netdev_dpdk_get_pipeline(__attribute__ ((unused))const struct netdev *netdev,
+                         struct dp_packet *packet,
+                         void *pipeline_res);
 #else
 
 static inline void
diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index d189a86..b9cbaad 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -1358,6 +1358,7 @@ netdev_dummy_update_flags(struct netdev *netdev_,
     netdev_dummy_construct,                                     \
     netdev_dummy_destruct,                                      \
     netdev_dummy_dealloc,                                       \
+    NULL,                                                       \
     netdev_dummy_get_config,                                    \
     netdev_dummy_set_config,                                    \
     NULL,                       /* get_tunnel_config */         \
diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index 6978c44..c245504 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -2819,6 +2819,7 @@ netdev_linux_update_flags(struct netdev *netdev_, enum 
netdev_flags off,
     CONSTRUCT,                                                  \
     netdev_linux_destruct,                                      \
     netdev_linux_dealloc,                                       \
+    NULL,                                                       \
     NULL,                       /* get_config */                \
     NULL,                       /* set_config */                \
     NULL,                       /* get_tunnel_config */         \
diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
index 79143d2..744aea0 100644
--- a/lib/netdev-provider.h
+++ b/lib/netdev-provider.h
@@ -274,7 +274,12 @@ struct netdev_class {
     int (*construct)(struct netdev *);
     void (*destruct)(struct netdev *);
     void (*dealloc)(struct netdev *);
-
+    /* Get the pipeline information for the netdev.
+     *  This will return the pipe_line id and
+     * status of pipeline for packet processing.
+     */
+    void (*get_pipeline)(const struct netdev *netdev, struct dp_packet *packet,
+                         void *pipeline_res);
     /* Fetches the device 'netdev''s configuration, storing it in 'args'.
      * The caller owns 'args' and pre-initializes it to an empty smap.
      *
diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
index 640cdbe..6e58f14 100644
--- a/lib/netdev-vport.c
+++ b/lib/netdev-vport.c
@@ -849,6 +849,7 @@ netdev_vport_get_ifindex(const struct netdev *netdev_)
     netdev_vport_construct,                                 \
     netdev_vport_destruct,                                  \
     netdev_vport_dealloc,                                   \
+    NULL,                                                  \
     GET_CONFIG,                                             \
     SET_CONFIG,                                             \
     GET_TUNNEL_CONFIG,                                      \
-- 
1.8.3.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to