Checksum Offloads in the Linux Networking Stack


Introduction
============

This document describes a set of techniques in the Linux networking stack
 to take advantage of checksum offload capabilities of various NICs.

The following technologies are described:
 * TX Checksum Offload
 * LCO: Local Checksum Offload
 * RCO: Remote Checksum Offload

Things that should be documented here but aren't yet:
 * RX Checksum Offload
 * CHECKSUM_UNNECESSARY conversion


TX Checksum Offload
===================

The interface for offloading a transmit checksum to a device is explained
 in detail in comments near the top of include/linux/skbuff.h.
In brief, it allows to request the device fill in a single ones-complement
 checksum defined by the sk_buff fields skb->csum_start and
 skb->csum_offset.  The device should compute the 16-bit ones-complement
 checksum (i.e. the 'IP-style' checksum) from csum_start to the end of the
 packet, and fill in the result at (csum_start + csum_offset).
Because csum_offset cannot be negative, this ensures that the previous
 value of the checksum field is included in the checksum computation, thus
 it can be used to supply any needed corrections to the checksum (such as
 the sum of the pseudo-header for UDP or TCP).
This interface only allows a single checksum to be offloaded.  Where
 encapsulation is used, the packet may have multiple checksum fields in
 different header layers, and the rest will have to be handled by another
 mechanism such as LCO or RCO.
CRC32c can also be offloaded using this interface, by means of filling
 skb->csum_start and skb->csum_offset as described above, and setting
 skb->csum_not_inet: see skbuff.h comment (section 'D') for more details.
No offloading of the IP header checksum is performed; it is always done in
 software.  This is OK because when we build the IP header, we obviously
 have it in cache, so summing it isn't expensive.  It's also rather short.
The requirements for GSO are more complicated, because when segmenting an
 encapsulated packet both the inner and outer checksums may need to be
 edited or recomputed for each resulting segment.  See the skbuff.h comment
 (section 'E') for more details.

A driver declares its offload capabilities in netdev->hw_features; see
 Documentation/networking/netdev-features.txt for more.  Note that a device
 which only advertises NETIF_F_IP[V6]_CSUM must still obey the csum_start
 and csum_offset given in the SKB; if it tries to deduce these itself in
 hardware (as some NICs do) the driver should check that the values in the
 SKB match those which the hardware will deduce, and if not, fall back to
 checksumming in software instead (with skb_csum_hwoffload_help() or one of
 the skb_checksum_help() / skb_crc32c_csum_help functions, as mentioned in
 include/linux/skbuff.h).

The stack should, for the most part, assume that checksum offload is
 supported by the underlying device.  The only place that should check is
 validate_xmit_skb(), and the functions it calls directly or indirectly.
 That function compares the offload features requested by the SKB (which
 may include other offloads besides TX Checksum Offload) and, if they are
 not supported or enabled on the device (determined by netdev->features),
 performs the corresponding offload in software.  In the case of TX
 Checksum Offload, that means calling skb_csum_hwoffload_help(skb, features).


LCO: Local Checksum Offload
===========================

LCO is a technique for efficiently computing the outer checksum of an
 encapsulated datagram when the inner checksum is due to be offloaded.
The ones-complement sum of a correctly checksummed TCP or UDP packet is
 equal to the complement of the sum of the pseudo header, because everything
 else gets 'cancelled out' by the checksum field.  This is because the sum was
 complemented before being written to the checksum field.
More generally, this holds in any case where the 'IP-style' ones complement
 checksum is used, and thus any checksum that TX Checksum Offload supports.
That is, if we have set up TX Checksum Offload with a start/offset pair, we
 know that after the device has filled in that checksum, the ones
 complement sum from csum_start to the end of the packet will be equal to
 the complement of whatever value we put in the checksum field beforehand.
 This allows us to compute the outer checksum without looking at the payload:
 we simply stop summing when we get to csum_start, then add the complement of
 the 16-bit word at (csum_start + csum_offset).
Then, when the true inner checksum is filled in (either by hardware or by
 skb_checksum_help()), the outer checksum will become correct by virtue of
 the arithmetic.

LCO is performed by the stack when constructing an outer UDP header for an
 encapsulation such as VXLAN or GENEVE, in udp_set_csum().  Similarly for
 the IPv6 equivalents, in udp6_set_csum().
It is also performed when constructing an IPv4 GRE header, in
 net/ipv4/ip_gre.c:build_header().  It is *not* currently performed when
 constructing an IPv6 GRE header; the GRE checksum is computed over the
 whole packet in net/ipv6/ip6_gre.c:ip6gre_xmit2(), but it should be
 possible to use LCO here as IPv6 GRE still uses an IP-style checksum.
All of the LCO implementations use a helper function lco_csum(), in
 include/linux/skbuff.h.

LCO can safely be used for nested encapsulations; in this case, the outer
 encapsulation layer will sum over both its own header and the 'middle'
 header.  This does mean that the 'middle' header will get summed multiple
 times, but there doesn't seem to be a way to avoid that without incurring
 bigger costs (e.g. in SKB bloat).


RCO: Remote Checksum Offload
============================

RCO is a technique for eliding the inner checksum of an encapsulated
 datagram, allowing the outer checksum to be offloaded.  It does, however,
 involve a change to the encapsulation protocols, which the receiver must
 also support.  For this reason, it is disabled by default.
RCO is detailed in the following Internet-Drafts:
https://tools.ietf.org/html/draft-herbert-remotecsumoffload-00
https://tools.ietf.org/html/draft-herbert-vxlan-rco-00
In Linux, RCO is implemented individually in each encapsulation protocol,
 and most tunnel types have flags controlling its use.  For instance, VXLAN
 has the flag VXLAN_F_REMCSUM_TX (per struct vxlan_rdst) to indicate that
 RCO should be used when transmitting to a given remote destination.
