Skip to content

Commit 792f258

Browse files
author
Martin KaFai Lau
committed
Merge branch 'selftests-bpf-networking-test-cleanups'
Hoyeon Lee says: ==================== selftests/bpf: networking test cleanups This series finishes the sockaddr_storage migration in the networking selftests by removing the remaining open-coded IPv4/IPv6 wrappers (addr_port/tuple in cls_redirect, sa46 in select_reuseport). The tests now use sockaddr_storage directly. No other custom socket-address wrappers remain after this series, so the churn stops here and behavior is unchanged. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Martin KaFai Lau <[email protected]>
2 parents e0940c6 + db354a1 commit 792f258

File tree

2 files changed

+77
-112
lines changed

2 files changed

+77
-112
lines changed

tools/testing/selftests/bpf/prog_tests/cls_redirect.c

Lines changed: 43 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -22,79 +22,37 @@
2222

2323
static int duration = 0;
2424

25-
struct addr_port {
26-
in_port_t port;
27-
union {
28-
struct in_addr in_addr;
29-
struct in6_addr in6_addr;
30-
};
31-
};
32-
33-
struct tuple {
34-
int family;
35-
struct addr_port src;
36-
struct addr_port dst;
37-
};
38-
39-
static bool fill_addr_port(const struct sockaddr *sa, struct addr_port *ap)
40-
{
41-
const struct sockaddr_in6 *in6;
42-
const struct sockaddr_in *in;
43-
44-
switch (sa->sa_family) {
45-
case AF_INET:
46-
in = (const struct sockaddr_in *)sa;
47-
ap->in_addr = in->sin_addr;
48-
ap->port = in->sin_port;
49-
return true;
50-
51-
case AF_INET6:
52-
in6 = (const struct sockaddr_in6 *)sa;
53-
ap->in6_addr = in6->sin6_addr;
54-
ap->port = in6->sin6_port;
55-
return true;
56-
57-
default:
58-
return false;
59-
}
60-
}
6125

