[dpdk-dev] [RFC PATCH] ethdev: mtr: enhance input color table features

Jerin Jacob jerinjacobk at gmail.com
Mon Aug 30 11:23:43 CEST 2021


Ping


On Fri, Aug 20, 2021 at 1:56 PM <jerinj at marvell.com> wrote:
>
> From: Jerin Jacob <jerinj at marvell.com>
>
> Currently, meter object supports only DSCP based on input color table,
> The patch enhance that to support VLAN based input color table,
> color table based on inner field for the tunnel use case,  and support
> for fallback color per meter if packet based on a different field.
>
> All of the above features are exposed through capability and added
> additional capability to specify the implementation supports
> more than one input color table per ethdev port.
>
> Signed-off-by: Jerin Jacob <jerinj at marvell.com>
> ---
>  lib/ethdev/rte_mtr.h | 130 ++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 116 insertions(+), 14 deletions(-)
>
> diff --git a/lib/ethdev/rte_mtr.h b/lib/ethdev/rte_mtr.h
> index dc246dd7af..311e8754de 100644
> --- a/lib/ethdev/rte_mtr.h
> +++ b/lib/ethdev/rte_mtr.h
> @@ -213,6 +213,16 @@ struct rte_mtr_meter_policy_params {
>         const struct rte_flow_action *actions[RTE_COLORS];
>  };
>
> +/**
> + * Input color table
> + */
> +enum rte_mtr_input_color_tbl {
> +       /** DSCP based input color table */
> +       RTE_MTR_INPUT_COLOR_TBL_DSCP,
> +       /** VLAN based input color table */
> +       RTE_MTR_INPUT_COLOR_TBL_VLAN,
> +};
> +
>  /**
>   * Parameters for each traffic metering & policing object
>   *
> @@ -233,20 +243,44 @@ struct rte_mtr_params {
>          */
>         int use_prev_mtr_color;
>
> -       /** Meter input color. When non-NULL: it points to a pre-allocated and
> -        * pre-populated table with exactly 64 elements providing the input
> -        * color for each value of the IPv4/IPv6 Differentiated Services Code
> -        * Point (DSCP) input packet field. When NULL: it is equivalent to
> -        * setting this parameter to an all-green populated table (i.e. table
> -        * with all the 64 elements set to green color). The color blind mode
> -        * is configured by setting *use_prev_mtr_color* to 0 and *dscp_table*
> -        * to either NULL or to an all-green populated table. When
> -        * *use_prev_mtr_color* is non-zero value or when *dscp_table* contains
> -        * at least one yellow or red color element, then the color aware mode
> -        * is configured.
> -        */
> -       enum rte_color *dscp_table;
> -
> +       RTE_STD_C11
> +       union {
> +               /** Meter input color based on DSCP.
> +                * Valid when rte_mtr_input_color_tbl::tbl_selector is
> +                * set to RTE_MTR_INPUT_COLOR_TBL_DSCP.
> +                * When non-NULL: it points to a pre-allocated and pre-populated
> +                * table with exactly 64 elements providing the input color for
> +                * each value of the IPv4/IPv6 Differentiated Services Code
> +                * Point (DSCP) input packet field. When NULL:
> +                * it is equivalent to setting this parameter to an all-green
> +                * populated table (i.e. table with
> +                * all the 64 elements set to green color). The color blind mode
> +                * is configured by setting *use_prev_mtr_color* to 0 and
> +                * *dscp_table* to either NULL or to an all-green
> +                * populated table. When *use_prev_mtr_color* is non-zero value
> +                * or when *dscp_table* contains at least one yellow or
> +                * red color element, then the color aware mode is configured.
> +                * @see struct rte_mtr_capabilities::input_color_dscp_supported
> +                */
> +               enum rte_color *dscp_table;
> +               /** Meter input color based on VLAN.
> +                * Valid when rte_mtr_input_color_tbl::tbl_selector is
> +                * set to RTE_MTR_INPUT_COLOR_TBL_VLAN.
> +                * When non-NULL: it points to a pre-allocated and pre-populated
> +                * table with exactly 16 elements providing the input color for
> +                * each value of the DEI(1bit), PCP(3 bits) input packet field.
> +                * When NULL: it is equivalent to setting this parameter to an
> +                * all-green populated table (i.e. table with
> +                * all the 16 elements set to green color). The color blind mode
> +                * is configured by setting *use_prev_mtr_color* to 0 and
> +                * *vlan_table* to either NULL or to an all-green
> +                * populated table. When *use_prev_mtr_color* is non-zero value
> +                * or when *vlan_table* contains at least one yellow or
> +                * red color element, then the color aware mode is configured.
> +                * @see struct rte_mtr_capabilities::input_color_vlan_supported
> +                */
> +               enum rte_color *vlan_table;
> +       };
>         /** Non-zero to enable the meter, zero to disable the meter at the time
>          * of MTR object creation. Ignored when the meter profile indicated by
>          * *meter_profile_id* is set to NONE.
> @@ -261,6 +295,25 @@ struct rte_mtr_params {
>
>         /** Meter policy ID. */
>         uint32_t meter_policy_id;
> +
> +       /** Select the input color table
> +        * @see struct rte_mtr_params::dscp_table
> +        * @see struct rte_mtr_capabilities::input_color_dscp_supported
> +        * @see struct rte_mtr_params::vlan_table
> +        * @see struct rte_mtr_capabilities::input_color_vlan_supported
> +        */
> +       enum rte_mtr_input_color_tbl tbl_selector;
> +       /** Fallback input color for the meter,
> +        *  when *use_prev_mtr_color* set to zero value and
> +        *  when packet is not based on selected *tbl_selector*.
> +        *  @see struct rte_mtr_capabilities::input_color_fallback_supported
> +        */
> +       enum rte_color fallback_input_color;
> +       /** Input color table based on inner field of selected
> +        *  of *tbl_selector*.
> +        *  @see struct rte_mtr_capabilities::input_color_inner_supported
> +        */
> +       int input_color_inner_enable;
>  };
>
>  /**
> @@ -417,6 +470,31 @@ struct rte_mtr_capabilities {
>          * @see enum rte_mtr_stats_type
>          */
>         uint64_t stats_mask;
> +
> +       /** Input color based on DSCP.
> +        * When non-zero, it indicates that driver supports input color table
> +        * based on DSCP.
> +        */
> +       int input_color_dscp_supported;
> +       /** Input color based on VLAN.
> +        * When non-zero, it indicates that driver supports input color table
> +        * based on VLAN.
> +        */
> +       int input_color_vlan_supported;
> +       /** Input color fallback support.
> +        * When non-zero, it indicates that driver supports input color
> +        * fallback.
> +        */
> +       int input_color_fallback_supported;
> +       /** Input color based on inner packet field.
> +        * When non-zero, it indicates that driver supports input color
> +        * based on inner field.
> +        */
> +       int input_color_inner_supported;
> +        /** When non-zero, it indicates that driver supports separate
> +         * input color table for given ethdev port.
> +         */
> +       int seperate_input_color_table_per_port;
>  };
>
>  /**
> @@ -832,6 +910,30 @@ rte_mtr_meter_dscp_table_update(uint16_t port_id,
>         enum rte_color *dscp_table,
>         struct rte_mtr_error *error);
>
> +/**
> + * MTR object VLAN table update
> + *
> + * @param[in] port_id
> + *   The port identifier of the Ethernet device.
> + * @param[in] mtr_id
> + *   MTR object ID. Needs to be valid.
> + * @param[in] vlan_table
> + *   When non-NULL: it points to a pre-allocated and pre-populated table with
> + *   exactly 16 elements providing the input color for each value of the
> + *   each value of the DEI(1bit), PCP(3 bits) input packet field.
> + *   When NULL: it is equivalent to setting this parameter to an "all-green"
> + *   populated table (i.e. table with all the 16 elements set to green color).
> + * @param[out] error
> + *   Error details. Filled in only on error, when not NULL.
> + * @return
> + *   0 on success, non-zero error code otherwise.
> + */
> +__rte_experimental
> +int
> +rte_mtr_meter_vlan_table_update(uint16_t port_id,
> +       uint32_t mtr_id,
> +       enum rte_color *vlan_table,
> +       struct rte_mtr_error *error);
>  /**
>   * MTR object enabled statistics counters update
>   *
> --
> 2.33.0
>


More information about the dev mailing list