]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
conn: try harder to have v4 and v6 ports agree
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 9 Feb 2021 17:45:12 +0000 (18:45 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 9 Feb 2021 17:45:12 +0000 (18:45 +0100)
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
conn/conn_default.go
conn/conn_linux.go

index 4f6b6d1a5da85415b6f244383006a4fe93f06491..22248afc8f2f66d3c26b574ce98ec68770b9cedb 100644 (file)
@@ -99,7 +99,9 @@ func extractErrno(err error) error {
 func createBind(uport uint16) (Bind, uint16, error) {
        var err error
        var bind nativeBind
+       var tries int
 
+again:
        port := int(uport)
 
        bind.ipv4, port, err = listenNet("udp4", port)
@@ -108,6 +110,10 @@ func createBind(uport uint16) (Bind, uint16, error) {
        }
 
        bind.ipv6, port, err = listenNet("udp6", port)
+       if uport == 0 && err != nil && extractErrno(err) == syscall.EADDRINUSE && tries < 100 {
+               tries++
+               goto again
+       }
        if err != nil && extractErrno(err) != syscall.EAFNOSUPPORT {
                bind.ipv4.Close()
                bind.ipv4 = nil
index f6638dd2286c01f756b4be1258f3a715bfad6a6f..716028f1676b8fbc1ab048e90d064a88cac52dea 100644 (file)
@@ -104,7 +104,11 @@ func createBind(port uint16) (Bind, uint16, error) {
        var err error
        var bind nativeBind
        var newPort uint16
+       var tries int
+       originalPort := port
 
+again:
+       port = originalPort
        // Attempt ipv6 bind, update port if successful.
        bind.sock6, newPort, err = create6(port)
        if err != nil {
@@ -118,6 +122,10 @@ func createBind(port uint16) (Bind, uint16, error) {
        // Attempt ipv4 bind, update port if successful.
        bind.sock4, newPort, err = create4(port)
        if err != nil {
+               if originalPort == 0 && err == syscall.EADDRINUSE && tries < 100 {
+                       tries++
+                       goto again
+               }
                if err != syscall.EAFNOSUPPORT {
                        unix.Close(bind.sock6)
                        return nil, 0, err