diff --git a/router/connection.go b/router/connection.go index 699a12de..ed8d4848 100644 --- a/router/connection.go +++ b/router/connection.go @@ -190,16 +190,11 @@ func (conn *LocalConnection) run(actionChan <-chan ConnectionAction, finished ch conn.Log("connection ready; using protocol version", conn.version) - var remoteAddr *net.UDPAddr - if conn.outbound { - tcpAddr := conn.TCPConn.RemoteAddr().(*net.TCPAddr) - remoteAddr = &net.UDPAddr{IP: tcpAddr.IP, Port: tcpAddr.Port, Zone: tcpAddr.Zone} - } - params := ForwarderParams{ RemotePeer: conn.remote, - LocalIP: conn.TCPConn.LocalAddr().(*net.TCPAddr).IP, - RemoteAddr: remoteAddr, + LocalAddr: conn.TCPConn.LocalAddr().(*net.TCPAddr), + RemoteAddr: conn.TCPConn.RemoteAddr().(*net.TCPAddr), + Outbound: conn.outbound, ConnUID: conn.uid, Crypto: conn.forwarderCrypto(), SendControlMessage: conn.sendOverlayControlMessage, diff --git a/router/fastdp.go b/router/fastdp.go index 2a8ca06a..e7149fcd 100644 --- a/router/fastdp.go +++ b/router/fastdp.go @@ -523,15 +523,16 @@ func (fastdp fastDatapathOverlay) MakeForwarder(params ForwarderParams) (Overlay } vxlanVportID := fastdp.mainVxlanVportID - remoteAddr := params.RemoteAddr - if remoteAddr != nil { + var remoteAddr *net.UDPAddr + + if params.Outbound { + remoteAddr = makeUDPAddr(params.RemoteAddr) // The provided address contains the main weave port // number to connect to. We need to derive the vxlan // port number from that. - vxlanRemoteAddr := *params.RemoteAddr + vxlanRemoteAddr := *remoteAddr vxlanRemoteAddr.Port++ remoteAddr = &vxlanRemoteAddr - var err error vxlanVportID, err = fastdp.getVxlanVportID(remoteAddr.Port) if err != nil { @@ -539,7 +540,7 @@ func (fastdp fastDatapathOverlay) MakeForwarder(params ForwarderParams) (Overlay } } - localIP, err := ipv4Bytes(params.LocalIP) + localIP, err := ipv4Bytes(params.LocalAddr.IP) if err != nil { return nil, err } diff --git a/router/overlay.go b/router/overlay.go index 3ab9f88d..914f40dd 100644 --- a/router/overlay.go +++ b/router/overlay.go @@ -29,15 +29,19 @@ type Overlay interface { type ForwarderParams struct { RemotePeer *Peer - // The local IP address to use for sending. Derived from the - // local address of the corresponding TCP socket, so may - // differ for different forwarders. - LocalIP net.IP + // The local address of the corresponding TCP connection. Used to + // derive the local IP address for sending. May differ for + // different forwarders. + LocalAddr *net.TCPAddr - // The remote address to send to. nil if unknown, i.e. an - // incoming connection, in which case the Overlay needs to - // discover it (e.g. from incoming datagrams). - RemoteAddr *net.UDPAddr + // The remote address of the corresponding TCP connection. Used to + // determine the address to send to, but only if the TCP + // connection is outbound. Otherwise the Overlay needs to discover + // it (e.g. from incoming datagrams). + RemoteAddr *net.TCPAddr + + // Is the corresponding TCP connection outbound? + Outbound bool // Unique identifier for this connection ConnUID uint64 diff --git a/router/sleeve.go b/router/sleeve.go index 82f9bc39..bc46fb7a 100644 --- a/router/sleeve.go +++ b/router/sleeve.go @@ -365,6 +365,11 @@ func (sleeve *SleeveOverlay) MakeForwarder(params ForwarderParams) (OverlayForwa confirmedChan := make(chan struct{}) finishedChan := make(chan struct{}) + var remoteAddr *net.UDPAddr + if params.Outbound { + remoteAddr = makeUDPAddr(params.RemoteAddr) + } + fwd := &sleeveForwarder{ sleeve: sleeve, remotePeer: params.RemotePeer, @@ -379,13 +384,13 @@ func (sleeve *SleeveOverlay) MakeForwarder(params ForwarderParams) (OverlayForwa finishedChan: finishedChan, establishedChan: make(chan struct{}), errorChan: make(chan error, 1), - remoteAddr: params.RemoteAddr, + remoteAddr: remoteAddr, mtu: DefaultMTU, crypto: crypto, maxPayload: DefaultMTU - UDPOverhead, overheadDF: UDPOverhead + crypto.EncDF.PacketOverhead() + crypto.EncDF.FrameOverhead() + EthernetOverhead, - senderDF: newUDPSenderDF(params.LocalIP, sleeve.localPort), + senderDF: newUDPSenderDF(params.LocalAddr.IP, sleeve.localPort), } go fwd.run(aggChan, aggDFChan, specialChan, controlMsgChan, diff --git a/router/utils.go b/router/utils.go index 3530abd2..3da6f747 100644 --- a/router/utils.go +++ b/router/utils.go @@ -104,6 +104,10 @@ func intmac(key uint64) (r net.HardwareAddr) { return } +func makeUDPAddr(addr *net.TCPAddr) *net.UDPAddr { + return &net.UDPAddr{IP: addr.IP, Port: addr.Port, Zone: addr.Zone} +} + type ListOfPeers []*Peer func (lop ListOfPeers) Len() int {