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