-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ipv6: move csum_ipv6_magic() and udp6_csum_init() into static library
As suggested by David, udp6_csum_init() is too big to be inlined, move it to ipv6 static library, net/ipv6/ip6_checksum.c. And the generic csum_ipv6_magic() too. Cc: David S. Miller <davem@davemloft.net> Signed-off-by: Cong Wang <amwang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Cong Wang
authored and
David S. Miller
committed
Jan 9, 2013
1 parent
b7394d2
commit acb3e04
Showing
4 changed files
with
103 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
#include <net/ip.h> | ||
#include <net/udp.h> | ||
#include <net/udplite.h> | ||
#include <asm/checksum.h> | ||
|
||
#ifndef _HAVE_ARCH_IPV6_CSUM | ||
__sum16 csum_ipv6_magic(const struct in6_addr *saddr, | ||
const struct in6_addr *daddr, | ||
__u32 len, unsigned short proto, | ||
__wsum csum) | ||
{ | ||
|
||
int carry; | ||
__u32 ulen; | ||
__u32 uproto; | ||
__u32 sum = (__force u32)csum; | ||
|
||
sum += (__force u32)saddr->s6_addr32[0]; | ||
carry = (sum < (__force u32)saddr->s6_addr32[0]); | ||
sum += carry; | ||
|
||
sum += (__force u32)saddr->s6_addr32[1]; | ||
carry = (sum < (__force u32)saddr->s6_addr32[1]); | ||
sum += carry; | ||
|
||
sum += (__force u32)saddr->s6_addr32[2]; | ||
carry = (sum < (__force u32)saddr->s6_addr32[2]); | ||
sum += carry; | ||
|
||
sum += (__force u32)saddr->s6_addr32[3]; | ||
carry = (sum < (__force u32)saddr->s6_addr32[3]); | ||
sum += carry; | ||
|
||
sum += (__force u32)daddr->s6_addr32[0]; | ||
carry = (sum < (__force u32)daddr->s6_addr32[0]); | ||
sum += carry; | ||
|
||
sum += (__force u32)daddr->s6_addr32[1]; | ||
carry = (sum < (__force u32)daddr->s6_addr32[1]); | ||
sum += carry; | ||
|
||
sum += (__force u32)daddr->s6_addr32[2]; | ||
carry = (sum < (__force u32)daddr->s6_addr32[2]); | ||
sum += carry; | ||
|
||
sum += (__force u32)daddr->s6_addr32[3]; | ||
carry = (sum < (__force u32)daddr->s6_addr32[3]); | ||
sum += carry; | ||
|
||
ulen = (__force u32)htonl((__u32) len); | ||
sum += ulen; | ||
carry = (sum < ulen); | ||
sum += carry; | ||
|
||
uproto = (__force u32)htonl(proto); | ||
sum += uproto; | ||
carry = (sum < uproto); | ||
sum += carry; | ||
|
||
return csum_fold((__force __wsum)sum); | ||
} | ||
EXPORT_SYMBOL(csum_ipv6_magic); | ||
#endif | ||
|
||
int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto) | ||
{ | ||
int err; | ||
|
||
UDP_SKB_CB(skb)->partial_cov = 0; | ||
UDP_SKB_CB(skb)->cscov = skb->len; | ||
|
||
if (proto == IPPROTO_UDPLITE) { | ||
err = udplite_checksum_init(skb, uh); | ||
if (err) | ||
return err; | ||
} | ||
|
||
if (uh->check == 0) { | ||
/* RFC 2460 section 8.1 says that we SHOULD log | ||
this error. Well, it is reasonable. | ||
*/ | ||
LIMIT_NETDEBUG(KERN_INFO "IPv6: udp checksum is 0\n"); | ||
return 1; | ||
} | ||
if (skb->ip_summed == CHECKSUM_COMPLETE && | ||
!csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, | ||
skb->len, proto, skb->csum)) | ||
skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
|
||
if (!skb_csum_unnecessary(skb)) | ||
skb->csum = ~csum_unfold(csum_ipv6_magic(&ipv6_hdr(skb)->saddr, | ||
&ipv6_hdr(skb)->daddr, | ||
skb->len, proto, 0)); | ||
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL(udp6_csum_init); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters