packets: Fix UDP over IPv6 checksum
[cascardo/ovs.git] / lib / packets.c
index daca1b3..b5d141a 100644 (file)
@@ -1334,7 +1334,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;
 
@@ -1347,10 +1348,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;
 }