checksum.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. #include <linux/in6.h>
  8. #define _HAVE_ARCH_IPV6_CSUM
  9. __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
  10. const struct in6_addr *daddr,
  11. __u32 len, __u8 proto, __wsum sum);
  12. static inline __sum16 csum_fold(__wsum csum)
  13. {
  14. u32 sum = (__force u32)csum;
  15. sum += (sum >> 16) | (sum << 16);
  16. return ~(__force __sum16)(sum >> 16);
  17. }
  18. #define csum_fold csum_fold
  19. static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
  20. {
  21. __uint128_t tmp;
  22. u64 sum;
  23. int n = ihl; /* we want it signed */
  24. tmp = *(const __uint128_t *)iph;
  25. iph += 16;
  26. n -= 4;
  27. tmp += ((tmp >> 64) | (tmp << 64));
  28. sum = tmp >> 64;
  29. do {
  30. sum += *(const u32 *)iph;
  31. iph += 4;
  32. } while (--n > 0);
  33. sum += ((sum >> 32) | (sum << 32));
  34. return csum_fold((__force __wsum)(sum >> 32));
  35. }
  36. #define ip_fast_csum ip_fast_csum
  37. extern unsigned int do_csum(const unsigned char *buff, int len);
  38. #define do_csum do_csum
  39. #include <asm-generic/checksum.h>
  40. #endif /* __ASM_CHECKSUM_H */