From: Paul Blakey <pa...@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 <pa...@mellanox.com> Reviewed-by: Roi Dayan <r...@mellanox.com> --- lib/netdev.c | 6 ++++++ lib/tc.c | 43 ++++++++++++++++++++++++++++++++++++++++++- lib/tc.h | 1 + vswitchd/vswitch.xml | 17 +++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/lib/netdev.c b/lib/netdev.c index ca727a5..d5935c3 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 431242b..b2e3d21 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) @@ -719,6 +727,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) { @@ -989,7 +1009,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); @@ -1033,3 +1053,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..8b9bdcb 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>false</code>. + </p> + </column> + <column name="other_config" key="dpdk-init" type='{"type": "boolean"}'> <p> -- 2.7.4 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev