On Tue, Apr 26, 2022 at 5:38 PM Dumitrescu, Cristian
<[email protected]> wrote:
>
> Hi Jerin,
Hi Cristian
>
> Thank you for implementing according to our agreement, I am happy to see that
> we are converging.
:-)
>
> Here are some comments below:
>
> <snip>
>
> > diff --git a/lib/ethdev/rte_mtr.h b/lib/ethdev/rte_mtr.h
> > index 40df0888c8..76ffbcf724 100644
> > --- a/lib/ethdev/rte_mtr.h
> > +++ b/lib/ethdev/rte_mtr.h
> > @@ -213,6 +213,52 @@ struct rte_mtr_meter_policy_params {
> > const struct rte_flow_action *actions[RTE_COLORS];
> > };
> >
> > +/**
> > + * Input color protocol method
>
> I suggest adding some more explanations here:
> More than one method can be enabled for a given meter. Even if enabled, a
> method might not be applicable to each input packet, in case the associated
> protocol header is not present in the packet. The highest priority method
> that is both enabled for the meter and also applicable for the current input
> packet wins; if none is both enabled and applicable, the default input color
> is used. @see function rte_mtr_color_in_protocol_priority_set()
OK.
>
> > + */
> > +enum rte_mtr_color_in_protocol {
> > + /**
> > + * If the input packet has at least one VLAN label, its input color is
> > + * detected by the outermost VLAN DEI(1bit), PCP(3 bits)
> > + * indexing into the struct rte_mtr_params::vlan_table.
> > + * Otherwise, the *default_input_color* is applied.
> > + *
>
> The statement "Otherwise, the *default_input_color* is applied" is incorrect
> IMO and should be removed, as multiple methods might be enabled and also
> applicable to a specific input packet, in which case the highest priority
> method wins, as opposed to the default input color.
>
> I suggest a simplification "Enable the detection of the packet input color
> based on the outermost VLAN header fields DEI (1 bit) and PCP (3 bits). These
> fields are used as index into the VLAN table"
OK
>
> > + * @see struct rte_mtr_params::default_input_color
> > + * @see struct rte_mtr_params::vlan_table
> > + */
> > + RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN = RTE_BIT64(0),
> > + /**
> > + * If the input packet has at least one VLAN label, its input color is
> > + * detected by the innermost VLAN DEI(1bit), PCP(3 bits)
> > + * indexing into the struct rte_mtr_params::vlan_table.
> > + * Otherwise, the *default_input_color* is applied.
> > + *
> > + * @see struct rte_mtr_params::default_input_color
> > + * @see struct rte_mtr_params::vlan_table
> > + */
>
> Same simplification suggested here.
OK
>
> > + RTE_MTR_COLOR_IN_PROTO_INNER_VLAN = RTE_BIT64(1),
> > + /**
> > + * If the input packet is IPv4 or IPv6, its input color is detected by
> > + * the outermost DSCP field indexing into the
> > + * struct rte_mtr_params::dscp_table.
> > + * Otherwise, the *default_input_color* is applied.
> > + *
> > + * @see struct rte_mtr_params::default_input_color
> > + * @see struct rte_mtr_params::dscp_table
> > + */
>
> Same simplification suggested here.
OK
>
> > + RTE_MTR_COLOR_IN_PROTO_OUTER_DSCP = RTE_BIT64(2),
>
> I am OK to keep DSCP for the name of the table instead of renaming the table,
> as you suggested, but this method name should reflect the protocol, not the
> field: RTE_MTR_COLOR_IN_PROTO_OUTER_IP.
OK
>
> > + /**
> > + * If the input packet is IPv4 or IPv6, its input color is detected by
> > + * the innermost DSCP field indexing into the
> > + * struct rte_mtr_params::dscp_table.
> > + * Otherwise, the *default_input_color* is applied.
> > + *
> > + * @see struct rte_mtr_params::default_input_color
> > + * @see struct rte_mtr_params::dscp_table
> > + */
>
> Same simplification suggested here.
OK
>
> > + RTE_MTR_COLOR_IN_PROTO_INNER_DSCP = RTE_BIT64(3),
>
> I am OK to keep DSCP for the name of the table instead of renaming the table,
> as you suggested, but this method name should reflect the protocol, not the
> field: RTE_MTR_COLOR_IN_PROTO_INNER_IP.
OK
>
> > +
> > /**
> > * Parameters for each traffic metering & policing object
> > *
> > @@ -233,20 +279,58 @@ struct rte_mtr_params {
> > */
> > int use_prev_mtr_color;
> >
> > - /** Meter input color. When non-NULL: it points to a pre-allocated and
> > + /** Meter input color based on IP DSCP protocol field.
> > + *
> > + * Valid when *input_color_proto_mask* set to any of the following
> > + * RTE_MTR_COLOR_IN_PROTO_OUTER_DSCP,
> > + * RTE_MTR_COLOR_IN_PROTO_INNER_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.
> > + * 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 enum
> > rte_mtr_color_in_protocol::RTE_MTR_COLOR_IN_PROTO_OUTER_DSCP
> > + * @see enum
> > rte_mtr_color_in_protocol::RTE_MTR_COLOR_IN_PROTO_INNER_DSCP
> > + * @see struct rte_mtr_params::input_color_proto_mask
> > */
> > enum rte_color *dscp_table;
> > -
> > + /** Meter input color based on VLAN DEI(1bit), PCP(3 bits) protocol
> > + * fields.
> > + *
> > + * Valid when *input_color_proto_mask* set to any of the following
> > + * RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN,
> > + * RTE_MTR_COLOR_IN_PROTO_INNER_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 enum
> > rte_mtr_color_in_protocol::RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN
> > + * @see enum
> > rte_mtr_color_in_protocol::RTE_MTR_COLOR_IN_PROTO_INNER_VLAN
> > + * @see struct rte_mtr_params::input_color_proto_mask
> > + */
> > + 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 +345,25 @@ struct rte_mtr_params {
> >
> > /** Meter policy ID. @see rte_mtr_meter_policy_add() */
> > uint32_t meter_policy_id;
> > +
> > + /** Set of input color protocols to be enabled.
> > + *
> > + * Set value to zero to configure as color blind mode.
> > + *
> > + * When multiple bits set then
> > rte_mtr_color_in_protocol_priority_set()
> > + * shall be used to set the priority, in the order, in which protocol
> > + * to be used to find the inpput color.
> > + *
> > + * @see enum rte_mtr_color_in_protocol
> > + * @see rte_mtr_color_in_protocol_priority_set()
> > + */
> > + uint64_t input_color_proto_mask;
>
> We should not have this as an input parameter at all, please remove this
> field. This mask is implicitly created by the user by calling the
> rte_mtr_color_in_protocol_priority_set() API function. If this function is
> called for a given method, then that method is enabled with the given
> priority; when this function is not called for a given method, then that
> method is disabled.
OK. Since we had rte_mtr_color_in_protocol_priority_set(), I was
thinking it is only setting "priority".
I will change to rte_mtr_color_in_protocol_set() and add API to _get() as well.
>
> > +
> > + /** Input color to be set for the input packet when none of the
> > + * enabled input color methods is applicable to the input packet.
> > + * Ignored when this when *input_color_proto_mask* set to zero.
> > + */
> > + enum rte_color default_input_color;
> > };
> >
> > /**
> > @@ -417,6 +520,16 @@ struct rte_mtr_capabilities {
> > * @see enum rte_mtr_stats_type
> > */
> > uint64_t stats_mask;
> > +
> > + /** Set of supported input color protocol.
> > + * @see enum rte_mtr_color_in_protocol
> > + */
> > + uint64_t input_color_proto_mask;
>
> Agree.
>
> > +
> > + /** When non-zero, it indicates that driver supports separate
> > + * input color table for given ethdev port.
> > + */
> > + int separate_input_color_table_per_port;
>
> The input color tables are actually configured per meter object, do we also
> need a "separate_input_color_table_per_meter" capability flag?
Yes. We have a similar limitation.
>
> > };
> >
> > /**
> > @@ -832,6 +945,59 @@ 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);
> > +/**
> > + * Set the priority for input color protocol
> > + *
> > + * When multiple bits set in struct rte_mtr_params::input_color_proto_mask
> > + * then this API shall be used to set the priority, in the order, in
> > + * which protocol to be used to find the input color.
>
> As stated above, we should remove struct
> rte_mtr_params::input_color_proto_mask, as it is build implicitly by calling
> this function.
>
> I suggest reiterating the explanation from above:
> More than one method can be enabled for a given meter. Even if enabled, a
> method might not be applicable to each input packet, in case the associated
> protocol header is not present in the packet. The highest priority method
> that is both enabled for the meter and also applicable for the current input
> packet wins; if none is both enabled and applicable, the default input color
> is used. @see function rte_mtr_color_in_protocol_priority_set()
OK
>
> > + *
> > + * @param[in] port_id
> > + * The port identifier of the Ethernet device.
> > + * @param[in] mtr_id
> > + * MTR object ID. Needs to be valid.
> > + * @param[in] proto
> > + * Input color protocol to apply priority.
> > + * MTR object's *input_color_proto_mask* should be configured
> > + * with proto value.
> > + * @param[in] priority
> > + * Input color protocol priority. Value zero indicates
> > + * the highest priority.
>
> Agree.
>
> > + * @param[out] error
> > + * Error details. Filled in only on error, when not NULL.
> > + * @return
> > + * 0 on success, non-zero error code otherwise.
> > + *
> > + * @see rte_mtr_params::input_color_proto_mask
> > + */
> > +__rte_experimental
> > +int
> > +rte_mtr_color_in_protocol_priority_set(uint16_t port_id, uint32_t mtr_id,
> > + enum rte_mtr_color_in_protocol proto, uint32_t priority,
> > + struct rte_mtr_error *error);
> > /**
> > * MTR object enabled statistics counters update
> > *
>
> <snip>
>
> Regards,
> Cristian