Add function to parse police action from netlink message.
Signed-off-by: Jianbo Liu <[email protected]>
---
lib/netdev-offload-tc.c | 4 +++
lib/tc.c | 54 +++++++++++++++++++++++++++++++++++++++++
lib/tc.h | 5 ++++
3 files changed, 63 insertions(+)
diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index a41b62758..83d57c63b 100644
--- a/lib/netdev-offload-tc.c
+++ b/lib/netdev-offload-tc.c
@@ -1017,6 +1017,10 @@ parse_tc_flower_to_match(struct tc_flower *flower,
nl_msg_put_u32(buf, OVS_ACTION_ATTR_RECIRC, action->chain);
}
break;
+ case TC_ACT_POLICE: {
+ /* Not supported yet */
+ }
+ break;
}
}
}
diff --git a/lib/tc.c b/lib/tc.c
index df73a43d4..5d96567e0 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -1339,6 +1339,54 @@ nl_parse_act_gact(struct nlattr *options, struct
tc_flower *flower)
return 0;
}
+static const struct nl_policy police_policy[] = {
+ [TCA_POLICE_TBF] = { .type = NL_A_UNSPEC,
+ .min_len = sizeof(struct tc_police),
+ .optional = false, },
+ [TCA_POLICE_RATE] = { .type = NL_A_UNSPEC,
+ .min_len = 1024,
+ .optional = true, },
+ [TCA_POLICE_PEAKRATE] = { .type = NL_A_UNSPEC,
+ .min_len = 1024,
+ .optional = true, },
+ [TCA_POLICE_AVRATE] = { .type = NL_A_U32,
+ .optional = true, },
+ [TCA_POLICE_RESULT] = { .type = NL_A_U32,
+ .optional = true, },
+ [TCA_POLICE_TM] = { .type = NL_A_UNSPEC,
+ .min_len = sizeof(struct tcf_t),
+ .optional = true, },
+};
+
+static int
+nl_parse_act_police(const struct nlattr *options, struct tc_flower *flower)
+{
+ struct nlattr *police_attrs[ARRAY_SIZE(police_policy)] = {};
+ const struct tc_police *police;
+ struct tc_action *action;
+ struct nlattr *police_tm;
+ const struct tcf_t *tm;
+
+ if (!nl_parse_nested(options, police_policy, police_attrs,
+ ARRAY_SIZE(police_policy))) {
+ VLOG_ERR_RL(&error_rl, "Failed to parse police action options");
+ return EPROTO;
+ }
+
+ police = nl_attr_get_unspec(police_attrs[TCA_POLICE_TBF], sizeof *police);
+ action = &flower->actions[flower->action_count++];
+ action->type = TC_ACT_POLICE;
+ action->police.index = police->index;
+
+ police_tm = police_attrs[TCA_POLICE_TM];
+ if (police_tm) {
+ tm = nl_attr_get_unspec(police_tm, sizeof *tm);
+ nl_parse_tcf(tm, flower);
+ }
+
+ return 0;
+}
+
static const struct nl_policy mirred_policy[] = {
[TCA_MIRRED_PARMS] = { .type = NL_A_UNSPEC,
.min_len = sizeof(struct tc_mirred),
@@ -1761,6 +1809,8 @@ nl_parse_single_action(struct nlattr *action, struct
tc_flower *flower,
/* Added for TC rule only (not in OvS rule) so ignore. */
} else if (!strcmp(act_kind, "ct")) {
nl_parse_act_ct(act_options, flower);
+ } else if (!strcmp(act_kind, "police")) {
+ nl_parse_act_police(act_options, flower);
} else {
VLOG_ERR_RL(&error_rl, "unknown tc action kind: %s", act_kind);
err = EINVAL;
@@ -2773,6 +2823,10 @@ nl_msg_put_flower_acts(struct ofpbuf *request, struct
tc_flower *flower)
nl_msg_end_nested(request, act_offset);
}
break;
+ case TC_ACT_POLICE: {
+ /* Not supported yet */
+ }
+ break;
}
}
}
diff --git a/lib/tc.h b/lib/tc.h
index d6cdddd16..751bec891 100644
--- a/lib/tc.h
+++ b/lib/tc.h
@@ -174,6 +174,7 @@ enum tc_action_type {
TC_ACT_MPLS_SET,
TC_ACT_GOTO,
TC_ACT_CT,
+ TC_ACT_POLICE,
};
enum nat_type {
@@ -261,6 +262,10 @@ struct tc_action {
struct tc_flower_key key;
struct tc_flower_key mask;
} rewrite;
+
+ struct {
+ uint32_t index;
+ } police;
};
enum tc_action_type type;
--
2.26.2
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev