From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 107F6A2EDB for ; Sat, 7 Sep 2019 00:50:31 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9D69D1F46C; Sat, 7 Sep 2019 00:50:29 +0200 (CEST) Received: from stargate.chelsio.com (stargate.chelsio.com [12.32.117.8]) by dpdk.org (Postfix) with ESMTP id BD5F01F46A for ; Sat, 7 Sep 2019 00:50:26 +0200 (CEST) Received: from localhost (scalar.blr.asicdesigners.com [10.193.185.94]) by stargate.chelsio.com (8.13.8/8.13.8) with ESMTP id x86MoMEe004471; Fri, 6 Sep 2019 15:50:23 -0700 From: Rahul Lakkireddy To: keith.wiles@intel.com Cc: nirranjan@chelsio.com, dev@dpdk.org Date: Sat, 7 Sep 2019 04:13:14 +0530 Message-Id: <1567809794-14477-1-git-send-email-rahul.lakkireddy@chelsio.com> X-Mailer: git-send-email 2.5.3 Subject: [dpdk-dev] [PATCH] pktgen: fix checksum calculation logic 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Use rte_ipv4_udptcp_cksum() and rte_ipv6_udptcp_cksum() for calculating L4 checksum in IPv4 and IPv6 packets, respectively. Fix the IPv6 address copying logic to keep it consistent in all places. Also, fix the payload length calculation in IPv4 and IPv6 headers. Fixes: 9a43ed448cd1 ("First commit for dpdk.org") Signed-off-by: Rahul Lakkireddy --- app/pktgen-ipv6.c | 11 +++++------ app/pktgen-tcp.c | 23 +++++++++++++---------- app/pktgen-udp.c | 8 +++++--- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/app/pktgen-ipv6.c b/app/pktgen-ipv6.c index 2e16b60..e8d3874 100644 --- a/app/pktgen-ipv6.c +++ b/app/pktgen-ipv6.c @@ -29,6 +29,7 @@ void pktgen_ipv6_ctor(pkt_seq_t *pkt, void *hdr) { struct pg_ipv6_hdr *ip = hdr; + uint32_t addr; uint16_t tlen; /* IPv6 Header constructor */ @@ -41,12 +42,10 @@ pktgen_ipv6_ctor(pkt_seq_t *pkt, void *hdr) ip->hop_limits = 4; ip->proto = pkt->ipProto; - rte_memcpy(&ip->dst_addr[8], - pkt->ip_dst_addr.addr.ipv6.s6_addr, - sizeof(struct in6_addr)); - rte_memcpy(&ip->src_addr[8], - pkt->ip_dst_addr.addr.ipv6.s6_addr, - sizeof(struct in6_addr)); + addr = htonl(pkt->ip_dst_addr.addr.ipv4.s_addr); + (void)rte_memcpy(&ip->dst_addr[8], &addr, sizeof(uint32_t)); + addr = htonl(pkt->ip_src_addr.addr.ipv4.s_addr); + (void)rte_memcpy(&ip->src_addr[8], &addr, sizeof(uint32_t)); } /**************************************************************************//** diff --git a/app/pktgen-tcp.c b/app/pktgen-tcp.c index a06241f..7c31960 100644 --- a/app/pktgen-tcp.c +++ b/app/pktgen-tcp.c @@ -37,7 +37,7 @@ pktgen_tcp_hdr_ctor(pkt_seq_t *pkt, void * hdr, int type) ipv4->src_addr = htonl(pkt->ip_src_addr.addr.ipv4.s_addr); ipv4->dst_addr = htonl(pkt->ip_dst_addr.addr.ipv4.s_addr); - tlen = pkt->pktSize - (pkt->ether_hdr_size + sizeof(struct pg_ipv4_hdr)); + tlen = pkt->pktSize - pkt->ether_hdr_size; ipv4->total_length = htons(tlen); ipv4->next_proto_id = pkt->ipProto; @@ -50,21 +50,23 @@ pktgen_tcp_hdr_ctor(pkt_seq_t *pkt, void * hdr, int type) tcp->rx_win = htons(DEFAULT_WND_SIZE); tcp->tcp_urp = 0; - tlen = pkt->pktSize - pkt->ether_hdr_size; - - tcp->cksum = rte_raw_cksum(tcp, tlen); + tcp->cksum = 0; + tcp->cksum = rte_ipv4_udptcp_cksum(ipv4, (const void *)tcp); } else { struct pg_ipv6_hdr *ipv6 = (struct pg_ipv6_hdr *)hdr; struct pg_tcp_hdr *tcp = (struct pg_tcp_hdr *)&ipv6[1]; + uint32_t addr; /* Create the pseudo header and TCP information */ - (void)rte_memcpy(ipv6->dst_addr, &pkt->ip_dst_addr.addr.ipv4.s_addr, - sizeof(struct in6_addr)); - (void)rte_memcpy(ipv6->src_addr, &pkt->ip_src_addr.addr.ipv4.s_addr, - sizeof(struct in6_addr)); + memset(ipv6->dst_addr, 0, sizeof(struct in6_addr)); + memset(ipv6->src_addr, 0, sizeof(struct in6_addr)); + addr = htonl(pkt->ip_dst_addr.addr.ipv4.s_addr); + (void)rte_memcpy(&ipv6->dst_addr[8], &addr, sizeof(uint32_t)); + addr = htonl(pkt->ip_src_addr.addr.ipv4.s_addr); + (void)rte_memcpy(&ipv6->src_addr[8], &addr, sizeof(uint32_t)); tlen = pkt->pktSize - (pkt->ether_hdr_size + sizeof(struct pg_ipv6_hdr)); - ipv6->payload_len = htonl(tlen); + ipv6->payload_len = htons(tlen); ipv6->proto = pkt->ipProto; tcp->src_port = htons(pkt->sport); @@ -77,7 +79,8 @@ pktgen_tcp_hdr_ctor(pkt_seq_t *pkt, void * hdr, int type) tcp->rx_win = htons(DEFAULT_WND_SIZE); tcp->tcp_urp = 0; - tcp->cksum = rte_raw_cksum(tcp, tlen); + tcp->cksum = 0; + tcp->cksum = rte_ipv6_udptcp_cksum(ipv6, (const void *)tcp); } /* In this case we return the original value to allow IP ctor to work */ diff --git a/app/pktgen-udp.c b/app/pktgen-udp.c index e2751d0..41bb5c6 100644 --- a/app/pktgen-udp.c +++ b/app/pktgen-udp.c @@ -64,16 +64,18 @@ pktgen_udp_hdr_ctor(pkt_seq_t *pkt, void *hdr, int type) struct pg_udp_hdr *udp = (struct pg_udp_hdr *)&ipv6[1]; /* Create the pseudo header and TCP information */ + memset(ipv6->dst_addr, 0, sizeof(struct in6_addr)); + memset(ipv6->src_addr, 0, sizeof(struct in6_addr)); addr = htonl(pkt->ip_dst_addr.addr.ipv4.s_addr); (void)rte_memcpy(&ipv6->dst_addr[8], &addr, sizeof(uint32_t)); addr = htonl(pkt->ip_src_addr.addr.ipv4.s_addr); (void)rte_memcpy(&ipv6->src_addr[8], &addr, sizeof(uint32_t)); - tlen = pkt->pktSize - pkt->ether_hdr_size; - ipv6->payload_len = htonl(tlen); + tlen = pkt->pktSize - (pkt->ether_hdr_size + + sizeof(struct pg_ipv6_hdr)); + ipv6->payload_len = htons(tlen); ipv6->proto = pkt->ipProto; - tlen = pkt->pktSize - (pkt->ether_hdr_size + sizeof(struct pg_ipv6_hdr)); udp->dgram_len = htons(tlen); udp->src_port = htons(pkt->sport); udp->dst_port = htons(pkt->dport); -- 2.18.0