On Tue, Apr 26, 2022 at 5:38 PM Dumitrescu, Cristian <cristian.dumitre...@intel.com> 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