ip6_checksum.c (e5451c8f8330e03ad3cfa16048b4daf961af434f) | ip6_checksum.c (1e94082963747b551b129528714827f76a090e93) |
---|---|
1#include <net/ip.h> 2#include <net/udp.h> 3#include <net/udplite.h> 4#include <asm/checksum.h> 5 6#ifndef _HAVE_ARCH_IPV6_CSUM 7__sum16 csum_ipv6_magic(const struct in6_addr *saddr, 8 const struct in6_addr *daddr, | 1#include <net/ip.h> 2#include <net/udp.h> 3#include <net/udplite.h> 4#include <asm/checksum.h> 5 6#ifndef _HAVE_ARCH_IPV6_CSUM 7__sum16 csum_ipv6_magic(const struct in6_addr *saddr, 8 const struct in6_addr *daddr, |
9 __u32 len, unsigned short proto, 10 __wsum csum) | 9 __u32 len, __u8 proto, __wsum csum) |
11{ 12 13 int carry; 14 __u32 ulen; 15 __u32 uproto; 16 __u32 sum = (__force u32)csum; 17 18 sum += (__force u32)saddr->s6_addr32[0]; --- 74 unchanged lines hidden (view full) --- 93 const struct in6_addr *daddr, int len) 94{ 95 struct udphdr *uh = udp_hdr(skb); 96 97 if (nocheck) 98 uh->check = 0; 99 else if (skb_is_gso(skb)) 100 uh->check = ~udp_v6_check(len, saddr, daddr, 0); | 10{ 11 12 int carry; 13 __u32 ulen; 14 __u32 uproto; 15 __u32 sum = (__force u32)csum; 16 17 sum += (__force u32)saddr->s6_addr32[0]; --- 74 unchanged lines hidden (view full) --- 92 const struct in6_addr *daddr, int len) 93{ 94 struct udphdr *uh = udp_hdr(skb); 95 96 if (nocheck) 97 uh->check = 0; 98 else if (skb_is_gso(skb)) 99 uh->check = ~udp_v6_check(len, saddr, daddr, 0); |
101 else if (skb_dst(skb) && skb_dst(skb)->dev && 102 (skb_dst(skb)->dev->features & NETIF_F_IPV6_CSUM)) { 103 104 BUG_ON(skb->ip_summed == CHECKSUM_PARTIAL); 105 | 100 else if (skb->ip_summed == CHECKSUM_PARTIAL) { 101 uh->check = 0; 102 uh->check = udp_v6_check(len, saddr, daddr, lco_csum(skb)); 103 if (uh->check == 0) 104 uh->check = CSUM_MANGLED_0; 105 } else { |
106 skb->ip_summed = CHECKSUM_PARTIAL; 107 skb->csum_start = skb_transport_header(skb) - skb->head; 108 skb->csum_offset = offsetof(struct udphdr, check); 109 uh->check = ~udp_v6_check(len, saddr, daddr, 0); | 106 skb->ip_summed = CHECKSUM_PARTIAL; 107 skb->csum_start = skb_transport_header(skb) - skb->head; 108 skb->csum_offset = offsetof(struct udphdr, check); 109 uh->check = ~udp_v6_check(len, saddr, daddr, 0); |
110 } else { 111 __wsum csum; 112 113 BUG_ON(skb->ip_summed == CHECKSUM_PARTIAL); 114 115 uh->check = 0; 116 csum = skb_checksum(skb, 0, len, 0); 117 uh->check = udp_v6_check(len, saddr, daddr, csum); 118 if (uh->check == 0) 119 uh->check = CSUM_MANGLED_0; 120 121 skb->ip_summed = CHECKSUM_UNNECESSARY; | |
122 } 123} 124EXPORT_SYMBOL(udp6_set_csum); | 110 } 111} 112EXPORT_SYMBOL(udp6_set_csum); |