On 2 Apr 2025, at 9:32, Roi Dayan wrote:

> Add proper action verification in dpif-netdev and remove
> psample verification according to dpif name.

Hi Roi,

I think you missed Ilya’s second comment:

2. dpif-netdev should only check actions it implements on it's own and
   call a verification helper for all other actions implemented in the
   odp-execute.c.  That helper may return true for all the actions it
   supports directly and false for all the actions that require datapath
   assistance.

> Signed-off-by: Roi Dayan <r...@nvidia.com>
> Reviewed-by: Eli Britstein <el...@nvidia.com>
> ---
>  lib/dpif-netdev.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 68 insertions(+)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 87d69c46d5e0..b6109e30952f 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -4307,6 +4307,67 @@ exit:
>      return error;
>  }
>
> +static bool
> +dpif_netdev_actions_supported(const struct nlattr *actions, size_t 
> actions_len)
> +{
> +    const struct nlattr *nla;
> +    size_t left;
> +
> +    if (!actions_len) {
> +        return true;
> +    }
> +
> +    NL_ATTR_FOR_EACH (nla, left, actions, actions_len) {
> +        enum ovs_action_attr type = nl_attr_type(nla);
> +
> +        switch (type) {
> +        /* Supported actions go here in order of definition. */
> +        case OVS_ACTION_ATTR_OUTPUT:
> +        case OVS_ACTION_ATTR_USERSPACE:
> +        case OVS_ACTION_ATTR_SET:
> +        case OVS_ACTION_ATTR_PUSH_VLAN:
> +        case OVS_ACTION_ATTR_POP_VLAN:
> +        case OVS_ACTION_ATTR_SAMPLE:
> +        case OVS_ACTION_ATTR_RECIRC:
> +        case OVS_ACTION_ATTR_HASH:
> +        case OVS_ACTION_ATTR_PUSH_MPLS:
> +        case OVS_ACTION_ATTR_POP_MPLS:
> +        case OVS_ACTION_ATTR_SET_MASKED:
> +        case OVS_ACTION_ATTR_CT:
> +        case OVS_ACTION_ATTR_TRUNC:
> +        case OVS_ACTION_ATTR_PUSH_ETH:
> +        case OVS_ACTION_ATTR_POP_ETH:
> +        case OVS_ACTION_ATTR_CT_CLEAR:
> +        case OVS_ACTION_ATTR_PUSH_NSH:
> +        case OVS_ACTION_ATTR_POP_NSH:
> +        case OVS_ACTION_ATTR_METER:
> +        case OVS_ACTION_ATTR_CLONE:
> +        case OVS_ACTION_ATTR_CHECK_PKT_LEN:
> +        case OVS_ACTION_ATTR_ADD_MPLS:
> +        case OVS_ACTION_ATTR_DEC_TTL:
> +        case OVS_ACTION_ATTR_DROP:
> +        case OVS_ACTION_ATTR_TUNNEL_PUSH:
> +        case OVS_ACTION_ATTR_TUNNEL_POP:
> +        case OVS_ACTION_ATTR_LB_OUTPUT:
> +            if (nla->nla_type & NLA_F_NESTED) {
> +                return dpif_netdev_actions_supported(nl_attr_get(nla),
> +                                                     nl_attr_get_size(nla));
> +            } else {
> +                return true;
> +            }
> +
> +        /* Unsupported actions go here in order of definition. */
> +        case OVS_ACTION_ATTR_PSAMPLE:
> +            break;
> +
> +        case OVS_ACTION_ATTR_UNSPEC:
> +        case __OVS_ACTION_ATTR_MAX:
> +            OVS_NOT_REACHED();
> +        }
> +    }
> +    return false;
> +}
> +
>  static int
>  dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
>  {
> @@ -4367,6 +4428,13 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct 
> dpif_flow_put *put)
>       * address mask. Installation of the flow will use the match variable. */
>      netdev_flow_key_init(&key, &match.flow);
>
> +    /* For probe operations, verify if the individual actions are supported.
> +     * Otherwise, assume the higher layer, ofproto, manages action support. 
> */
> +    if (probe && !dpif_netdev_actions_supported(put->actions,
> +                                                put->actions_len)) {
> +        return EINVAL;
> +    }
> +
>      if (put->pmd_id == PMD_ID_NULL) {
>          if (cmap_count(&dp->poll_threads) == 0) {
>              return EINVAL;
> -- 
> 2.21.0

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

Reply via email to