linux/include/asm-generic/checksum.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __ASM_GENERIC_CHECKSUM_H
   3#define __ASM_GENERIC_CHECKSUM_H
   4
   5/*
   6 * computes the checksum of a memory block at buff, length len,
   7 * and adds in "sum" (32-bit)
   8 *
   9 * returns a 32-bit number suitable for feeding into itself
  10 * or csum_tcpudp_magic
  11 *
  12 * this function must be called with even lengths, except
  13 * for the last fragment, which may be odd
  14 *
  15 * it's best to have buff aligned on a 32-bit boundary
  16 */
  17extern __wsum csum_partial(const void *buff, int len, __wsum sum);
  18
  19#ifndef ip_fast_csum
  20/*
  21 * This is a version of ip_compute_csum() optimized for IP headers,
  22 * which always checksum on 4 octet boundaries.
  23 */
  24extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
  25#endif
  26
  27#ifndef csum_fold
  28/*
  29 * Fold a partial checksum
  30 */
  31static inline __sum16 csum_fold(__wsum csum)
  32{
  33        u32 sum = (__force u32)csum;
  34        sum = (sum & 0xffff) + (sum >> 16);
  35        sum = (sum & 0xffff) + (sum >> 16);
  36        return (__force __sum16)~sum;
  37}
  38#endif
  39
  40#ifndef csum_tcpudp_nofold
  41/*
  42 * computes the checksum of the TCP/UDP pseudo-header
  43 * returns a 16-bit checksum, already complemented
  44 */
  45extern __wsum
  46csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len,
  47                   __u8 proto, __wsum sum);
  48#endif
  49
  50#ifndef csum_tcpudp_magic
  51static inline __sum16
  52csum_tcpudp_magic(__be32 saddr, __be32 daddr, __u32 len,
  53                  __u8 proto, __wsum sum)
  54{
  55        return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
  56}
  57#endif
  58
  59/*
  60 * this routine is used for miscellaneous IP-like checksums, mainly
  61 * in icmp.c
  62 */
  63extern __sum16 ip_compute_csum(const void *buff, int len);
  64
  65#endif /* __ASM_GENERIC_CHECKSUM_H */
  66