[ovs-dev] [PATCH ovs V4 04/24] other-config: Add tc-policy switch to control tc flower flag
Roi Dayan
roid at mellanox.com
Mon Mar 13 13:36:54 UTC 2017
From: Paul Blakey <paulb at mellanox.com>
Add a new configuration tc-policy option that controls tc
flower flag. Possible options are none, skip_sw, skip_hw.
The default is none which is to insert the rule both to sw and hw.
This option is only relevant if hw-offload is enabled.
Signed-off-by: Paul Blakey <paulb at mellanox.com>
Reviewed-by: Roi Dayan <roid at mellanox.com>
---
lib/netdev.c | 6 ++++++
lib/tc.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
lib/tc.h | 1 +
vswitchd/vswitch.xml | 17 +++++++++++++++++
4 files changed, 66 insertions(+), 1 deletions(-)
diff --git a/lib/netdev.c b/lib/netdev.c
index 977844a..6bde14b 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -54,6 +54,9 @@
#include "openvswitch/vlog.h"
#include "flow.h"
#include "util.h"
+#ifdef __linux__
+#include "tc.h"
+#endif
VLOG_DEFINE_THIS_MODULE(netdev);
@@ -2115,6 +2118,9 @@ netdev_set_flow_api_enabled(const struct smap *ovs_other_config)
VLOG_INFO("netdev: Flow API Enabled");
+ tc_set_policy(smap_get_def(ovs_other_config, "tc-policy",
+ TC_POLICY_DEFAULT));
+
ovsthread_once_done(&once);
}
}
diff --git a/lib/tc.c b/lib/tc.c
index 0c9c15e..219f702 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -38,6 +38,14 @@ VLOG_DEFINE_THIS_MODULE(tc);
static struct vlog_rate_limit parse_err = VLOG_RATE_LIMIT_INIT(5, 5);
+enum tc_offload_policy {
+ TC_POLICY_NONE,
+ TC_POLICY_SKIP_SW,
+ TC_POLICY_SKIP_HW
+};
+
+static enum tc_offload_policy tc_policy = TC_POLICY_NONE;
+
/* Returns tc handle 'major':'minor'. */
unsigned int
tc_make_handle(unsigned int major, unsigned int minor)
@@ -725,6 +733,18 @@ tc_get_flower(int ifindex, int prio, int handle, struct tc_flower *flower)
return error;
}
+static int
+tc_get_tc_cls_policy(enum tc_offload_policy policy)
+{
+ if (policy == TC_POLICY_SKIP_HW) {
+ return TCA_CLS_FLAGS_SKIP_HW;
+ } else if (policy == TC_POLICY_SKIP_SW) {
+ return TCA_CLS_FLAGS_SKIP_SW;
+ }
+
+ return 0;
+}
+
static void
nl_msg_put_act_push_vlan(struct ofpbuf *request, uint16_t vid, uint8_t prio)
{
@@ -995,7 +1015,7 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
}
}
- nl_msg_put_u32(request, TCA_FLOWER_FLAGS, 0);
+ nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(tc_policy));
if (flower->tunnel.tunnel) {
nl_msg_put_flower_tunnel(request, flower);
@@ -1040,3 +1060,24 @@ tc_replace_flower(int ifindex, uint16_t prio, uint32_t handle,
return error;
}
+
+void
+tc_set_policy(const char *policy)
+{
+ if (!policy) {
+ return;
+ }
+
+ if (!strcmp(policy, "skip_sw")) {
+ tc_policy = TC_POLICY_SKIP_SW;
+ } else if (!strcmp(policy, "skip_hw")) {
+ tc_policy = TC_POLICY_SKIP_HW;
+ } else if (!strcmp(policy, "none")) {
+ tc_policy = TC_POLICY_NONE;
+ } else {
+ VLOG_WARN("tc: Invalid policy '%s'", policy);
+ return;
+ }
+
+ VLOG_INFO("tc: Using policy '%s'", policy);
+}
diff --git a/lib/tc.h b/lib/tc.h
index 5ca6c55..6f6cc09 100644
--- a/lib/tc.h
+++ b/lib/tc.h
@@ -115,5 +115,6 @@ int tc_flush(int ifindex);
int tc_dump_flower_start(int ifindex, struct nl_dump *dump);
int parse_netlink_to_tc_flower(struct ofpbuf *reply,
struct tc_flower *flower);
+void tc_set_policy(const char *policy);
#endif /* tc.h */
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 942e68f..a37d2ed 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -183,6 +183,23 @@
</p>
</column>
+ <column name="other_config" key="tc-policy"
+ type='{"type": "string"}'>
+ <p>
+ Specified the policy used with HW offloading.
+ Options:
+ <code>none</code> - Add software rule and offload rule to HW.
+ <code>skip_sw</code> - Offload rule to HW only.
+ <code>skip_hw</code> - Add software rule without offloading rule to HW.
+ </p>
+ <p>
+ This is only relevant if HW offloading is enabled (hw-offload).
+ </p>
+ <p>
+ The default value is <code>none</code>.
+ </p>
+ </column>
+
<column name="other_config" key="dpdk-init"
type='{"type": "boolean"}'>
<p>
--
1.7.1
More information about the dev
mailing list