| IN_CKSUM(9) | Kernel Developer's Manual | IN_CKSUM(9) | 
in_cksum, in4_cksum,
  in6_cksum —
in_cksum(struct
  mbuf *m, int len);
uint16_t
  
  in4_cksum(struct
    mbuf *m, uint8_t
    nxt, int off,
    int len);
uint16_t
  
  in6_cksum(struct
    mbuf *m, uint8_t
    nxt, int off,
    int len);
in4_cksum() function is used to compute
  the transport-layer checksum required by
  tcp(4) and
  udp(4) over a range of bytes
  starting at off and continuing on for
  len bytes within the mbuf m.
If the nxt parameter is non-zero, it is assumed to be an IP protocol number. It is also assumed that the data within m starts with an IP header, and the transport-layer header starts at off; a pseudo-header is constructed as specified in RFC768 and RFC793, and the pseudo-header is prepended to the data covered by the checksum.
The in6_cksum() function is similar; if
    nxt is non-zero, it is assumed that
    m starts with an IPv6 header, and that the
    transport-layer header starts after off bytes.
The in_cksum() function is equivalent to
    in4_cksum(m,
    0, 0,
    len).
These functions are always performance critical and should be reimplemented in assembler or optimized C for each platform; when available, use of repeated full-width add-with-carry followed by reduction of the sum to a 16 bit width usually leads to best results. See RFC's 1071, 1141, 1624, and 1936 for more information about efficient computation of the internet checksum.
in6_cksum() function currently requires special
  handling of link-local addresses in the pseudo-header due to the use of
  embedded scope-id's within link-local addresses.
| May 22, 2001 | NetBSD 10.0 |