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