From 8cf2884a87db0eca0aa2f382c9850335332682b3 Mon Sep 17 00:00:00 2001 From: Gerrit Renker Date: Wed, 3 Mar 2010 17:57:14 +0100 Subject: [PATCH] net: revert restricting SO_REUSEADDR This reverts part of commit a5927501e41fa3fca2975452617474e78ffecc48 (08_refactor-makesock.diff, 25 Feb 2010), which restricted by default SO_REUSEADDR to connection-oriented protocols only - it used to be set on all passive sockets. However, the same problem exists also for UDP, whenever connecting more than one listener on the same host, hence revert it. --- net.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/net.c b/net.c index aeeca20e..b44d1d3e 100644 --- a/net.c +++ b/net.c @@ -384,7 +384,7 @@ int makesock(unsigned l4type, bool passive, struct addrinfo *local = NULL, *src, *remote = NULL, *dst, hints; unsigned int l3type = AF_UNSPEC; - int rc, sockfd = -1, + int rc, on = 1, sockfd = -1, socktype = sock_type(l4type); char port[6]; /* port number has at most 5 digits */ @@ -429,6 +429,18 @@ int makesock(unsigned l4type, bool passive, if (sockfd < 0) goto get_next_dst; + /* + * Reuse the address on passive sockets to avoid failure on + * restart (protocols using listen()) and when creating + * multiple listener instances (UDP multicast). + */ + if (passive && setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, + &on, sizeof(on)) == -1) { + rc = errno; + PARA_ERROR_LOG("can not set SO_REUSEADDR: %s\n", + strerror(rc)); + return -ERRNO_TO_PARA_ERROR(rc); + } flowopt_setopts(sockfd, fo); if (src) { @@ -480,15 +492,8 @@ get_next_src: */ int para_listen(unsigned l4type, uint16_t port, struct flowopts *fo) { - int fd, ret; - - if (fo == NULL) - fo = flowopt_new(); - - /* Reuse the address to avoid failure on restart. */ - OPT_ENABLE(fo, SOL_SOCKET, SO_REUSEADDR); + int ret, fd = makesock(l4type, 1, NULL, port, fo); - fd = makesock(l4type, 1, NULL, port, fo); if (fd > 0) { ret = listen(fd, BACKLOG); if (ret < 0) { -- 2.39.5