Commit 43080b71 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Daniel Borkmann

selftests/bpf: Fix misaligned memory accesses in xdp_bonding test

Construct packet buffer explicitly for each packet to avoid unaligned
memory accesses.
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20211124002325.1737739-13-andrii@kernel.org
parent 57428298
...@@ -218,9 +218,9 @@ static int send_udp_packets(int vary_dst_ip) ...@@ -218,9 +218,9 @@ static int send_udp_packets(int vary_dst_ip)
.h_dest = BOND2_MAC, .h_dest = BOND2_MAC,
.h_proto = htons(ETH_P_IP), .h_proto = htons(ETH_P_IP),
}; };
uint8_t buf[128] = {}; struct iphdr iph = {};
struct iphdr *iph = (struct iphdr *)(buf + sizeof(eh)); struct udphdr uh = {};
struct udphdr *uh = (struct udphdr *)(buf + sizeof(eh) + sizeof(*iph)); uint8_t buf[128];
int i, s = -1; int i, s = -1;
int ifindex; int ifindex;
...@@ -232,17 +232,16 @@ static int send_udp_packets(int vary_dst_ip) ...@@ -232,17 +232,16 @@ static int send_udp_packets(int vary_dst_ip)
if (!ASSERT_GT(ifindex, 0, "get bond1 ifindex")) if (!ASSERT_GT(ifindex, 0, "get bond1 ifindex"))
goto err; goto err;
memcpy(buf, &eh, sizeof(eh)); iph.ihl = 5;
iph->ihl = 5; iph.version = 4;
iph->version = 4; iph.tos = 16;
iph->tos = 16; iph.id = 1;
iph->id = 1; iph.ttl = 64;
iph->ttl = 64; iph.protocol = IPPROTO_UDP;
iph->protocol = IPPROTO_UDP; iph.saddr = 1;
iph->saddr = 1; iph.daddr = 2;
iph->daddr = 2; iph.tot_len = htons(sizeof(buf) - ETH_HLEN);
iph->tot_len = htons(sizeof(buf) - ETH_HLEN); iph.check = 0;
iph->check = 0;
for (i = 1; i <= NPACKETS; i++) { for (i = 1; i <= NPACKETS; i++) {
int n; int n;
...@@ -253,10 +252,15 @@ static int send_udp_packets(int vary_dst_ip) ...@@ -253,10 +252,15 @@ static int send_udp_packets(int vary_dst_ip)
}; };
/* vary the UDP destination port for even distribution with roundrobin/xor modes */ /* vary the UDP destination port for even distribution with roundrobin/xor modes */
uh->dest++; uh.dest++;
if (vary_dst_ip) if (vary_dst_ip)
iph->daddr++; iph.daddr++;
/* construct a packet */
memcpy(buf, &eh, sizeof(eh));
memcpy(buf + sizeof(eh), &iph, sizeof(iph));
memcpy(buf + sizeof(eh) + sizeof(iph), &uh, sizeof(uh));
n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&saddr_ll, sizeof(saddr_ll)); n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&saddr_ll, sizeof(saddr_ll));
if (!ASSERT_EQ(n, sizeof(buf), "sendto")) if (!ASSERT_EQ(n, sizeof(buf), "sendto"))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment