From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 53B717F51 for ; Thu, 27 Nov 2014 09:18:52 +0100 (CET) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 27 Nov 2014 00:18:51 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,468,1413270000"; d="scan'208";a="644394614" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by orsmga002.jf.intel.com with ESMTP; 27 Nov 2014 00:18:51 -0800 Received: from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com [10.239.29.89]) by shvmail01.sh.intel.com with ESMTP id sAR8InCg003163; Thu, 27 Nov 2014 16:18:49 +0800 Received: from shecgisg004.sh.intel.com (localhost [127.0.0.1]) by shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id sAR8Ileu000685; Thu, 27 Nov 2014 16:18:49 +0800 Received: (from jijiangl@localhost) by shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id sAR8Ilmf000681; Thu, 27 Nov 2014 16:18:47 +0800 From: Jijiang Liu To: dev@dpdk.org Date: Thu, 27 Nov 2014 16:18:39 +0800 Message-Id: <1417076319-629-4-git-send-email-jijiang.liu@intel.com> X-Mailer: git-send-email 1.7.12.2 In-Reply-To: <1417076319-629-1-git-send-email-jijiang.liu@intel.com> References: <1417076319-629-1-git-send-email-jijiang.liu@intel.com> Subject: [dpdk-dev] [PATCH 3/3] testpmd:rework csum forward 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: Thu, 27 Nov 2014 08:18:53 -0000 The changes include: 1. use the new introduced ol_flags and fields in csumonly.c file; 2. fix an issue of outer UDP checksum check; 3. fix an issue that is if the TESTPMD_TX_OFFLOAD_IP_CKSUM is not set, and the "ol_flags |= PKT_TX_IPV4" should be done in the process_inner_cksums(); Signed-off-by: Jijiang Liu --- app/test-pmd/csumonly.c | 55 +++++++++++++++++++++++++--------------------- 1 files changed, 30 insertions(+), 25 deletions(-) diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index d8c080a..0727510 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -189,11 +189,12 @@ process_inner_cksums(void *l3_hdr, uint16_t ethertype, uint16_t l3_len, } else { if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) ol_flags |= PKT_TX_IP_CKSUM; - else + else { ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr); + ol_flags |= PKT_TX_IPV4; + } } - ol_flags |= PKT_TX_IPV4; } else if (ethertype == _htons(ETHER_TYPE_IPv6)) ol_flags |= PKT_TX_IPV6; else @@ -257,27 +258,28 @@ process_outer_cksums(void *outer_l3_hdr, uint16_t outer_ethertype, uint64_t ol_flags = 0; if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) - ol_flags |= PKT_TX_VXLAN_CKSUM; + ol_flags |= PKT_TX_UDP_TUNNEL_PKT; if (outer_ethertype == _htons(ETHER_TYPE_IPv4)) { ipv4_hdr->hdr_checksum = 0; - if ((testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) == 0) + if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) + ol_flags |= PKT_TX_OUTER_IPV4_CSUM; + else ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr); - } + } else if (outer_ethertype == _htons(ETHER_TYPE_IPv6)) + ol_flags |= PKT_TX_OUTER_IPV6; udp_hdr = (struct udp_hdr *)((char *)outer_l3_hdr + outer_l3_len); /* do not recalculate udp cksum if it was 0 */ if (udp_hdr->dgram_cksum != 0) { udp_hdr->dgram_cksum = 0; - if ((testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) == 0) { - if (outer_ethertype == _htons(ETHER_TYPE_IPv4)) - udp_hdr->dgram_cksum = - rte_ipv4_udptcp_cksum(ipv4_hdr, udp_hdr); - else - udp_hdr->dgram_cksum = - rte_ipv6_udptcp_cksum(ipv6_hdr, udp_hdr); - } + if (outer_ethertype == _htons(ETHER_TYPE_IPv4)) + udp_hdr->dgram_cksum = + rte_ipv4_udptcp_cksum(ipv4_hdr, udp_hdr); + else + udp_hdr->dgram_cksum = + rte_ipv6_udptcp_cksum(ipv6_hdr, udp_hdr); } return ol_flags; @@ -320,7 +322,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) uint16_t i; uint64_t ol_flags; uint16_t testpmd_ol_flags; - uint8_t l4_proto; + uint8_t l4_proto, l4_tun_len = 0; uint16_t ethertype = 0, outer_ethertype = 0; uint16_t l2_len = 0, l3_len = 0, l4_len = 0; uint16_t outer_l2_len = 0, outer_l3_len = 0; @@ -383,10 +385,6 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) if (((m->ol_flags & PKT_RX_TUNNEL_IPV4_HDR) || (m->ol_flags & PKT_RX_TUNNEL_IPV6_HDR))) tunnel = 1; - /* else check udp destination port, 4789 is the default - * vxlan port (rfc7348) */ - else if (udp_hdr->dst_port == _htons(4789)) - tunnel = 1; if (tunnel == 1) { outer_ethertype = ethertype; @@ -394,6 +392,11 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) outer_l3_len = l3_len; outer_l3_hdr = l3_hdr; + /* check udp destination port, 4789 is the default + * vxlan port (rfc7348) */ + if (udp_hdr->dst_port == _htons(4789)) + l4_tun_len = ETHER_VXLAN_HLEN; + eth_hdr = (struct ether_hdr *)((char *)udp_hdr + sizeof(struct udp_hdr) + sizeof(struct vxlan_hdr)); @@ -432,10 +435,11 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) if (tunnel == 1) { if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM) { - m->l2_len = outer_l2_len; - m->l3_len = outer_l3_len; - m->inner_l2_len = l2_len; - m->inner_l3_len = l3_len; + m->outer_l2_len = outer_l2_len; + m->outer_l3_len = outer_l3_len; + m->l2_len = l2_len; + m->l3_len = l3_len; + m->l4_tun_len = l4_tun_len; } else { /* if we don't do vxlan cksum in hw, @@ -470,7 +474,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) { PKT_TX_UDP_CKSUM, PKT_TX_L4_MASK }, { PKT_TX_TCP_CKSUM, PKT_TX_L4_MASK }, { PKT_TX_SCTP_CKSUM, PKT_TX_L4_MASK }, - { PKT_TX_VXLAN_CKSUM, PKT_TX_VXLAN_CKSUM }, + { PKT_TX_UDP_TUNNEL_PKT, PKT_TX_UDP_TUNNEL_PKT }, { PKT_TX_TCP_SEG, PKT_TX_TCP_SEG }, }; unsigned j; @@ -498,8 +502,9 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) m->l2_len, m->l3_len, m->l4_len); if ((tunnel == 1) && (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_VXLAN_CKSUM)) - printf("tx: m->inner_l2_len=%d m->inner_l3_len=%d\n", - m->inner_l2_len, m->inner_l3_len); + printf("tx: m->outer_l2_len=%d m->outer_l3_len=%d\n" + "m->l4_tun_len=%d", m->outer_l2_len, + m->outer_l3_len, m->l4_tun_len); if (tso_segsz != 0) printf("tx: m->tso_segsz=%d\n", m->tso_segsz); printf("tx: flags="); -- 1.7.7.6