diff mbox

[ovs-dev,ovs,RFC,4/9] dpif-hw-netlink: added new user offload policy

Message ID 1474980364-9291-5-git-send-email-paulb@mellanox.com
State RFC
Headers show

Commit Message

Paul Blakey Sept. 27, 2016, 12:45 p.m. UTC
Added a new framework so use can specify which flows
to try and offload.
A new map was added to save each flow's policy.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Signed-off-by: Shahar Klein <shahark@mellanox.com>
---
 lib/automake.mk         |  2 ++
 lib/dpif-hw-netlink.c   | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
 lib/dpif-hw-netlink.h   |  6 +++++
 lib/hw-offload-policy.c | 23 +++++++++++++++++++
 lib/hw-offload-policy.h | 20 +++++++++++++++++
 5 files changed, 110 insertions(+)
 create mode 100644 lib/hw-offload-policy.c
 create mode 100644 lib/hw-offload-policy.h
diff mbox

Patch

diff --git a/lib/automake.mk b/lib/automake.mk
index c7c828d..f87cc8c 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -343,6 +343,8 @@  lib_libopenvswitch_la_SOURCES += \
 	lib/dpif-netlink.h \
 	lib/tc.h \
 	lib/tc.c \
+	lib/hw-offload-policy.c \
+	lib/hw-offload-policy.h \
 	lib/dpif-hw-netlink.c \
 	lib/dpif-hw-netlink.h \
 	lib/if-notifier.c \
diff --git a/lib/dpif-hw-netlink.c b/lib/dpif-hw-netlink.c
index 7394580..e14c64c 100644
--- a/lib/dpif-hw-netlink.c
+++ b/lib/dpif-hw-netlink.c
@@ -42,6 +42,8 @@ 
 #include "openvswitch/vlog.h"
 #include "netdev-provider.h"
 #include "dpif-hw-netlink.h"
+#include "tc.h"
+#include "hw-offload-policy.h"
 
 VLOG_DEFINE_THIS_MODULE(dpif_hw_netlink);
 
@@ -323,6 +325,62 @@  get_ovs_port(struct dpif_hw_netlink *dpif, int ifindex)
     return -1;
 }
 
+static void
+del_policy(struct dpif_hw_netlink *dpif, const ovs_u128 * ovs_ufid)
+{
+    struct ufid_policy_hash_data *data;
+
+    if (!ovs_ufid) {
+        return;
+    }
+    size_t hash = hash_ufid(ovs_ufid);
+
+    /* WRITE LOCK */
+    HMAP_FOR_EACH_WITH_HASH(data, node_ufid, hash, &dpif->ufid_to_policy) {
+        if (memcmp(&data->ovs_ufid, ovs_ufid, sizeof (*ovs_ufid)) == 0)
+            break;
+    }
+    if (data) {
+        hmap_remove(&dpif->ufid_to_policy, &data->node_ufid);
+        free(data);
+    }
+    /* WRITE UNLOACK */
+}
+
+static void
+put_policy(struct dpif_hw_netlink *dpif, const ovs_u128 * ovs_ufid,
+           enum dpif_hw_offload_policy policy)
+{
+    struct ufid_policy_hash_data *data =
+        malloc(sizeof (struct ufid_policy_hash_data));
+
+    data->ovs_ufid = *ovs_ufid;
+    data->offloading_policy = policy;
+
+    del_policy(dpif, ovs_ufid);
+    /* WRITE LOCK */
+    hmap_insert(&dpif->ufid_to_policy, &data->node_ufid, hash_ufid(ovs_ufid));
+    /* WRITE UNLOCK */
+    return;
+
+}
+
+static enum dpif_hw_offload_policy
+get_policy(struct dpif_hw_netlink *dpif, const ovs_u128 * ovs_ufid)
+{
+    struct ufid_policy_hash_data *data = NULL;
+    size_t hash = hash_ufid(ovs_ufid);
+
+    /* READ LOCK */
+    HMAP_FOR_EACH_WITH_HASH(data, node_ufid, hash, &dpif->ufid_to_policy) {
+        if (memcmp(&data->ovs_ufid, ovs_ufid, sizeof (*ovs_ufid)) == 0)
+            break;
+    }
+    /* READ UNLOCK */
+
+    return data->offloading_policy;
+}
+
 static struct dpif_hw_netlink *
 dpif_hw_netlink_cast(const struct dpif *dpif)
 {
@@ -336,6 +394,7 @@  initmaps(struct dpif_hw_netlink *dpif)
     hmap_init(&dpif->port_to_netdev);
     hmap_init(&dpif->ufid_to_handle);
     hmap_init(&dpif->handle_to_ufid);
+    hmap_init(&dpif->ufid_to_policy);
     ovs_mutex_init(&dpif->hash_mutex);
     return 0;
 }
