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 <pa...@mellanox.com> Signed-off-by: Shahar Klein <shah...@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 --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 -- 1.8.3.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev