From 33f19c7941ae0a3746db5404d6a52b02c6dac675 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Sat, 11 Mar 2023 10:07:11 -0500 Subject: [PATCH] MT#55283 add open_v46_socket() Opens a generic socket supporting both IPv4 and IPv6, useful for outgoing connections. Change-Id: I2502653d481479b9c13a5f66ed5929723e9db9b3 --- lib/socket.c | 14 ++++++++++++++ lib/socket.h | 1 + 2 files changed, 15 insertions(+) diff --git a/lib/socket.c b/lib/socket.c index e1c9a707c..54e8fc7a9 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -725,6 +725,20 @@ fail: return -1; } +int open_v46_socket(socket_t *r, int type) { + sockfamily_t *fam = &__socket_families[SF_IP6]; + + if (__socket(r, type, fam)) { + __C_DBG("open socket fail, fd=%d", r->fd); + return -1; + } + + nonblock(r->fd); + ipv6only(r->fd, 0); + + return 0; +} + void dummy_socket(socket_t *r, const sockaddr_t *sa) { ZERO(*r); r->fd = -1; diff --git a/lib/socket.h b/lib/socket.h index 2548179fe..4ea315eaa 100644 --- a/lib/socket.h +++ b/lib/socket.h @@ -214,6 +214,7 @@ INLINE int socket_cpu_affinity(socket_t *s, int cpu) { void socket_init(void); int open_socket(socket_t *r, int type, unsigned int port, const sockaddr_t *); +int open_v46_socket(socket_t *r, int type); int connect_socket(socket_t *r, int type, const endpoint_t *ep); int connect_socket_nb(socket_t *r, int type, const endpoint_t *ep); // 1 == in progress int connect_socket_retry(socket_t *r); // retries connect() while in progress