62-
static bool set_up_conn(const struct sockaddr *addr, socklen_t len, int type,
63-
int *server, int *conn, struct tuple *tuple)
26+
static bool set_up_conn(const struct sockaddr_storage *addr, socklen_t len, int type,
27+
int *server, int *conn,
28+
struct sockaddr_storage *src,
29+
struct sockaddr_storage *dst)
6430
{
6531
struct sockaddr_storage ss;
6632
socklen_t slen = sizeof(ss);
67-
struct sockaddr *sa = (struct sockaddr *)&ss;
6833

69-
*server = start_server_addr(type, (struct sockaddr_storage *)addr, len, NULL);
34+
*server = start_server_addr(type, addr, len, NULL);
7035
if (*server < 0)
7136
return false;
7237

73-
if (CHECK_FAIL(getsockname(*server, sa, &slen)))
38+
if (CHECK_FAIL(getsockname(*server, (struct sockaddr *)&ss, &slen)))
7439
goto close_server;
7540

76-
*conn = connect_to_addr(type, (struct sockaddr_storage *)sa, slen, NULL);
41+
*conn = connect_to_addr(type, &ss, slen, NULL);
7742
if (*conn < 0)
7843
goto close_server;
7944

8045
/* We want to simulate packets arriving at conn, so we have to
8146
* swap src and dst.
8247
*/
83-
slen = sizeof(ss);
84-
if (CHECK_FAIL(getsockname(*conn, sa, &slen)))
85-
goto close_conn;
86-
87-
if (CHECK_FAIL(!fill_addr_port(sa, &tuple->dst)))
48+
slen = sizeof(*dst);
49+
if (CHECK_FAIL(getsockname(*conn, (struct sockaddr *)dst, &slen)))
8850
goto close_conn;
8951

90-
slen = sizeof(ss);
91-
if (CHECK_FAIL(getpeername(*conn, sa, &slen)))
52+
slen = sizeof(*src);
53+
if (CHECK_FAIL(getpeername(*conn, (struct sockaddr *)src, &slen)))
9254
goto close_conn;
9355

94-
if (CHECK_FAIL(!fill_addr_port(sa, &tuple->src)))
95-
goto close_conn;
96-
97-
tuple->family = ss.ss_family;
9856
return true;
9957

10058
close_conn:
@@ -110,17 +68,16 @@ static socklen_t prepare_addr(struct sockaddr_storage *addr, int family)
11068
{
11169
struct sockaddr_in *addr4;
11270
struct sockaddr_in6 *addr6;
71+
memset(addr, 0, sizeof(*addr));
11372

11473
switch (family) {
11574
case AF_INET:
11675
addr4 = (struct sockaddr_in *)addr;
117-
memset(addr4, 0, sizeof(*addr4));
11876
addr4->sin_family = family;
11977
addr4->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
12078
return sizeof(*addr4);
12179
case AF_INET6:
12280
addr6 = (struct sockaddr_in6 *)addr;
123-
memset(addr6, 0, sizeof(*addr6));
12481
addr6->sin6_family = family;
12582
addr6->sin6_addr = in6addr_loopback;
12683
return sizeof(*addr6);
@@ -242,9 +199,15 @@ static void encap_init(encap_headers_t *encap, uint8_t hop_count, uint8_t proto)
242199
}
243200

244201
static size_t build_input(const struct test_cfg *test, void *const buf,
245-
const struct tuple *tuple)
202+
const struct sockaddr_storage *src,
203+
const struct sockaddr_storage *dst)
246204
{
247-
in_port_t sport = tuple->src.port;
205+
struct sockaddr_in6 *src_in6 = (struct sockaddr_in6 *)src;
206+
struct sockaddr_in6 *dst_in6 = (struct sockaddr_in6 *)dst;
207+
struct sockaddr_in *src_in = (struct sockaddr_in *)src;
208+
struct sockaddr_in *dst_in = (struct sockaddr_in *)dst;
209+
sa_family_t family = src->ss_family;
210+
in_port_t sport, dport;
248211
encap_headers_t encap;
249212
struct iphdr ip;
250213
struct ipv6hdr ipv6;
@@ -254,8 +217,11 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
254217
uint8_t *p = buf;
255218
int proto;
256219

220+
sport = (family == AF_INET) ? src_in->sin_port : src_in6->sin6_port;
221+
dport = (family == AF_INET) ? dst_in->sin_port : dst_in6->sin6_port;
222+
257223
proto = IPPROTO_IPIP;
258-
if (tuple->family == AF_INET6)
224+
if (family == AF_INET6)
259225
proto = IPPROTO_IPV6;
260226

261227
encap_init(&encap, test->hops == ONE_HOP ? 1 : 0, proto);
@@ -270,15 +236,15 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
270236
if (test->type == UDP)
271237
proto = IPPROTO_UDP;
272238

273-
switch (tuple->family) {
239+
switch (family) {
274240
case AF_INET:
275241
ip = (struct iphdr){
276242
.ihl = 5,
277243
.version = 4,
278244
.ttl = IPDEFTTL,
279245
.protocol = proto,
280-
.saddr = tuple->src.in_addr.s_addr,
281-
.daddr = tuple->dst.in_addr.s_addr,
246+
.saddr = src_in->sin_addr.s_addr,
247+
.daddr = dst_in->sin_addr.s_addr,
282248
};
283249
p = mempcpy(p, &ip, sizeof(ip));
284250
break;
@@ -287,8 +253,8 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
287253
.version = 6,
288254
.hop_limit = IPDEFTTL,
289255
.nexthdr = proto,
290-
.saddr = tuple->src.in6_addr,
291-
.daddr = tuple->dst.in6_addr,
256+
.saddr = src_in6->sin6_addr,
257+
.daddr = dst_in6->sin6_addr,
292258
};
293259
p = mempcpy(p, &ipv6, sizeof(ipv6));
294260
break;
@@ -303,18 +269,16 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
303269
case TCP:
304270
tcp = (struct tcphdr){
305271
.source = sport,
306-
.dest = tuple->dst.port,
272+
.dest = dport,
273+
.syn = (test->flags == SYN),
274+
.ack = (test->flags == ACK),
307275
};
308-
if (test->flags == SYN)
309-
tcp.syn = true;
310-
if (test->flags == ACK)
311-
tcp.ack = true;
312276
p = mempcpy(p, &tcp, sizeof(tcp));
313277
break;
314278
case UDP:
315279
udp = (struct udphdr){
316280
.source = sport,
317-
.dest = tuple->dst.port,
281+
.dest = dport,
318282
};
319283
p = mempcpy(p, &udp, sizeof(udp));
320284
break;
@@ -339,27 +303,26 @@ static void test_cls_redirect_common(struct bpf_program *prog)
339303
LIBBPF_OPTS(bpf_test_run_opts, tattr);
340304
int families[] = { AF_INET, AF_INET6 };
341305
struct sockaddr_storage ss;
342-
struct sockaddr *addr;
343306
socklen_t slen;
344307
int i, j, err, prog_fd;
345308
int servers[__NR_KIND][ARRAY_SIZE(families)] = {};
346309
int conns[__NR_KIND][ARRAY_SIZE(families)] = {};
347-
struct tuple tuples[__NR_KIND][ARRAY_SIZE(families)];
310+
struct sockaddr_storage srcs[__NR_KIND][ARRAY_SIZE(families)];
311+
struct sockaddr_storage dsts[__NR_KIND][ARRAY_SIZE(families)];
348312

349-
addr = (struct sockaddr *)&ss;
350313
for (i = 0; i < ARRAY_SIZE(families); i++) {
351314
slen = prepare_addr(&ss, families[i]);
352315
if (CHECK_FAIL(!slen))
353316
goto cleanup;
354317

355-
if (CHECK_FAIL(!set_up_conn(addr, slen, SOCK_DGRAM,
318+
if (CHECK_FAIL(!set_up_conn(&ss, slen, SOCK_DGRAM,
356319
&servers[UDP][i], &conns[UDP][i],
357-
&tuples[UDP][i])))
320+
&srcs[UDP][i], &dsts[UDP][i])))
358321
goto cleanup;
359322

360-
if (CHECK_FAIL(!set_up_conn(addr, slen, SOCK_STREAM,
323+
if (CHECK_FAIL(!set_up_conn(&ss, slen, SOCK_STREAM,
361324
&servers[TCP][i], &conns[TCP][i],
362-
&tuples[TCP][i])))
325+
&srcs[TCP][i], &dsts[TCP][i])))
363326
goto cleanup;
364327
}
365328

@@ -368,19 +331,20 @@ static void test_cls_redirect_common(struct bpf_program *prog)
368331
struct test_cfg *test = &tests[i];
369332

370333
for (j = 0; j < ARRAY_SIZE(families); j++) {
371-
struct tuple *tuple = &tuples[test->type][j];
334+
struct sockaddr_storage *src = &srcs[test->type][j];
335+
struct sockaddr_storage *dst = &dsts[test->type][j];
372336
char input[256];
373337
char tmp[256];
374338

375-
test_str(tmp, sizeof(tmp), test, tuple->family);
339+
test_str(tmp, sizeof(tmp), test, families[j]);
376340
if (!test__start_subtest(tmp))
377341
continue;
378342

379343
tattr.data_out = tmp;
380344
tattr.data_size_out = sizeof(tmp);
381345

382346
tattr.data_in = input;
383-
tattr.data_size_in = build_input(test, input, tuple);
347+
tattr.data_size_in = build_input(test, input, src, dst);
384348
if (CHECK_FAIL(!tattr.data_size_in))
385349
continue;
386350

tools/testing/selftests/bpf/prog_tests/select_reuseport.c

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,7 @@ static struct bpf_object *obj;
4141
static __u32 index_zero;
4242
static int epfd;
4343

44-
static union sa46 {
45-
struct sockaddr_in6 v6;
46-
struct sockaddr_in v4;
47-
sa_family_t family;
48-
} srv_sa;
44+
static struct sockaddr_storage srv_sa;
4945

5046
#define RET_IF(condition, tag, format...) ({ \
5147
if (CHECK_FAIL(condition)) { \
@@ -135,24 +131,24 @@ static int prepare_bpf_obj(void)
135131
return 0;
136132
}
137133

138-
static void sa46_init_loopback(union sa46 *sa, sa_family_t family)
134+
static void ss_init_loopback(struct sockaddr_storage *sa, sa_family_t family)
139135
{
140136
memset(sa, 0, sizeof(*sa));
141-
sa->family = family;
142-
if (sa->family == AF_INET6)
143-
sa->v6.sin6_addr = in6addr_loopback;
137+
sa->ss_family = family;
138+
if (sa->ss_family == AF_INET6)
139+
((struct sockaddr_in6 *)sa)->sin6_addr = in6addr_loopback;
144140
else
145-
sa->v4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
141+
((struct sockaddr_in *)sa)->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
146142
}
147143

148-
static void sa46_init_inany(union sa46 *sa, sa_family_t family)
144+
static void ss_init_inany(struct sockaddr_storage *sa, sa_family_t family)
149145
{
150146
memset(sa, 0, sizeof(*sa));
151-
sa->family = family;
152-
if (sa->family == AF_INET6)
153-
sa->v6.sin6_addr = in6addr_any;
147+
sa->ss_family = family;
148+
if (sa->ss_family == AF_INET6)
149+
((struct sockaddr_in6 *)sa)->sin6_addr = in6addr_any;
154150
else
155-
sa->v4.sin_addr.s_addr = INADDR_ANY;
151+
((struct sockaddr_in *)sa)->sin_addr.s_addr = INADDR_ANY;
156152
}
157153

158154
static int read_int_sysctl(const char *sysctl)
@@ -228,7 +224,7 @@ static void check_data(int type, sa_family_t family, const struct cmd *cmd,
228224
int cli_fd)
229225
{
230226
struct data_check expected = {}, result;
231-
union sa46 cli_sa;
227+
struct sockaddr_storage cli_sa;
232228
socklen_t addrlen;
233229
int err;
234230

@@ -251,26 +247,32 @@ static void check_data(int type, sa_family_t family, const struct cmd *cmd,
251247
}
252248

253249
if (family == AF_INET6) {
250+
struct sockaddr_in6 *srv_v6 = (struct sockaddr_in6 *)&srv_sa;
251+
struct sockaddr_in6 *cli_v6 = (struct sockaddr_in6 *)&cli_sa;
252+
254253
expected.eth_protocol = htons(ETH_P_IPV6);
255-
expected.bind_inany = !srv_sa.v6.sin6_addr.s6_addr32[3] &&
256-
!srv_sa.v6.sin6_addr.s6_addr32[2] &&
257-
!srv_sa.v6.sin6_addr.s6_addr32[1] &&
258-
!srv_sa.v6.sin6_addr.s6_addr32[0];
254+
expected.bind_inany = !srv_v6->sin6_addr.s6_addr32[3] &&
255+
!srv_v6->sin6_addr.s6_addr32[2] &&
256+
!srv_v6->sin6_addr.s6_addr32[1] &&
257+
!srv_v6->sin6_addr.s6_addr32[0];
259258

260-
memcpy(&expected.skb_addrs[0], cli_sa.v6.sin6_addr.s6_addr32,
261-
sizeof(cli_sa.v6.sin6_addr));
259+
memcpy(&expected.skb_addrs[0], cli_v6->sin6_addr.s6_addr32,
260+
sizeof(cli_v6->sin6_addr));
262261
memcpy(&expected.skb_addrs[4], &in6addr_loopback,
263262
sizeof(in6addr_loopback));
264-
expected.skb_ports[0] = cli_sa.v6.sin6_port;
265-
expected.skb_ports[1] = srv_sa.v6.sin6_port;
263+
expected.skb_ports[0] = cli_v6->sin6_port;
264+
expected.skb_ports[1] = srv_v6->sin6_port;
266265
} else {
266+
struct sockaddr_in *srv_v4 = (struct sockaddr_in *)&srv_sa;
267+
struct sockaddr_in *cli_v4 = (struct sockaddr_in *)&cli_sa;
268+
267269
expected.eth_protocol = htons(ETH_P_IP);
268-
expected.bind_inany = !srv_sa.v4.sin_addr.s_addr;
270+
expected.bind_inany = !srv_v4->sin_addr.s_addr;
269271

270-
expected.skb_addrs[0] = cli_sa.v4.sin_addr.s_addr;
272+
expected.skb_addrs[0] = cli_v4->sin_addr.s_addr;
271273
expected.skb_addrs[1] = htonl(INADDR_LOOPBACK);
272-
expected.skb_ports[0] = cli_sa.v4.sin_port;
273-
expected.skb_ports[1] = srv_sa.v4.sin_port;
274+
expected.skb_ports[0] = cli_v4->sin_port;
275+
expected.skb_ports[1] = srv_v4->sin_port;
274276
}
275277

276278
if (memcmp(&result, &expected, offsetof(struct data_check,
@@ -364,16 +366,15 @@ static void check_results(void)
364366
static int send_data(int type, sa_family_t family, void *data, size_t len,
365367
enum result expected)
366368
{
367-
union sa46 cli_sa;
369+
struct sockaddr_storage cli_sa;
368370
int fd, err;
369371

370372
fd = socket(family, type, 0);
371373
RET_ERR(fd == -1, "socket()", "fd:%d errno:%d\n", fd, errno);
372374

373-
sa46_init_loopback(&cli_sa, family);
375+
ss_init_loopback(&cli_sa, family);
374376
err = bind(fd, (struct sockaddr *)&cli_sa, sizeof(cli_sa));
375377
RET_ERR(fd == -1, "bind(cli_sa)", "err:%d errno:%d\n", err, errno);
376-
377378
err = sendto(fd, data, len, MSG_FASTOPEN, (struct sockaddr *)&srv_sa,
378379
sizeof(srv_sa));
379380
RET_ERR(err != len && expected >= PASS,
@@ -589,9 +590,9 @@ static void prepare_sk_fds(int type, sa_family_t family, bool inany)
589590
socklen_t addrlen;
590591

591592
if (inany)
592-
sa46_init_inany(&srv_sa, family);
593+
ss_init_inany(&srv_sa, family);
593594
else
594-
sa46_init_loopback(&srv_sa, family);
595+
ss_init_loopback(&srv_sa, family);
595596
addrlen = sizeof(srv_sa);
596597

597598
/*

0 commit comments

Comments
 (0)