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