1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2016 ARM Ltd. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef __ASM_CHECKSUM_H 6*4882a593Smuzhiyun #define __ASM_CHECKSUM_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/in6.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define _HAVE_ARCH_IPV6_CSUM 11*4882a593Smuzhiyun __sum16 csum_ipv6_magic(const struct in6_addr *saddr, 12*4882a593Smuzhiyun const struct in6_addr *daddr, 13*4882a593Smuzhiyun __u32 len, __u8 proto, __wsum sum); 14*4882a593Smuzhiyun csum_fold(__wsum csum)15*4882a593Smuzhiyunstatic inline __sum16 csum_fold(__wsum csum) 16*4882a593Smuzhiyun { 17*4882a593Smuzhiyun u32 sum = (__force u32)csum; 18*4882a593Smuzhiyun sum += (sum >> 16) | (sum << 16); 19*4882a593Smuzhiyun return ~(__force __sum16)(sum >> 16); 20*4882a593Smuzhiyun } 21*4882a593Smuzhiyun #define csum_fold csum_fold 22*4882a593Smuzhiyun ip_fast_csum(const void * iph,unsigned int ihl)23*4882a593Smuzhiyunstatic inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl) 24*4882a593Smuzhiyun { 25*4882a593Smuzhiyun __uint128_t tmp; 26*4882a593Smuzhiyun u64 sum; 27*4882a593Smuzhiyun int n = ihl; /* we want it signed */ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun tmp = *(const __uint128_t *)iph; 30*4882a593Smuzhiyun iph += 16; 31*4882a593Smuzhiyun n -= 4; 32*4882a593Smuzhiyun tmp += ((tmp >> 64) | (tmp << 64)); 33*4882a593Smuzhiyun sum = tmp >> 64; 34*4882a593Smuzhiyun do { 35*4882a593Smuzhiyun sum += *(const u32 *)iph; 36*4882a593Smuzhiyun iph += 4; 37*4882a593Smuzhiyun } while (--n > 0); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun sum += ((sum >> 32) | (sum << 32)); 40*4882a593Smuzhiyun return csum_fold((__force u32)(sum >> 32)); 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun #define ip_fast_csum ip_fast_csum 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun extern unsigned int do_csum(const unsigned char *buff, int len); 45*4882a593Smuzhiyun #define do_csum do_csum 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #include <asm-generic/checksum.h> 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #endif /* __ASM_CHECKSUM_H */ 50