Skip to content

Commit 6888a03

Browse files
author
Martin KaFai Lau
committed
Merge branch 'selftests-bpf-test-sockmap-sockhash-redirection'
Michal Luczaj says: ==================== selftests/bpf: Test sockmap/sockhash redirection The idea behind this series is to comprehensively test the BPF redirection: BPF_MAP_TYPE_SOCKMAP, BPF_MAP_TYPE_SOCKHASH x sk_msg-to-egress, sk_msg-to-ingress, sk_skb-to-egress, sk_skb-to-ingress x AF_INET, SOCK_STREAM, AF_INET6, SOCK_STREAM, AF_INET, SOCK_DGRAM, AF_INET6, SOCK_DGRAM, AF_UNIX, SOCK_STREAM, AF_UNIX, SOCK_DGRAM, AF_VSOCK, SOCK_STREAM, AF_VSOCK, SOCK_SEQPACKET New module is introduced, sockmap_redir: all supported and unsupported redirect combinations are tested for success and failure respectively. Code is pretty much stolen/adapted from Jakub Sitnicki's sockmap_redir_matrix.c [1]. Usage: $ cd tools/testing/selftests/bpf $ make $ sudo ./test_progs -t sockmap_redir ... Summary: 1/576 PASSED, 0 SKIPPED, 0 FAILED [1]: https://github.com/jsitnicki/sockmap-redir-matrix/blob/main/sockmap_redir_matrix.c Changes in v3: - Drop unrelated changes; sockmap_listen, test_sockmap_listen, doc - Collect tags [Jakub, John] - Introduce BPF verdict programs especially for sockmap_redir [Jiayuan] - Link to v2: https://lore.kernel.org/r/[email protected] Changes in v2: - Verify that the unsupported redirect combos do fail [Jakub] - Dedup tests in sockmap_listen - Cosmetic changes and code reordering - Link to v1: https://lore.kernel.org/bpf/[email protected]/ ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Martin KaFai Lau <[email protected]>
2 parents 5ead949 + c04eeeb commit 6888a03

File tree

5 files changed

+623
-476
lines changed

5 files changed

+623
-476
lines changed

tools/testing/selftests/bpf/prog_tests/socket_helpers.h

Lines changed: 79 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#ifndef __SOCKET_HELPERS__
44
#define __SOCKET_HELPERS__
55

6+
#include <sys/un.h>
67
#include <linux/vm_sockets.h>
78

89
/* include/linux/net.h */
@@ -169,6 +170,15 @@ static inline void init_addr_loopback6(struct sockaddr_storage *ss,
169170
*len = sizeof(*addr6);
170171
}
171172

