Skip to content

Commit 8ccd382

Browse files
author
Martin KaFai Lau
committed
Merge branch 'bpf-next/net' into for-next
Signed-off-by: Martin KaFai Lau <[email protected]>
2 parents c3d80ea + db16377 commit 8ccd382

File tree

3 files changed

+124
-170
lines changed

3 files changed

+124
-170
lines changed

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

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -451,11 +451,11 @@ static void test_sockmap_progs_query(enum bpf_attach_type attach_type)
451451
#define MAX_EVENTS 10
452452
static void test_sockmap_skb_verdict_shutdown(void)
453453
{
454+
int n, err, map, verdict, c1 = -1, p1 = -1;
454455
struct epoll_event ev, events[MAX_EVENTS];
455-
int n, err, map, verdict, s, c1 = -1, p1 = -1;
456456
struct test_sockmap_pass_prog *skel;
457-
int epollfd;
458457
int zero = 0;
458+
int epollfd;
459459
char b;
460460

461461
skel = test_sockmap_pass_prog__open_and_load();
@@ -469,10 +469,7 @@ static void test_sockmap_skb_verdict_shutdown(void)
469469
if (!ASSERT_OK(err, "bpf_prog_attach"))
470470
goto out;
471471

472-
s = socket_loopback(AF_INET, SOCK_STREAM);
473-
if (s < 0)
474-
goto out;
475-
err = create_pair(s, AF_INET, SOCK_STREAM, &c1, &p1);
472+
err = create_pair(AF_INET, SOCK_STREAM, &c1, &p1);
476473
if (err < 0)
477474
goto out;
478475

@@ -506,8 +503,8 @@ static void test_sockmap_skb_verdict_shutdown(void)
506503

507504
static void test_sockmap_skb_verdict_fionread(bool pass_prog)
508505
{
506+
int err, map, verdict, c0 = -1, c1 = -1, p0 = -1, p1 = -1;
509507
int expected, zero = 0, sent, recvd, avail;
510-
int err, map, verdict, s, c0 = -1, c1 = -1, p0 = -1, p1 = -1;
511508
struct test_sockmap_pass_prog *pass = NULL;
512509
struct test_sockmap_drop_prog *drop = NULL;
513510
char buf[256] = "0123456789";
@@ -534,11 +531,8 @@ static void test_sockmap_skb_verdict_fionread(bool pass_prog)
534531
if (!ASSERT_OK(err, "bpf_prog_attach"))
535532
goto out;
536533

537-
s = socket_loopback(AF_INET, SOCK_STREAM);
538-
if (!ASSERT_GT(s, -1, "socket_loopback(s)"))
539-
goto out;
540-
err = create_socket_pairs(s, AF_INET, SOCK_STREAM, &c0, &c1, &p0, &p1);
541-
if (!ASSERT_OK(err, "create_socket_pairs(s)"))
534+
err = create_socket_pairs(AF_INET, SOCK_STREAM, &c0, &c1, &p0, &p1);
535+
if (!ASSERT_OK(err, "create_socket_pairs()"))
542536
goto out;
543537

544538
err = bpf_map_update_elem(map, &zero, &c1, BPF_NOEXIST);
@@ -570,16 +564,12 @@ static void test_sockmap_skb_verdict_fionread(bool pass_prog)
570564

571565
static void test_sockmap_skb_verdict_peek_helper(int map)
572566
{
573-
int err, s, c1, p1, zero = 0, sent, recvd, avail;
567+
int err, c1, p1, zero = 0, sent, recvd, avail;
574568
char snd[256] = "0123456789";
575569
char rcv[256] = "0";
576570

577-
s = socket_loopback(AF_INET, SOCK_STREAM);
578-
if (!ASSERT_GT(s, -1, "socket_loopback(s)"))
579-
return;
580-
581-
err = create_pair(s, AF_INET, SOCK_STREAM, &c1, &p1);
582-
if (!ASSERT_OK(err, "create_pairs(s)"))
571+
err = create_pair(AF_INET, SOCK_STREAM, &c1, &p1);
572+
if (!ASSERT_OK(err, "create_pair()"))
583573
return;
584574

585575
err = bpf_map_update_elem(map, &zero, &c1, BPF_NOEXIST);

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

Lines changed: 101 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33

44
#include <linux/vm_sockets.h>
55

6+
/* include/linux/net.h */
7+
#define SOCK_TYPE_MASK 0xf
8+
69
#define IO_TIMEOUT_SEC 30
710
#define MAX_STRERR_LEN 256
811
#define MAX_TEST_NAME 80
@@ -14,6 +17,17 @@
1417

1518
#define __always_unused __attribute__((__unused__))
1619

20+
/* include/linux/cleanup.h */
21+
#define __get_and_null(p, nullvalue) \
22+
({ \
23+
__auto_type __ptr = &(p); \
24+
__auto_type __val = *__ptr; \
25+
*__ptr = nullvalue; \
26+
__val; \
27+
})
28+
29+
#define take_fd(fd) __get_and_null(fd, -EBADF)
30+
1731
#define _FAIL(errnum, fmt...) \
1832
({ \
1933
error_at_line(0, (errnum), __func__, __LINE__, fmt); \
@@ -179,6 +193,14 @@
179193
__ret; \
180194
})
181195

196+
static inline void close_fd(int *fd)
197+
{
198+
if (*fd >= 0)
199+
xclose(*fd);
200+
}
201+
202+
#define __close_fd __attribute__((cleanup(close_fd)))
203+
182204
static inline int poll_connect(int fd, unsigned int timeout_sec)
183205
{
184206
struct timeval timeout = { .tv_sec = timeout_sec };
@@ -312,54 +334,6 @@ static inline int add_to_sockmap(int sock_mapfd, int fd1, int fd2)
312334
return xbpf_map_update_elem(sock_mapfd, &key, &value, BPF_NOEXIST);
313335
}
314336

315-
static inline int create_pair(int s, int family, int sotype, int *c, int *p)
316-
{
317-
struct sockaddr_storage addr;
318-
socklen_t len;
319-
int err = 0;
320-
321-
len = sizeof(addr);
322-
err = xgetsockname(s, sockaddr(&addr), &len);
323-
if (err)
324-
return err;
325-
326-
*c = xsocket(family, sotype, 0);
327-
if (*c < 0)
328-
return errno;
329-
err = xconnect(*c, sockaddr(&addr), len);
330-
if (err) {
331-
err = errno;
332-
goto close_cli0;
333-
}
334-
335-
*p = xaccept_nonblock(s, NULL, NULL);
336-
if (*p < 0) {
337-
err = errno;
338-
goto close_cli0;
339-
}
340-
return err;
341-
close_cli0:
342-
close(*c);
343-
return err;
344-
}
345-
346-
static inline int create_socket_pairs(int s, int family, int sotype,
347-
int *c0, int *c1, int *p0, int *p1)
348-
{
349-
int err;
350-
351-
err = create_pair(s, family, sotype, c0, p0);
352-
if (err)
353-
return err;
354-
355-
err = create_pair(s, family, sotype, c1, p1);
356-
if (err) {
357-
close(*c0);
358-
close(*p0);
359-
}
360-
return err;
361-
}
362-
363337
static inline int enable_reuseport(int s, int progfd)
364338
{
365339
int err, one = 1;
@@ -412,5 +386,84 @@ static inline int socket_loopback(int family, int sotype)
412386
return socket_loopback_reuseport(family, sotype, -1);
413387
}
414388

389+
static inline int create_pair(int family, int sotype, int *p0, int *p1)
390+
{
391+
__close_fd int s, c = -1, p = -1;
392+
struct sockaddr_storage addr;
393+
socklen_t len = sizeof(addr);
394+
int err;
395+
396+
s = socket_loopback(family, sotype);
397+
if (s < 0)
398+
return s;
399+
400+
err = xgetsockname(s, sockaddr(&addr), &len);
401+
if (err)
402+
return err;
403+
404+
c = xsocket(family, sotype, 0);
405+
if (c < 0)
406+
return c;
407+
408+
err = connect(c, sockaddr(&addr), len);
409+
if (err) {
410+
if (errno != EINPROGRESS) {
411+
FAIL_ERRNO("connect");
412+
return err;
413+
}
414+
415+
err = poll_connect(c, IO_TIMEOUT_SEC);
416+
if (err) {
417+
FAIL_ERRNO("poll_connect");
418+
return err;
419+
}
420+
}
421+
422+
switch (sotype & SOCK_TYPE_MASK) {
423+
case SOCK_DGRAM:
424+
err = xgetsockname(c, sockaddr(&addr), &len);
425+
if (err)
426+
return err;
427+
428+
err = xconnect(s, sockaddr(&addr), len);
429+
if (err)
430+
return err;
431+
432+
*p0 = take_fd(s);
433+
break;
434+
case SOCK_STREAM:
435+
case SOCK_SEQPACKET:
436+
p = xaccept_nonblock(s, NULL, NULL);
437+
if (p < 0)
438+
return p;
439+
440+
*p0 = take_fd(p);
441+
break;
442+
default:
443+
FAIL("Unsupported socket type %#x", sotype);
444+
return -EOPNOTSUPP;
445+
}
446+
447+
*p1 = take_fd(c);
448+
return 0;
449+
}
450+
451+
static inline int create_socket_pairs(int family, int sotype, int *c0, int *c1,
452+
int *p0, int *p1)
453+
{
454+
int err;
455+
456+
err = create_pair(family, sotype, c0, p0);
457+
if (err)
458+
return err;
459+
460+
err = create_pair(family, sotype, c1, p1);
461+
if (err) {
462+
close(*c0);
463+
close(*p0);
464+
}
465+
466+
return err;
467+
}
415468

416469
#endif // __SOCKMAP_HELPERS__

0 commit comments

Comments
 (0)