@@ -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 \
@@ -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;
}
@@ -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
new file mode 100644
@@ -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;
+}
new file mode 100644
@@ -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