From e7ff6a21918a39b717c6ff596d3a3b2cff3f1b7f Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 5 Nov 2015 19:32:49 +0000 Subject: [PATCH] LocalPeer shouldn't have to know about remote UDP address ...and LocalConnection shouldn't have to remember it --- router/connection.go | 32 ++++++++++++++++++-------------- router/local_peer.go | 13 ++++--------- router/router.go | 2 +- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/router/connection.go b/router/connection.go index 9f047159..699a12de 100644 --- a/router/connection.go +++ b/router/connection.go @@ -40,17 +40,16 @@ type RemoteConnection struct { type LocalConnection struct { sync.RWMutex RemoteConnection - TCPConn *net.TCPConn - version byte - tcpSender TCPSender - remoteUDPAddr *net.UDPAddr - SessionKey *[32]byte - heartbeatTCP *time.Ticker - Router *Router - uid uint64 - actionChan chan<- ConnectionAction - finished <-chan struct{} // closed to signal that actorLoop has finished - forwarder OverlayForwarder + TCPConn *net.TCPConn + version byte + tcpSender TCPSender + SessionKey *[32]byte + heartbeatTCP *time.Ticker + Router *Router + uid uint64 + actionChan chan<- ConnectionAction + finished <-chan struct{} // closed to signal that actorLoop has finished + forwarder OverlayForwarder } type ConnectionAction func() error @@ -83,7 +82,7 @@ func (conn *RemoteConnection) ErrorLog(args ...interface{}) { // Does not return anything. If the connection is successful, it will // end up in the local peer's connections map. -func StartLocalConnection(connRemote *RemoteConnection, tcpConn *net.TCPConn, udpAddr *net.UDPAddr, router *Router, acceptNewPeer bool) { +func StartLocalConnection(connRemote *RemoteConnection, tcpConn *net.TCPConn, router *Router, acceptNewPeer bool) { if connRemote.local != router.Ourself.Peer { log.Fatal("Attempt to create local connection from a peer which is not ourself") } @@ -94,7 +93,6 @@ func StartLocalConnection(connRemote *RemoteConnection, tcpConn *net.TCPConn, ud RemoteConnection: *connRemote, Router: router, TCPConn: tcpConn, - remoteUDPAddr: udpAddr, uid: randUint64(), actionChan: actionChan, finished: finished} @@ -192,10 +190,16 @@ 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: conn.remoteUDPAddr, + RemoteAddr: remoteAddr, ConnUID: conn.uid, Crypto: conn.forwarderCrypto(), SendControlMessage: conn.sendOverlayControlMessage, diff --git a/router/local_peer.go b/router/local_peer.go index f0047486..80c5abcc 100644 --- a/router/local_peer.go +++ b/router/local_peer.go @@ -62,21 +62,16 @@ func (peer *LocalPeer) CreateConnection(peerAddr string, acceptNewPeer bool) err if err := peer.checkConnectionLimit(); err != nil { return err } - tcpAddr, tcpErr := net.ResolveTCPAddr("tcp4", peerAddr) - udpAddr, udpErr := net.ResolveUDPAddr("udp4", peerAddr) - if tcpErr != nil || udpErr != nil { - // they really should have the same value, but just in case... - if tcpErr == nil { - return udpErr - } - return tcpErr + tcpAddr, err := net.ResolveTCPAddr("tcp4", peerAddr) + if err != nil { + return err } tcpConn, err := net.DialTCP("tcp4", nil, tcpAddr) if err != nil { return err } connRemote := NewRemoteConnection(peer.Peer, nil, tcpConn.RemoteAddr().String(), true, false) - StartLocalConnection(connRemote, tcpConn, udpAddr, peer.router, acceptNewPeer) + StartLocalConnection(connRemote, tcpConn, peer.router, acceptNewPeer) return nil } diff --git a/router/router.go b/router/router.go index 5e135a6d..7e8cf346 100644 --- a/router/router.go +++ b/router/router.go @@ -171,7 +171,7 @@ func (router *Router) acceptTCP(tcpConn *net.TCPConn) { remoteAddrStr := tcpConn.RemoteAddr().String() log.Printf("->[%s] connection accepted", remoteAddrStr) connRemote := NewRemoteConnection(router.Ourself.Peer, nil, remoteAddrStr, false, false) - StartLocalConnection(connRemote, tcpConn, nil, router, true) + StartLocalConnection(connRemote, tcpConn, router, true) } func (router *Router) handleForwardedPacket(key ForwardPacketKey) FlowOp {