Commit f4504af6 authored by Alexis Lothoré (eBPF Foundation)'s avatar Alexis Lothoré (eBPF Foundation) Committed by Alexei Starovoitov
Browse files

selftests/bpf: move ip checksum helper to network helpers



xdp_metadata test has a small helper computing ipv4 checksums to allow
manually building packets.

Move this helper to network_helpers to share it with other tests.

Signed-off-by: default avatarAlexis Lothoré (eBPF Foundation) <alexis.lothore@bootlin.com>
Acked-by: default avatarStanislav Fomichev <sdf@fomichev.me>
Link: https://lore.kernel.org/r/20241120-flow_dissector-v3-9-45b46494f937@bootlin.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent c2401082
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -105,6 +105,30 @@ static __u16 csum_fold(__u32 csum)
	return (__u16)~csum;
}

static __wsum csum_partial(const void *buf, int len, __wsum sum)
{
	__u16 *p = (__u16 *)buf;
	int num_u16 = len >> 1;
	int i;

	for (i = 0; i < num_u16; i++)
		sum += p[i];

	return sum;
}

static inline __sum16 build_ip_csum(struct iphdr *iph)
{
	__u32 sum = 0;
	__u16 *p;

	iph->check = 0;
	p = (void *)iph;
	sum = csum_partial(p, iph->ihl << 2, 0);

	return csum_fold(sum);
}

static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
					__u32 len, __u8 proto,
					__wsum csum)
+1 −18
Original line number Diff line number Diff line
@@ -133,23 +133,6 @@ static void close_xsk(struct xsk *xsk)
	munmap(xsk->umem_area, UMEM_SIZE);
}

static void ip_csum(struct iphdr *iph)
{
	__u32 sum = 0;
	__u16 *p;
	int i;

	iph->check = 0;
	p = (void *)iph;
	for (i = 0; i < sizeof(*iph) / sizeof(*p); i++)
		sum += p[i];

	while (sum >> 16)
		sum = (sum & 0xffff) + (sum >> 16);

	iph->check = ~sum;
}

static int generate_packet(struct xsk *xsk, __u16 dst_port)
{
	struct xsk_tx_metadata *meta;
@@ -192,7 +175,7 @@ static int generate_packet(struct xsk *xsk, __u16 dst_port)
	iph->protocol = IPPROTO_UDP;
	ASSERT_EQ(inet_pton(FAMILY, TX_ADDR, &iph->saddr), 1, "inet_pton(TX_ADDR)");
	ASSERT_EQ(inet_pton(FAMILY, RX_ADDR, &iph->daddr), 1, "inet_pton(RX_ADDR)");
	ip_csum(iph);
	iph->check = build_ip_csum(iph);

	udph->source = htons(UDP_SOURCE_PORT);
	udph->dest = htons(dst_port);