May 22, 2001 IN_CKSUM 9

### NAME

in_cksum, in4_cksum, in6_cksum - compute Internet checksum

### SYNOPSIS

```uint16_t` 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`)

### DESCRIPTION

These functions are used to compute the ones-complement checksum required by IP and IPv6. The 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.

### RETURN VALUES

All three functions return the computed checksum value.

### SEE ALSO

inet(4), inet6(4), tcp(4), udp(4), protocols(5), mbuf(9)

### STANDARDS

These functions implement the Internet transport-layer checksum as specified in RFC768, RFC793, and RFC2460.

### BUGS

The 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.