From: Li Zhang <lizh@nvidia.com>
To: dekelp@nvidia.com, orika@nvidia.com, viacheslavo@nvidia.com,
matan@nvidia.com, shahafs@nvidia.com,
cristian.dumitrescu@intel.com, lironh@marvell.com,
Xiaoyun Li <xiaoyun.li@intel.com>
Cc: dev@dpdk.org, thomas@monjalon.net, rasland@nvidia.com,
roniba@nvidia.com, Haifei Luo <haifeil@nvidia.com>
Subject: [dpdk-dev] [PATCH v5 2/2] app/testpmd: support policy actions per color
Date: Wed, 14 Apr 2021 09:32:30 +0300 [thread overview]
Message-ID: <20210414063231.2047131-3-lizh@nvidia.com> (raw)
In-Reply-To: <20210414063231.2047131-1-lizh@nvidia.com>
From: Haifei Luo <haifeil@nvidia.com>
Add the create/del policy CLIs to support actions per color.
The CLIs are:
Create: add port meter policy (port_id) (policy_id) g_actions (actions)
y_actions (actions) r_actions (actions)
Delete: del port meter policy (port_id) (policy_id)
Examples:
testpmd> add port meter policy 0 1 g_actions rss / end y_actions end
r_actions drop / end
testpmd> del port meter policy 0 1
Signed-off-by: Haifei Luo <haifeil@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
---
app/test-pmd/cmdline.c | 13 ++-
app/test-pmd/cmdline_flow.c | 118 +++++++++++++++++++-
app/test-pmd/cmdline_mtr.c | 85 +++++++++++++-
app/test-pmd/cmdline_mtr.h | 3 +
app/test-pmd/config.c | 32 ++++++
app/test-pmd/testpmd.h | 2 +
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 30 ++++-
7 files changed, 269 insertions(+), 14 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 0bb6394314..6c6184a170 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -705,9 +705,8 @@ static void cmd_help_long_parsed(void *parsed_result,
"del port meter profile (port_id) (profile_id)\n"
" meter profile delete\n\n"
- "create port meter (port_id) (mtr_id) (profile_id) (meter_enable)\n"
- "(g_action) (y_action) (r_action) (stats_mask) (shared)\n"
- "(use_pre_meter_color) [(dscp_tbl_entry0) (dscp_tbl_entry1)...\n"
+ "create port meter (port_id) (mtr_id) (profile_id) (policy_id) (meter_enable)\n"
+ "(stats_mask) (shared) (use_pre_meter_color) [(dscp_tbl_entry0) (dscp_tbl_entry1)...\n"
"(dscp_tbl_entry63)]\n"
" meter create\n\n"
@@ -720,6 +719,13 @@ static void cmd_help_long_parsed(void *parsed_result,
"del port meter (port_id) (mtr_id)\n"
" meter delete\n\n"
+ "add port meter policy (port_id) (policy_id) g_actions (actions)\n"
+ "y_actions (actions) r_actions (actions)\n"
+ " meter policy add\n\n"
+
+ "del port meter policy (port_id) (policy_id)\n"
+ " meter policy delete\n\n"
+
"set port meter profile (port_id) (mtr_id) (profile_id)\n"
" meter update meter profile\n\n"
@@ -17069,6 +17075,7 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_enable_port_meter,
(cmdline_parse_inst_t *)&cmd_disable_port_meter,
(cmdline_parse_inst_t *)&cmd_del_port_meter,
+ (cmdline_parse_inst_t *)&cmd_del_port_meter_policy,
(cmdline_parse_inst_t *)&cmd_set_port_meter_profile,
(cmdline_parse_inst_t *)&cmd_set_port_meter_dscp_table,
(cmdline_parse_inst_t *)&cmd_set_port_meter_stats_mask,
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index fb7a3a8bd3..f50e7312ee 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -55,6 +55,10 @@ enum index {
GROUP_ID,
PRIORITY_LEVEL,
SHARED_ACTION_ID,
+ POLICY_ID,
+
+ /* TOP-level command. */
+ ADD,
/* Top-level command. */
SET,
@@ -289,6 +293,9 @@ enum index {
ITEM_GENEVE_OPT_TYPE,
ITEM_GENEVE_OPT_LENGTH,
ITEM_GENEVE_OPT_DATA,
+ ITEM_POL_PORT,
+ ITEM_POL_METER,
+ ITEM_POL_POLICY,
/* Validate/create actions. */
ACTIONS,
@@ -427,6 +434,9 @@ enum index {
ACTION_MODIFY_FIELD_SRC_OFFSET,
ACTION_MODIFY_FIELD_SRC_VALUE,
ACTION_MODIFY_FIELD_WIDTH,
+ ACTION_POL_G,
+ ACTION_POL_Y,
+ ACTION_POL_R,
};
/** Maximum size for pattern in struct rte_flow_item_raw. */
@@ -808,6 +818,9 @@ struct buffer {
struct {
int destroy;
} aged; /**< Aged arguments. */
+ struct {
+ uint32_t policy_id;
+ } policy;/**< Policy arguments. */
} args; /**< Command arguments. */
};
@@ -1785,6 +1798,9 @@ static int parse_ipv6_addr(struct context *, const struct token *,
static int parse_port(struct context *, const struct token *,
const char *, unsigned int,
void *, unsigned int);
+static int parse_mp(struct context *, const struct token *,
+ const char *, unsigned int,
+ void *, unsigned int);
static int parse_sa(struct context *, const struct token *,
const char *, unsigned int,
void *, unsigned int);
@@ -1823,7 +1839,7 @@ static const struct token token_list[] = {
[ZERO] = {
.name = "ZERO",
.help = "null entry, abused as the entry point",
- .next = NEXT(NEXT_ENTRY(FLOW)),
+ .next = NEXT(NEXT_ENTRY(FLOW, ADD)),
},
[END] = {
.name = "",
@@ -1945,6 +1961,13 @@ static const struct token token_list[] = {
.call = parse_int,
.comp = comp_none,
},
+ [POLICY_ID] = {
+ .name = "{policy_id}",
+ .type = "POLCIY_ID",
+ .help = "policy id",
+ .call = parse_int,
+ .comp = comp_none,
+ },
/* Top-level command. */
[FLOW] = {
.name = "flow",
@@ -4528,6 +4551,54 @@ static const struct token token_list[] = {
.help = "specify action to share",
.next = NEXT(next_action),
},
+ [ACTION_POL_G] = {
+ .name = "g_actions",
+ .help = "submit a list of associated actions for green",
+ .next = NEXT(next_action),
+ .call = parse_mp,
+ },
+ [ACTION_POL_Y] = {
+ .name = "y_actions",
+ .help = "submit a list of associated actions for yellow",
+ .next = NEXT(next_action),
+ },
+ [ACTION_POL_R] = {
+ .name = "r_actions",
+ .help = "submit a list of associated actions for red",
+ .next = NEXT(next_action),
+ },
+
+ /* Top-level command. */
+ [ADD] = {
+ .name = "add",
+ .type = "port meter policy {port_id} {arg}",
+ .help = "add port meter policy",
+ .next = NEXT(NEXT_ENTRY(ITEM_POL_PORT)),
+ .call = parse_init,
+ },
+ /* Sub-level commands. */
+ [ITEM_POL_PORT] = {
+ .name = "port",
+ .help = "add port meter policy",
+ .next = NEXT(NEXT_ENTRY(ITEM_POL_METER)),
+ },
+ [ITEM_POL_METER] = {
+ .name = "meter",
+ .help = "add port meter policy",
+ .next = NEXT(NEXT_ENTRY(ITEM_POL_POLICY)),
+ },
+ [ITEM_POL_POLICY] = {
+ .name = "policy",
+ .help = "add port meter policy",
+ .next = NEXT(NEXT_ENTRY(ACTION_POL_R),
+ NEXT_ENTRY(ACTION_POL_Y),
+ NEXT_ENTRY(ACTION_POL_G),
+ NEXT_ENTRY(POLICY_ID),
+ NEXT_ENTRY(PORT_ID)),
+ .args = ARGS(ARGS_ENTRY(struct buffer, args.policy.policy_id),
+ ARGS_ENTRY(struct buffer, port)),
+ .call = parse_mp,
+ },
};
/** Remove and return last entry from argument stack. */
@@ -4712,6 +4783,47 @@ parse_init(struct context *ctx, const struct token *token,
return len;
}
+/** Parse tokens for meter policy action commands. */
+static int
+parse_mp(struct context *ctx, const struct token *token,
+ const char *str, unsigned int len,
+ void *buf, unsigned int size)
+{
+ struct buffer *out = buf;
+
+ /* Token name must match. */
+ if (parse_default(ctx, token, str, len, NULL, 0) < 0)
+ return -1;
+ /* Nothing else to do if there is no buffer. */
+ if (!out)
+ return len;
+ if (!out->command) {
+ if (ctx->curr != ITEM_POL_POLICY)
+ return -1;
+ if (sizeof(*out) > size)
+ return -1;
+ out->command = ctx->curr;
+ ctx->objdata = 0;
+ ctx->object = out;
+ ctx->objmask = NULL;
+ out->args.vc.data = (uint8_t *)out + size;
+ return len;
+ }
+ switch (ctx->curr) {
+ case ACTION_POL_G:
+ out->args.vc.actions =
+ (void *)RTE_ALIGN_CEIL((uintptr_t)(out + 1),
+ sizeof(double));
+ out->command = ctx->curr;
+ ctx->objdata = 0;
+ ctx->object = out;
+ ctx->objmask = NULL;
+ return len;
+ default:
+ return -1;
+ }
+}
+
/** Parse tokens for shared action commands. */
static int
parse_sa(struct context *ctx, const struct token *token,
@@ -7685,6 +7797,10 @@ cmd_flow_parsed(const struct buffer *in)
case TUNNEL_LIST:
port_flow_tunnel_list(in->port);
break;
+ case ACTION_POL_G:
+ port_meter_policy_add(in->port, in->args.policy.policy_id,
+ in->args.vc.actions);
+ break;
default:
break;
}
diff --git a/app/test-pmd/cmdline_mtr.c b/app/test-pmd/cmdline_mtr.c
index 44394e3ea1..bdc9ae8bfe 100644
--- a/app/test-pmd/cmdline_mtr.c
+++ b/app/test-pmd/cmdline_mtr.c
@@ -37,6 +37,8 @@ print_err_msg(struct rte_mtr_error *error)
[RTE_MTR_ERROR_TYPE_STATS] = "stats",
[RTE_MTR_ERROR_TYPE_SHARED]
= "shared meter",
+ [RTE_MTR_ERROR_TYPE_METER_POLICY_ID] = "meter policy id",
+ [RTE_MTR_ERROR_TYPE_METER_POLICY] = "meter policy null",
};
const char *errstr;
@@ -56,6 +58,12 @@ print_err_msg(struct rte_mtr_error *error)
error->type);
}
+void
+print_mtr_err_msg(struct rte_mtr_error *error)
+{
+ print_err_msg(error);
+}
+
static int
parse_uint(uint64_t *value, const char *str)
{
@@ -671,6 +679,7 @@ struct cmd_create_port_meter_result {
uint16_t port_id;
uint32_t mtr_id;
uint32_t profile_id;
+ uint32_t policy_id;
cmdline_fixed_string_t meter_enable;
cmdline_fixed_string_t g_action;
cmdline_fixed_string_t y_action;
@@ -698,6 +707,9 @@ cmdline_parse_token_num_t cmd_create_port_meter_mtr_id =
cmdline_parse_token_num_t cmd_create_port_meter_profile_id =
TOKEN_NUM_INITIALIZER(
struct cmd_create_port_meter_result, profile_id, RTE_UINT32);
+cmdline_parse_token_num_t cmd_create_port_meter_policy_id =
+ TOKEN_NUM_INITIALIZER(
+ struct cmd_create_port_meter_result, policy_id, RTE_UINT32);
cmdline_parse_token_string_t cmd_create_port_meter_meter_enable =
TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result,
meter_enable, "yes#no");
@@ -741,7 +753,7 @@ static void cmd_create_port_meter_parsed(void *parsed_result,
/* Meter params */
memset(¶ms, 0, sizeof(struct rte_mtr_params));
params.meter_profile_id = res->profile_id;
-
+ params.meter_policy_id = res->policy_id;
/* Parse meter input color string params */
ret = parse_meter_color_str(c_str, &use_prev_meter_color, &dscp_table);
if (ret) {
@@ -756,7 +768,6 @@ static void cmd_create_port_meter_parsed(void *parsed_result,
params.meter_enable = 1;
else
params.meter_enable = 0;
-
params.stats_mask = res->statistics_mask;
ret = rte_mtr_create(port_id, mtr_id, ¶ms, shared, &error);
@@ -771,7 +782,6 @@ cmdline_parse_inst_t cmd_create_port_meter = {
.f = cmd_create_port_meter_parsed,
.data = NULL,
.help_str = "create port meter <port_id> <mtr_id> <profile_id> <meter_enable>(yes|no) "
- "<g_action>(R|Y|G|D) <y_action>(R|Y|G|D) <r_action>(R|Y|G|D) "
"<stats_mask> <shared> <use_pre_meter_color> "
"[<dscp_tbl_entry0> <dscp_tbl_entry1> ...<dscp_tbl_entry63>]",
.tokens = {
@@ -781,10 +791,8 @@ cmdline_parse_inst_t cmd_create_port_meter = {
(void *)&cmd_create_port_meter_port_id,
(void *)&cmd_create_port_meter_mtr_id,
(void *)&cmd_create_port_meter_profile_id,
+ (void *)&cmd_create_port_meter_policy_id,
(void *)&cmd_create_port_meter_meter_enable,
- (void *)&cmd_create_port_meter_g_action,
- (void *)&cmd_create_port_meter_y_action,
- (void *)&cmd_create_port_meter_r_action,
(void *)&cmd_create_port_meter_statistics_mask,
(void *)&cmd_create_port_meter_shared,
(void *)&cmd_create_port_meter_input_color,
@@ -914,6 +922,71 @@ cmdline_parse_inst_t cmd_disable_port_meter = {
},
};
+/* *** Delete Port Meter Policy Object *** */
+struct cmd_del_port_meter_policy_result {
+ cmdline_fixed_string_t del;
+ cmdline_fixed_string_t port;
+ cmdline_fixed_string_t meter;
+ cmdline_fixed_string_t policy;
+ uint16_t port_id;
+ uint32_t policy_id;
+};
+
+cmdline_parse_token_string_t cmd_del_port_meter_policy_del =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_del_port_meter_policy_result, del, "del");
+cmdline_parse_token_string_t cmd_del_port_meter_policy_port =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_del_port_meter_policy_result, port, "port");
+cmdline_parse_token_string_t cmd_del_port_meter_policy_meter =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_del_port_meter_policy_result, meter, "meter");
+cmdline_parse_token_string_t cmd_del_port_meter_policy_policy =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_del_port_meter_policy_result, policy, "policy");
+cmdline_parse_token_num_t cmd_del_port_meter_policy_port_id =
+ TOKEN_NUM_INITIALIZER(
+ struct cmd_del_port_meter_policy_result, port_id, RTE_UINT16);
+cmdline_parse_token_num_t cmd_del_port_meter_policy_policy_id =
+ TOKEN_NUM_INITIALIZER(
+ struct cmd_del_port_meter_policy_result, policy_id, RTE_UINT32);
+
+static void cmd_del_port_meter_policy_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_del_port_meter_policy_result *res = parsed_result;
+ struct rte_mtr_error error;
+ uint32_t policy_id = res->policy_id;
+ uint16_t port_id = res->port_id;
+ int ret;
+
+ if (port_id_is_invalid(port_id, ENABLED_WARN))
+ return;
+
+ /* Delete Meter Policy*/
+ ret = rte_mtr_meter_policy_delete(port_id, policy_id, &error);
+ if (ret != 0) {
+ print_err_msg(&error);
+ return;
+ }
+}
+
+cmdline_parse_inst_t cmd_del_port_meter_policy = {
+ .f = cmd_del_port_meter_policy_parsed,
+ .data = NULL,
+ .help_str = "Delete port meter policy",
+ .tokens = {
+ (void *)&cmd_del_port_meter_policy_del,
+ (void *)&cmd_del_port_meter_policy_port,
+ (void *)&cmd_del_port_meter_policy_meter,
+ (void *)&cmd_del_port_meter_policy_policy,
+ (void *)&cmd_del_port_meter_policy_port_id,
+ (void *)&cmd_del_port_meter_policy_policy_id,
+ NULL,
+ },
+};
+
/* *** Delete Port Meter Object *** */
struct cmd_del_port_meter_result {
cmdline_fixed_string_t del;
diff --git a/app/test-pmd/cmdline_mtr.h b/app/test-pmd/cmdline_mtr.h
index 7e2713cea3..2415fc16c3 100644
--- a/app/test-pmd/cmdline_mtr.h
+++ b/app/test-pmd/cmdline_mtr.h
@@ -4,6 +4,7 @@
#ifndef _CMDLINE_MTR_H_
#define _CMDLINE_MTR_H_
+#include <rte_mtr.h>
/* Traffic Metering and Policing */
extern cmdline_parse_inst_t cmd_show_port_meter_cap;
@@ -15,9 +16,11 @@ extern cmdline_parse_inst_t cmd_create_port_meter;
extern cmdline_parse_inst_t cmd_enable_port_meter;
extern cmdline_parse_inst_t cmd_disable_port_meter;
extern cmdline_parse_inst_t cmd_del_port_meter;
+extern cmdline_parse_inst_t cmd_del_port_meter_policy;
extern cmdline_parse_inst_t cmd_set_port_meter_profile;
extern cmdline_parse_inst_t cmd_set_port_meter_dscp_table;
extern cmdline_parse_inst_t cmd_set_port_meter_stats_mask;
extern cmdline_parse_inst_t cmd_show_port_meter_stats;
+void print_mtr_err_msg(struct rte_mtr_error *error);
#endif /* _CMDLINE_MTR_H_ */
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index a5e82b7a97..f8b3f671cd 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -38,6 +38,7 @@
#include <rte_string_fns.h>
#include <rte_cycles.h>
#include <rte_flow.h>
+#include <rte_mtr.h>
#include <rte_errno.h>
#ifdef RTE_NET_IXGBE
#include <rte_pmd_ixgbe.h>
@@ -52,6 +53,7 @@
#include <rte_hexdump.h>
#include "testpmd.h"
+#include "cmdline_mtr.h"
#define ETHDEV_FWVERS_LEN 32
@@ -1465,6 +1467,36 @@ action_alloc(portid_t port_id, uint32_t id,
return 0;
}
+/** Add port meter policy */
+int
+port_meter_policy_add(portid_t port_id, uint32_t policy_id,
+ const struct rte_flow_action *actions)
+{
+ struct rte_mtr_error error;
+ const struct rte_flow_action *act = actions;
+ const struct rte_flow_action *start;
+ struct rte_mtr_meter_policy_params policy;
+ uint32_t i = 0, act_n;
+ int ret;
+
+ for (i = 0; i < RTE_COLORS; i++) {
+ for (act_n = 0, start = act;
+ act->type != RTE_FLOW_ACTION_TYPE_END; act++)
+ act_n++;
+ if (act_n && act->type == RTE_FLOW_ACTION_TYPE_END)
+ policy.actions[i] = start;
+ else
+ policy.actions[i] = NULL;
+ act++;
+ }
+ ret = rte_mtr_meter_policy_add(port_id,
+ policy_id,
+ &policy, &error);
+ if (ret)
+ print_mtr_err_msg(&error);
+ return ret;
+}
+
/** Create shared action */
int
port_shared_action_create(portid_t port_id, uint32_t id,
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index a87ccb0f0f..bc7cb7e9b9 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -837,6 +837,8 @@ void port_flow_tunnel_list(portid_t port_id);
void port_flow_tunnel_destroy(portid_t port_id, uint32_t tunnel_id);
void port_flow_tunnel_create(portid_t port_id, const struct tunnel_ops *ops);
int port_flow_isolate(portid_t port_id, int set);
+int port_meter_policy_add(portid_t port_id, uint32_t policy_id,
+ const struct rte_flow_action *actions);
void rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id);
void tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 3f7a1c0e33..b596ee9a14 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -2764,13 +2764,37 @@ Delete meter profile from the ethernet device::
testpmd> del port meter profile (port_id) (profile_id)
+create port policy
+~~~~~~~~~~~~~~~~~~
+
+Create new policy object for the ethernet device::
+
+ testpmd> add port meter policy (port_id) (policy_id) g_actions \
+ {action} y_actions {action} r_actions {action}
+
+where:
+
+* ``policy_id``: policy ID.
+* ``action``: action lists for green/yellow/red colors.
+
+delete port policy
+~~~~~~~~~~~~~~~~~~
+
+Delete policy object for the ethernet device::
+
+ testpmd> del port meter policy (port_id) (policy_id)
+
+where:
+
+* ``policy_id``: policy ID.
+
create port meter
~~~~~~~~~~~~~~~~~
Create new meter object for the ethernet device::
testpmd> create port meter (port_id) (mtr_id) (profile_id) \
- (meter_enable) (g_action) (y_action) (r_action) (stats_mask) (shared) \
+ (policy_id) (meter_enable) (stats_mask) (shared) \
(use_pre_meter_color) [(dscp_tbl_entry0) (dscp_tbl_entry1)...\
(dscp_tbl_entry63)]
@@ -2778,11 +2802,9 @@ where:
* ``mtr_id``: meter object ID.
* ``profile_id``: ID for the meter profile.
+* ``policy_id``: ID for the policy.
* ``meter_enable``: When this parameter has a non-zero value, the meter object
gets enabled at the time of creation, otherwise remains disabled.
-* ``g_action``: Policer action for the packet with green color.
-* ``y_action``: Policer action for the packet with yellow color.
-* ``r_action``: Policer action for the packet with red color.
* ``stats_mask``: Mask of statistics counter types to be enabled for the
meter object.
* ``shared``: When this parameter has a non-zero value, the meter object is
--
2.27.0
next prev parent reply other threads:[~2021-04-14 6:32 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-18 8:58 [dpdk-dev] [PATCH 1/2] [RFC]: ethdev: add pre-defined meter policy API Li Zhang
2021-03-18 8:58 ` [dpdk-dev] [PATCH 2/2] [RFC]: ethdev: manage meter API object handles by the drivers Li Zhang
2021-03-23 21:33 ` Dumitrescu, Cristian
2021-03-25 8:21 ` Matan Azrad
2021-03-25 23:16 ` Ajit Khaparde
2021-03-29 19:56 ` Matan Azrad
2021-03-27 13:15 ` Jerin Jacob
2021-03-29 20:10 ` Matan Azrad
2021-03-31 10:22 ` Jerin Jacob
2021-03-23 21:02 ` [dpdk-dev] [PATCH 1/2] [RFC]: ethdev: add pre-defined meter policy API Dumitrescu, Cristian
2021-03-25 6:56 ` Matan Azrad
2021-03-29 9:23 ` Ori Kam
2021-03-29 16:24 ` Dumitrescu, Cristian
2021-04-01 13:13 ` Ori Kam
2021-04-01 13:35 ` Dumitrescu, Cristian
2021-04-01 14:22 ` Ori Kam
2021-03-29 16:08 ` Dumitrescu, Cristian
2021-03-29 20:43 ` Matan Azrad
2021-03-31 15:46 ` Dumitrescu, Cristian
2021-04-04 13:48 ` Matan Azrad
2021-03-29 10:38 ` Jerin Jacob
2021-03-29 20:31 ` Matan Azrad
2021-03-31 10:50 ` Jerin Jacob
2021-04-13 0:14 ` [dpdk-dev] [PATCH v3 0/2] Support " Li Zhang
2021-04-13 0:14 ` [dpdk-dev] [PATCH v3 1/2] ethdev: add pre-defined " Li Zhang
2021-04-13 14:19 ` Dumitrescu, Cristian
2021-04-14 3:23 ` Li Zhang
2021-04-13 14:59 ` Dumitrescu, Cristian
2021-04-14 4:55 ` Li Zhang
2021-04-14 8:02 ` Thomas Monjalon
2021-04-14 8:31 ` Matan Azrad
2021-04-14 8:47 ` Asaf Penso
2021-04-14 8:59 ` Li Zhang
2021-04-14 9:04 ` Thomas Monjalon
2021-04-14 14:00 ` Dumitrescu, Cristian
2021-04-14 16:21 ` Li Zhang
2021-04-13 16:25 ` Kinsella, Ray
2021-04-13 0:14 ` [dpdk-dev] [PATCH v3 2/2] app/testpmd: support policy actions per color Li Zhang
2021-04-14 3:12 ` [dpdk-dev] [PATCH v4 0/2] Support meter policy API Li Zhang
2021-04-14 3:12 ` [dpdk-dev] [PATCH v4 1/2] ethdev: add pre-defined " Li Zhang
2021-04-14 3:12 ` [dpdk-dev] [PATCH v4 2/2] app/testpmd: support policy actions per color Li Zhang
2021-04-14 6:32 ` [dpdk-dev] [PATCH v5 0/2] Support meter policy API Li Zhang
2021-04-14 6:32 ` [dpdk-dev] [PATCH v5 1/2] ethdev: add pre-defined " Li Zhang
2021-04-14 6:32 ` Li Zhang [this message]
2021-04-14 8:57 ` [dpdk-dev] [PATCH v6 0/2] Support " Li Zhang
2021-04-14 8:57 ` [dpdk-dev] [PATCH v6 1/2] ethdev: add pre-defined " Li Zhang
2021-04-14 16:16 ` Dumitrescu, Cristian
2021-04-15 1:59 ` Li Zhang
2021-04-14 22:21 ` Singh, Jasvinder
2021-04-15 2:00 ` Li Zhang
2021-04-14 8:58 ` [dpdk-dev] [PATCH v6 2/2] app/testpmd: support policy actions per color Li Zhang
2021-04-15 4:54 ` [dpdk-dev] [PATCH v7 0/2] Support meter policy API Li Zhang
2021-04-15 4:54 ` [dpdk-dev] [PATCH v7 1/2] ethdev: add pre-defined " Li Zhang
2021-04-15 4:54 ` [dpdk-dev] [PATCH v7 2/2] app/testpmd: support policy actions per color Li Zhang
2021-04-15 9:20 ` [dpdk-dev] [PATCH v8 0/2] Support meter policy API Li Zhang
2021-04-15 9:20 ` [dpdk-dev] [PATCH v8 1/2] ethdev: add pre-defined " Li Zhang
2021-04-15 15:13 ` Ori Kam
2021-04-19 12:34 ` Singh, Jasvinder
2021-04-19 16:13 ` Jiawei(Jonny) Wang
2021-04-15 9:20 ` [dpdk-dev] [PATCH v8 2/2] app/testpmd: support policy actions per color Li Zhang
2021-04-19 16:08 ` [dpdk-dev] [PATCH v9 0/2] Support meter policy API Jiawei Wang
2021-04-19 16:08 ` [dpdk-dev] [PATCH v9 1/2] ethdev: add pre-defined " Jiawei Wang
2021-04-20 11:18 ` Dumitrescu, Cristian
2021-04-20 12:55 ` Asaf Penso
2021-04-20 21:01 ` Dumitrescu, Cristian
2021-04-19 16:08 ` [dpdk-dev] [PATCH v9 2/2] app/testpmd: support policy actions per color Jiawei Wang
2021-04-20 11:36 ` [dpdk-dev] [PATCH v9 0/2] Support meter policy API Ferruh Yigit
2021-04-20 14:08 ` Jiawei(Jonny) Wang
2021-04-20 14:04 ` [dpdk-dev] [PATCH v10 " Jiawei Wang
2021-04-20 14:04 ` [dpdk-dev] [PATCH v10 1/2] ethdev: add pre-defined " Jiawei Wang
2021-04-20 17:12 ` Ajit Khaparde
2021-04-21 19:43 ` Thomas Monjalon
2021-04-22 1:29 ` Li Zhang
2021-04-20 14:04 ` [dpdk-dev] [PATCH v10 2/2] app/testpmd: support policy actions per color Jiawei Wang
2021-04-20 17:14 ` Ajit Khaparde
2021-04-21 10:23 ` [dpdk-dev] [PATCH v10 0/2] Support meter policy API Ferruh Yigit
2021-04-20 17:56 ` [dpdk-dev] [PATCH 1/2] [RFC]: ethdev: add pre-defined " Stephen Hemminger
2021-04-21 2:49 ` Li Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210414063231.2047131-3-lizh@nvidia.com \
--to=lizh@nvidia.com \
--cc=cristian.dumitrescu@intel.com \
--cc=dekelp@nvidia.com \
--cc=dev@dpdk.org \
--cc=haifeil@nvidia.com \
--cc=lironh@marvell.com \
--cc=matan@nvidia.com \
--cc=orika@nvidia.com \
--cc=rasland@nvidia.com \
--cc=roniba@nvidia.com \
--cc=shahafs@nvidia.com \
--cc=thomas@monjalon.net \
--cc=viacheslavo@nvidia.com \
--cc=xiaoyun.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).