From patchwork Tue Feb 9 08:22:04 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thadeu Lima de Souza Cascardo X-Patchwork-Id: 580666 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (li376-54.members.linode.com [96.126.127.54]) by ozlabs.org (Postfix) with ESMTP id 61F6514090A for ; Tue, 9 Feb 2016 19:22:22 +1100 (AEDT) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 60DFC10905; Tue, 9 Feb 2016 00:22:17 -0800 (PST) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx1e3.cudamail.com (mx1.cudamail.com [69.90.118.67]) by archives.nicira.com (Postfix) with ESMTPS id 71A1E108D4 for ; Tue, 9 Feb 2016 00:22:15 -0800 (PST) Received: from bar5.cudamail.com (localhost [127.0.0.1]) by mx1e3.cudamail.com (Postfix) with ESMTPS id D1A38420559 for ; Tue, 9 Feb 2016 01:22:14 -0700 (MST) X-ASG-Debug-ID: 1455006133-09eadd2e8c65b30001-byXFYA Received: from mx1-pf2.cudamail.com ([192.168.24.2]) by bar5.cudamail.com with ESMTP id GH23Weo0yxzpnqMM (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 09 Feb 2016 01:22:13 -0700 (MST) X-Barracuda-Envelope-From: cascardo@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.24.2 Received: from unknown (HELO mx1.redhat.com) (209.132.183.28) by mx1-pf2.cudamail.com with ESMTPS (DHE-RSA-AES256-SHA encrypted); 9 Feb 2016 08:22:12 -0000 Received-SPF: pass (mx1-pf2.cudamail.com: SPF record at _spf1.redhat.com designates 209.132.183.28 as permitted sender) X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-Barracuda-RBL-IP: 209.132.183.28 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id D1EB58F4EA for ; Tue, 9 Feb 2016 08:22:11 +0000 (UTC) Received: from indiana.gru.redhat.com (ovpn-113-30.phx2.redhat.com [10.3.113.30]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u198MAwK013664 for ; Tue, 9 Feb 2016 03:22:11 -0500 X-CudaMail-Envelope-Sender: cascardo@redhat.com From: Thadeu Lima de Souza Cascardo To: dev@openvswitch.org X-CudaMail-Whitelist-To: dev@openvswitch.org X-CudaMail-MID: CM-E2-208001751 X-CudaMail-DTE: 020916 X-CudaMail-Originating-IP: 209.132.183.28 Date: Tue, 9 Feb 2016 06:22:04 -0200 X-ASG-Orig-Subj: [##CM-E2-208001751##][PATCH 1/2] packets: Fix UDP over IPv6 checksum Message-Id: <1455006125-13898-1-git-send-email-cascardo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: UNKNOWN[192.168.24.2] X-Barracuda-Start-Time: 1455006133 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-ASG-Whitelist: Header =?UTF-8?B?eFwtY3VkYW1haWxcLXdoaXRlbGlzdFwtdG8=?= X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 Subject: [ovs-dev] [PATCH 1/2] packets: Fix UDP over IPv6 checksum X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dev-bounces@openvswitch.org Sender: "dev" Fix the IPv6 pseudoheader checksum. Requires that the payload length is given to the function. Signed-off-by: Thadeu Lima de Souza Cascardo --- lib/netdev-vport.c | 14 +++++++++----- lib/packets.c | 8 ++++---- lib/packets.h | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index 88f5022..a2d5093 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -1000,15 +1000,18 @@ udp_extract_tnl_md(struct dp_packet *packet, struct flow_tnl *tnl, if (udp->udp_csum) { uint32_t csum; + size_t udp_len; + udp_len = dp_packet_size(packet) - + ((const unsigned char *) udp - + (const unsigned char *) dp_packet_l2(packet)); if (is_header_ipv6(dp_packet_data(packet))) { - csum = packet_csum_pseudoheader6(dp_packet_l3(packet)); + csum = packet_csum_pseudoheader6(dp_packet_l3(packet), + htonl(udp_len)); } else { csum = packet_csum_pseudoheader(dp_packet_l3(packet)); } - csum = csum_continue(csum, udp, dp_packet_size(packet) - - ((const unsigned char *)udp - - (const unsigned char *)dp_packet_l2(packet))); + csum = csum_continue(csum, udp, udp_len); if (csum_finish(csum)) { return NULL; } @@ -1048,7 +1051,8 @@ push_udp_header(struct dp_packet *packet, if (udp->udp_csum) { uint32_t csum; if (is_header_ipv6(dp_packet_data(packet))) { - csum = packet_csum_pseudoheader6(ipv6_hdr(dp_packet_data(packet))); + csum = packet_csum_pseudoheader6(ipv6_hdr(dp_packet_data(packet)), + htonl(ip_tot_size)); } else { csum = packet_csum_pseudoheader(ip_hdr(dp_packet_data(packet))); } diff --git a/lib/packets.c b/lib/packets.c index d82341d..93d75bc 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -1271,7 +1271,8 @@ packet_csum_pseudoheader(const struct ip_header *ip) #ifndef __CHECKER__ uint32_t -packet_csum_pseudoheader6(const struct ovs_16aligned_ip6_hdr *ip6) +packet_csum_pseudoheader6(const struct ovs_16aligned_ip6_hdr *ip6, + ovs_be32 plen) { uint32_t partial = 0; @@ -1284,10 +1285,9 @@ packet_csum_pseudoheader6(const struct ovs_16aligned_ip6_hdr *ip6) partial = csum_add32(partial, get_16aligned_be32(&(ip6->ip6_dst.be32[2]))); partial = csum_add32(partial, get_16aligned_be32(&(ip6->ip6_dst.be32[3]))); + partial = csum_add32(partial, plen); partial = csum_add16(partial, 0); - partial = csum_add16(partial, ip6->ip6_plen); - partial = csum_add16(partial, 0); - partial = csum_add16(partial, ip6->ip6_nxt); + partial = csum_add16(partial, htons(ip6->ip6_nxt)); return partial; } diff --git a/lib/packets.h b/lib/packets.h index f1445de..b8fa8db 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -838,7 +838,7 @@ struct icmp6_header { }; BUILD_ASSERT_DECL(ICMP6_HEADER_LEN == sizeof(struct icmp6_header)); -uint32_t packet_csum_pseudoheader6(const struct ovs_16aligned_ip6_hdr *); +uint32_t packet_csum_pseudoheader6(const struct ovs_16aligned_ip6_hdr *, ovs_be32); /* Neighbor Discovery option field. * ND options are always a multiple of 8 bytes in size. */