1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Licensed under the GPL
3*4882a593Smuzhiyun */
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #ifndef __UM_SYSDEP_CHECKSUM_H
6*4882a593Smuzhiyun #define __UM_SYSDEP_CHECKSUM_H
7*4882a593Smuzhiyun
ip_compute_csum(const void * buff,int len)8*4882a593Smuzhiyun static inline __sum16 ip_compute_csum(const void *buff, int len)
9*4882a593Smuzhiyun {
10*4882a593Smuzhiyun return csum_fold (csum_partial(buff, len, 0));
11*4882a593Smuzhiyun }
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #define _HAVE_ARCH_IPV6_CSUM
csum_ipv6_magic(const struct in6_addr * saddr,const struct in6_addr * daddr,__u32 len,__u8 proto,__wsum sum)14*4882a593Smuzhiyun static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
15*4882a593Smuzhiyun const struct in6_addr *daddr,
16*4882a593Smuzhiyun __u32 len, __u8 proto,
17*4882a593Smuzhiyun __wsum sum)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun __asm__(
20*4882a593Smuzhiyun "addl 0(%1), %0 ;\n"
21*4882a593Smuzhiyun "adcl 4(%1), %0 ;\n"
22*4882a593Smuzhiyun "adcl 8(%1), %0 ;\n"
23*4882a593Smuzhiyun "adcl 12(%1), %0 ;\n"
24*4882a593Smuzhiyun "adcl 0(%2), %0 ;\n"
25*4882a593Smuzhiyun "adcl 4(%2), %0 ;\n"
26*4882a593Smuzhiyun "adcl 8(%2), %0 ;\n"
27*4882a593Smuzhiyun "adcl 12(%2), %0 ;\n"
28*4882a593Smuzhiyun "adcl %3, %0 ;\n"
29*4882a593Smuzhiyun "adcl %4, %0 ;\n"
30*4882a593Smuzhiyun "adcl $0, %0 ;\n"
31*4882a593Smuzhiyun : "=&r" (sum)
32*4882a593Smuzhiyun : "r" (saddr), "r" (daddr),
33*4882a593Smuzhiyun "r"(htonl(len)), "r"(htonl(proto)), "0"(sum));
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun return csum_fold(sum);
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #endif
39