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;