On 27 May 2022, at 11:00, Jianbo Liu wrote:

> When offloading rule, tc should be filled with police index, instead
> of meter id. As meter is mapped to police action, and the mapping is
> inserted into meter_id_to_police_idx hmap, this hmap is used to find
> the police index. Besides, the reverse mapping between meter id and
> police index is also added, so meter id can be retrieved from this
> hashmap and pass to dpif while dumping rules.
>
> Signed-off-by: Jianbo Liu <[email protected]>

Just one comment below.

> ---
>  lib/netdev-offload-tc.c | 45 ++++++++++++++++++++++++++++++++++++++++-
>  lib/tc.c                | 20 +++++++++++++++++-
>  2 files changed, 63 insertions(+), 2 deletions(-)
>
> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
> index 7e5f04bdf..43d13cc56 100644
> --- a/lib/netdev-offload-tc.c
> +++ b/lib/netdev-offload-tc.c
> @@ -65,6 +65,7 @@ struct chain_node {
>
>  struct meter_police_mapping_data {
>      struct hmap_node meter_id_node;
> +    struct hmap_node police_idx_node;
>      uint32_t meter_id;
>      uint32_t police_idx;
>  };
> @@ -83,6 +84,11 @@ static struct id_pool *meter_police_ids 
> OVS_GUARDED_BY(meter_police_ids_mutex);
>  static struct ovs_mutex meter_mutex = OVS_MUTEX_INITIALIZER;
>  static struct hmap meter_id_to_police_idx OVS_GUARDED_BY(meter_mutex)
>      = HMAP_INITIALIZER(&meter_id_to_police_idx);
> +static struct hmap police_idx_to_meter_id OVS_GUARDED_BY(meter_mutex)
> +    = HMAP_INITIALIZER(&police_idx_to_meter_id);
> +
> +static int meter_id_lookup(uint32_t meter_id, uint32_t *police_idx);
> +static int police_idx_lookup(uint32_t police_idx, uint32_t *meter_id);
>
>  static bool
>  is_internal_port(const char *type)
> @@ -1040,7 +1046,12 @@ parse_tc_flower_to_match(struct tc_flower *flower,
>              }
>              break;
>              case TC_ACT_POLICE: {
> -                /* Not supported yet */
> +                uint32_t meter_id;
> +
> +                if (police_idx_lookup(action->police.index, &meter_id)) {
> +                    return ENOENT;
> +                }
> +                nl_msg_put_u32(buf, OVS_ACTION_ATTR_METER, meter_id);
>              }
>              break;
>              }
> @@ -1963,6 +1974,16 @@ netdev_tc_flow_put(struct netdev *netdev, struct match 
> *match,
>              action->type = TC_ACT_GOTO;
>              action->chain = 0;  /* 0 is reserved and not used by recirc. */
>              flower.action_count++;
> +        } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_METER) {
> +            uint32_t police_index, meter_id;
> +
> +            meter_id = nl_attr_get_u32(nla);
> +            if (meter_id_lookup(meter_id, &police_index)) {
> +                return EOPNOTSUPP;
> +            }
> +            action->type = TC_ACT_POLICE;
> +            action->police.index = police_index;
> +            flower.action_count++;
>          } else {
>              VLOG_DBG_RL(&rl, "unsupported put action type: %d",
>                          nl_attr_type(nla));
> @@ -2432,6 +2453,25 @@ meter_id_lookup(uint32_t meter_id, uint32_t 
> *police_idx)
>      return data ? 0 : ENOENT;
>  }
>
> +static int
> +police_idx_lookup(uint32_t police_idx, uint32_t *meter_id)
> +{
> +    struct meter_police_mapping_data *data = NULL;
> +    size_t hash = hash_int(police_idx, 0);
> +
> +    ovs_mutex_lock(&meter_mutex);
> +    HMAP_FOR_EACH_WITH_HASH (data, police_idx_node, hash,
> +                             &police_idx_to_meter_id) {
> +        if (data->police_idx == police_idx) {
> +            *meter_id = data->meter_id;
> +            break;
> +        }
> +    }
> +    ovs_mutex_unlock(&meter_mutex);
> +
> +    return data ? 0 : ENOENT;

'data' can be none NULL and still no valid entry was found.

> +}
> +
>  static void
>  meter_id_insert(uint32_t meter_id, uint32_t police_idx)
>  {
> @@ -2443,6 +2483,8 @@ meter_id_insert(uint32_t meter_id, uint32_t police_idx)
>      data->police_idx = police_idx;
>      hmap_insert(&meter_id_to_police_idx, &data->meter_id_node,
>                  hash_int(meter_id, 0));
> +    hmap_insert(&police_idx_to_meter_id, &data->police_idx_node,
> +                hash_int(police_idx, 0));
>      ovs_mutex_unlock(&meter_mutex);
>  }
>
> @@ -2455,6 +2497,7 @@ meter_id_remove(uint32_t meter_id)
>      data = meter_id_find_locked(meter_id);
>      if (data) {
>          hmap_remove(&meter_id_to_police_idx, &data->meter_id_node);
> +        hmap_remove(&police_idx_to_meter_id, &data->police_idx_node);
>          free(data);
>      }
>      ovs_mutex_unlock(&meter_mutex);
> diff --git a/lib/tc.c b/lib/tc.c
> index ac53c56db..8db18fa2c 100644
> --- a/lib/tc.c
> +++ b/lib/tc.c
> @@ -2440,6 +2440,22 @@ nl_msg_put_act_gact(struct ofpbuf *request, uint32_t 
> chain)
>      nl_msg_end_nested(request, offset);
>  }
>
> +static void
> +nl_msg_put_act_police_index(struct ofpbuf *request, uint32_t police_idx)
> +{
> +    struct tc_police police;
> +    size_t offset;
> +
> +    memset(&police, 0, sizeof police);
> +    police.index = police_idx;
> +
> +    nl_msg_put_string(request, TCA_ACT_KIND, "police");
> +    offset = nl_msg_start_nested(request, TCA_ACT_OPTIONS);
> +    nl_msg_put_unspec(request, TCA_POLICE_TBF, &police, sizeof police);
> +    nl_msg_put_u32(request, TCA_POLICE_RESULT, TC_ACT_PIPE);
> +    nl_msg_end_nested(request, offset);
> +}
> +
>  static void
>  nl_msg_put_act_ct(struct ofpbuf *request, struct tc_action *action)
>  {
> @@ -2930,7 +2946,9 @@ nl_msg_put_flower_acts(struct ofpbuf *request, struct 
> tc_flower *flower)
>              }
>              break;
>              case TC_ACT_POLICE: {
> -                /* Not supported yet */
> +                act_offset = nl_msg_start_nested(request, act_index++);
> +                nl_msg_put_act_police_index(request, action->police.index);
> +                nl_msg_end_nested(request, act_offset);
>              }
>              break;
>              }
> -- 
> 2.26.2

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to