Skip to content

Commit

Permalink
other-config: Add tc-policy switch to control tc flower flag
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Roi Dayan <[email protected]>
Acked-by: Flavio Leitner <[email protected]>
Signed-off-by: Simon Horman <[email protected]>
  • Loading branch information
Paul Blakey authored and shorman-netronome committed Jun 15, 2017
1 parent 31b88c9 commit 691d20c
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 1 deletion.
6 changes: 6 additions & 0 deletions lib/netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -2136,6 +2139,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);
}
}
Expand Down
43 changes: 42 additions & 1 deletion lib/tc.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,14 @@ VLOG_DEFINE_THIS_MODULE(tc);

static struct vlog_rate_limit error_rl = VLOG_RATE_LIMIT_INIT(60, 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;

struct tcmsg *
tc_make_request(int ifindex, int type, unsigned int flags,
struct ofpbuf *request)
Expand Down Expand Up @@ -739,6 +747,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)
{
Expand Down Expand Up @@ -1044,7 +1064,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);
Expand Down Expand Up @@ -1089,3 +1109,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);
}
3 changes: 3 additions & 0 deletions lib/tc.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@

#define TC_INGRESS_PARENT TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS)

#define TC_POLICY_DEFAULT "none"

/* Returns tc handle 'major':'minor'. */
static inline unsigned int
tc_make_handle(unsigned int major, unsigned int minor)
Expand Down Expand Up @@ -152,5 +154,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 */
17 changes: 17 additions & 0 deletions vswitchd/vswitch.xml
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,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>
Expand Down

0 comments on commit 691d20c

Please sign in to comment.