net: revert restricting SO_REUSEADDR
[paraslash.git] / net.c
diff --git a/net.c b/net.c
index aeeca20..b44d1d3 100644 (file)
--- 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) {