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