From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 02C261BEDF for ; Thu, 5 Jul 2018 17:07:32 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jul 2018 08:07:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,312,1526367600"; d="scan'208,217";a="72487712" Received: from awalabdu-mobl.ger.corp.intel.com (HELO [163.33.176.189]) ([163.33.176.189]) by orsmga002.jf.intel.com with ESMTP; 05 Jul 2018 08:07:29 -0700 To: Nelio Laranjeiro , dev@dpdk.org, Adrien Mazarguil , Wenzhuo Lu , Jingjing Wu , Bernard Iremonger , Stephen Hemminger Cc: Ori Kam References: <5e6d06d39fb9dd5e1f2a30915d12baf17c481902.1530799598.git.nelio.laranjeiro@6wind.com> From: Mohammad Abdul Awal Message-ID: Date: Thu, 5 Jul 2018 16:07:28 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: <5e6d06d39fb9dd5e1f2a30915d12baf17c481902.1530799598.git.nelio.laranjeiro@6wind.com> Content-Language: en-US Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Content-Filtered-By: Mailman/MimeDel 2.1.15 Subject: Re: [dpdk-dev] [PATCH v8 2/2] app/testpmd: add NVGRE encap/decap support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Jul 2018 15:07:33 -0000 Some nits. Auto-completion suggestion for values should be wrapped between '<' and '>', not '(' and ')'. See all the cases. On 05/07/2018 15:33, Nelio Laranjeiro wrote: > Due to the complex NVGRE_ENCAP flow action and based on the fact testpmd > does not allocate memory, this patch adds a new command in testpmd to > initialise a global structure containing the necessary information to > make the outer layer of the packet. This same global structure will > then be used by the flow command line in testpmd when the action > nvgre_encap will be parsed, at this point, the conversion into such > action becomes trivial. > > This global structure is only used for the encap action. > > Signed-off-by: Nelio Laranjeiro > Acked-by: Ori Kam > --- > app/test-pmd/cmdline.c | 160 ++++++++++++++++++++ > app/test-pmd/cmdline_flow.c | 132 ++++++++++++++++ > app/test-pmd/testpmd.c | 15 ++ > app/test-pmd/testpmd.h | 15 ++ > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 52 +++++++ > 5 files changed, 374 insertions(+) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index 56bdb023c..1b3fa1647 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -792,6 +792,16 @@ static void cmd_help_long_parsed(void *parsed_result, > " eth-dst (eth-dst)\n" > " Configure the VXLAN encapsulation for flows.\n\n" > > + "nvgre ip-version (ipv4|ipv6) tni (tni) ip-src" > + " (ip-src) ip-dst (ip-dst) eth-src (eth-src) eth-dst" > + " (eth-dst)\n" Auto-completion suggestion for values should be wrapped between '<' and '>', not '(' and ')'. > + " Configure the NVGRE encapsulation for flows.\n\n" > + > + "nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni)" > + " ip-src (ip-src) ip-dst (ip-dst) vlan-tci (vlan-tci)" > + " eth-src (eth-src) eth-dst (eth-dst)\n" > + " Configure the NVGRE encapsulation for flows.\n\n" > + > , list_pkt_forwarding_modes() > ); > } > @@ -15021,6 +15031,154 @@ cmdline_parse_inst_t cmd_set_vxlan_with_vlan = { > }, > }; > > +/** Set NVGRE encapsulation details */ > +struct cmd_set_nvgre_result { > + cmdline_fixed_string_t set; > + cmdline_fixed_string_t nvgre; > + cmdline_fixed_string_t pos_token; > + cmdline_fixed_string_t ip_version; > + uint32_t tni; > + cmdline_ipaddr_t ip_src; > + cmdline_ipaddr_t ip_dst; > + uint16_t tci; > + struct ether_addr eth_src; > + struct ether_addr eth_dst; > +}; > + > +cmdline_parse_token_string_t cmd_set_nvgre_set = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, set, "set"); > +cmdline_parse_token_string_t cmd_set_nvgre_nvgre = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, nvgre, "nvgre"); > +cmdline_parse_token_string_t cmd_set_nvgre_nvgre_with_vlan = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, nvgre, > + "nvgre-with-vlan"); > +cmdline_parse_token_string_t cmd_set_nvgre_ip_version = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, > + "ip-version"); > +cmdline_parse_token_string_t cmd_set_nvgre_ip_version_value = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, ip_version, > + "ipv4#ipv6"); > +cmdline_parse_token_string_t cmd_set_nvgre_tni = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, > + "tni"); > +cmdline_parse_token_num_t cmd_set_nvgre_tni_value = > + TOKEN_NUM_INITIALIZER(struct cmd_set_nvgre_result, tni, UINT32); > +cmdline_parse_token_string_t cmd_set_nvgre_ip_src = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, > + "ip-src"); > +cmdline_parse_token_num_t cmd_set_nvgre_ip_src_value = > + TOKEN_IPADDR_INITIALIZER(struct cmd_set_nvgre_result, ip_src); > +cmdline_parse_token_string_t cmd_set_nvgre_ip_dst = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, > + "ip-dst"); > +cmdline_parse_token_ipaddr_t cmd_set_nvgre_ip_dst_value = > + TOKEN_IPADDR_INITIALIZER(struct cmd_set_nvgre_result, ip_dst); > +cmdline_parse_token_string_t cmd_set_nvgre_vlan = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, > + "vlan-tci"); > +cmdline_parse_token_num_t cmd_set_nvgre_vlan_value = > + TOKEN_NUM_INITIALIZER(struct cmd_set_nvgre_result, tci, UINT16); > +cmdline_parse_token_string_t cmd_set_nvgre_eth_src = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, > + "eth-src"); > +cmdline_parse_token_etheraddr_t cmd_set_nvgre_eth_src_value = > + TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_nvgre_result, eth_src); > +cmdline_parse_token_string_t cmd_set_nvgre_eth_dst = > + TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, > + "eth-dst"); > +cmdline_parse_token_etheraddr_t cmd_set_nvgre_eth_dst_value = > + TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_nvgre_result, eth_dst); > + > +static void cmd_set_nvgre_parsed(void *parsed_result, > + __attribute__((unused)) struct cmdline *cl, > + __attribute__((unused)) void *data) > +{ > + struct cmd_set_nvgre_result *res = parsed_result; > + union { > + uint32_t nvgre_tni; > + uint8_t tni[4]; > + } id = { > + .nvgre_tni = rte_cpu_to_be_32(res->tni) & RTE_BE32(0x00ffffff), > + }; > + > + if (strcmp(res->nvgre, "nvgre") == 0) > + nvgre_encap_conf.select_vlan = 0; > + else if (strcmp(res->nvgre, "nvgre-with-vlan") == 0) > + nvgre_encap_conf.select_vlan = 1; > + if (strcmp(res->ip_version, "ipv4") == 0) > + nvgre_encap_conf.select_ipv4 = 1; > + else if (strcmp(res->ip_version, "ipv6") == 0) > + nvgre_encap_conf.select_ipv4 = 0; > + else > + return; > + rte_memcpy(nvgre_encap_conf.tni, &id.tni[1], 3); > + if (nvgre_encap_conf.select_ipv4) { > + IPV4_ADDR_TO_UINT(res->ip_src, nvgre_encap_conf.ipv4_src); > + IPV4_ADDR_TO_UINT(res->ip_dst, nvgre_encap_conf.ipv4_dst); > + } else { > + IPV6_ADDR_TO_ARRAY(res->ip_src, nvgre_encap_conf.ipv6_src); > + IPV6_ADDR_TO_ARRAY(res->ip_dst, nvgre_encap_conf.ipv6_dst); > + } > + if (nvgre_encap_conf.select_vlan) > + nvgre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci); > + rte_memcpy(nvgre_encap_conf.eth_src, res->eth_src.addr_bytes, > + ETHER_ADDR_LEN); > + rte_memcpy(nvgre_encap_conf.eth_dst, res->eth_dst.addr_bytes, > + ETHER_ADDR_LEN); > +} > + > +cmdline_parse_inst_t cmd_set_nvgre = { > + .f = cmd_set_nvgre_parsed, > + .data = NULL, > + .help_str = "set nvgre ip-version (ipv4|ipv6) tni (tni) ip-src" > + " (ip-src) ip-dst (ip-dst) eth-src (eth-src)" > + " eth-dst (eth-dst)", > + .tokens = { > + (void *)&cmd_set_nvgre_set, > + (void *)&cmd_set_nvgre_nvgre, > + (void *)&cmd_set_nvgre_ip_version, > + (void *)&cmd_set_nvgre_ip_version_value, > + (void *)&cmd_set_nvgre_tni, > + (void *)&cmd_set_nvgre_tni_value, > + (void *)&cmd_set_nvgre_ip_src, > + (void *)&cmd_set_nvgre_ip_src_value, > + (void *)&cmd_set_nvgre_ip_dst, > + (void *)&cmd_set_nvgre_ip_dst_value, > + (void *)&cmd_set_nvgre_eth_src, > + (void *)&cmd_set_nvgre_eth_src_value, > + (void *)&cmd_set_nvgre_eth_dst, > + (void *)&cmd_set_nvgre_eth_dst_value, > + NULL, > + }, > +}; > + > +cmdline_parse_inst_t cmd_set_nvgre_with_vlan = { > + .f = cmd_set_nvgre_parsed, > + .data = NULL, > + .help_str = "set nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni)" > + " ip-src (ip-src) ip-dst (ip-dst) vlan-tci (vlan-tci)" > + " eth-src (eth-src) eth-dst (eth-dst)", > + .tokens = { > + (void *)&cmd_set_nvgre_set, > + (void *)&cmd_set_nvgre_nvgre_with_vlan, > + (void *)&cmd_set_nvgre_ip_version, > + (void *)&cmd_set_nvgre_ip_version_value, > + (void *)&cmd_set_nvgre_tni, > + (void *)&cmd_set_nvgre_tni_value, > + (void *)&cmd_set_nvgre_ip_src, > + (void *)&cmd_set_nvgre_ip_src_value, > + (void *)&cmd_set_nvgre_ip_dst, > + (void *)&cmd_set_nvgre_ip_dst_value, > + (void *)&cmd_set_nvgre_vlan, > + (void *)&cmd_set_nvgre_vlan_value, > + (void *)&cmd_set_nvgre_eth_src, > + (void *)&cmd_set_nvgre_eth_src_value, > + (void *)&cmd_set_nvgre_eth_dst, > + (void *)&cmd_set_nvgre_eth_dst_value, > + NULL, > + }, > +}; > + > /* Strict link priority scheduling mode setting */ > static void > cmd_strict_link_prio_parsed( > @@ -17647,6 +17805,8 @@ cmdline_parse_ctx_t main_ctx[] = { > #endif > (cmdline_parse_inst_t *)&cmd_set_vxlan, > (cmdline_parse_inst_t *)&cmd_set_vxlan_with_vlan, > + (cmdline_parse_inst_t *)&cmd_set_nvgre, > + (cmdline_parse_inst_t *)&cmd_set_nvgre_with_vlan, > (cmdline_parse_inst_t *)&cmd_ddp_add, > (cmdline_parse_inst_t *)&cmd_ddp_del, > (cmdline_parse_inst_t *)&cmd_ddp_get_list, > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > index a99fd0048..f9260600e 100644 > --- a/app/test-pmd/cmdline_flow.c > +++ b/app/test-pmd/cmdline_flow.c > @@ -241,6 +241,8 @@ enum index { > ACTION_OF_PUSH_MPLS_ETHERTYPE, > ACTION_VXLAN_ENCAP, > ACTION_VXLAN_DECAP, > + ACTION_NVGRE_ENCAP, > + ACTION_NVGRE_DECAP, > }; > > /** Maximum size for pattern in struct rte_flow_item_raw. */ > @@ -277,6 +279,22 @@ struct action_vxlan_encap_data { > struct rte_flow_item_vxlan item_vxlan; > }; > > +/** Maximum number of items in struct rte_flow_action_nvgre_encap. */ > +#define ACTION_NVGRE_ENCAP_ITEMS_NUM 5 > + > +/** Storage for struct rte_flow_action_nvgre_encap including external data. */ > +struct action_nvgre_encap_data { > + struct rte_flow_action_nvgre_encap conf; > + struct rte_flow_item items[ACTION_NVGRE_ENCAP_ITEMS_NUM]; > + struct rte_flow_item_eth item_eth; > + struct rte_flow_item_vlan item_vlan; > + union { > + struct rte_flow_item_ipv4 item_ipv4; > + struct rte_flow_item_ipv6 item_ipv6; > + }; > + struct rte_flow_item_nvgre item_nvgre; > +}; > + > /** Maximum number of subsequent tokens and arguments on the stack. */ > #define CTX_STACK_SIZE 16 > > @@ -796,6 +814,8 @@ static const enum index next_action[] = { > ACTION_OF_PUSH_MPLS, > ACTION_VXLAN_ENCAP, > ACTION_VXLAN_DECAP, > + ACTION_NVGRE_ENCAP, > + ACTION_NVGRE_DECAP, > ZERO, > }; > > @@ -929,6 +949,9 @@ static int parse_vc_action_rss_queue(struct context *, const struct token *, > static int parse_vc_action_vxlan_encap(struct context *, const struct token *, > const char *, unsigned int, void *, > unsigned int); > +static int parse_vc_action_nvgre_encap(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); > @@ -2429,6 +2452,24 @@ static const struct token token_list[] = { > .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), > .call = parse_vc, > }, > + [ACTION_NVGRE_ENCAP] = { > + .name = "nvgre_encap", > + .help = "NVGRE encapsulation, uses configuration set by \"set" > + " nvgre\"", > + .priv = PRIV_ACTION(NVGRE_ENCAP, > + sizeof(struct action_nvgre_encap_data)), > + .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), > + .call = parse_vc_action_nvgre_encap, > + }, > + [ACTION_NVGRE_DECAP] = { > + .name = "nvgre_decap", > + .help = "Performs a decapsulation action by stripping all" > + " headers of the NVGRE tunnel network overlay from the" > + " matched flow.", > + .priv = PRIV_ACTION(NVGRE_DECAP, 0), > + .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), > + .call = parse_vc, > + }, > }; > > /** Remove and return last entry from argument stack. */ > @@ -3093,6 +3134,97 @@ parse_vc_action_vxlan_encap(struct context *ctx, const struct token *token, > return ret; > } > > +/** Parse NVGRE encap action. */ > +static int > +parse_vc_action_nvgre_encap(struct context *ctx, const struct token *token, > + const char *str, unsigned int len, > + void *buf, unsigned int size) > +{ > + struct buffer *out = buf; > + struct rte_flow_action *action; > + struct action_nvgre_encap_data *action_nvgre_encap_data; > + int ret; > + > + ret = parse_vc(ctx, token, str, len, buf, size); > + if (ret < 0) > + return ret; > + /* Nothing else to do if there is no buffer. */ > + if (!out) > + return ret; > + if (!out->args.vc.actions_n) > + return -1; > + action = &out->args.vc.actions[out->args.vc.actions_n - 1]; > + /* Point to selected object. */ > + ctx->object = out->args.vc.data; > + ctx->objmask = NULL; > + /* Set up default configuration. */ > + action_nvgre_encap_data = ctx->object; > + *action_nvgre_encap_data = (struct action_nvgre_encap_data){ > + .conf = (struct rte_flow_action_nvgre_encap){ > + .definition = action_nvgre_encap_data->items, > + }, > + .items = { > + { > + .type = RTE_FLOW_ITEM_TYPE_ETH, > + .spec = &action_nvgre_encap_data->item_eth, > + .mask = &rte_flow_item_eth_mask, > + }, > + { > + .type = RTE_FLOW_ITEM_TYPE_VLAN, > + .spec = &action_nvgre_encap_data->item_vlan, > + .mask = &rte_flow_item_vlan_mask, > + }, > + { > + .type = RTE_FLOW_ITEM_TYPE_IPV4, > + .spec = &action_nvgre_encap_data->item_ipv4, > + .mask = &rte_flow_item_ipv4_mask, > + }, > + { > + .type = RTE_FLOW_ITEM_TYPE_NVGRE, > + .spec = &action_nvgre_encap_data->item_nvgre, > + .mask = &rte_flow_item_nvgre_mask, > + }, > + { > + .type = RTE_FLOW_ITEM_TYPE_END, > + }, > + }, > + .item_eth.type = 0, > + .item_vlan = { > + .tci = nvgre_encap_conf.vlan_tci, > + .inner_type = 0, > + }, > + .item_ipv4.hdr = { > + .src_addr = nvgre_encap_conf.ipv4_src, > + .dst_addr = nvgre_encap_conf.ipv4_dst, > + }, > + .item_nvgre.flow_id = 0, > + }; > + memcpy(action_nvgre_encap_data->item_eth.dst.addr_bytes, > + nvgre_encap_conf.eth_dst, ETHER_ADDR_LEN); > + memcpy(action_nvgre_encap_data->item_eth.src.addr_bytes, > + nvgre_encap_conf.eth_src, ETHER_ADDR_LEN); > + if (!nvgre_encap_conf.select_ipv4) { > + memcpy(&action_nvgre_encap_data->item_ipv6.hdr.src_addr, > + &nvgre_encap_conf.ipv6_src, > + sizeof(nvgre_encap_conf.ipv6_src)); > + memcpy(&action_nvgre_encap_data->item_ipv6.hdr.dst_addr, > + &nvgre_encap_conf.ipv6_dst, > + sizeof(nvgre_encap_conf.ipv6_dst)); > + action_nvgre_encap_data->items[2] = (struct rte_flow_item){ > + .type = RTE_FLOW_ITEM_TYPE_IPV6, > + .spec = &action_nvgre_encap_data->item_ipv6, > + .mask = &rte_flow_item_ipv6_mask, > + }; > + } > + if (!nvgre_encap_conf.select_vlan) > + action_nvgre_encap_data->items[1].type = > + RTE_FLOW_ITEM_TYPE_VOID; > + memcpy(action_nvgre_encap_data->item_nvgre.tni, nvgre_encap_conf.tni, > + RTE_DIM(nvgre_encap_conf.tni)); > + action->conf = &action_nvgre_encap_data->conf; > + return ret; > +} > + > /** Parse tokens for destroy command. */ > static int > parse_destroy(struct context *ctx, const struct token *token, > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c > index bf39ac3ff..dbba7d253 100644 > --- a/app/test-pmd/testpmd.c > +++ b/app/test-pmd/testpmd.c > @@ -409,6 +409,21 @@ struct vxlan_encap_conf vxlan_encap_conf = { > .eth_dst = "\xff\xff\xff\xff\xff\xff", > }; > > +struct nvgre_encap_conf nvgre_encap_conf = { > + .select_ipv4 = 1, > + .select_vlan = 0, > + .tni = "\x00\x00\x00", > + .ipv4_src = IPv4(127, 0, 0, 1), > + .ipv4_dst = IPv4(255, 255, 255, 255), > + .ipv6_src = "\x00\x00\x00\x00\x00\x00\x00\x00" > + "\x00\x00\x00\x00\x00\x00\x00\x01", > + .ipv6_dst = "\x00\x00\x00\x00\x00\x00\x00\x00" > + "\x00\x00\x00\x00\x00\x00\x11\x11", > + .vlan_tci = 0, > + .eth_src = "\x00\x00\x00\x00\x00\x00", > + .eth_dst = "\xff\xff\xff\xff\xff\xff", > +}; > + > /* Forward function declarations */ > static void map_port_queue_stats_mapping_registers(portid_t pi, > struct rte_port *port); > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h > index 0d6618788..2b1e448b0 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -496,6 +496,21 @@ struct vxlan_encap_conf { > }; > struct vxlan_encap_conf vxlan_encap_conf; > > +/* NVGRE encap/decap parameters. */ > +struct nvgre_encap_conf { > + uint32_t select_ipv4:1; > + uint32_t select_vlan:1; > + uint8_t tni[3]; > + rte_be32_t ipv4_src; > + rte_be32_t ipv4_dst; > + uint8_t ipv6_src[16]; > + uint8_t ipv6_dst[16]; > + rte_be16_t vlan_tci; > + uint8_t eth_src[ETHER_ADDR_LEN]; > + uint8_t eth_dst[ETHER_ADDR_LEN]; > +}; > +struct nvgre_encap_conf nvgre_encap_conf; > + > static inline unsigned int > lcore_num(void) > { > diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > index 3281778d9..94d8d38c7 100644 > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > @@ -1552,6 +1552,21 @@ flow rule using the action vxlan_encap will use the last configuration set. > To have a different encapsulation header, one of those commands must be called > before the flow rule creation. > > +Config NVGRE Encap outer layers > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + > +Configure the outer layer to encapsulate a packet inside a NVGRE tunnel:: > + > + set nvgre ip-version (ipv4|ipv6) tni (tni) ip-src (ip-src) ip-dst (ip-dst) \ > + eth-src (eth-src) eth-dst (eth-dst) > + set nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni) ip-src (ip-src) \ > + ip-dst (ip-dst) vlan-tci (vlan-tci) eth-src (eth-src) eth-dst (eth-dst)                                       ^^^^^^^                                       Auto-completion suggestion for values should be wrapped between '<' and '>', not '(' and ')', for all cases. > + > +Those command will set an internal configuration inside testpmd, any following > +flow rule using the action nvgre_encap will use the last configuration set. > +To have a different encapsulation header, one of those commands must be called > +before the flow rule creation. > + > Port Functions > -------------- > > @@ -3673,6 +3688,12 @@ This section lists supported actions and their attributes, if any. > - ``vxlan_decap``: Performs a decapsulation action by stripping all headers of > the VXLAN tunnel network overlay from the matched flow. > > +- ``nvgre_encap``: Performs a NVGRE encapsulation, outer layer configuration > + is done through `Config NVGRE Encap outer layers`_. > + > +- ``nvgre_decap``: Performs a decapsulation action by stripping all headers of > + the NVGRE tunnel network overlay from the matched flow. > + > Destroying flow rules > ~~~~~~~~~~~~~~~~~~~~~ > > @@ -3970,6 +3991,37 @@ IPv6 VXLAN outer header:: > testpmd> flow create 0 ingress pattern end actions vxlan_encap / > queue index 0 / end > > +Sample NVGRE encapsulation rule > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + > +NVGRE encapsulation outer layer has default value pre-configured in testpmd > +source code, those can be changed by using the following commands > + > +IPv4 NVGRE outer header:: > + > + testpmd> set nvgre ip-version ipv4 tni 4 ip-src 127.0.0.1 ip-dst 128.0.0.1 > + eth-src 11:11:11:11:11:11 eth-dst 22:22:22:22:22:22 > + testpmd> flow create 0 ingress pattern end actions nvgre_encap / > + queue index 0 / end > + > + testpmd> set nvgre-with-vlan ip-version ipv4 tni 4 ip-src 127.0.0.1 > + ip-dst 128.0.0.1 vlan-tci 34 eth-src 11:11:11:11:11:11 > + eth-dst 22:22:22:22:22:22 > + testpmd> flow create 0 ingress pattern end actions nvgre_encap / > + queue index 0 / end > + > +IPv6 NVGRE outer header:: > + > + testpmd> set nvgre ip-version ipv6 tni 4 ip-src ::1 ip-dst ::2222 > + eth-src 11:11:11:11:11:11 eth-dst 22:22:22:22:22:22 > + testpmd> flow create 0 ingress pattern end actions nvgre_encap / > + queue index 0 / end > + > + testpmd> set nvgre-with-vlan ip-version ipv6 tni 4 ip-src ::1 ip-dst ::2222 > + vlan-tci 34 eth-src 11:11:11:11:11:11 eth-dst 22:22:22:22:22:22 > + testpmd> flow create 0 ingress pattern end actions nvgre_encap / > + queue index 0 / end > + > BPF Functions > -------------- > Tested-by: Mohammad Abdul Awal Acked-by: Mohammad Abdul Awal