Skip to content

Commit fb1131d

Browse files
mmhalMartin KaFai Lau
authored andcommitted
selftests/bpf: Support af_unix SOCK_DGRAM socket pair creation
Handle af_unix in init_addr_loopback(). For pair creation, bind() the peer socket to make SOCK_DGRAM connect() happy. Signed-off-by: Michal Luczaj <[email protected]> Signed-off-by: Martin KaFai Lau <[email protected]> Reviewed-by: Jakub Sitnicki <[email protected]> Acked-by: John Fastabend <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 5ead949 commit fb1131d

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

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

Lines changed: 24 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) {

0 commit comments

Comments
 (0)