Skip to content

Commit ebde202

Browse files
HoyeonRheeKernel Patches Daemon
authored andcommitted
selftests/bpf: use sockaddr_storage instead of addr_port in cls_redirect test
The cls_redirect test uses a custom addr_port structure to represent IPv4/IPv6 addresses and ports. This custom wrapper requires extra conversion logic and specific helpers such as fill_addr_port(), which are no longer necessary when using standard socket address structures. This commit replaces addr_port with the standard sockaddr_storage so that test handles address families and ports using the native socket types. This removes the custom helper, eliminates redundant casts, and simplifies tuple handling without functional changes. Signed-off-by: Hoyeon Lee <[email protected]>
1 parent 4a6b8b7 commit ebde202

File tree

1 file changed

+30
-65
lines changed

1 file changed

+30
-65
lines changed

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

Lines changed: 30 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -22,79 +22,42 @@
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-
3325
struct tuple {
3426
int family;
35-
struct addr_port src;
36-
struct addr_port dst;
27+
struct sockaddr_storage src;
28+
struct sockaddr_storage dst;
3729
};
3830

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-
}
6131

62-
static bool set_up_conn(const struct sockaddr *addr, socklen_t len, int type,
32+
static bool set_up_conn(const struct sockaddr_storage *addr, socklen_t len, int type,
6333
int *server, int *conn, struct tuple *tuple)
6434
{
6535
struct sockaddr_storage ss;
6636
socklen_t slen = sizeof(ss);
67-
struct sockaddr *sa = (struct sockaddr *)&ss;
6837

69-
*server = start_server_addr(type, (struct sockaddr_storage *)addr, len, NULL);
38+
*server = start_server_addr(type, addr, len, NULL);
7039
if (*server < 0)
7140
return false;
7241

73-
if (CHECK_FAIL(getsockname(*server, sa, &slen)))
42+
if (CHECK_FAIL(getsockname(*server, (struct sockaddr *)&ss, &slen)))
7443
goto close_server;
7544

76-
*conn = connect_to_addr(type, (struct sockaddr_storage *)sa, slen, NULL);
45+
*conn = connect_to_addr(type, &ss, slen, NULL);
7746
if (*conn < 0)
7847
goto close_server;
7948

8049
/* We want to simulate packets arriving at conn, so we have to
8150
* swap src and dst.
8251
*/
83-
slen = sizeof(ss);
84-
if (CHECK_FAIL(getsockname(*conn, sa, &slen)))
52+
slen = sizeof(tuple->dst);
53+
if (CHECK_FAIL(getsockname(*conn, (struct sockaddr *)&tuple->dst, &slen)))
8554
goto close_conn;
8655

87-
if (CHECK_FAIL(!fill_addr_port(sa, &tuple->dst)))
56+
slen = sizeof(tuple->src);
57+
if (CHECK_FAIL(getpeername(*conn, (struct sockaddr *)&tuple->src, &slen)))
8858
goto close_conn;
8959

90-
slen = sizeof(ss);
91-
if (CHECK_FAIL(getpeername(*conn, sa, &slen)))
92-
goto close_conn;
93-
94-
if (CHECK_FAIL(!fill_addr_port(sa, &tuple->src)))
95-
goto close_conn;
96-
97-
tuple->family = ss.ss_family;
60+
tuple->family = tuple->dst.ss_family;
9861
return true;
9962

10063
close_conn:
@@ -110,17 +73,16 @@ static socklen_t prepare_addr(struct sockaddr_storage *addr, int family)
11073
{
11174
struct sockaddr_in *addr4;
11275
struct sockaddr_in6 *addr6;
76+
memset(addr, 0, sizeof(*addr));
11377

11478
switch (family) {
11579
case AF_INET:
11680
addr4 = (struct sockaddr_in *)addr;
117-
memset(addr4, 0, sizeof(*addr4));
11881
addr4->sin_family = family;
11982
addr4->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
12083
return sizeof(*addr4);
12184
case AF_INET6:
12285
addr6 = (struct sockaddr_in6 *)addr;
123-
memset(addr6, 0, sizeof(*addr6));
12486
addr6->sin6_family = family;
12587
addr6->sin6_addr = in6addr_loopback;
12688
return sizeof(*addr6);
@@ -244,7 +206,11 @@ static void encap_init(encap_headers_t *encap, uint8_t hop_count, uint8_t proto)
244206
static size_t build_input(const struct test_cfg *test, void *const buf,
245207
const struct tuple *tuple)
246208
{
247-
in_port_t sport = tuple->src.port;
209+
struct sockaddr_in6 *src_in6 = (struct sockaddr_in6 *)&tuple->src;
210+
struct sockaddr_in6 *dst_in6 = (struct sockaddr_in6 *)&tuple->dst;
211+
struct sockaddr_in *src_in = (struct sockaddr_in *)&tuple->src;
212+
struct sockaddr_in *dst_in = (struct sockaddr_in *)&tuple->dst;
213+
in_port_t sport, dport;
248214
encap_headers_t encap;
249215
struct iphdr ip;
250216
struct ipv6hdr ipv6;
@@ -254,6 +220,9 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
254220
uint8_t *p = buf;
255221
int proto;
256222

223+
sport = (tuple->family == AF_INET) ? src_in->sin_port : src_in6->sin6_port;
224+
dport = (tuple->family == AF_INET) ? dst_in->sin_port : dst_in6->sin6_port;
225+
257226
proto = IPPROTO_IPIP;
258227
if (tuple->family == AF_INET6)
259228
proto = IPPROTO_IPV6;
@@ -277,8 +246,8 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
277246
.version = 4,
278247
.ttl = IPDEFTTL,
279248
.protocol = proto,
280-
.saddr = tuple->src.in_addr.s_addr,
281-
.daddr = tuple->dst.in_addr.s_addr,
249+
.saddr = src_in->sin_addr.s_addr,
250+
.daddr = dst_in->sin_addr.s_addr,
282251
};
283252
p = mempcpy(p, &ip, sizeof(ip));
284253
break;
@@ -287,8 +256,8 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
287256
.version = 6,
288257
.hop_limit = IPDEFTTL,
289258
.nexthdr = proto,
290-
.saddr = tuple->src.in6_addr,
291-
.daddr = tuple->dst.in6_addr,
259+
.saddr = src_in6->sin6_addr,
260+
.daddr = dst_in6->sin6_addr,
292261
};
293262
p = mempcpy(p, &ipv6, sizeof(ipv6));
294263
break;
@@ -303,18 +272,16 @@ static size_t build_input(const struct test_cfg *test, void *const buf,
303272
case TCP:
304273
tcp = (struct tcphdr){
305274
.source = sport,
306-
.dest = tuple->dst.port,
275+
.dest = dport,
276+
.syn = (test->flags == SYN),
277+
.ack = (test->flags == ACK),
307278
};
308-
if (test->flags == SYN)
309-
tcp.syn = true;
310-
if (test->flags == ACK)
311-
tcp.ack = true;
312279
p = mempcpy(p, &tcp, sizeof(tcp));
313280
break;
314281
case UDP:
315282
udp = (struct udphdr){
316283
.source = sport,
317-
.dest = tuple->dst.port,
284+
.dest = dport,
318285
};
319286
p = mempcpy(p, &udp, sizeof(udp));
320287
break;
@@ -339,25 +306,23 @@ static void test_cls_redirect_common(struct bpf_program *prog)
339306
LIBBPF_OPTS(bpf_test_run_opts, tattr);
340307
int families[] = { AF_INET, AF_INET6 };
341308
struct sockaddr_storage ss;
342-
struct sockaddr *addr;
343309
socklen_t slen;
344310
int i, j, err, prog_fd;
345311
int servers[__NR_KIND][ARRAY_SIZE(families)] = {};
346312
int conns[__NR_KIND][ARRAY_SIZE(families)] = {};
347313
struct tuple tuples[__NR_KIND][ARRAY_SIZE(families)];
348314

349-
addr = (struct sockaddr *)&ss;
350315
for (i = 0; i < ARRAY_SIZE(families); i++) {
351316
slen = prepare_addr(&ss, families[i]);
352317
if (CHECK_FAIL(!slen))
353318
goto cleanup;
354319

355-
if (CHECK_FAIL(!set_up_conn(addr, slen, SOCK_DGRAM,
320+
if (CHECK_FAIL(!set_up_conn(&ss, slen, SOCK_DGRAM,
356321
&servers[UDP][i], &conns[UDP][i],
357322
&tuples[UDP][i])))
358323
goto cleanup;
359324

360-
if (CHECK_FAIL(!set_up_conn(addr, slen, SOCK_STREAM,
325+
if (CHECK_FAIL(!set_up_conn(&ss, slen, SOCK_STREAM,
361326
&servers[TCP][i], &conns[TCP][i],
362327
&tuples[TCP][i])))
363328
goto cleanup;

0 commit comments

Comments
 (0)