conn: try harder to have v4 and v6 ports agree

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld
2021-02-09 18:45:12 +01:00
parent 78ebce6932
commit 30b96ba083
2 changed files with 14 additions and 0 deletions

View 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