From 9dbb6c43ce655e018da2c7f78a6cfb7f42d95c1c Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 28 Aug 2020 19:20:23 +0200 Subject: [PATCH] MINOR: sock: distinguish dgram from stream types when retrieving old sockets For now we still don't retrieve dgram sockets, but the code must be able to distinguish them before we switch to receivers. This adds a new flag to the xfer_sock_list indicating that a socket is of type SOCK_DGRAM. The way to set the flag for now is by looking at the dummy address family which equals AF_CUST_UDP{4,6} in this case (given that other dgram sockets are not yet supported). --- include/haproxy/sock-t.h | 1 + src/sock.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/include/haproxy/sock-t.h b/include/haproxy/sock-t.h index 7d66d1982..1a49dfa44 100644 --- a/include/haproxy/sock-t.h +++ b/include/haproxy/sock-t.h @@ -29,6 +29,7 @@ #define SOCK_XFER_OPT_FOREIGN 0x000000001 #define SOCK_XFER_OPT_V6ONLY 0x000000002 +#define SOCK_XFER_OPT_DGRAM 0x000000004 /* The list used to transfer sockets between old and new processes */ struct xfer_sock_list { diff --git a/src/sock.c b/src/sock.c index 894f48506..1614d9542 100644 --- a/src/sock.c +++ b/src/sock.c @@ -296,6 +296,10 @@ int sock_get_old_sockets(const char *unixsocket) if (sock_inet_is_foreign(fd, xfer_sock->addr.ss_family)) xfer_sock->options |= SOCK_XFER_OPT_FOREIGN; + socklen = sizeof(val); + if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &val, &socklen) == 0 && val == SOCK_DGRAM) + xfer_sock->options |= SOCK_XFER_OPT_DGRAM; + #if defined(IPV6_V6ONLY) /* keep only the v6only flag depending on what's currently * active on the socket, and always drop the v4v6 one. @@ -362,6 +366,12 @@ int sock_find_compatible_fd(const struct listener *l) if (!l->proto->addrcmp) return -1; + /* WT: this is not the right way to do it, it is temporary for the + * transition to receivers. + */ + if (l->addr.ss_family == AF_CUST_UDP4 || l->addr.ss_family == AF_CUST_UDP6) + options |= SOCK_XFER_OPT_DGRAM; + if (l->options & LI_O_FOREIGN) options |= SOCK_XFER_OPT_FOREIGN;