Skip to content

Commit 190de54

Browse files
mmhalMartin KaFai Lau
authored andcommitted
selftests/bpf: Support more socket types in create_pair()
Extend the function to allow creating socket pairs of SOCK_STREAM, SOCK_DGRAM and SOCK_SEQPACKET. Adapt direct callers and leave further cleanups for the following patch. Reviewed-by: Jakub Sitnicki <[email protected]> Tested-by: Jakub Sitnicki <[email protected]> Suggested-by: Jakub Sitnicki <[email protected]> Signed-off-by: Michal Luczaj <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Martin KaFai Lau <[email protected]>
1 parent 92ec8b9 commit 190de54

File tree

2 files changed

+96
-61
lines changed

2 files changed

+96
-61
lines changed

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

Lines changed: 6 additions & 13 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

@@ -570,16 +567,12 @@ static void test_sockmap_skb_verdict_fionread(bool pass_prog)
570567

571568
static void test_sockmap_skb_verdict_peek_helper(int map)
572569
{
573-
int err, s, c1, p1, zero = 0, sent, recvd, avail;
570+
int err, c1, p1, zero = 0, sent, recvd, avail;
574571
char snd[256] = "0123456789";
575572
char rcv[256] = "0";
576573

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)"))
574+
err = create_pair(AF_INET, SOCK_STREAM, &c1, &p1);
575+
if (!ASSERT_OK(err, "create_pair()"))
583576
return;
584577

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

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

Lines changed: 90 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
@@ -312,54 +315,6 @@ static inline int add_to_sockmap(int sock_mapfd, int fd1, int fd2)
312315
return xbpf_map_update_elem(sock_mapfd, &key, &value, BPF_NOEXIST);
313316
}
314317

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-
363318
static inline int enable_reuseport(int s, int progfd)
364319
{
365320
int err, one = 1;
@@ -412,5 +367,92 @@ static inline int socket_loopback(int family, int sotype)
412367
return socket_loopback_reuseport(family, sotype, -1);
413368
}
414369

370+
static inline int create_pair(int family, int sotype, int *p0, int *p1)
371+
{
372+
struct sockaddr_storage addr;
373+
socklen_t len = sizeof(addr);
374+
int s, c, p, err;
375+
376+
s = socket_loopback(family, sotype);
377+
if (s < 0)
378+
return s;
379+
380+
err = xgetsockname(s, sockaddr(&addr), &len);
381+
if (err)
382+
goto close_s;
383+
384+
c = xsocket(family, sotype, 0);
385+
if (c < 0) {
386+
err = c;
387+
goto close_s;
388+
}
389+
390+
err = connect(c, sockaddr(&addr), len);
391+
if (err) {
392+
if (errno != EINPROGRESS) {
393+
FAIL_ERRNO("connect");
394+
goto close_c;
395+
}
396+
397+
err = poll_connect(c, IO_TIMEOUT_SEC);
398+
if (err) {
399+
FAIL_ERRNO("poll_connect");
400+
goto close_c;
401+
}
402+
}
403+
404+
switch (sotype & SOCK_TYPE_MASK) {
405+
case SOCK_DGRAM:
406+
err = xgetsockname(c, sockaddr(&addr), &len);
407+
if (err)
408+
goto close_c;
409+
410+
err = xconnect(s, sockaddr(&addr), len);
411+
if (!err) {
412+
*p0 = s;
413+
*p1 = c;
414+
return err;
415+
}
416+
break;
417+
case SOCK_STREAM:
418+
case SOCK_SEQPACKET:
419+
p = xaccept_nonblock(s, NULL, NULL);
420+
if (p >= 0) {
421+
*p0 = p;
422+
*p1 = c;
423+
goto close_s;
424+
}
425+
426+
err = p;
427+
break;
428+
default:
429+
FAIL("Unsupported socket type %#x", sotype);
430+
err = -EOPNOTSUPP;
431+
}
432+
433+
close_c:
434+
close(c);
435+
close_s:
436+
close(s);
437+
return err;
438+
}
439+
440+
static inline int create_socket_pairs(int s, int family, int sotype,
441+
int *c0, int *c1, int *p0, int *p1)
442+
{
443+
int err;
444+
445+
err = create_pair(family, sotype, c0, p0);
446+
if (err)
447+
return err;
448+
449+
err = create_pair(family, sotype, c1, p1);
450+
if (err) {
451+
close(*c0);
452+
close(*p0);
453+
}
454+
455+
return err;
456+
}
415457

416458
#endif // __SOCKMAP_HELPERS__

0 commit comments

Comments
 (0)