* [dpdk-dev] [PATCH v2 0/4] Support NVGRE on i40e @ 2015-02-12 0:45 Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 1/4] librte_ether:add an ETHER_TYPE_TEB macro Jijiang Liu ` (4 more replies) 0 siblings, 5 replies; 15+ messages in thread From: Jijiang Liu @ 2015-02-12 0:45 UTC (permalink / raw) To: dev The patch set supports NVGRE on i40e. It includes: - Support RX filters for NVGRE packet. It uses MAC and VLAN to point to a queue. The filter types supported are listed below: 1. Inner MAC and Inner VLAN ID 2. Inner MAC address, inner VLAN ID and tenant ID. 3. Inner MAC and tenant ID 4. Inner MAC address 5. Outer MAC address, tenant ID and inner MAC - Support TX checksum offload for NVGRE packet, which include outer L3(IP), inner L3(IP) and inner L4(UDP, TCP and SCTP) V2 changes: Do some rework based on Olivier's patch set [PATCH v2 00/20] enhance tx checksum offload API; the changes are listed below, 1. remove nvgre_hdr definition from rte_ether.h file. It is not used in csumonly.c file. 2. remove filter type iip that is not supported well in current firmware. 3. remove GRE packet flag from mbuf. Jijiang Liu (4): add ETHER_TYPE_TEB definition add nvgre filter test nvgre filter test nvgre tx checksum app/test-pmd/cmdline.c | 14 ++++++++------ app/test-pmd/csumonly.c | 32 +++++++++++++++++++------------- lib/librte_ether/rte_ether.h | 1 + lib/librte_pmd_i40e/i40e_ethdev.c | 3 +++ 4 files changed, 31 insertions(+), 19 deletions(-) -- 1.7.7.6 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v2 1/4] librte_ether:add an ETHER_TYPE_TEB macro 2015-02-12 0:45 [dpdk-dev] [PATCH v2 0/4] Support NVGRE on i40e Jijiang Liu @ 2015-02-12 0:45 ` Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 2/4] i40e:support RX tunnel filter for NVGRE packet Jijiang Liu ` (3 subsequent siblings) 4 siblings, 0 replies; 15+ messages in thread From: Jijiang Liu @ 2015-02-12 0:45 UTC (permalink / raw) To: dev Add an Ethernet type definition for Transparent Ethernet Bridging. Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> --- lib/librte_ether/rte_ether.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/lib/librte_ether/rte_ether.h b/lib/librte_ether/rte_ether.h index 7e7d22c..a8b3e1d 100644 --- a/lib/librte_ether/rte_ether.h +++ b/lib/librte_ether/rte_ether.h @@ -329,6 +329,7 @@ struct vxlan_hdr { #define ETHER_TYPE_VLAN 0x8100 /**< IEEE 802.1Q VLAN tagging. */ #define ETHER_TYPE_1588 0x88F7 /**< IEEE 802.1AS 1588 Precise Time Protocol. */ #define ETHER_TYPE_SLOW 0x8809 /**< Slow protocols (LACP and Marker). */ +#define ETHER_TYPE_TEB 0x6558 /**< Transparent Ethernet Bridging. */ #define ETHER_VXLAN_HLEN (sizeof(struct udp_hdr) + sizeof(struct vxlan_hdr)) /**< VXLAN tunnel header length. */ -- 1.7.7.6 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v2 2/4] i40e:support RX tunnel filter for NVGRE packet 2015-02-12 0:45 [dpdk-dev] [PATCH v2 0/4] Support NVGRE on i40e Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 1/4] librte_ether:add an ETHER_TYPE_TEB macro Jijiang Liu @ 2015-02-12 0:45 ` Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 3/4] app/testpmd:test " Jijiang Liu ` (2 subsequent siblings) 4 siblings, 0 replies; 15+ messages in thread From: Jijiang Liu @ 2015-02-12 0:45 UTC (permalink / raw) To: dev The filter types supported are listed below for NVGRE packet: 1. Inner MAC and Inner VLAN ID. 2. Inner MAC address, inner VLAN ID and tenant ID. 3. Inner MAC and tenant ID. 4. Inner MAC address. 5. Outer MAC address, tenant ID and inner MAC address. Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> --- lib/librte_pmd_i40e/i40e_ethdev.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c b/lib/librte_pmd_i40e/i40e_ethdev.c index 6f385d2..bb6d3e1 100644 --- a/lib/librte_pmd_i40e/i40e_ethdev.c +++ b/lib/librte_pmd_i40e/i40e_ethdev.c @@ -4810,6 +4810,9 @@ i40e_dev_tunnel_filter_set(struct i40e_pf *pf, case RTE_TUNNEL_TYPE_VXLAN: tun_type = I40E_AQC_ADD_CLOUD_TNL_TYPE_XVLAN; break; + case RTE_TUNNEL_TYPE_NVGRE: + tun_type = I40E_AQC_ADD_CLOUD_TNL_TYPE_NVGRE_OMAC; + break; default: /* Other tunnel types is not supported. */ PMD_DRV_LOG(ERR, "tunnel type is not supported."); -- 1.7.7.6 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v2 3/4] app/testpmd:test RX tunnel filter for NVGRE packet 2015-02-12 0:45 [dpdk-dev] [PATCH v2 0/4] Support NVGRE on i40e Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 1/4] librte_ether:add an ETHER_TYPE_TEB macro Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 2/4] i40e:support RX tunnel filter for NVGRE packet Jijiang Liu @ 2015-02-12 0:45 ` Jijiang Liu 2015-02-13 1:23 ` Wu, Jingjing 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 4/4] app/testpmd:test NVGRE Tx checksum offload Jijiang Liu 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e Declan Doherty 4 siblings, 1 reply; 15+ messages in thread From: Jijiang Liu @ 2015-02-12 0:45 UTC (permalink / raw) To: dev Extend the "tunnel_filter" command in testpmd to test the RX tunnel filter API for NVGRE packet. Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> --- app/test-pmd/cmdline.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 9de3e7e..a380d43 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -293,11 +293,11 @@ static void cmd_help_long_parsed(void *parsed_result, " a port\n\n" "tunnel_filter add (port_id) (outer_mac) (inner_mac) (ip_addr) " - "(inner_vlan) (tunnel_type) (filter_type) (tenant_id) (queue_id)\n" + "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) (queue_id)\n" " add a tunnel filter of a port.\n\n" "tunnel_filter rm (port_id) (outer_mac) (inner_mac) (ip_addr) " - "(inner_vlan) (tunnel_type) (filter_type) (tenant_id) (queue_id)\n" + "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) (queue_id)\n" " remove a tunnel filter of a port.\n\n" "rx_vxlan_port add (udp_port) (port_id)\n" @@ -6851,8 +6851,10 @@ cmd_tunnel_filter_parsed(void *parsed_result, if (!strcmp(res->tunnel_type, "vxlan")) tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN; + if (!strcmp(res->tunnel_type, "nvgre")) + tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_NVGRE; else { - printf("Only VXLAN is supported now.\n"); + printf("The tunnel type is supported now.\n"); return; } @@ -6896,12 +6898,12 @@ cmdline_parse_token_ipaddr_t cmd_tunnel_filter_ip_value = ip_value); cmdline_parse_token_string_t cmd_tunnel_filter_tunnel_type = TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, - tunnel_type, "vxlan"); + tunnel_type, "vxlan#nvgre"); cmdline_parse_token_string_t cmd_tunnel_filter_filter_type = TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, filter_type, "imac-ivlan#imac-ivlan-tenid#imac-tenid#" - "imac#omac-imac-tenid"); + "imac#omac-imac-tenid#"); cmdline_parse_token_num_t cmd_tunnel_filter_tenant_id = TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, tenant_id, UINT32); @@ -6914,7 +6916,7 @@ cmdline_parse_inst_t cmd_tunnel_filter = { .data = (void *)0, .help_str = "add/rm tunnel filter of a port: " "tunnel_filter add port_id outer_mac inner_mac ip " - "inner_vlan tunnel_type(vxlan) filter_type " + "inner_vlan tunnel_type(vxlan|nvgre) filter_type " "(imac-ivlan|imac-ivlan-tenid|imac-tenid|" "imac|omac-imac-tenid) " "tenant_id queue_num", -- 1.7.7.6 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [dpdk-dev] [PATCH v2 3/4] app/testpmd:test RX tunnel filter for NVGRE packet 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 3/4] app/testpmd:test " Jijiang Liu @ 2015-02-13 1:23 ` Wu, Jingjing 2015-02-13 1:27 ` Liu, Jijiang 0 siblings, 1 reply; 15+ messages in thread From: Wu, Jingjing @ 2015-02-13 1:23 UTC (permalink / raw) To: Liu, Jijiang, dev Hi, jijiang > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jijiang Liu > Sent: Thursday, February 12, 2015 8:46 AM > To: dev@dpdk.org > Subject: [dpdk-dev] [PATCH v2 3/4] app/testpmd:test RX tunnel filter for > NVGRE packet > > Extend the "tunnel_filter" command in testpmd to test the RX tunnel filter > API for NVGRE packet. > > Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> > --- > app/test-pmd/cmdline.c | 14 ++++++++------ > 1 files changed, 8 insertions(+), 6 deletions(-) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index > 9de3e7e..a380d43 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -293,11 +293,11 @@ static void cmd_help_long_parsed(void > *parsed_result, > " a port\n\n" > > "tunnel_filter add (port_id) (outer_mac) (inner_mac) > (ip_addr) " > - "(inner_vlan) (tunnel_type) (filter_type) (tenant_id) > (queue_id)\n" > + "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) > (queue_id)\n" > " add a tunnel filter of a port.\n\n" > > "tunnel_filter rm (port_id) (outer_mac) (inner_mac) > (ip_addr) " > - "(inner_vlan) (tunnel_type) (filter_type) (tenant_id) > (queue_id)\n" > + "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) > (queue_id)\n" > " remove a tunnel filter of a port.\n\n" > > "rx_vxlan_port add (udp_port) (port_id)\n" > @@ -6851,8 +6851,10 @@ cmd_tunnel_filter_parsed(void *parsed_result, > > if (!strcmp(res->tunnel_type, "vxlan")) > tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN; > + if (!strcmp(res->tunnel_type, "nvgre")) > + tunnel_filter_conf.tunnel_type = > RTE_TUNNEL_TYPE_NVGRE; > else { > - printf("Only VXLAN is supported now.\n"); > + printf("The tunnel type is supported now.\n"); Maybe "not" is missed in the printed sentence. Or you can just remove the else {}, because res->tunnel_type can only be "vxlan" or "nvgre". > return; > } > > @@ -6896,12 +6898,12 @@ cmdline_parse_token_ipaddr_t > cmd_tunnel_filter_ip_value = > ip_value); > cmdline_parse_token_string_t cmd_tunnel_filter_tunnel_type = > TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, > - tunnel_type, "vxlan"); > + tunnel_type, "vxlan#nvgre"); > > cmdline_parse_token_string_t cmd_tunnel_filter_filter_type = > TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, > filter_type, "imac-ivlan#imac-ivlan-tenid#imac-tenid#" > - "imac#omac-imac-tenid"); > + "imac#omac-imac-tenid#"); Do you need the additional "#"? > cmdline_parse_token_num_t cmd_tunnel_filter_tenant_id = > TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, > tenant_id, UINT32); > @@ -6914,7 +6916,7 @@ cmdline_parse_inst_t cmd_tunnel_filter = { > .data = (void *)0, > .help_str = "add/rm tunnel filter of a port: " > "tunnel_filter add port_id outer_mac inner_mac ip " > - "inner_vlan tunnel_type(vxlan) filter_type " > + "inner_vlan tunnel_type(vxlan|nvgre) filter_type " > "(imac-ivlan|imac-ivlan-tenid|imac-tenid|" > "imac|omac-imac-tenid) " > "tenant_id queue_num", > -- > 1.7.7.6 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [dpdk-dev] [PATCH v2 3/4] app/testpmd:test RX tunnel filter for NVGRE packet 2015-02-13 1:23 ` Wu, Jingjing @ 2015-02-13 1:27 ` Liu, Jijiang 0 siblings, 0 replies; 15+ messages in thread From: Liu, Jijiang @ 2015-02-13 1:27 UTC (permalink / raw) To: Wu, Jingjing, dev > -----Original Message----- > From: Wu, Jingjing > Sent: Friday, February 13, 2015 9:23 AM > To: Liu, Jijiang; dev@dpdk.org > Subject: RE: [dpdk-dev] [PATCH v2 3/4] app/testpmd:test RX tunnel filter for > NVGRE packet > > Hi, jijiang > > > -----Original Message----- > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jijiang Liu > > Sent: Thursday, February 12, 2015 8:46 AM > > To: dev@dpdk.org > > Subject: [dpdk-dev] [PATCH v2 3/4] app/testpmd:test RX tunnel filter > > for NVGRE packet > > > > Extend the "tunnel_filter" command in testpmd to test the RX tunnel > > filter API for NVGRE packet. > > > > Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> > > --- > > app/test-pmd/cmdline.c | 14 ++++++++------ > > 1 files changed, 8 insertions(+), 6 deletions(-) > > > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index > > 9de3e7e..a380d43 100644 > > --- a/app/test-pmd/cmdline.c > > +++ b/app/test-pmd/cmdline.c > > @@ -293,11 +293,11 @@ static void cmd_help_long_parsed(void > > *parsed_result, > > " a port\n\n" > > > > "tunnel_filter add (port_id) (outer_mac) (inner_mac) > > (ip_addr) " > > - "(inner_vlan) (tunnel_type) (filter_type) (tenant_id) > > (queue_id)\n" > > + "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) > > (queue_id)\n" > > " add a tunnel filter of a port.\n\n" > > > > "tunnel_filter rm (port_id) (outer_mac) (inner_mac) > > (ip_addr) " > > - "(inner_vlan) (tunnel_type) (filter_type) (tenant_id) > > (queue_id)\n" > > + "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) > > (queue_id)\n" > > " remove a tunnel filter of a port.\n\n" > > > > "rx_vxlan_port add (udp_port) (port_id)\n" > > @@ -6851,8 +6851,10 @@ cmd_tunnel_filter_parsed(void *parsed_result, > > > > if (!strcmp(res->tunnel_type, "vxlan")) > > tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN; > > + if (!strcmp(res->tunnel_type, "nvgre")) > > + tunnel_filter_conf.tunnel_type = > > RTE_TUNNEL_TYPE_NVGRE; > > else { > > - printf("Only VXLAN is supported now.\n"); > > + printf("The tunnel type is supported now.\n"); > > Maybe "not" is missed in the printed sentence. Or you can just remove the else > {}, because res->tunnel_type can only be "vxlan" or "nvgre". I'll update it in next version. > > return; > > } > > > > @@ -6896,12 +6898,12 @@ cmdline_parse_token_ipaddr_t > > cmd_tunnel_filter_ip_value = > > ip_value); > > cmdline_parse_token_string_t cmd_tunnel_filter_tunnel_type = > > TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, > > - tunnel_type, "vxlan"); > > + tunnel_type, "vxlan#nvgre"); > > > > cmdline_parse_token_string_t cmd_tunnel_filter_filter_type = > > TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, > > filter_type, "imac-ivlan#imac-ivlan-tenid#imac-tenid#" > > - "imac#omac-imac-tenid"); > > + "imac#omac-imac-tenid#"); > > > Do you need the additional "#"? Don't need it, I'll update it in next version. > > cmdline_parse_token_num_t cmd_tunnel_filter_tenant_id = > > TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, > > tenant_id, UINT32); > > @@ -6914,7 +6916,7 @@ cmdline_parse_inst_t cmd_tunnel_filter = { > > .data = (void *)0, > > .help_str = "add/rm tunnel filter of a port: " > > "tunnel_filter add port_id outer_mac inner_mac ip " > > - "inner_vlan tunnel_type(vxlan) filter_type " > > + "inner_vlan tunnel_type(vxlan|nvgre) filter_type " > > "(imac-ivlan|imac-ivlan-tenid|imac-tenid|" > > "imac|omac-imac-tenid) " > > "tenant_id queue_num", > > -- > > 1.7.7.6 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v2 4/4] app/testpmd:test NVGRE Tx checksum offload 2015-02-12 0:45 [dpdk-dev] [PATCH v2 0/4] Support NVGRE on i40e Jijiang Liu ` (2 preceding siblings ...) 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 3/4] app/testpmd:test " Jijiang Liu @ 2015-02-12 0:45 ` Jijiang Liu 2015-02-13 9:52 ` Olivier MATZ 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e Declan Doherty 4 siblings, 1 reply; 15+ messages in thread From: Jijiang Liu @ 2015-02-12 0:45 UTC (permalink / raw) To: dev Enhance csum fwd engine based on current TX checksum framework in order to test TX Checksum offload for NVGRE packet. It includes: - IPv4 and IPv6 packet - outer L3, inner L3 and L4 checksum offload for Tx side. Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> --- app/test-pmd/csumonly.c | 32 +++++++++++++++++++------------- 1 files changed, 19 insertions(+), 13 deletions(-) diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index 5ddbaf5..58b82e7 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -79,6 +79,10 @@ #define IP_HDRLEN 0x05 /* default IP header length == five 32-bits words. */ #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN) +#define GRE_KEY_PRESENT 0x2000 +#define GRE_KEY_LEN 4 +#define GRE_SUPPORTED_FIELDS GRE_KEY_PRESENT + /* We cannot use rte_cpu_to_be_16() on a constant in a switch/case */ #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN #define _htons(x) ((uint16_t)((((x) & 0x00ffU) << 8) | (((x) & 0xff00U) >> 8))) @@ -100,7 +104,7 @@ struct testpmd_offload_info { uint16_t tso_segsz; }; -/* simplified GRE header (flags must be 0) */ +/* simplified GRE header */ struct simple_gre_hdr { uint16_t flags; uint16_t proto; @@ -231,20 +235,25 @@ parse_gre(struct simple_gre_hdr *gre_hdr, struct testpmd_offload_info *info) struct ether_hdr *eth_hdr; struct ipv4_hdr *ipv4_hdr; struct ipv6_hdr *ipv6_hdr; + uint8_t gre_len = 0; - /* if flags != 0; it's not supported */ - if (gre_hdr->flags != 0) + /* check which fields are supported */ + if (gre_hdr->flags != 0 && + (gre_hdr->flags & _htons(GRE_SUPPORTED_FIELDS)) == 0) return; + gre_len += sizeof(struct simple_gre_hdr); + + if (gre_hdr->flags & _htons(GRE_KEY_PRESENT)) + gre_len += GRE_KEY_LEN; + if (gre_hdr->proto == _htons(ETHER_TYPE_IPv4)) { info->is_tunnel = 1; info->outer_ethertype = info->ethertype; info->outer_l2_len = info->l2_len; info->outer_l3_len = info->l3_len; - ipv4_hdr = (struct ipv4_hdr *)((char *)gre_hdr + - sizeof(struct simple_gre_hdr)); - + ipv4_hdr = (struct ipv4_hdr *)((char *)gre_hdr + gre_len); parse_ipv4(ipv4_hdr, info); info->ethertype = _htons(ETHER_TYPE_IPv4); info->l2_len = 0; @@ -255,30 +264,27 @@ parse_gre(struct simple_gre_hdr *gre_hdr, struct testpmd_offload_info *info) info->outer_l2_len = info->l2_len; info->outer_l3_len = info->l3_len; - ipv6_hdr = (struct ipv6_hdr *)((char *)gre_hdr + - sizeof(struct simple_gre_hdr)); + ipv6_hdr = (struct ipv6_hdr *)((char *)gre_hdr + gre_len); info->ethertype = _htons(ETHER_TYPE_IPv6); parse_ipv6(ipv6_hdr, info); info->l2_len = 0; - } else if (gre_hdr->proto == _htons(0x6558)) { /* ETH_P_TEB in linux */ + } else if (gre_hdr->proto == _htons(ETHER_TYPE_TEB)) { info->is_tunnel = 1; info->outer_ethertype = info->ethertype; info->outer_l2_len = info->l2_len; info->outer_l3_len = info->l3_len; - eth_hdr = (struct ether_hdr *)((char *)gre_hdr + - sizeof(struct simple_gre_hdr)); + eth_hdr = (struct ether_hdr *)((char *)gre_hdr + gre_len); parse_ethernet(eth_hdr, info); } else return; - info->l2_len += sizeof(struct simple_gre_hdr); + info->l2_len += gre_len; } - /* Parse an encapsulated ip or ipv6 header */ static void parse_encap_ip(void *encap_ip, struct testpmd_offload_info *info) -- 1.7.7.6 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [dpdk-dev] [PATCH v2 4/4] app/testpmd:test NVGRE Tx checksum offload 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 4/4] app/testpmd:test NVGRE Tx checksum offload Jijiang Liu @ 2015-02-13 9:52 ` Olivier MATZ 2015-02-15 1:13 ` Liu, Jijiang 0 siblings, 1 reply; 15+ messages in thread From: Olivier MATZ @ 2015-02-13 9:52 UTC (permalink / raw) To: Jijiang Liu, dev Hi Jijiang, On 02/12/2015 01:45 AM, Jijiang Liu wrote: > Enhance csum fwd engine based on current TX checksum framework in order to test TX Checksum offload for NVGRE packet. > > It includes: > - IPv4 and IPv6 packet > - outer L3, inner L3 and L4 checksum offload for Tx side. > > [...] > @@ -231,20 +235,25 @@ parse_gre(struct simple_gre_hdr *gre_hdr, struct testpmd_offload_info *info) > struct ether_hdr *eth_hdr; > struct ipv4_hdr *ipv4_hdr; > struct ipv6_hdr *ipv6_hdr; > + uint8_t gre_len = 0; > > - /* if flags != 0; it's not supported */ > - if (gre_hdr->flags != 0) > + /* check which fields are supported */ > + if (gre_hdr->flags != 0 && > + (gre_hdr->flags & _htons(GRE_SUPPORTED_FIELDS)) == 0) > return; > > + gre_len += sizeof(struct simple_gre_hdr); > + > + if (gre_hdr->flags & _htons(GRE_KEY_PRESENT)) > + gre_len += GRE_KEY_LEN; > + I think this test won't work if the flags contains both supported and unsupported flags. What about this instead: if ((gre_hdr->flags & _htons(~GRE_SUPPORTED_FIELDS)) != 0) return; Regards, Olivier ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [dpdk-dev] [PATCH v2 4/4] app/testpmd:test NVGRE Tx checksum offload 2015-02-13 9:52 ` Olivier MATZ @ 2015-02-15 1:13 ` Liu, Jijiang 0 siblings, 0 replies; 15+ messages in thread From: Liu, Jijiang @ 2015-02-15 1:13 UTC (permalink / raw) To: Olivier MATZ; +Cc: dev > -----Original Message----- > From: Olivier MATZ [mailto:olivier.matz@6wind.com] > Sent: Friday, February 13, 2015 5:53 PM > To: Liu, Jijiang; dev@dpdk.org > Subject: Re: [dpdk-dev] [PATCH v2 4/4] app/testpmd:test NVGRE Tx checksum > offload > > Hi Jijiang, > > > On 02/12/2015 01:45 AM, Jijiang Liu wrote: > > Enhance csum fwd engine based on current TX checksum framework in order > to test TX Checksum offload for NVGRE packet. > > > > It includes: > > - IPv4 and IPv6 packet > > - outer L3, inner L3 and L4 checksum offload for Tx side. > > > > [...] > > @@ -231,20 +235,25 @@ parse_gre(struct simple_gre_hdr *gre_hdr, struct > testpmd_offload_info *info) > > struct ether_hdr *eth_hdr; > > struct ipv4_hdr *ipv4_hdr; > > struct ipv6_hdr *ipv6_hdr; > > + uint8_t gre_len = 0; > > > > - /* if flags != 0; it's not supported */ > > - if (gre_hdr->flags != 0) > > + /* check which fields are supported */ > > + if (gre_hdr->flags != 0 && > > + (gre_hdr->flags & _htons(GRE_SUPPORTED_FIELDS)) == 0) > > return; > > > > + gre_len += sizeof(struct simple_gre_hdr); > > + > > + if (gre_hdr->flags & _htons(GRE_KEY_PRESENT)) > > + gre_len += GRE_KEY_LEN; > > + > > I think this test won't work if the flags contains both supported and unsupported > flags. > > What about this instead: > > if ((gre_hdr->flags & _htons(~GRE_SUPPORTED_FIELDS)) != 0) > return; > That's correct, I will update it in next version. > > Regards, > Olivier ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e 2015-02-12 0:45 [dpdk-dev] [PATCH v2 0/4] Support NVGRE on i40e Jijiang Liu ` (3 preceding siblings ...) 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 4/4] app/testpmd:test NVGRE Tx checksum offload Jijiang Liu @ 2015-02-20 17:01 ` Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 1/4] librte_ether:add an ETHER_TYPE_TEB macro Declan Doherty 2015-02-23 15:42 ` [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e Thomas Monjalon 4 siblings, 2 replies; 15+ messages in thread From: Declan Doherty @ 2015-02-20 17:01 UTC (permalink / raw) To: dev The patch set supports NVGRE on i40e. It includes: - Support RX filters for NVGRE packet. It uses MAC and VLAN to point to a queue. The filter types supported are listed below: 1. Inner MAC and Inner VLAN ID 2. Inner MAC address, inner VLAN ID and tenant ID. 3. Inner MAC and tenant ID 4. Inner MAC address 5. Outer MAC address, tenant ID and inner MAC - Support TX checksum offload for NVGRE packet, which include outer L3(IP), inner L3(IP) and inner L4(UDP, TCP and SCTP) V2 changes: Do some rework based on Olivier's patch set [PATCH v2 00/20] enhance tx checksum offload API; the changes are listed below, 1. remove nvgre_hdr definition from rte_ether.h file. It is not used in csumonly.c file. 2. remove filter type iip that is not supported well in current firmware. 3. remove GRE packet flag from mbuf. V3 changes: - Addresses Olivier's comment's for V2 of patchset - Re-based against HEAD Jijiang Liu (4): librte_ether:add an ETHER_TYPE_TEB macro i40e:support RX tunnel filter for NVGRE packet app/testpmd:test RX tunnel filter for NVGRE packet app/testpmd:test NVGRE Tx checksum offload app/test-pmd/cmdline.c | 12 +++++++----- app/test-pmd/csumonly.c | 29 ++++++++++++++++++----------- lib/librte_ether/rte_ether.h | 1 + lib/librte_pmd_i40e/i40e_ethdev.c | 3 +++ 4 files changed, 29 insertions(+), 16 deletions(-) -- 1.9.3 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v3 1/4] librte_ether:add an ETHER_TYPE_TEB macro 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e Declan Doherty @ 2015-02-20 17:01 ` Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 2/4] i40e:support RX tunnel filter for NVGRE packet Declan Doherty 2015-02-23 15:42 ` [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e Thomas Monjalon 1 sibling, 1 reply; 15+ messages in thread From: Declan Doherty @ 2015-02-20 17:01 UTC (permalink / raw) To: dev From: Jijiang Liu <jijiang.liu@intel.com> Add an Ethernet type definition for Transparent Ethernet Bridging. Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> Signed-off-by: Declan Doherty <declan.doherty@intel.com> --- lib/librte_ether/rte_ether.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/librte_ether/rte_ether.h b/lib/librte_ether/rte_ether.h index 7e7d22c..a8b3e1d 100644 --- a/lib/librte_ether/rte_ether.h +++ b/lib/librte_ether/rte_ether.h @@ -329,6 +329,7 @@ struct vxlan_hdr { #define ETHER_TYPE_VLAN 0x8100 /**< IEEE 802.1Q VLAN tagging. */ #define ETHER_TYPE_1588 0x88F7 /**< IEEE 802.1AS 1588 Precise Time Protocol. */ #define ETHER_TYPE_SLOW 0x8809 /**< Slow protocols (LACP and Marker). */ +#define ETHER_TYPE_TEB 0x6558 /**< Transparent Ethernet Bridging. */ #define ETHER_VXLAN_HLEN (sizeof(struct udp_hdr) + sizeof(struct vxlan_hdr)) /**< VXLAN tunnel header length. */ -- 1.9.3 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v3 2/4] i40e:support RX tunnel filter for NVGRE packet 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 1/4] librte_ether:add an ETHER_TYPE_TEB macro Declan Doherty @ 2015-02-20 17:01 ` Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 3/4] app/testpmd:test " Declan Doherty 0 siblings, 1 reply; 15+ messages in thread From: Declan Doherty @ 2015-02-20 17:01 UTC (permalink / raw) To: dev From: Jijiang Liu <jijiang.liu@intel.com> The filter types supported are listed below for NVGRE packet: 1. Inner MAC and Inner VLAN ID. 2. Inner MAC address, inner VLAN ID and tenant ID. 3. Inner MAC and tenant ID. 4. Inner MAC address. 5. Outer MAC address, tenant ID and inner MAC address. Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> Signed-off-by: Declan Doherty <declan.doherty@intel.com> --- lib/librte_pmd_i40e/i40e_ethdev.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c b/lib/librte_pmd_i40e/i40e_ethdev.c index 6f385d2..bb6d3e1 100644 --- a/lib/librte_pmd_i40e/i40e_ethdev.c +++ b/lib/librte_pmd_i40e/i40e_ethdev.c @@ -4810,6 +4810,9 @@ i40e_dev_tunnel_filter_set(struct i40e_pf *pf, case RTE_TUNNEL_TYPE_VXLAN: tun_type = I40E_AQC_ADD_CLOUD_TNL_TYPE_XVLAN; break; + case RTE_TUNNEL_TYPE_NVGRE: + tun_type = I40E_AQC_ADD_CLOUD_TNL_TYPE_NVGRE_OMAC; + break; default: /* Other tunnel types is not supported. */ PMD_DRV_LOG(ERR, "tunnel type is not supported."); -- 1.9.3 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v3 3/4] app/testpmd:test RX tunnel filter for NVGRE packet 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 2/4] i40e:support RX tunnel filter for NVGRE packet Declan Doherty @ 2015-02-20 17:01 ` Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 4/4] app/testpmd:test NVGRE Tx checksum offload Declan Doherty 0 siblings, 1 reply; 15+ messages in thread From: Declan Doherty @ 2015-02-20 17:01 UTC (permalink / raw) To: dev From: Jijiang Liu <jijiang.liu@intel.com> Extend the "tunnel_filter" command in testpmd to test the RX tunnel filter API for NVGRE packet. Signed-off-by: Jijiang Liu <jijiang.liu@intel.com> Signed-off-by: Declan Doherty <declan.doherty@intel.com> --- app/test-pmd/cmdline.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 4753bb4..b4bb91e 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -293,11 +293,11 @@ static void cmd_help_long_parsed(void *parsed_result, " a port\n\n" "tunnel_filter add (port_id) (outer_mac) (inner_mac) (ip_addr) " - "(inner_vlan) (tunnel_type) (filter_type) (tenant_id) (queue_id)\n" + "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) (queue_id)\n" " add a tunnel filter of a port.\n\n" "tunnel_filter rm (port_id) (outer_mac) (inner_mac) (ip_addr) " - "(inner_vlan) (tunnel_type) (filter_type) (tenant_id) (queue_id)\n" + "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) (queue_id)\n" " remove a tunnel filter of a port.\n\n" "rx_vxlan_port add (udp_port) (port_id)\n" @@ -6860,8 +6860,10 @@ cmd_tunnel_filter_parsed(void *parsed_result, if (!strcmp(res->tunnel_type, "vxlan")) tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN; + else if (!strcmp(res->tunnel_type, "nvgre")) + tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_NVGRE; else { - printf("Only VXLAN is supported now.\n"); + printf("The tunnel type %s not supported.\n", res->tunnel_type); return; } @@ -6905,7 +6907,7 @@ cmdline_parse_token_ipaddr_t cmd_tunnel_filter_ip_value = ip_value); cmdline_parse_token_string_t cmd_tunnel_filter_tunnel_type = TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, - tunnel_type, "vxlan"); + tunnel_type, "vxlan#nvgre"); cmdline_parse_token_string_t cmd_tunnel_filter_filter_type = TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, @@ -6923,7 +6925,7 @@ cmdline_parse_inst_t cmd_tunnel_filter = { .data = (void *)0, .help_str = "add/rm tunnel filter of a port: " "tunnel_filter add port_id outer_mac inner_mac ip " - "inner_vlan tunnel_type(vxlan) filter_type " + "inner_vlan tunnel_type(vxlan|nvgre) filter_type " "(imac-ivlan|imac-ivlan-tenid|imac-tenid|" "imac|omac-imac-tenid) " "tenant_id queue_num", -- 1.9.3 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [dpdk-dev] [PATCH v3 4/4] app/testpmd:test NVGRE Tx checksum offload 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 3/4] app/testpmd:test " Declan Doherty @ 2015-02-20 17:01 ` Declan Doherty 0 siblings, 0 replies; 15+ messages in thread From: Declan Doherty @ 2015-02-20 17:01 UTC (permalink / raw) To: dev From: Jijiang Liu <jijiang.liu@intel.com> Enhance csum fwd engine based on current TX checksum framework in order to test TX Checksum offload for NVGRE packet. It includes: - IPv4 and IPv6 packet - outer L3, inner L3 and L4 checksum offload for Tx side. Signed-off-by: Declan Doherty <declan.doherty@intel.com> --- app/test-pmd/csumonly.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index 0a7af79..52cbd8a 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -79,6 +79,10 @@ #define IP_HDRLEN 0x05 /* default IP header length == five 32-bits words. */ #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN) +#define GRE_KEY_PRESENT 0x2000 +#define GRE_KEY_LEN 4 +#define GRE_SUPPORTED_FIELDS GRE_KEY_PRESENT + /* We cannot use rte_cpu_to_be_16() on a constant in a switch/case */ #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN #define _htons(x) ((uint16_t)((((x) & 0x00ffU) << 8) | (((x) & 0xff00U) >> 8))) @@ -101,7 +105,7 @@ struct testpmd_offload_info { uint16_t tso_segsz; }; -/* simplified GRE header (flags must be 0) */ +/* simplified GRE header */ struct simple_gre_hdr { uint16_t flags; uint16_t proto; @@ -233,11 +237,17 @@ parse_gre(struct simple_gre_hdr *gre_hdr, struct testpmd_offload_info *info) struct ether_hdr *eth_hdr; struct ipv4_hdr *ipv4_hdr; struct ipv6_hdr *ipv6_hdr; + uint8_t gre_len = 0; - /* if flags != 0; it's not supported */ - if (gre_hdr->flags != 0) + /* check which fields are supported */ + if ((gre_hdr->flags & _htons(~GRE_SUPPORTED_FIELDS)) != 0) return; + gre_len += sizeof(struct simple_gre_hdr); + + if (gre_hdr->flags & _htons(GRE_KEY_PRESENT)) + gre_len += GRE_KEY_LEN; + if (gre_hdr->proto == _htons(ETHER_TYPE_IPv4)) { info->is_tunnel = 1; info->outer_ethertype = info->ethertype; @@ -245,8 +255,7 @@ parse_gre(struct simple_gre_hdr *gre_hdr, struct testpmd_offload_info *info) info->outer_l3_len = info->l3_len; info->outer_l4_proto = info->l4_proto; - ipv4_hdr = (struct ipv4_hdr *)((char *)gre_hdr + - sizeof(struct simple_gre_hdr)); + ipv4_hdr = (struct ipv4_hdr *)((char *)gre_hdr + gre_len); parse_ipv4(ipv4_hdr, info); info->ethertype = _htons(ETHER_TYPE_IPv4); @@ -259,28 +268,26 @@ parse_gre(struct simple_gre_hdr *gre_hdr, struct testpmd_offload_info *info) info->outer_l3_len = info->l3_len; info->outer_l4_proto = info->l4_proto; - ipv6_hdr = (struct ipv6_hdr *)((char *)gre_hdr + - sizeof(struct simple_gre_hdr)); + ipv6_hdr = (struct ipv6_hdr *)((char *)gre_hdr + gre_len); info->ethertype = _htons(ETHER_TYPE_IPv6); parse_ipv6(ipv6_hdr, info); info->l2_len = 0; - } else if (gre_hdr->proto == _htons(0x6558)) { /* ETH_P_TEB in linux */ + } else if (gre_hdr->proto == _htons(ETHER_TYPE_TEB)) { info->is_tunnel = 1; info->outer_ethertype = info->ethertype; info->outer_l2_len = info->l2_len; info->outer_l3_len = info->l3_len; info->outer_l4_proto = info->l4_proto; - eth_hdr = (struct ether_hdr *)((char *)gre_hdr + - sizeof(struct simple_gre_hdr)); + eth_hdr = (struct ether_hdr *)((char *)gre_hdr + gre_len); parse_ethernet(eth_hdr, info); } else return; - info->l2_len += sizeof(struct simple_gre_hdr); + info->l2_len += gre_len; } -- 1.9.3 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 1/4] librte_ether:add an ETHER_TYPE_TEB macro Declan Doherty @ 2015-02-23 15:42 ` Thomas Monjalon 1 sibling, 0 replies; 15+ messages in thread From: Thomas Monjalon @ 2015-02-23 15:42 UTC (permalink / raw) To: Declan Doherty, jijiang.liu; +Cc: dev 2015-02-20 17:01, Declan Doherty: > The patch set supports NVGRE on i40e. > > It includes: > - Support RX filters for NVGRE packet. It uses MAC and VLAN to point > to a queue. The filter types supported are listed below: > > 1. Inner MAC and Inner VLAN ID > > 2. Inner MAC address, inner VLAN ID and tenant ID. > > 3. Inner MAC and tenant ID > > 4. Inner MAC address > > 5. Outer MAC address, tenant ID and inner MAC > > - Support TX checksum offload for NVGRE packet, which include outer L3(IP), inner L3(IP) and inner L4(UDP, TCP and SCTP) > > V2 changes: > Do some rework based on Olivier's patch set [PATCH v2 00/20] enhance tx checksum offload API; the changes are listed below, > 1. remove nvgre_hdr definition from rte_ether.h file. It is not used in csumonly.c file. > 2. remove filter type iip that is not supported well in current firmware. > 3. remove GRE packet flag from mbuf. > > V3 changes: > - Addresses Olivier's comment's for V2 of patchset > - Re-based against HEAD > > Jijiang Liu (4): > librte_ether:add an ETHER_TYPE_TEB macro > i40e:support RX tunnel filter for NVGRE packet > app/testpmd:test RX tunnel filter for NVGRE packet > app/testpmd:test NVGRE Tx checksum offload Applied, thanks ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2015-02-23 15:42 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-02-12 0:45 [dpdk-dev] [PATCH v2 0/4] Support NVGRE on i40e Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 1/4] librte_ether:add an ETHER_TYPE_TEB macro Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 2/4] i40e:support RX tunnel filter for NVGRE packet Jijiang Liu 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 3/4] app/testpmd:test " Jijiang Liu 2015-02-13 1:23 ` Wu, Jingjing 2015-02-13 1:27 ` Liu, Jijiang 2015-02-12 0:45 ` [dpdk-dev] [PATCH v2 4/4] app/testpmd:test NVGRE Tx checksum offload Jijiang Liu 2015-02-13 9:52 ` Olivier MATZ 2015-02-15 1:13 ` Liu, Jijiang 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 1/4] librte_ether:add an ETHER_TYPE_TEB macro Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 2/4] i40e:support RX tunnel filter for NVGRE packet Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 3/4] app/testpmd:test " Declan Doherty 2015-02-20 17:01 ` [dpdk-dev] [PATCH v3 4/4] app/testpmd:test NVGRE Tx checksum offload Declan Doherty 2015-02-23 15:42 ` [dpdk-dev] [PATCH v3 0/4] Support NVGRE on i40e Thomas Monjalon
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).