Hey, Anyone has any comments on this patch?
-Jack On Mon, 19-09-16, 17:21, Xiaoyu Min wrote: > In some scenarios, the raw_encap/raw_decap actions could be multiple in > one single flow (e,g. hirepin flow): > > ... actions raw_decap / raw_encap / raw_decap / raw_encap / ... > > This requires the testpmd supports multiple raw_encap/raw_decap data > settings as well. > > With the multiple raw_encap/raw_decap settings, the testpmd commands – > set raw_encap / set raw_decap will become: > > set raw_encap <index> <item pattern> > set raw_decap <index> <item pattern> > > And the actions – raw_encap/raw_decap also could optionally choose which > global raw_encap/raw_decap confs to be used by index: > > ... actions raw_decap index 1 / raw_encap index 2 / ... > > If there is no `index` specified, the default index is 0: > > set raw_encap <item pattern> > ... actions raw_decap / raw_encap / ... > > which will use raw_encap index 0. > > In addition to the set raw_encap/raw_decap commands, > > show <raw_encap/raw_decap> <index> > show <raw_encap/raw_decap> all > > are also introduced into in order to check which index is set and to > what. > > Signed-off-by: Xiaoyu Min <jack...@mellanox.com> > --- > app/test-pmd/cmdline.c | 2 + > app/test-pmd/cmdline_flow.c | 310 ++++++++++++++++++-- > app/test-pmd/testpmd.h | 2 + > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 57 +++- > 4 files changed, 331 insertions(+), 40 deletions(-) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index b6bc34b4d2..9a7aae8b0e 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -19017,6 +19017,8 @@ cmdline_parse_ctx_t main_ctx[] = { > (cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific, > (cmdline_parse_inst_t *)&cmd_show_tx_metadata, > (cmdline_parse_inst_t *)&cmd_set_raw, > + (cmdline_parse_inst_t *)&cmd_show_set_raw, > + (cmdline_parse_inst_t *)&cmd_show_set_raw_all, > NULL, > }; > > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > index 495871394e..f5a1178d9d 100644 > --- a/app/test-pmd/cmdline_flow.c > +++ b/app/test-pmd/cmdline_flow.c > @@ -19,7 +19,10 @@ > #include <rte_byteorder.h> > #include <cmdline_parse.h> > #include <cmdline_parse_etheraddr.h> > +#include <cmdline_parse_string.h> > +#include <cmdline_parse_num.h> > #include <rte_flow.h> > +#include <rte_hexdump.h> > > #include "testpmd.h" > > @@ -51,6 +54,7 @@ enum index { > /* Sub-leve commands. */ > SET_RAW_ENCAP, > SET_RAW_DECAP, > + SET_RAW_INDEX, > > /* Top-level command. */ > FLOW, > @@ -297,6 +301,10 @@ enum index { > ACTION_DEC_TCP_ACK_VALUE, > ACTION_RAW_ENCAP, > ACTION_RAW_DECAP, > + ACTION_RAW_ENCAP_INDEX, > + ACTION_RAW_ENCAP_INDEX_VALUE, > + ACTION_RAW_DECAP_INDEX, > + ACTION_RAW_DECAP_INDEX_VALUE, > }; > > /** Maximum size for pattern in struct rte_flow_item_raw. */ > @@ -320,6 +328,7 @@ struct action_rss_data { > #define ACTION_VXLAN_ENCAP_ITEMS_NUM 6 > > #define ACTION_RAW_ENCAP_MAX_DATA 128 > +#define RAW_ENCAP_CONFS_MAX_NUM 8 > > /** Storage for struct rte_flow_action_raw_encap. */ > struct raw_encap_conf { > @@ -328,7 +337,7 @@ struct raw_encap_conf { > size_t size; > }; > > -struct raw_encap_conf raw_encap_conf = {.size = 0}; > +struct raw_encap_conf raw_encap_confs[RAW_ENCAP_CONFS_MAX_NUM]; > > /** Storage for struct rte_flow_action_raw_decap. */ > struct raw_decap_conf { > @@ -336,7 +345,7 @@ struct raw_decap_conf { > size_t size; > }; > > -struct raw_decap_conf raw_decap_conf = {.size = 0}; > +struct raw_decap_conf raw_decap_confs[RAW_ENCAP_CONFS_MAX_NUM]; > > /** Storage for struct rte_flow_action_vxlan_encap including external data. > */ > struct action_vxlan_encap_data { > @@ -376,12 +385,14 @@ struct action_raw_encap_data { > struct rte_flow_action_raw_encap conf; > uint8_t data[ACTION_RAW_ENCAP_MAX_DATA]; > uint8_t preserve[ACTION_RAW_ENCAP_MAX_DATA]; > + uint16_t idx; > }; > > /** Storage for struct rte_flow_action_raw_decap including external data. */ > struct action_raw_decap_data { > struct rte_flow_action_raw_decap conf; > uint8_t data[ACTION_RAW_ENCAP_MAX_DATA]; > + uint16_t idx; > }; > > /** Maximum number of subsequent tokens and arguments on the stack. */ > @@ -902,6 +913,12 @@ static const enum index item_meta[] = { > ZERO, > }; > > +static const enum index next_set_raw[] = { > + SET_RAW_INDEX, > + ITEM_ETH, > + ZERO, > +}; > + > static const enum index next_action[] = { > ACTION_END, > ACTION_VOID, > @@ -1143,6 +1160,18 @@ static const enum index action_dec_tcp_ack[] = { > ZERO, > }; > > +static const enum index action_raw_encap[] = { > + ACTION_RAW_ENCAP_INDEX, > + ACTION_NEXT, > + ZERO, > +}; > + > +static const enum index action_raw_decap[] = { > + ACTION_RAW_DECAP_INDEX, > + ACTION_NEXT, > + ZERO, > +}; > + > static int parse_set_raw_encap_decap(struct context *, const struct token *, > const char *, unsigned int, > void *, unsigned int); > @@ -1201,6 +1230,12 @@ static int parse_vc_action_raw_encap(struct context *, > static int parse_vc_action_raw_decap(struct context *, > const struct token *, const char *, > unsigned int, void *, unsigned int); > +static int parse_vc_action_raw_encap_index(struct context *, > + const struct token *, const char *, > + unsigned int, void *, unsigned int); > +static int parse_vc_action_raw_decap_index(struct context *, > + const struct token *, const char *, > + unsigned int, void *, unsigned int); > static int parse_destroy(struct context *, const struct token *, > const char *, unsigned int, > void *, unsigned int); > @@ -1260,6 +1295,8 @@ static int comp_vc_action_rss_type(struct context *, > const struct token *, > unsigned int, char *, unsigned int); > static int comp_vc_action_rss_queue(struct context *, const struct token *, > unsigned int, char *, unsigned int); > +static int comp_set_raw_index(struct context *, const struct token *, > + unsigned int, char *, unsigned int); > > /** Token definitions. */ > static const struct token token_list[] = { > @@ -3095,23 +3132,49 @@ static const struct token token_list[] = { > .name = "raw_encap", > .help = "encapsulation data, defined by set raw_encap", > .priv = PRIV_ACTION(RAW_ENCAP, > - sizeof(struct rte_flow_action_raw_encap)), > - .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), > + sizeof(struct action_raw_encap_data)), > + .next = NEXT(action_raw_encap), > .call = parse_vc_action_raw_encap, > }, > + [ACTION_RAW_ENCAP_INDEX] = { > + .name = "index", > + .help = "the index of raw_encap_confs", > + .next = NEXT(NEXT_ENTRY(ACTION_RAW_ENCAP_INDEX_VALUE)), > + }, > + [ACTION_RAW_ENCAP_INDEX_VALUE] = { > + .name = "{index}", > + .type = "UNSIGNED", > + .help = "unsigned integer value", > + .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), > + .call = parse_vc_action_raw_encap_index, > + .comp = comp_set_raw_index, > + }, > [ACTION_RAW_DECAP] = { > .name = "raw_decap", > .help = "decapsulation data, defined by set raw_encap", > .priv = PRIV_ACTION(RAW_DECAP, > - sizeof(struct rte_flow_action_raw_decap)), > - .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), > + sizeof(struct action_raw_decap_data)), > + .next = NEXT(action_raw_decap), > .call = parse_vc_action_raw_decap, > }, > + [ACTION_RAW_DECAP_INDEX] = { > + .name = "index", > + .help = "the index of raw_encap_confs", > + .next = NEXT(NEXT_ENTRY(ACTION_RAW_DECAP_INDEX_VALUE)), > + }, > + [ACTION_RAW_DECAP_INDEX_VALUE] = { > + .name = "{index}", > + .type = "UNSIGNED", > + .help = "unsigned integer value", > + .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), > + .call = parse_vc_action_raw_decap_index, > + .comp = comp_set_raw_index, > + }, > /* Top level command. */ > [SET] = { > .name = "set", > .help = "set raw encap/decap data", > - .type = "set raw_encap|raw_decap <pattern>", > + .type = "set raw_encap|raw_decap <index> <pattern>", > .next = NEXT(NEXT_ENTRY > (SET_RAW_ENCAP, > SET_RAW_DECAP)), > @@ -3121,14 +3184,29 @@ static const struct token token_list[] = { > [SET_RAW_ENCAP] = { > .name = "raw_encap", > .help = "set raw encap data", > - .next = NEXT(next_item), > + .next = NEXT(next_set_raw), > + .args = ARGS(ARGS_ENTRY_ARB_BOUNDED > + (offsetof(struct buffer, port), > + sizeof(((struct buffer *)0)->port), > + 0, RAW_ENCAP_CONFS_MAX_NUM - 1)), > .call = parse_set_raw_encap_decap, > }, > [SET_RAW_DECAP] = { > .name = "raw_decap", > .help = "set raw decap data", > - .next = NEXT(next_item), > + .next = NEXT(next_set_raw), > + .args = ARGS(ARGS_ENTRY_ARB_BOUNDED > + (offsetof(struct buffer, port), > + sizeof(((struct buffer *)0)->port), > + 0, RAW_ENCAP_CONFS_MAX_NUM - 1)), > .call = parse_set_raw_encap_decap, > + }, > + [SET_RAW_INDEX] = { > + .name = "{index}", > + .type = "UNSIGNED", > + .help = "index of raw_encap/raw_decap data", > + .next = NEXT(next_item), > + .call = parse_port, > } > }; > > @@ -4423,6 +4501,84 @@ parse_vc_action_mplsoudp_decap(struct context *ctx, > const struct token *token, > return ret; > } > > +static int > +parse_vc_action_raw_decap_index(struct context *ctx, const struct token > *token, > + const char *str, unsigned int len, void *buf, > + unsigned int size) > +{ > + struct action_raw_decap_data *action_raw_decap_data; > + struct rte_flow_action *action; > + const struct arg *arg; > + struct buffer *out = buf; > + int ret; > + uint16_t idx; > + > + RTE_SET_USED(token); > + RTE_SET_USED(buf); > + RTE_SET_USED(size); > + arg = ARGS_ENTRY_ARB_BOUNDED > + (offsetof(struct action_raw_decap_data, idx), > + sizeof(((struct action_raw_decap_data *)0)->idx), > + 0, RAW_ENCAP_CONFS_MAX_NUM - 1); > + if (push_args(ctx, arg)) > + return -1; > + ret = parse_int(ctx, token, str, len, NULL, 0); > + if (ret < 0) { > + pop_args(ctx); > + return -1; > + } > + if (!ctx->object) > + return len; > + action = &out->args.vc.actions[out->args.vc.actions_n - 1]; > + action_raw_decap_data = ctx->object; > + idx = action_raw_decap_data->idx; > + action_raw_decap_data->conf.data = raw_decap_confs[idx].data; > + action_raw_decap_data->conf.size = raw_decap_confs[idx].size; > + action->conf = &action_raw_decap_data->conf; > + return len; > +} > + > + > +static int > +parse_vc_action_raw_encap_index(struct context *ctx, const struct token > *token, > + const char *str, unsigned int len, void *buf, > + unsigned int size) > +{ > + struct action_raw_encap_data *action_raw_encap_data; > + struct rte_flow_action *action; > + const struct arg *arg; > + struct buffer *out = buf; > + int ret; > + uint16_t idx; > + > + RTE_SET_USED(token); > + RTE_SET_USED(buf); > + RTE_SET_USED(size); > + if (ctx->curr != ACTION_RAW_ENCAP_INDEX_VALUE) > + return -1; > + arg = ARGS_ENTRY_ARB_BOUNDED > + (offsetof(struct action_raw_encap_data, idx), > + sizeof(((struct action_raw_encap_data *)0)->idx), > + 0, RAW_ENCAP_CONFS_MAX_NUM - 1); > + if (push_args(ctx, arg)) > + return -1; > + ret = parse_int(ctx, token, str, len, NULL, 0); > + if (ret < 0) { > + pop_args(ctx); > + return -1; > + } > + if (!ctx->object) > + return len; > + action = &out->args.vc.actions[out->args.vc.actions_n - 1]; > + action_raw_encap_data = ctx->object; > + idx = action_raw_encap_data->idx; > + action_raw_encap_data->conf.data = raw_encap_confs[idx].data; > + action_raw_encap_data->conf.size = raw_encap_confs[idx].size; > + action_raw_encap_data->conf.preserve = NULL; > + action->conf = &action_raw_encap_data->conf; > + return len; > +} > + > static int > parse_vc_action_raw_encap(struct context *ctx, const struct token *token, > const char *str, unsigned int len, void *buf, > @@ -4430,8 +4586,7 @@ parse_vc_action_raw_encap(struct context *ctx, const > struct token *token, > { > struct buffer *out = buf; > struct rte_flow_action *action; > - struct rte_flow_action_raw_encap *action_raw_encap_conf = NULL; > - uint8_t *data = NULL; > + struct action_raw_encap_data *action_raw_encap_data = NULL; > int ret; > > ret = parse_vc(ctx, token, str, len, buf, size); > @@ -4447,14 +4602,11 @@ parse_vc_action_raw_encap(struct context *ctx, const > struct token *token, > ctx->object = out->args.vc.data; > ctx->objmask = NULL; > /* Copy the headers to the buffer. */ > - action_raw_encap_conf = ctx->object; > - /* data stored from tail of data buffer */ > - data = (uint8_t *)&(raw_encap_conf.data) + > - ACTION_RAW_ENCAP_MAX_DATA - raw_encap_conf.size; > - action_raw_encap_conf->data = data; > - action_raw_encap_conf->preserve = NULL; > - action_raw_encap_conf->size = raw_encap_conf.size; > - action->conf = action_raw_encap_conf; > + action_raw_encap_data = ctx->object; > + action_raw_encap_data->conf.data = raw_encap_confs[0].data; > + action_raw_encap_data->conf.preserve = NULL; > + action_raw_encap_data->conf.size = raw_encap_confs[0].size; > + action->conf = &action_raw_encap_data->conf; > return ret; > } > > @@ -4465,8 +4617,7 @@ parse_vc_action_raw_decap(struct context *ctx, const > struct token *token, > { > struct buffer *out = buf; > struct rte_flow_action *action; > - struct rte_flow_action_raw_decap *action_raw_decap_conf = NULL; > - uint8_t *data = NULL; > + struct action_raw_decap_data *action_raw_decap_data = NULL; > int ret; > > ret = parse_vc(ctx, token, str, len, buf, size); > @@ -4482,13 +4633,10 @@ parse_vc_action_raw_decap(struct context *ctx, const > struct token *token, > ctx->object = out->args.vc.data; > ctx->objmask = NULL; > /* Copy the headers to the buffer. */ > - action_raw_decap_conf = ctx->object; > - /* data stored from tail of data buffer */ > - data = (uint8_t *)&(raw_decap_conf.data) + > - ACTION_RAW_ENCAP_MAX_DATA - raw_decap_conf.size; > - action_raw_decap_conf->data = data; > - action_raw_decap_conf->size = raw_decap_conf.size; > - action->conf = action_raw_decap_conf; > + action_raw_decap_data = ctx->object; > + action_raw_decap_data->conf.data = raw_decap_confs[0].data; > + action_raw_decap_data->conf.size = raw_decap_confs[0].size; > + action->conf = &action_raw_decap_data->conf; > return ret; > } > > @@ -5167,6 +5315,7 @@ parse_set_raw_encap_decap(struct context *ctx, const > struct token *token, > return -1; > ctx->objdata = 0; > ctx->objmask = NULL; > + ctx->object = out; > if (!out->command) > return -1; > out->command = ctx->curr; > @@ -5343,6 +5492,24 @@ comp_vc_action_rss_queue(struct context *ctx, const > struct token *token, > return -1; > } > > +/** Complete index number for set raw_encap/raw_decap commands. */ > +static int > +comp_set_raw_index(struct context *ctx, const struct token *token, > + unsigned int ent, char *buf, unsigned int size) > +{ > + uint16_t idx = 0; > + uint16_t nb = 0; > + > + RTE_SET_USED(ctx); > + RTE_SET_USED(token); > + for (idx = 0; idx < RAW_ENCAP_CONFS_MAX_NUM; ++idx) { > + if (buf && idx == ent) > + return snprintf(buf, size, "%u", idx); > + ++nb; > + } > + return nb; > +} > + > /** Internal context. */ > static struct context cmd_flow_context; > > @@ -5777,15 +5944,16 @@ cmd_set_raw_parsed(const struct buffer *in) > size_t *total_size = NULL; > uint16_t upper_layer = 0; > uint16_t proto = 0; > + uint16_t idx = in->port; /* We borrow port field as index */ > > RTE_ASSERT(in->command == SET_RAW_ENCAP || > in->command == SET_RAW_DECAP); > if (in->command == SET_RAW_ENCAP) { > - total_size = &raw_encap_conf.size; > - data = (uint8_t *)&raw_encap_conf.data; > + total_size = &raw_encap_confs[idx].size; > + data = (uint8_t *)&raw_encap_confs[idx].data; > } else { > - total_size = &raw_decap_conf.size; > - data = (uint8_t *)&raw_decap_conf.data; > + total_size = &raw_decap_confs[idx].size; > + data = (uint8_t *)&raw_decap_confs[idx].data; > } > *total_size = 0; > memset(data, 0x00, ACTION_RAW_ENCAP_MAX_DATA); > @@ -5855,6 +6023,7 @@ cmd_set_raw_parsed(const struct buffer *in) > if (verbose_level & 0x1) > printf("total data size is %zu\n", (*total_size)); > RTE_ASSERT((*total_size) <= ACTION_RAW_ENCAP_MAX_DATA); > + memmove(data, (data_tail - (*total_size)), *total_size); > } > > /** Populate help strings for current token (cmdline API). */ > @@ -5939,3 +6108,80 @@ cmdline_parse_inst_t cmd_set_raw = { > NULL, > }, /**< Tokens are returned by cmd_flow_tok(). */ > }; > + > +/* *** display raw_encap/raw_decap buf */ > +struct cmd_show_set_raw_result { > + cmdline_fixed_string_t cmd_show; > + cmdline_fixed_string_t cmd_what; > + cmdline_fixed_string_t cmd_all; > + uint16_t cmd_index; > +}; > + > +static void > +cmd_show_set_raw_parsed(void *parsed_result, struct cmdline *cl, void *data) > +{ > + struct cmd_show_set_raw_result *res = parsed_result; > + uint16_t index = res->cmd_index; > + uint8_t all = 0; > + uint8_t *raw_data = NULL; > + size_t raw_size = 0; > + char title[16] = {0}; > + > + RTE_SET_USED(cl); > + RTE_SET_USED(data); > + if (!strcmp(res->cmd_all, "all")) { > + all = 1; > + index = 0; > + } else if (index >= RAW_ENCAP_CONFS_MAX_NUM) { > + printf("index should be 0-%u\n", RAW_ENCAP_CONFS_MAX_NUM - 1); > + return; > + } > + do { > + if (!strcmp(res->cmd_what, "raw_encap")) { > + raw_data = (uint8_t *)&raw_encap_confs[index].data; > + raw_size = raw_encap_confs[index].size; > + snprintf(title, 16, "\nindex: %u", index); > + rte_hexdump(stdout, title, raw_data, raw_size); > + } else { > + raw_data = (uint8_t *)&raw_decap_confs[index].data; > + raw_size = raw_decap_confs[index].size; > + snprintf(title, 16, "\nindex: %u", index); > + rte_hexdump(stdout, title, raw_data, raw_size); > + } > + } while (all && ++index < RAW_ENCAP_CONFS_MAX_NUM); > +} > + > +cmdline_parse_token_string_t cmd_show_set_raw_cmd_show = > + TOKEN_STRING_INITIALIZER(struct cmd_show_set_raw_result, > + cmd_show, "show"); > +cmdline_parse_token_string_t cmd_show_set_raw_cmd_what = > + TOKEN_STRING_INITIALIZER(struct cmd_show_set_raw_result, > + cmd_what, "raw_encap#raw_decap"); > +cmdline_parse_token_num_t cmd_show_set_raw_cmd_index = > + TOKEN_NUM_INITIALIZER(struct cmd_show_set_raw_result, > + cmd_index, UINT16); > +cmdline_parse_token_string_t cmd_show_set_raw_cmd_all = > + TOKEN_STRING_INITIALIZER(struct cmd_show_set_raw_result, > + cmd_all, "all"); > +cmdline_parse_inst_t cmd_show_set_raw = { > + .f = cmd_show_set_raw_parsed, > + .data = NULL, > + .help_str = "show <raw_encap|raw_decap> <index>", > + .tokens = { > + (void *)&cmd_show_set_raw_cmd_show, > + (void *)&cmd_show_set_raw_cmd_what, > + (void *)&cmd_show_set_raw_cmd_index, > + NULL, > + }, > +}; > +cmdline_parse_inst_t cmd_show_set_raw_all = { > + .f = cmd_show_set_raw_parsed, > + .data = NULL, > + .help_str = "show <raw_encap|raw_decap> all", > + .tokens = { > + (void *)&cmd_show_set_raw_cmd_show, > + (void *)&cmd_show_set_raw_cmd_what, > + (void *)&cmd_show_set_raw_cmd_all, > + NULL, > + }, > +}; > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h > index ce13eb8e6a..a65635d6ff 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -265,6 +265,8 @@ extern struct fwd_engine ieee1588_fwd_engine; > > extern struct fwd_engine * fwd_engines[]; /**< NULL terminated array. */ > extern cmdline_parse_inst_t cmd_set_raw; > +extern cmdline_parse_inst_t cmd_show_set_raw; > +extern cmdline_parse_inst_t cmd_show_set_raw_all; > > extern uint16_t mempool_flags; > > diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > index 67f4339ca9..1cf9a2bdff 100644 > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > @@ -540,6 +540,25 @@ Dumps the log level for all the dpdk modules:: > > testpmd> dump_log_types > > +show (raw_encap|raw_decap) > +~~~~~~~~~~~~~~~~~~~~~~~~~~ > + > +Display content of raw_encap/raw_decap buffers in hex:: > + > + testpmd> show <raw_encap|raw_decap> <index> > + testpmd> show <raw_encap|raw_decap> all > + > +For example:: > + > + testpmd> show raw_encap 6 > + > + index: 6 at [0x1c565b0], len=50 > + 00000000: 00 00 00 00 00 00 16 26 36 46 56 66 08 00 45 00 | > .......&6FVf..E. > + 00000010: 00 00 00 00 00 00 00 11 00 00 C0 A8 01 06 C0 A8 | > ................ > + 00000020: 03 06 00 00 00 FA 00 00 00 00 08 00 00 00 00 00 | > ................ > + 00000030: 06 00 | .. > + > + > Configuration Functions > ----------------------- > > @@ -1844,12 +1863,22 @@ Config Raw Encapsulation > Configure the raw data to be used when encapsulating a packet by > rte_flow_action_raw_encap:: > > + set raw_encap {index} {item} [/ {item} [...]] / end_set > + > +There are multiple global buffers for ``raw_encap``, this command will set > one > +internal buffer index by ``{index}``. > +If there is no ``{index}`` specified:: > + > set raw_encap {item} [/ {item} [...]] / end_set > > -This command will set an internal buffer inside testpmd, any following flow > rule > -using the action raw_encap will use the last configuration set. > -To have a different encapsulation header, this command must be called before > the > -flow rule creation. > +the default index ``0`` is used. > +In order to use different encapsulating header, ``index`` must be specified > +during the flow rule creation:: > + > + testpmd> flow create 0 egress pattern eth / ipv4 / end actions > + raw_encap index 2 / end > + > +Otherwise the default index ``0`` is used. > > Config Raw Decapsulation > ~~~~~~~~~~~~~~~~~~~~~~~~ > @@ -1857,10 +1886,22 @@ Config Raw Decapsulation > Configure the raw data to be used when decapsulating a packet by > rte_flow_action_raw_decap:: > > + set raw_decap {index} {item} [/ {item} [...]] / end_set > + > +There are multiple global buffers for ``raw_decap``, this command will set > +one internal buffer index by ``{index}``. > +If there is no ``{index}`` specified:: > + > set raw_decap {item} [/ {item} [...]] / end_set > > -This command will set an internal buffer inside testpmd, any following flow > rule > -using the action raw_decap will use the last configuration set. > +the default index ``0`` is used. > +In order to use different decapsulating header, ``index`` must be specified > +during the flow rule creation:: > + > + testpmd> flow create 0 egress pattern eth / ipv4 / end actions > + raw_encap index 3 / end > + > +Otherwise the default index ``0`` is used. > > Port Functions > -------------- > @@ -4658,11 +4699,11 @@ Raw encapsulation configuration can be set by the > following commands > > Eecapsulating VxLAN:: > > - testpmd> set raw_encap eth src is 10:11:22:33:44:55 / vlan tci is 1 > + testpmd> set raw_encap 4 eth src is 10:11:22:33:44:55 / vlan tci is 1 > inner_type is 0x0800 / ipv4 / udp dst is 4789 / vxlan vni > is 2 / end_set > testpmd> flow create 0 egress pattern eth / ipv4 / end actions > - raw_encap / end > + raw_encap index 4 / end > > Sample Raw decapsulation rule > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > -- > 2.23.0 >