]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - arch/arm64/include/asm/checksum.h
UBUNTU: Ubuntu-4.10.0-37.41
[mirror_ubuntu-zesty-kernel.git] / arch / arm64 / include / asm / checksum.h
CommitLineData
0e455d8e
RM
1/*
2 * Copyright (C) 2016 ARM Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#ifndef __ASM_CHECKSUM_H
17#define __ASM_CHECKSUM_H
18
19#include <linux/types.h>
20
21static inline __sum16 csum_fold(__wsum csum)
22{
23 u32 sum = (__force u32)csum;
24 sum += (sum >> 16) | (sum << 16);
25 return ~(__force __sum16)(sum >> 16);
26}
27#define csum_fold csum_fold
28
29static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
30{
31 __uint128_t tmp;
32 u64 sum;
33
34 tmp = *(const __uint128_t *)iph;
35 iph += 16;
36 ihl -= 4;
37 tmp += ((tmp >> 64) | (tmp << 64));
38 sum = tmp >> 64;
39 do {
40 sum += *(const u32 *)iph;
41 iph += 4;
42 } while (--ihl);
43
44 sum += ((sum >> 32) | (sum << 32));
45 return csum_fold(sum >> 32);
46}
47#define ip_fast_csum ip_fast_csum
48
49#include <asm-generic/checksum.h>
50
51#endif /* __ASM_CHECKSUM_H */