1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (C) 2016 ARM Ltd.
5 #ifndef __ASM_CHECKSUM_H
6 #define __ASM_CHECKSUM_H
10 #define _HAVE_ARCH_IPV6_CSUM
11 __sum16
csum_ipv6_magic(const struct in6_addr
*saddr
,
12 const struct in6_addr
*daddr
,
13 __u32 len
, __u8 proto
, __wsum sum
);
15 static inline __sum16
csum_fold(__wsum csum
)
17 u32 sum
= (__force u32
)csum
;
18 sum
+= (sum
>> 16) | (sum
<< 16);
19 return ~(__force __sum16
)(sum
>> 16);
21 #define csum_fold csum_fold
23 static inline __sum16
ip_fast_csum(const void *iph
, unsigned int ihl
)
27 int n
= ihl
; /* we want it signed */
29 tmp
= *(const __uint128_t
*)iph
;
32 tmp
+= ((tmp
>> 64) | (tmp
<< 64));
35 sum
+= *(const u32
*)iph
;
39 sum
+= ((sum
>> 32) | (sum
<< 32));
40 return csum_fold((__force u32
)(sum
>> 32));
42 #define ip_fast_csum ip_fast_csum
44 extern unsigned int do_csum(const unsigned char *buff
, int len
);
45 #define do_csum do_csum
47 #include <asm-generic/checksum.h>
49 #endif /* __ASM_CHECKSUM_H */