tools/testing/selftests/net/lib/csum.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/net/lib/csum.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/net/lib/csum.c- Extension
.c- Size
- 25434 bytes
- Lines
- 1011
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
arpa/inet.hasm/byteorder.herrno.herror.hlinux/filter.hlinux/if_packet.hlinux/ipv6.hlinux/virtio_net.hnet/ethernet.hnet/if.hnetinet/if_ether.hnetinet/in.hnetinet/ip.hnetinet/ip6.hnetinet/tcp.hnetinet/udp.hpoll.hsched.hstdbool.hstddef.hstdint.hstdio.hstdlib.hstring.hsys/socket.hsys/stat.hsys/time.hsys/types.hunistd.hkselftest.h
Detected Declarations
struct udp_encap_hdrfunction gettimeofday_msfunction checksum_nofoldfunction checksum_foldfunction checksumfunction open_inetfunction open_packetfunction send_inetfunction eth_str_to_addrfunction send_packetfunction recv_prepare_udpfunction __recv_prepare_packet_filterfunction recv_prepare_packet_filterfunction recv_prepare_packet_bindfunction recv_prepare_packetfunction recv_udpfunction recv_verify_csumfunction recv_verify_packet_tcpfunction recv_verify_packet_udp_encapfunction recv_verify_packet_udpfunction recv_verify_packet_ipv4function recv_verify_packet_ipv6function recv_get_packet_csum_statusfunction recv_packetfunction offloadfunction parse_argsfunction do_txfunction do_rxfunction main
Annotated Snippet
struct udp_encap_hdr {
uint8_t nexthdr;
uint8_t padding[3];
};
/* Ipaddrs, for pseudo csum. Global var is ugly, pass through funcs was worse */
static void *iph_addr_p;
static unsigned long gettimeofday_ms(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec * 1000UL) + (tv.tv_usec / 1000UL);
}
static uint32_t checksum_nofold(char *data, size_t len, uint32_t sum)
{
uint16_t *words = (uint16_t *)data;
int i;
for (i = 0; i < len / 2; i++)
sum += words[i];
if (len & 1)
sum += ((unsigned char *)data)[len - 1];
return sum;
}
static uint16_t checksum_fold(void *data, size_t len, uint32_t sum)
{
sum = checksum_nofold(data, len, sum);
while (sum > 0xFFFF)
sum = (sum & 0xFFFF) + (sum >> 16);
return ~sum;
}
static uint16_t checksum(void *th, uint16_t proto, size_t len)
{
uint32_t sum;
int alen;
alen = cfg_family == PF_INET6 ? 32 : 8;
sum = checksum_nofold(iph_addr_p, alen, 0);
sum += htons(proto);
sum += htons(len);
/* With CHECKSUM_PARTIAL kernel expects non-inverted pseudo csum */
if (cfg_do_tx && cfg_send_pfpacket)
return ~checksum_fold(NULL, 0, sum);
else
return checksum_fold(th, len, sum);
}
static void *build_packet_ipv4(void *_iph, uint8_t proto, unsigned int len)
{
struct iphdr *iph = _iph;
memset(iph, 0, sizeof(*iph));
iph->version = 4;
iph->ihl = 5;
iph->ttl = 8;
iph->protocol = proto;
iph->saddr = cfg_saddr4.sin_addr.s_addr;
iph->daddr = cfg_daddr4.sin_addr.s_addr;
iph->tot_len = htons(sizeof(*iph) + len);
iph->check = checksum_fold(iph, sizeof(*iph), 0);
iph_addr_p = &iph->saddr;
return iph + 1;
}
static void *build_packet_ipv6(void *_ip6h, uint8_t proto, unsigned int len)
{
struct ipv6hdr *ip6h = _ip6h;
memset(ip6h, 0, sizeof(*ip6h));
ip6h->version = 6;
ip6h->payload_len = htons(len);
ip6h->nexthdr = proto;
ip6h->hop_limit = 64;
ip6h->saddr = cfg_saddr6.sin6_addr;
ip6h->daddr = cfg_daddr6.sin6_addr;
Annotation
- Immediate include surface: `arpa/inet.h`, `asm/byteorder.h`, `errno.h`, `error.h`, `linux/filter.h`, `linux/if_packet.h`, `linux/ipv6.h`, `linux/virtio_net.h`.
- Detected declarations: `struct udp_encap_hdr`, `function gettimeofday_ms`, `function checksum_nofold`, `function checksum_fold`, `function checksum`, `function open_inet`, `function open_packet`, `function send_inet`, `function eth_str_to_addr`, `function send_packet`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.