173+
static inline void init_addr_loopback_unix(struct sockaddr_storage *ss,
174+
socklen_t *len)
175+
{
176+
struct sockaddr_un *addr = memset(ss, 0, sizeof(*ss));
177+
178+
addr->sun_family = AF_UNIX;
179+
*len = sizeof(sa_family_t);
180+
}
181+
172182
static inline void init_addr_loopback_vsock(struct sockaddr_storage *ss,
173183
socklen_t *len)
174184
{
@@ -190,6 +200,9 @@ static inline void init_addr_loopback(int family, struct sockaddr_storage *ss,
190200
case AF_INET6:
191201
init_addr_loopback6(ss, len);
192202
return;
203+
case AF_UNIX:
204+
init_addr_loopback_unix(ss, len);
205+
return;
193206
case AF_VSOCK:
194207
init_addr_loopback_vsock(ss, len);
195208
return;
@@ -315,21 +328,27 @@ static inline int create_pair(int family, int sotype, int *p0, int *p1)
315328
{
316329
__close_fd int s, c = -1, p = -1;
317330
struct sockaddr_storage addr;
318-
socklen_t len = sizeof(addr);
331+
socklen_t len;
319332
int err;
320333

321334
s = socket_loopback(family, sotype);
322335
if (s < 0)
323336
return s;
324337

325-
err = xgetsockname(s, sockaddr(&addr), &len);
326-
if (err)
327-
return err;
328-
329338
c = xsocket(family, sotype, 0);
330339
if (c < 0)
331340
return c;
332341

342+
init_addr_loopback(family, &addr, &len);
343+
err = xbind(c, sockaddr(&addr), len);
344+
if (err)
345+
return err;
346+
347+
len = sizeof(addr);
348+
err = xgetsockname(s, sockaddr(&addr), &len);
349+
if (err)
350+
return err;
351+
333352
err = connect(c, sockaddr(&addr), len);
334353
if (err) {
335354
if (errno != EINPROGRESS) {
@@ -391,4 +410,59 @@ static inline int create_socket_pairs(int family, int sotype, int *c0, int *c1,
391410
return err;
392411
}
393412

413+
static inline const char *socket_kind_to_str(int sock_fd)
414+
{
415+
socklen_t opt_len;
416+
int domain, type;
417+
418+
opt_len = sizeof(domain);
419+
if (getsockopt(sock_fd, SOL_SOCKET, SO_DOMAIN, &domain, &opt_len))
420+
FAIL_ERRNO("getsockopt(SO_DOMAIN)");
421+
422+
opt_len = sizeof(type);
423+
if (getsockopt(sock_fd, SOL_SOCKET, SO_TYPE, &type, &opt_len))
424+
FAIL_ERRNO("getsockopt(SO_TYPE)");
425+
426+
switch (domain) {
427+
case AF_INET:
428+
switch (type) {
429+
case SOCK_STREAM:
430+
return "tcp4";
431+
case SOCK_DGRAM:
432+
return "udp4";
433+
}
434+
break;
435+
case AF_INET6:
436+
switch (type) {
437+
case SOCK_STREAM:
438+
return "tcp6";
439+
case SOCK_DGRAM:
440+
return "udp6";
441+
}
442+
break;
443+
case AF_UNIX:
444+
switch (type) {
445+
case SOCK_STREAM:
446+
return "u_str";
447+
case SOCK_DGRAM:
448+
return "u_dgr";
449+
case SOCK_SEQPACKET:
450+
return "u_seq";
451+
}
452+
break;
453+
case AF_VSOCK:
454+
switch (type) {
455+
case SOCK_STREAM:
456+
return "v_str";
457+
case SOCK_DGRAM:
458+
return "v_dgr";
459+
case SOCK_SEQPACKET:
460+
return "v_seq";
461+
}
462+
break;
463+
}
464+
465+
return "???";
466+
}
467+
394468
#endif // __SOCKET_HELPERS__

tools/testing/selftests/bpf/prog_tests/sockmap_helpers.h

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,31 @@
55

66
#define MAX_TEST_NAME 80
77

8+
#define u32(v) ((u32){(v)})
9+
#define u64(v) ((u64){(v)})
10+
811
#define __always_unused __attribute__((__unused__))
912

1013
#define xbpf_map_delete_elem(fd, key) \
1114
({ \
1215
int __ret = bpf_map_delete_elem((fd), (key)); \
13-
if (__ret < 0) \
16+
if (__ret < 0) \
1417
FAIL_ERRNO("map_delete"); \
1518
__ret; \
1619
})
1720

1821
#define xbpf_map_lookup_elem(fd, key, val) \
1922
({ \
2023
int __ret = bpf_map_lookup_elem((fd), (key), (val)); \
21-
if (__ret < 0) \
24+
if (__ret < 0) \
2225
FAIL_ERRNO("map_lookup"); \
2326
__ret; \
2427
})
2528

2629
#define xbpf_map_update_elem(fd, key, val, flags) \
2730
({ \
2831
int __ret = bpf_map_update_elem((fd), (key), (val), (flags)); \
29-
if (__ret < 0) \
32+
if (__ret < 0) \
3033
FAIL_ERRNO("map_update"); \
3134
__ret; \
3235
})
@@ -35,15 +38,15 @@
3538
({ \
3639
int __ret = \
3740
bpf_prog_attach((prog), (target), (type), (flags)); \
38-
if (__ret < 0) \
41+
if (__ret < 0) \
3942
FAIL_ERRNO("prog_attach(" #type ")"); \
4043
__ret; \
4144
})
4245

4346
#define xbpf_prog_detach2(prog, target, type) \
4447
({ \
4548
int __ret = bpf_prog_detach2((prog), (target), (type)); \
46-
if (__ret < 0) \
49+
if (__ret < 0) \
4750
FAIL_ERRNO("prog_detach2(" #type ")"); \
4851
__ret; \
4952
})
@@ -66,21 +69,15 @@
6669
__ret; \
6770
})
6871

69-
static inline int add_to_sockmap(int sock_mapfd, int fd1, int fd2)
72+
static inline int add_to_sockmap(int mapfd, int fd1, int fd2)
7073
{
71-
u64 value;
72-
u32 key;
7374
int err;
7475

75-
key = 0;
76-
value = fd1;
77-
err = xbpf_map_update_elem(sock_mapfd, &key, &value, BPF_NOEXIST);
76+
err = xbpf_map_update_elem(mapfd, &u32(0), &u64(fd1), BPF_NOEXIST);
7877
if (err)
7978
return err;
8079

81-
key = 1;
82-
value = fd2;
83-
return xbpf_map_update_elem(sock_mapfd, &key, &value, BPF_NOEXIST);
80+
return xbpf_map_update_elem(mapfd, &u32(1), &u64(fd2), BPF_NOEXIST);
8481
}
8582

8683
#endif // __SOCKMAP_HELPERS__

0 commit comments

Comments
 (0)