Linux Checksum Calculation Logic ^API | Comments | | skb_checksum_help | | | ip_fast_csum | | | csum_fold | | | skb_checksum | | | csum_tcpudp_magic | | | nf_ip_checksum | | csum_tcpudp_nofold | | csum_replace4 | | csum_replace2 | | nf_nat_ipv4_csum_recalc | | csum_tcpudp_magic | skb->csum_start = skb_transport_header(skb) - skb->head; skb->csum_offset = offsetof(struct tcphdr, check); **TSO** is a hardware feature whereas **GSO** is a software feature. In the sense, TSO needs "the device" to break the frame into MTU sized segments. BUT, GSO is a strategy followed by kernel to avoid processing smaller packets throughout the stack to improve the porformance ====== Linux Checksum offloading ====== - For bridging and non-udp/tcp packet, no so called offloading support in tx path - For Fragmented packets, no checksum offloading support in tx path - For UDP/TCP routing packet (incremental), no checksum offloading support in tx path. at the same time, no ip_summed flag change - Only Linux local output UDP/TCP’s checksum can be offloaded in tx path - For L2TP related tunnels, only inner UDP/TCP can be offloaded, outer UDP/TCP is done by linux itself in tx path. Below variables in skb is very important for checksum offloading: - ip_summed (CHECKSUM_PARTIAL) - encapsulation - inner_network_header/network_header - inner_transport_header/transport_header ====== Linux Checksum ====== union { __wsum csum; struct { __u16 csum_start; __u16 csum_offset; }; }; | Variables/Direction | skb->ip_summed | skb->csum or csum_start/offset | ^ Input | CHECKSUM_NONE 0 | not valid | SW need do L4 payload + pseudo header verification | | | CHECKSUM_UNNECESSARY 1 | not valid | HW already do L4 payload + pseudo header verification | | | CHECKSUM_COMPLETE 2 | csum valid (stored with L4 payload checksum) | SW need to do skb->csum + pseudo header verification | ^ Output | CHECKSUM_NONE 0 | not valid | SW already do necessary L4 checksum calculation | | | CHECKSUM_PARTIAL 3 | csum_start/offset valid | SW already do pseudo header and HW need to further calculate its payload based on |