From 5a623a29f3f30f48deb8a978ce7c49f3fe6b5790 Mon Sep 17 00:00:00 2001 From: "Juan A. Garcia Pardo" Date: Tue, 5 Jan 2021 15:19:20 +0100 Subject: [PATCH] Allow a second call to initQUICSockets. (#79) * Allow a second call to initQUICSockets. Force the port to zero before the second call. * use a parameter to ignore the port * fix comment --- go/lib/infra/infraenv/infraenv.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/go/lib/infra/infraenv/infraenv.go b/go/lib/infra/infraenv/infraenv.go index b50e77ceb4..3eeeac9057 100644 --- a/go/lib/infra/infraenv/infraenv.go +++ b/go/lib/infra/infraenv/infraenv.go @@ -104,7 +104,7 @@ func (nc *NetworkConfig) QUICStack() (*QUICStack, error) { if nc.QUIC.Address == "" { nc.QUIC.Address = net.JoinHostPort(nc.Public.IP.String(), "0") } - client, server, err := nc.initQUICSockets() + client, server, err := nc.initQUICSockets(false) if err != nil { return nil, err } @@ -121,7 +121,9 @@ func (nc *NetworkConfig) QUICStack() (*QUICStack, error) { } //TLS/QUIC part - tlsClient, tlsServer, err := nc.initQUICSockets() + // Calling initQUICSockets again will fail if nc.QUIC.Address has a port other than 0. + // As a workaround, forcefully set the port to 0 via a parameter. + tlsClient, tlsServer, err := nc.initQUICSockets(true) if err != nil { return nil, err } @@ -283,7 +285,7 @@ func (nc *NetworkConfig) initSvcRedirect(quicAddress string, tlsQUICAdress strin return cancel, nil } -func (nc *NetworkConfig) initQUICSockets() (net.PacketConn, net.PacketConn, error) { +func (nc *NetworkConfig) initQUICSockets(ignorePort bool) (net.PacketConn, net.PacketConn, error) { dispatcherService := reliable.NewDispatcher("") if nc.ReconnectToDispatcher { dispatcherService = reconnect.NewDispatcherService(dispatcherService) @@ -303,6 +305,9 @@ func (nc *NetworkConfig) initQUICSockets() (net.PacketConn, net.PacketConn, erro if err != nil { return nil, nil, serrors.WrapStr("parsing server QUIC address", err) } + if ignorePort { + serverAddr.Port = 0 + } server, err := serverNet.Listen(context.Background(), "udp", serverAddr, addr.SvcNone) if err != nil { return nil, nil, serrors.WrapStr("creating server connection", err)