]> Cypherpunks repositories - gostls13.git/commitdiff
net: enable SO_REUSEADDR, SO_REUSEPORT options on stream, multicast listeners only
authorMikio Hara <mikioh.mikioh@gmail.com>
Sat, 11 Feb 2012 02:50:51 +0000 (11:50 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Sat, 11 Feb 2012 02:50:51 +0000 (11:50 +0900)
This CL changes default SOL_SOCKET settings to mitigate connect
failure on OpenBSD or similar platforms which support randomized
transport protocol port number assignment.

Fixes #2830.

R=rsc, jsing
CC=golang-dev
https://golang.org/cl/5648044

src/pkg/net/sock_bsd.go
src/pkg/net/sock_linux.go
src/pkg/net/sock_windows.go
src/pkg/net/sockopt_bsd.go
src/pkg/net/sockopt_linux.go
src/pkg/net/sockopt_windows.go

index 7c693a271f7898adf5475fe5977055a09127bfe5..2607b04c7bc777d688b64cf2247c2536cb06549f 100644 (file)
@@ -38,6 +38,11 @@ func listenerSockaddr(s, f int, la syscall.Sockaddr, toAddr func(syscall.Sockadd
                return la, nil
        }
        switch v := a.(type) {
+       case *TCPAddr, *UnixAddr:
+               err := setDefaultListenerSockopts(s)
+               if err != nil {
+                       return nil, err
+               }
        case *UDPAddr:
                if v.IP.IsMulticast() {
                        err := setDefaultMulticastSockopts(s)
index 0743843bf2807421611f62a44fbf2404837128ce..e509d93978b1205b30e9a45e83a873fd779deb27 100644 (file)
@@ -32,6 +32,11 @@ func listenerSockaddr(s, f int, la syscall.Sockaddr, toAddr func(syscall.Sockadd
                return la, nil
        }
        switch v := a.(type) {
+       case *TCPAddr, *UnixAddr:
+               err := setDefaultListenerSockopts(s)
+               if err != nil {
+                       return nil, err
+               }
        case *UDPAddr:
                if v.IP.IsMulticast() {
                        err := setDefaultMulticastSockopts(s)
index 434122c9e46b9c572427b3a95bc356e5d7d87542..cce6181c9e52d2570f5cc4ecf4dfb1c4053bd99d 100644 (file)
@@ -19,6 +19,11 @@ func listenerSockaddr(s syscall.Handle, f int, la syscall.Sockaddr, toAddr func(
                return la, nil
        }
        switch v := a.(type) {
+       case *TCPAddr, *UnixAddr:
+               err := setDefaultListenerSockopts(s)
+               if err != nil {
+                       return nil, err
+               }
        case *UDPAddr:
                if v.IP.IsMulticast() {
                        err := setDefaultMulticastSockopts(s)
index bc764650627579600de41933879622883cec986d..519d2fb05a8dab01360105bf5696c0b7bcd836c3 100644 (file)
@@ -20,31 +20,28 @@ func setDefaultSockopts(s, f, t int) error {
                // Note that some operating systems never admit this option.
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 0)
        }
-
-       if f == syscall.AF_UNIX ||
-               (f == syscall.AF_INET || f == syscall.AF_INET6) && t == syscall.SOCK_STREAM {
-               // Allow reuse of recently-used addresses.
-               err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
-               if err != nil {
-                       return os.NewSyscallError("setsockopt", err)
-               }
-
-               // Allow reuse of recently-used ports.
-               // This option is supported only in descendants of 4.4BSD,
-               // to make an effective multicast application and an application
-               // that requires quick draw possible.
-               err = syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1)
-               if err != nil {
-                       return os.NewSyscallError("setsockopt", err)
-               }
-       }
-
        // Allow broadcast.
        err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
        if err != nil {
                return os.NewSyscallError("setsockopt", err)
        }
+       return nil
+}
 
+func setDefaultListenerSockopts(s int) error {
+       // Allow reuse of recently-used addresses.
+       err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
+       if err != nil {
+               return os.NewSyscallError("setsockopt", err)
+       }
+       // Allow reuse of recently-used ports.
+       // This option is supported only in descendants of 4.4BSD,
+       // to make an effective multicast application and an application
+       // that requires quick draw possible.
+       err = syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1)
+       if err != nil {
+               return os.NewSyscallError("setsockopt", err)
+       }
        return nil
 }
 
index 67c1dc87a7a0099b0c09a530cccfa056a4ed2ef2..7509c29eecf231233afd533e55e180bcb7afd5fa 100644 (file)
@@ -18,23 +18,20 @@ func setDefaultSockopts(s, f, t int) error {
                // Note that some operating systems never admit this option.
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 0)
        }
-
-       if f == syscall.AF_UNIX ||
-               (f == syscall.AF_INET || f == syscall.AF_INET6) && t == syscall.SOCK_STREAM {
-               // Allow reuse of recently-used addresses.
-               err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
-               if err != nil {
-                       return os.NewSyscallError("setsockopt", err)
-               }
-
-       }
-
        // Allow broadcast.
        err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
        if err != nil {
                return os.NewSyscallError("setsockopt", err)
        }
+       return nil
+}
 
+func setDefaultListenerSockopts(s int) error {
+       // Allow reuse of recently-used addresses.
+       err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
+       if err != nil {
+               return os.NewSyscallError("setsockopt", err)
+       }
        return nil
 }
 
index 842bccc8f40fe92ae827868d6ed9267e41abb8f9..46661e2f25647033ab08edbe76a6fee6c7a264c6 100644 (file)
@@ -18,16 +18,18 @@ func setDefaultSockopts(s syscall.Handle, f, t int) error {
                // Note that some operating systems never admit this option.
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 0)
        }
+       // Allow broadcast.
+       syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
+       return nil
+}
 
+func setDefaultListenerSockopts(s syscall.Handle, f, t int) error {
        // Windows will reuse recently-used addresses by default.
        // SO_REUSEADDR should not be used here, as it allows
        // a socket to forcibly bind to a port in use by another socket.
        // This could lead to a non-deterministic behavior, where
        // connection requests over the port cannot be guaranteed
        // to be handled by the correct socket.
-
-       // Allow broadcast.
-       syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
        return nil
 }