162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Licensed under the GPL 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#ifndef __UM_SYSDEP_CHECKSUM_H 662306a36Sopenharmony_ci#define __UM_SYSDEP_CHECKSUM_H 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistatic inline __sum16 ip_compute_csum(const void *buff, int len) 962306a36Sopenharmony_ci{ 1062306a36Sopenharmony_ci return csum_fold (csum_partial(buff, len, 0)); 1162306a36Sopenharmony_ci} 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define _HAVE_ARCH_IPV6_CSUM 1462306a36Sopenharmony_cistatic __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, 1562306a36Sopenharmony_ci const struct in6_addr *daddr, 1662306a36Sopenharmony_ci __u32 len, __u8 proto, 1762306a36Sopenharmony_ci __wsum sum) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci __asm__( 2062306a36Sopenharmony_ci "addl 0(%1), %0 ;\n" 2162306a36Sopenharmony_ci "adcl 4(%1), %0 ;\n" 2262306a36Sopenharmony_ci "adcl 8(%1), %0 ;\n" 2362306a36Sopenharmony_ci "adcl 12(%1), %0 ;\n" 2462306a36Sopenharmony_ci "adcl 0(%2), %0 ;\n" 2562306a36Sopenharmony_ci "adcl 4(%2), %0 ;\n" 2662306a36Sopenharmony_ci "adcl 8(%2), %0 ;\n" 2762306a36Sopenharmony_ci "adcl 12(%2), %0 ;\n" 2862306a36Sopenharmony_ci "adcl %3, %0 ;\n" 2962306a36Sopenharmony_ci "adcl %4, %0 ;\n" 3062306a36Sopenharmony_ci "adcl $0, %0 ;\n" 3162306a36Sopenharmony_ci : "=&r" (sum) 3262306a36Sopenharmony_ci : "r" (saddr), "r" (daddr), 3362306a36Sopenharmony_ci "r"(htonl(len)), "r"(htonl(proto)), "0"(sum)); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci return csum_fold(sum); 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#endif 39