On 3 May 2022, at 5:08, Jianbo Liu via dev wrote:

> Add function to parse police action from netlink message, and meter id
> can be retrieved from action cockie as it will be saved there in later
> patch.

See comments inline below…

> Signed-off-by: Jianbo Liu <jian...@nvidia.com>
> ---
>  lib/netdev-offload-tc.c |  4 +++
>  lib/tc.c                | 59 +++++++++++++++++++++++++++++++++++++++++
>  lib/tc.h                |  6 +++++
>  3 files changed, 69 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..af7a7bc6d 100644
> --- a/lib/tc.c
> +++ b/lib/tc.c
> @@ -1339,6 +1339,59 @@ 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 *act_cookie)
> +{
> +    struct nlattr *police_attrs[ARRAY_SIZE(police_policy)] = {};
> +    struct tc_action *action;
> +    const struct tc_police *police;

For the new code, I review I try to stick to reverse Christmas tree style, so 
as you might need to make changes may also swap the two-line?

> +    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");

Change failed to a capital, so “Failed to parse..."

> +        return EPROTO;
> +    }
> +
> +    police = nl_attr_get(police_attars[TCA_POLICE_TBF]);

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;
> +
> +    if (act_cookie) {
> +        action->police.meter_id = nl_attr_get_u32(act_cookie);
> +    }
> +
> +    police_tm = police_attrs[TCA_POLICE_TM];

If you use optional attributes, you have to make sure they are present. Guess 
the fix would be to set .optional = false for 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 +1814,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, act_cookie);
>      } else {
>          VLOG_ERR_RL(&error_rl, "unknown tc action kind: %s", act_kind);
>          err = EINVAL;
> @@ -2773,6 +2828,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..201345672 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,11 @@ struct tc_action {
>              struct tc_flower_key key;
>              struct tc_flower_key mask;
>          } rewrite;
> +
> +        struct {
> +            uint32_t index;
> +            uint32_t meter_id;
> +        } police;
>       };
>
>       enum tc_action_type type;
> -- 
> 2.26.2
>
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to