@@ -297,8 +297,8 @@ parse_meter_color_str(char *c_str, uint32_t *use_prev_meter_color,
}
static int
-parse_multi_token_string(char *t_str, uint16_t *port_id,
- uint32_t *mtr_id, enum rte_color **dscp_table)
+parse_multi_token_string(char *t_str, uint16_t *port_id, uint32_t *mtr_id,
+ enum rte_mtr_color_in_protocol *proto, enum rte_color **dscp_table)
{
char *token;
uint64_t val;
@@ -326,6 +326,16 @@ parse_multi_token_string(char *t_str, uint16_t *port_id,
*mtr_id = val;
+ /* Third token: protocol */
+ token = strtok_r(t_str, PARSE_DELIMITER, &t_str);
+ if (token == NULL)
+ return 0;
+
+ if (strcmp(token, "outer_ip") == 0)
+ *proto = RTE_MTR_COLOR_IN_PROTO_OUTER_IP;
+ else if (strcmp(token, "inner_ip") == 0)
+ *proto = RTE_MTR_COLOR_IN_PROTO_INNER_IP;
+
ret = parse_dscp_table_entries(t_str, dscp_table);
if (ret != 0)
return -1;
@@ -335,7 +345,7 @@ parse_multi_token_string(char *t_str, uint16_t *port_id,
static int
parse_multi_token_vlan_str(char *t_str, uint16_t *port_id, uint32_t *mtr_id,
- enum rte_color **vlan_table)
+ enum rte_mtr_color_in_protocol *proto, enum rte_color **vlan_table)
{
uint64_t val;
char *token;
@@ -363,6 +373,16 @@ parse_multi_token_vlan_str(char *t_str, uint16_t *port_id, uint32_t *mtr_id,
*mtr_id = val;
+ /* Third token: protocol */
+ token = strtok_r(t_str, PARSE_DELIMITER, &t_str);
+ if (token == NULL)
+ return 0;
+
+ if (strcmp(token, "outer_vlan") == 0)
+ *proto = RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN;
+ else if (strcmp(token, "inner_vlan") == 0)
+ *proto = RTE_MTR_COLOR_IN_PROTO_INNER_VLAN;
+
ret = parse_vlan_table_entries(t_str, vlan_table);
if (ret != 0)
return -1;
@@ -1388,6 +1408,7 @@ static void cmd_set_port_meter_dscp_table_parsed(void *parsed_result,
__rte_unused void *data)
{
struct cmd_set_port_meter_dscp_table_result *res = parsed_result;
+ enum rte_mtr_color_in_protocol proto = 0;
struct rte_mtr_error error;
enum rte_color *dscp_table = NULL;
char *t_str = res->token_string;
@@ -1396,7 +1417,8 @@ static void cmd_set_port_meter_dscp_table_parsed(void *parsed_result,
int ret;
/* Parse string */
- ret = parse_multi_token_string(t_str, &port_id, &mtr_id, &dscp_table);
+ ret = parse_multi_token_string(t_str, &port_id, &mtr_id, &proto,
+ &dscp_table);
if (ret) {
fprintf(stderr, " Multi token string parse error\n");
return;
@@ -1406,7 +1428,7 @@ static void cmd_set_port_meter_dscp_table_parsed(void *parsed_result,
goto free_table;
/* Update Meter DSCP Table*/
- ret = rte_mtr_meter_dscp_table_update(port_id, mtr_id,
+ ret = rte_mtr_meter_dscp_table_update(port_id, mtr_id, proto,
dscp_table, &error);
if (ret != 0)
print_err_msg(&error);
@@ -1418,7 +1440,7 @@ static void cmd_set_port_meter_dscp_table_parsed(void *parsed_result,
cmdline_parse_inst_t cmd_set_port_meter_dscp_table = {
.f = cmd_set_port_meter_dscp_table_parsed,
.data = NULL,
- .help_str = "set port meter dscp table <port_id> <mtr_id> "
+ .help_str = "set port meter dscp table <port_id> <mtr_id> <proto> "
"[<dscp_tbl_entry0> <dscp_tbl_entry1> ... <dscp_tbl_entry63>]",
.tokens = {
(void *)&cmd_set_port_meter_dscp_table_set,
@@ -1461,6 +1483,7 @@ static void cmd_set_port_meter_vlan_table_parsed(void *parsed_result,
__rte_unused void *data)
{
struct cmd_set_port_meter_vlan_table_result *res = parsed_result;
+ enum rte_mtr_color_in_protocol proto = 0;
struct rte_mtr_error error;
enum rte_color *vlan_table = NULL;
char *t_str = res->token_string;
@@ -1469,7 +1492,8 @@ static void cmd_set_port_meter_vlan_table_parsed(void *parsed_result,
int ret;
/* Parse string */
- ret = parse_multi_token_vlan_str(t_str, &port_id, &mtr_id, &vlan_table);
+ ret = parse_multi_token_vlan_str(t_str, &port_id, &mtr_id, &proto,
+ &vlan_table);
if (ret) {
fprintf(stderr, " Multi token string parse error\n");
return;
@@ -1479,7 +1503,7 @@ static void cmd_set_port_meter_vlan_table_parsed(void *parsed_result,
goto free_table;
/* Update Meter VLAN Table*/
- ret = rte_mtr_meter_vlan_table_update(port_id, mtr_id,
+ ret = rte_mtr_meter_vlan_table_update(port_id, mtr_id, proto,
vlan_table, &error);
if (ret != 0)
print_err_msg(&error);
@@ -1491,7 +1515,7 @@ static void cmd_set_port_meter_vlan_table_parsed(void *parsed_result,
cmdline_parse_inst_t cmd_set_port_meter_vlan_table = {
.f = cmd_set_port_meter_vlan_table_parsed,
.data = NULL,
- .help_str = "set port meter vlan table <port_id> <mtr_id> "
+ .help_str = "set port meter vlan table <port_id> <mtr_id> <proto> "
"[<vlan_tbl_entry0> <vlan_tbl_entry1> ... <vlan_tbl_entry15>]",
.tokens = {
(void *)&cmd_set_port_meter_vlan_table_set,
@@ -2597,15 +2597,15 @@ set port meter dscp table
Set meter dscp table for the ethernet device::
- testpmd> set port meter dscp table (port_id) (mtr_id) [(dscp_tbl_entry0) \
- (dscp_tbl_entry1)...(dscp_tbl_entry63)]
+ testpmd> set port meter dscp table (port_id) (mtr_id) (proto) \
+ [(dscp_tbl_entry0) (dscp_tbl_entry1)...(dscp_tbl_entry63)]
set port meter vlan table
~~~~~~~~~~~~~~~~~~~~~~~~~
Set meter VLAN table for the Ethernet device::
- testpmd> set port meter vlan table (port_id) (mtr_id) [(vlan_tbl_entry0) \
- (vlan_tbl_entry1)...(vlan_tbl_entry15)]
+ testpmd> set port meter vlan table (port_id) (mtr_id) (proto) \
+ [(vlan_tbl_entry0) (vlan_tbl_entry1)...(vlan_tbl_entry15)]
set port meter protocol
~~~~~~~~~~~~~~~~~~~~~~~
@@ -720,6 +720,7 @@ cnxk_nix_mtr_disable(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
static int
cnxk_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+ enum rte_mtr_color_in_protocol proto,
enum rte_color *dscp_table,
struct rte_mtr_error *error)
{
@@ -750,7 +751,7 @@ cnxk_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
table.count = ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP;
- switch (dev->proto) {
+ switch (proto) {
case RTE_MTR_COLOR_IN_PROTO_OUTER_IP:
table.mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER;
break;
@@ -764,6 +765,13 @@ cnxk_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
goto exit;
}
+ if (dev->proto != proto) {
+ rc = -rte_mtr_error_set(error, EINVAL,
+ RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+ "input color protocol is not configured");
+ goto exit;
+ }
+
for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP; i++)
table.color[i] = nix_dscp_tbl[i];
@@ -784,6 +792,7 @@ cnxk_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
static int
cnxk_nix_mtr_vlan_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+ enum rte_mtr_color_in_protocol proto,
enum rte_color *vlan_table,
struct rte_mtr_error *error)
{
@@ -814,7 +823,7 @@ cnxk_nix_mtr_vlan_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
table.count = ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN;
- switch (dev->proto) {
+ switch (proto) {
case RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN:
table.mode = ROC_NIX_BPF_PC_MODE_VLAN_OUTER;
break;
@@ -828,6 +837,13 @@ cnxk_nix_mtr_vlan_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
goto exit;
}
+ if (dev->proto != proto) {
+ rc = -rte_mtr_error_set(error, EINVAL,
+ RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+ "input color protocol is not configured");
+ goto exit;
+ }
+
for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN; i++)
table.color[i] = nix_vlan_tbl[i];
@@ -636,7 +636,7 @@ pmd_mtr_meter_profile_update(struct rte_eth_dev *dev,
/* MTR object meter DSCP table update */
static int
pmd_mtr_meter_dscp_table_update(struct rte_eth_dev *dev,
- uint32_t mtr_id,
+ uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
enum rte_color *dscp_table,
struct rte_mtr_error *error)
{
@@ -648,6 +648,8 @@ pmd_mtr_meter_dscp_table_update(struct rte_eth_dev *dev,
uint32_t table_id, i;
int status;
+ RTE_SET_USED(proto);
+
/* MTR object id must be valid */
m = softnic_mtr_find(p, mtr_id);
if (m == NULL)
@@ -197,25 +197,25 @@ rte_mtr_meter_policy_update(uint16_t port_id,
/** MTR object meter DSCP table update */
int
rte_mtr_meter_dscp_table_update(uint16_t port_id,
- uint32_t mtr_id,
+ uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
enum rte_color *dscp_table,
struct rte_mtr_error *error)
{
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
- mtr_id, dscp_table, error);
+ mtr_id, proto, dscp_table, error);
}
/** MTR object meter VLAN table update */
int
rte_mtr_meter_vlan_table_update(uint16_t port_id,
- uint32_t mtr_id,
+ uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
enum rte_color *vlan_table,
struct rte_mtr_error *error)
{
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
return RTE_MTR_FUNC(port_id, meter_vlan_table_update)(dev,
- mtr_id, vlan_table, error);
+ mtr_id, proto, vlan_table, error);
}
/** Set the input color protocol on MTR object */
@@ -913,6 +913,8 @@ rte_mtr_meter_policy_update(uint16_t 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.
* @param[in] dscp_table
* 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
@@ -927,7 +929,7 @@ rte_mtr_meter_policy_update(uint16_t port_id,
__rte_experimental
int
rte_mtr_meter_dscp_table_update(uint16_t port_id,
- uint32_t mtr_id,
+ uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
enum rte_color *dscp_table,
struct rte_mtr_error *error);
@@ -938,6 +940,8 @@ rte_mtr_meter_dscp_table_update(uint16_t 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.
* @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
@@ -952,6 +956,7 @@ rte_mtr_meter_dscp_table_update(uint16_t port_id,
__rte_experimental
int
rte_mtr_meter_vlan_table_update(uint16_t port_id, uint32_t mtr_id,
+ enum rte_mtr_color_in_protocol proto,
enum rte_color *vlan_table,
struct rte_mtr_error *error);
@@ -93,13 +93,13 @@ typedef int (*rte_mtr_meter_policy_update_t)(struct rte_eth_dev *dev,
/** @internal MTR object meter DSCP table update. */
typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
+ uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
enum rte_color *dscp_table,
struct rte_mtr_error *error);
/** @internal mtr object meter vlan table update. */
typedef int (*rte_mtr_meter_vlan_table_update_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
+ uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
enum rte_color *vlan_table,
struct rte_mtr_error *error);