mywiki:linux:checksum
This is an old revision of the document!
Table of Contents
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);
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 |
mywiki/linux/checksum.1461308483.txt.gz · Last modified: (external edit)
