From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 59A84282 for ; Mon, 8 Dec 2014 12:44:46 +0100 (CET) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 08 Dec 2014 03:44:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,538,1413270000"; d="scan'208";a="644177108" Received: from irsmsx154.ger.corp.intel.com ([163.33.192.96]) by fmsmga002.fm.intel.com with ESMTP; 08 Dec 2014 03:44:44 -0800 Received: from irsmsx105.ger.corp.intel.com ([169.254.7.144]) by IRSMSX154.ger.corp.intel.com ([169.254.12.18]) with mapi id 14.03.0195.001; Mon, 8 Dec 2014 11:44:43 +0000 From: "Ananyev, Konstantin" To: "Liu, Jijiang" , "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH 3/3] test-pmd:change tx_checksum command and csum forwarding engine Thread-Index: AQHQEhIZ7Rd4j41JqUCeVeX4hm+/XpyFkLGg Date: Mon, 8 Dec 2014 11:44:42 +0000 Message-ID: <2601191342CEEE43887BDE71AB977258213BDB43@IRSMSX105.ger.corp.intel.com> References: <1417952164-12626-1-git-send-email-jijiang.liu@intel.com> <1417952164-12626-4-git-send-email-jijiang.liu@intel.com> In-Reply-To: <1417952164-12626-4-git-send-email-jijiang.liu@intel.com> Accept-Language: en-IE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.180] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH 3/3] test-pmd:change tx_checksum command and csum forwarding engine X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Dec 2014 11:44:47 -0000 Hi Jijiang, > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jijiang Liu > Sent: Sunday, December 07, 2014 11:36 AM > To: dev@dpdk.org > Subject: [dpdk-dev] [PATCH 3/3] test-pmd:change tx_checksum command and c= sum forwarding engine >=20 > The patch enhances the tx_checksum command and reworks csum forwarding en= gine due to the change of tx_checksum command. > The main changes of the tx_checksum command are listed below, >=20 > 1. add "tx_checksum set tunnel (hw|sw|none) (port-id)" command >=20 > 2. add "tx_checksum set outer-ip (hw|sw) (port-id)" command >=20 > 3. remove the "vxlan" option from the "tx_checksum set(ip|udp|tcp|sctp|vx= lan) (hw|sw) (port-id)" command >=20 > Moreover, replace the TESTPMD_TX_OFFLOAD_VXLAN_CKSUM flag with TESTPMD_TX= _OFFLOAD_TUNNEL_CKSUM flag, and add the > TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM flag. >=20 > Signed-off-by: Jijiang Liu > --- > app/test-pmd/cmdline.c | 201 +++++++++++++++++++++++++++++++++++++++++= +++--- > app/test-pmd/csumonly.c | 34 +++++--- > app/test-pmd/testpmd.h | 6 +- > 3 files changed, 215 insertions(+), 26 deletions(-) >=20 > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index f79ea3e..cf8b594 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -316,16 +316,28 @@ static void cmd_help_long_parsed(void *parsed_resul= t, > " Disable hardware insertion of a VLAN header in" > " packets sent on a port.\n\n" >=20 > - "tx_cksum set (ip|udp|tcp|sctp|vxlan) (hw|sw) (port_id)\n" > + "tx_cksum set (ip|udp|tcp|sctp) (hw|sw) (port_id)\n" > " Select hardware or software calculation of the" > " checksum with when transmitting a packet using the" > " csum forward engine.\n" > - " ip|udp|tcp|sctp always concern the inner layer.\n" > - " vxlan concerns the outer IP and UDP layer (in" > - " case the packet is recognized as a vxlan packet by" > - " the forward engine)\n" > + " In the case of tunneling packet,ip|udp|tcp|sctp" > + " always concern the inner layer.\n\n" > + > + "tx_cksum set tunnel (hw|sw|none) (port_id)\n" > + " Select hardware or software calculation of the" > + " checksum with when transmitting a tunneling packet" > + " using the csum forward engine.\n" > + " Tunneling packet concerns the outer IP, inner IP" > + " and inner L4\n" > " Please check the NIC datasheet for HW limits.\n\n" >=20 > + "tx_cksum set (outer-ip) (hw|sw) (port_id)\n" > + " Select hardware or software calculation of the" > + " checksum with when transmitting a packet using the" > + " csum forward engine.\n" > + " outer-ip always concern the outer layer of" > + " tunneling packet.\n\n" > + > "tx_checksum show (port_id)\n" > " Display tx checksum offload configuration\n\n" >=20 > @@ -2861,6 +2873,175 @@ cmdline_parse_inst_t cmd_tx_vlan_reset =3D { > }, > }; >=20 > +/* ENABLE HARDWARE INSERTION OF CHECKSUM IN TX PACKETS FOR TUNNELING */ > +struct cmd_tx_cksum_tunnel_result { > + cmdline_fixed_string_t tx_cksum; > + cmdline_fixed_string_t mode; > + cmdline_fixed_string_t type; > + cmdline_fixed_string_t hwsw; > + uint8_t port_id; > +}; > + > +static void > +cmd_tx_cksum_tunnel_parsed(void *parsed_result, > + __attribute__((unused)) struct cmdline *cl, > + __attribute__((unused)) void *data) > +{ > + struct cmd_tx_cksum_tunnel_result *res =3D parsed_result; > + int hw =3D 0; > + uint16_t ol_flags, mask =3D 0; > + > + if (port_id_is_invalid(res->port_id)) { > + printf("invalid port %d\n", res->port_id); > + return; > + } > + > + if (!strcmp(res->mode, "set")) { > + > + if (!strcmp(res->hwsw, "hw")) > + hw =3D 1; > + else if (!strcmp(res->hwsw, "none")) { > + ports[res->port_id].tx_ol_flags =3D 0; Why do you set all tx_ol_flags to zero here, if user sets tunnelling to 'no= ne'? I mean in that case we just shouldn't even try to determine is it a tunneli= ng packet or not, but always treat it as not tunnelling. Though, as for 'normal' packet IP/(TCP/UDPT|SCTP) offloads are still valid,= correct? I think here we should do: ports[res->port_id].tx_ol_flags =3D ~( TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM |= TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM); And somehow mark, that we don't want any tunnelling processing for that por= t. Either add a new flag into ports[].tx_ol_flags or some new field into stru= ct rte_port . Then in pkt_burst_checksum_forward(): tunnel =3D 0; ... /* check if it's a supported tunnel (only vxlan for now) */ if (IS_TUNNELING_ON(txp) && l4_proto =3D=3D IPPROTO_UDP) { ... } Konstantin > + return; > + } > + > + mask =3D TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM; > + > + if (hw) > + ports[res->port_id].tx_ol_flags |=3D mask; > + else > + ports[res->port_id].tx_ol_flags &=3D (~mask); > + } > + > + ol_flags =3D ports[res->port_id].tx_ol_flags; > + printf("Tunnel checksum offload is %s\n", > + (ol_flags & TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM) ? "hw" : "sw"); > +} > + > +cmdline_parse_token_string_t cmd_tx_cksum_tunnel_tx_cksum =3D > + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_tunnel_result, > + tx_cksum, "tx_checksum"); > +cmdline_parse_token_string_t cmd_tx_cksum_tunnel_mode =3D > + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_tunnel_result, > + mode, "set"); > +cmdline_parse_token_string_t cmd_tx_cksum_tunnel_type =3D > + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_tunnel_result, > + type, "tunnel"); > +cmdline_parse_token_string_t cmd_tx_cksum_tunnel_hwsw =3D > + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_tunnel_result, > + hwsw, "hw#sw#none"); > +cmdline_parse_token_num_t cmd_tx_cksum_tunnel_portid =3D > + TOKEN_NUM_INITIALIZER(struct cmd_tx_cksum_tunnel_result, > + port_id, UINT8); > + > +cmdline_parse_inst_t cmd_tx_cksum_tunnel_set =3D { > + .f =3D cmd_tx_cksum_tunnel_parsed, > + .data =3D NULL, > + .help_str =3D "enable/disable hardware calculation of tunneling " > + "packet checksum when using csum forward engine: tx_cksum set " > + "tunnel hw|sw|none ", > + .tokens =3D { > + (void *)&cmd_tx_cksum_tunnel_tx_cksum, > + (void *)&cmd_tx_cksum_tunnel_mode, > + (void *)&cmd_tx_cksum_tunnel_type, > + (void *)&cmd_tx_cksum_tunnel_hwsw, > + (void *)&cmd_tx_cksum_tunnel_portid, > + NULL, > + }, > +}; > + > +/* ENABLE HARDWARE INSERTION OF OUTER CHECKSUM IN TX PACKETS FOR TUNNELI= NG */ > +struct cmd_tx_cksum_outer_result { > + cmdline_fixed_string_t tx_cksum; > + cmdline_fixed_string_t mode; > + cmdline_fixed_string_t proto; > + cmdline_fixed_string_t hwsw; > + uint8_t port_id; > +}; > + > +static void > +cmd_tx_cksum_outer_parsed(void *parsed_result, > + __attribute__((unused)) struct cmdline *cl, > + __attribute__((unused)) void *data) > +{ > + struct cmd_tx_cksum_outer_result *res =3D parsed_result; > + int hw =3D 0; > + uint16_t ol_flags, mask =3D 0; > + struct rte_eth_dev_info dev_info; > + > + if (port_id_is_invalid(res->port_id)) { > + printf("invalid port %d\n", res->port_id); > + return; > + } > + > + if (!strcmp(res->mode, "set")) { > + > + if (!strcmp(res->hwsw, "hw")) > + hw =3D 1; > + > + if (!strcmp(res->proto, "outer-ip")) { > + if (ports[res->port_id].tx_ol_flags & > + TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM) > + mask =3D TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM; > + else { > + printf("Tunnel checksum flag must be" > + " configured before enabling HW" > + " outer IP checksum\n"); > + return; > + } > + } > + > + if (hw) > + ports[res->port_id].tx_ol_flags |=3D mask; > + else > + ports[res->port_id].tx_ol_flags &=3D (~mask); > + } > + > + ol_flags =3D ports[res->port_id].tx_ol_flags; > + printf("Outer IP checksum offload is %s\n", > + (ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ? "hw" : "sw"); > + > + /* display warnings if configuration is not supported by the NIC */ > + rte_eth_dev_info_get(res->port_id, &dev_info); > + if ((ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) && > + (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) > + =3D=3D 0) { > + printf("Warning: hardware Outer IP checksum enabled but not " > + "supported by port %d\n", res->port_id); > + } > +} > + > +cmdline_parse_token_string_t cmd_tx_cksum_outer_tx_cksum =3D > + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_outer_result, > + tx_cksum, "tx_checksum"); > +cmdline_parse_token_string_t cmd_tx_cksum_outer_mode =3D > + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_outer_result, > + mode, "set"); > +cmdline_parse_token_string_t cmd_tx_cksum_outer_proto =3D > + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_outer_result, > + proto, "outer-ip"); > +cmdline_parse_token_string_t cmd_tx_cksum_outer_hwsw =3D > + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_outer_result, > + hwsw, "hw#sw"); > +cmdline_parse_token_num_t cmd_tx_cksum_outer_portid =3D > + TOKEN_NUM_INITIALIZER(struct cmd_tx_cksum_outer_result, > + port_id, UINT8); > + > +cmdline_parse_inst_t cmd_tx_cksum_outer_set =3D { > + .f =3D cmd_tx_cksum_outer_parsed, > + .data =3D NULL, > + .help_str =3D "enable/disable hardware calculation of outer L3" > + " checksum for tunneling packet when using csum forward" > + " engine:tx_cksum set outer-ip hw|sw ", > + .tokens =3D { > + (void *)&cmd_tx_cksum_outer_tx_cksum, > + (void *)&cmd_tx_cksum_outer_mode, > + (void *)&cmd_tx_cksum_outer_proto, > + (void *)&cmd_tx_cksum_outer_hwsw, > + (void *)&cmd_tx_cksum_outer_portid, > + NULL, > + }, > +}; >=20 > /* *** ENABLE HARDWARE INSERTION OF CHECKSUM IN TX PACKETS *** */ > struct cmd_tx_cksum_result { > @@ -2899,8 +3080,6 @@ cmd_tx_cksum_parsed(void *parsed_result, > mask =3D TESTPMD_TX_OFFLOAD_TCP_CKSUM; > } else if (!strcmp(res->proto, "sctp")) { > mask =3D TESTPMD_TX_OFFLOAD_SCTP_CKSUM; > - } else if (!strcmp(res->proto, "vxlan")) { > - mask =3D TESTPMD_TX_OFFLOAD_VXLAN_CKSUM; > } >=20 > if (hw) > @@ -2918,8 +3097,6 @@ cmd_tx_cksum_parsed(void *parsed_result, > (ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw"); > printf("SCTP checksum offload is %s\n", > (ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw"); > - printf("VxLAN checksum offload is %s\n", > - (ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) ? "hw" : "sw"); >=20 > /* display warnings if configuration is not supported by the NIC */ > rte_eth_dev_info_get(res->port_id, &dev_info); > @@ -2953,7 +3130,7 @@ cmdline_parse_token_string_t cmd_tx_cksum_mode =3D > mode, "set"); > cmdline_parse_token_string_t cmd_tx_cksum_proto =3D > TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_result, > - proto, "ip#tcp#udp#sctp#vxlan"); > + proto, "ip#tcp#udp#sctp"); > cmdline_parse_token_string_t cmd_tx_cksum_hwsw =3D > TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_result, > hwsw, "hw#sw"); > @@ -2965,7 +3142,7 @@ cmdline_parse_inst_t cmd_tx_cksum_set =3D { > .f =3D cmd_tx_cksum_parsed, > .data =3D NULL, > .help_str =3D "enable/disable hardware calculation of L3/L4 checksum wh= en " > - "using csum forward engine: tx_cksum set ip|tcp|udp|sctp|vxlan hw|sw <= port>", > + "using csum forward engine: tx_cksum set ip|tcp|udp|sctp hw|sw "= , > .tokens =3D { > (void *)&cmd_tx_cksum_tx_cksum, > (void *)&cmd_tx_cksum_mode, > @@ -8749,6 +8926,8 @@ cmdline_parse_ctx_t main_ctx[] =3D { > (cmdline_parse_inst_t *)&cmd_tx_vlan_reset, > (cmdline_parse_inst_t *)&cmd_tx_vlan_set_pvid, > (cmdline_parse_inst_t *)&cmd_tx_cksum_set, > + (cmdline_parse_inst_t *)&cmd_tx_cksum_tunnel_set, > + (cmdline_parse_inst_t *)&cmd_tx_cksum_outer_set, > (cmdline_parse_inst_t *)&cmd_tx_cksum_show, > (cmdline_parse_inst_t *)&cmd_tso_set, > (cmdline_parse_inst_t *)&cmd_tso_show, > diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c > index 41711fd..3db5473 100644 > --- a/app/test-pmd/csumonly.c > +++ b/app/test-pmd/csumonly.c > @@ -256,17 +256,16 @@ process_outer_cksums(void *outer_l3_hdr, uint16_t o= uter_ethertype, > struct udp_hdr *udp_hdr; > uint64_t ol_flags =3D 0; >=20 > - if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) > - ol_flags |=3D PKT_TX_UDP_TUNNEL_PKT; > - > if (outer_ethertype =3D=3D _htons(ETHER_TYPE_IPv4)) { > ipv4_hdr->hdr_checksum =3D 0; >=20 > - if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) > + if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) > ol_flags |=3D PKT_TX_OUTER_IP_CKSUM; > - else > + else { > ipv4_hdr->hdr_checksum =3D rte_ipv4_cksum(ipv4_hdr); > - } else if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) > + ol_flags |=3D PKT_TX_OUTER_IPV4; > + } > + } else if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM) > ol_flags |=3D PKT_TX_OUTER_IPV6; >=20 > udp_hdr =3D (struct udp_hdr *)((char *)outer_l3_hdr + outer_l3_len); > @@ -300,11 +299,14 @@ process_outer_cksums(void *outer_l3_hdr, uint16_t o= uter_ethertype, > * Ether / (vlan) / outer IP|IP6 / outer UDP / VxLAN / Ether / IP|IP6 = / > * UDP|TCP|SCTP > * > - * The testpmd command line for this forward engine sets the flags > + * These testpmd command lines for this forward engine sets the flags > * TESTPMD_TX_OFFLOAD_* in ports[tx_port].tx_ol_flags. They control > - * wether a checksum must be calculated in software or in hardware. The > - * IP, UDP, TCP and SCTP flags always concern the inner layer. The > - * VxLAN flag concerns the outer IP (if packet is recognized as a vxlan = packet). > + * wether a checksum must be calculated in software or in hardware. > + * In the case of tunneling packet, the IP, UDP, TCP and SCTP flags > + * always concern the inner layer; the outer IP flag always concern > + * the outer layer; the tunnel flag is used to tell the NIC that it > + * is a tunneing packet, want hardware offload for outer layer, > + * or inner layer, or both. > */ > static void > pkt_burst_checksum_forward(struct fwd_stream *fs) > @@ -386,17 +388,23 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) > tunnel =3D 1; >=20 > /* currently, this flag is set by i40e only if the > - * packet is vxlan */ > + * packet is a tunneling packet */ > } else if (m->ol_flags & (PKT_RX_TUNNEL_IPV4_HDR | > PKT_RX_TUNNEL_IPV6_HDR)) > tunnel =3D 1; >=20 > if (tunnel =3D=3D 1) { > + > + if (testpmd_ol_flags > + & TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM) > + ol_flags |=3D PKT_TX_UDP_TUNNEL_PKT; > + > outer_ethertype =3D ethertype; > outer_l2_len =3D l2_len; > outer_l3_len =3D l3_len; > outer_l3_hdr =3D l3_hdr; >=20 > + /* currently, only VXLAN packet is supported */ > eth_hdr =3D (struct ether_hdr *)((char *)udp_hdr + > sizeof(struct udp_hdr) + > sizeof(struct vxlan_hdr)); > @@ -434,7 +442,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) > /* step 4: fill the mbuf meta data (flags and header lengths) */ >=20 > if (tunnel =3D=3D 1) { > - if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) { > + if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM) { > m->outer_l2_len =3D outer_l2_len; > m->outer_l3_len =3D outer_l3_len; > m->l2_len =3D l4_tun_len + l2_len; > @@ -505,7 +513,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) > "m->l4_len=3D%d\n", > m->l2_len, m->l3_len, m->l4_len); > if ((tunnel =3D=3D 1) && > - (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM)) > + (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM)) > printf("tx: m->outer_l2_len=3D%d m->outer_l3_len=3D%d\n", > m->outer_l2_len, m->outer_l3_len); > if (tso_segsz !=3D 0) > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h > index f8b0740..4b4fd2f 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -125,10 +125,12 @@ struct fwd_stream { > #define TESTPMD_TX_OFFLOAD_TCP_CKSUM 0x0004 > /** Offload SCTP checksum in csum forward engine */ > #define TESTPMD_TX_OFFLOAD_SCTP_CKSUM 0x0008 > -/** Offload VxLAN checksum in csum forward engine */ > -#define TESTPMD_TX_OFFLOAD_VXLAN_CKSUM 0x0010 > +/** Offload tunneling packet checksum in csum forward engine */ > +#define TESTPMD_TX_OFFLOAD_TUNNEL_CKSUM 0x0010 > /** Insert VLAN header in forward engine */ > #define TESTPMD_TX_OFFLOAD_INSERT_VLAN 0x0020 > +/** Offload outer_IP checksum in csum forward engine for tunneling packe= t */ > +#define TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM 0x0040 >=20 > /** > * The data structure associated with each port. > -- > 1.7.7.6