diff mbox series

[ovs-dev,v7,2/9] tc: Add support parsing tc police action

Message ID 20220708030630.9437-3-jianbol@nvidia.com
State Superseded
Headers show
Series Add support for ovs metering with tc offload | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Jianbo Liu July 8, 2022, 3:06 a.m. UTC
Add function to parse police action from netlink message.

Signed-off-by: Jianbo Liu <jianbol@nvidia.com>
Acked-by: Eelco Chaudron <echaudro@redhat.com>
---
 lib/netdev-offload-tc.c |  4 +++
 lib/tc.c                | 54 +++++++++++++++++++++++++++++++++++++++++
 lib/tc.h                |  5 ++++
 3 files changed, 63 insertions(+)
diff mbox series

Patch

diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index 262faf3c6..4d42d27b4 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 bbb8c86f7..bfd6512a1 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -1340,6 +1340,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),
@@ -1760,6 +1808,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;
@@ -2776,6 +2826,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;