diff --git a/lib/dpif-hw-netlink.h b/lib/dpif-hw-netlink.h
index f44abca..e2cee90 100644
--- a/lib/dpif-hw-netlink.h
+++ b/lib/dpif-hw-netlink.h
@@ -14,6 +14,7 @@  struct dpif_hw_netlink {
     struct hmap port_to_netdev;
     struct hmap ufid_to_handle;
     struct hmap handle_to_ufid;
+    struct hmap ufid_to_policy;
 };
 
 struct port_netdev_hash_data {
@@ -32,4 +33,9 @@  struct ufid_handle_hash_data {
     odp_port_t port;
 };
 
+struct ufid_policy_hash_data {
+    struct hmap_node node_ufid;
+    ovs_u128 ovs_ufid;
+    int offloading_policy;
+};
 #endif
diff --git a/lib/hw-offload-policy.c b/lib/hw-offload-policy.c
new file mode 100644
index 0000000..366c237
--- /dev/null
+++ b/lib/hw-offload-policy.c
@@ -0,0 +1,23 @@ 
+#include <config.h>
+#include "dpif.h"
+#include "openvswitch/types.h"
+#include "hw-offload-policy.h"
+#include "dpif-hw-netlink.h"
+
+enum dpif_hw_offload_policy
+HW_offload_test_put(struct dpif_hw_netlink *dpif, struct dpif_flow_put *put)
+{
+    return DPIF_HW_OFFLOAD_ONLY;
+}
+
+enum dpif_hw_offload_policy
+HW_offload_test_del(struct dpif *dpif, struct dpif_flow_del *del)
+{
+    return DPIF_HW_OFFLOAD_ONLY;
+}
+
+enum dpif_hw_offload_policy
+HW_offload_test_get(struct dpif *dpif, struct dpif_flow_get *get)
+{
+    return DPIF_HW_OFFLOAD_ONLY;
+}
diff --git a/lib/hw-offload-policy.h b/lib/hw-offload-policy.h
new file mode 100644
index 0000000..8371fc0
--- /dev/null
+++ b/lib/hw-offload-policy.h
@@ -0,0 +1,20 @@ 
+
+#ifndef HW_OFFLOAD_POLICY_H
+#define HW_OFFLOAD_POLICY_H 1
+
+#include "dpif-hw-netlink.h"
+
+enum dpif_hw_offload_policy {
+    DPIF_HW_NO_OFFLAOAD = 1,    /* no offload - SW only */
+    DPIF_HW_OFFLOAD_ONLY,       /* if fails fall back to SW */
+    DPIF_HW_OFFLOAD_SPLIT,
+};
+
+enum dpif_hw_offload_policy HW_offload_test_put(struct dpif_hw_netlink *dpif,
+                                                struct dpif_flow_put *put);
+enum dpif_hw_offload_policy HW_offload_test_del(struct dpif *dpif,
+                                                struct dpif_flow_del *del);
+enum dpif_hw_offload_policy HW_offload_test_get(struct dpif *dpif,
+                                                struct dpif_flow_get *get);
+
+#endif