summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-02-09 18:45:12 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2021-02-09 18:45:12 +0100
commit30b96ba083e4ef61051f125770b50bd278712539 (patch)
tree285947e5f050849dcbb26d5ee2489e26b4946be3
parentdevice: only allocate peer queues once (diff)
downloadwireguard-go-30b96ba083e4ef61051f125770b50bd278712539.tar.xz
wireguard-go-30b96ba083e4ef61051f125770b50bd278712539.zip
conn: try harder to have v4 and v6 ports agree
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--conn/conn_default.go6
-rw-r--r--conn/conn_linux.go8
2 files changed, 14 insertions, 0 deletions
diff --git a/conn/conn_default.go b/conn/conn_default.go
index 4f6b6d1..22248af 100644
--- a/conn/conn_default.go
+++ b/conn/conn_default.go
@@ -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
diff --git a/conn/conn_linux.go b/conn/conn_linux.go
index f6638dd..716028f 100644
--- a/conn/conn_linux.go
+++ b/conn/conn_linux.go
@@ -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