Skip to content

Commit

Permalink
refactor net-table
Browse files Browse the repository at this point in the history
  • Loading branch information
miolini committed Jan 30, 2016
1 parent ab344db commit 0937b2b
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 78 deletions.
28 changes: 15 additions & 13 deletions common/net_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@ import (
type NetTable struct {
BaseService

localNode *LocalNode
waitGroup sync.WaitGroup
dhtInChan chan string
localNode *LocalNode
waitGroup sync.WaitGroup
dhtInChan chan string

lock sync.RWMutex
blackList map[string]time.Time
peers map[string]*RemoteNode
lock sync.RWMutex
blackList map[string]time.Time
peers map[string]*RemoteNode

heartbeatTicker <-chan time.Time

logger log.Logger
logger log.Logger
}

func (nt NetTable) Name() string {
Expand Down Expand Up @@ -55,7 +55,7 @@ func (nt *NetTable) Stop() {
}
}

func (nt *NetTable) GetDHTInChannel() chan<- string {
func (nt *NetTable) GetDHTInChannel() chan <- string {
return nt.dhtInChan
}

Expand Down Expand Up @@ -107,7 +107,9 @@ func (nt *NetTable) processDHTIn() {
nt.lock.Unlock()

if !ok {
nt.tryConnect(host)
if err := nt.tryConnect(host); err != nil {
nt.logger.Info("unable connect %s err: %s", host, err)
}
}
}
}
Expand All @@ -133,14 +135,15 @@ func (nt *NetTable) heartbeat() {
}
}

func (nt *NetTable) tryConnect(h string) {
func (nt *NetTable) tryConnect(h string) error {
rn, err := TryConnect(h, nt.localNode.NetworkSecret(), nt.localNode)
if err != nil {
nt.addToBlackList(h)
return
return err
}
nt.logger.Debug("adding remote node...")
nt.AddRemoteNode(rn)
return nil
}

func (nt *NetTable) addToBlackList(h string) {
Expand All @@ -154,9 +157,8 @@ func (nt *NetTable) SendPacket(dstIP net.IP, payload []byte) {

rn := nt.RemoteNodeByIP(dstIP)
if rn == nil {
nt.logger.Error("destination host %q unreachable", dstIP.String())
nt.logger.Debug("destination host %q unreachable", dstIP.String())
nt.logger.Debug("known hosts, %v", nt.knownHosts())

return
}

Expand Down
69 changes: 4 additions & 65 deletions common/remotenode.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ package common

import (
"fmt"
"github.com/anacrolix/utp"
"github.com/meshbird/meshbird/log"
"github.com/meshbird/meshbird/network/protocol"
"github.com/meshbird/meshbird/secure"
"io"
"net"
"strconv"
"time"
"github.com/meshbird/meshbird/log"
"github.com/meshbird/meshbird/network/protocol"
"github.com/meshbird/meshbird/secure"
)

var (
Expand Down Expand Up @@ -98,63 +96,4 @@ func (rn *RemoteNode) listen(ln *LocalNode) {
rn.lastHeartbeat = time.Now()
}
}
}

func TryConnect(h string, networkSecret *secure.NetworkSecret, ln *LocalNode) (*RemoteNode, error) {
host, portStr, errSplit := net.SplitHostPort(h)
if errSplit != nil {
return nil, errSplit
}

port, errConvert := strconv.Atoi(portStr)
if errConvert != nil {
return nil, errConvert
}

rn := new(RemoteNode)
rn.lastHeartbeat = time.Now()
rn.publicAddress = fmt.Sprintf("%s:%d", host, port+1)

rn.logger = log.L(fmt.Sprintf("public %s", rn.publicAddress))
rn.logger.Debug("trying to connect...")

s, errSocket := utp.NewSocket("udp4", ":0")
if errSocket != nil {
rn.logger.Error("unable to crete a socket, %v", errSocket)
return nil, errSocket
}

conn, errDial := s.DialTimeout(rn.publicAddress, 10*time.Second)
if errDial != nil {
rn.logger.Error("unable to dial, %v", errDial)
return nil, errDial
}

rn.conn = conn
rn.sessionKey = RandomBytes(16)

if err := protocol.WriteEncodeHandshake(rn.conn, rn.sessionKey, networkSecret); err != nil {
return nil, err
}
if _, okError := protocol.ReadDecodeOk(rn.conn); okError != nil {
return nil, okError
}

peerInfo, errPeerInfo := protocol.ReadDecodePeerInfo(rn.conn)
if errPeerInfo != nil {
return nil, errPeerInfo
}

rn.privateIP = peerInfo.PrivateIP()

// create new logger
log.RemoveLogger(rn.logger.Name())
rn.logger = log.L(fmt.Sprintf(rnLoggerFormat, rn.privateIP.String()))

if err := protocol.WriteEncodePeerInfo(rn.conn, ln.State().PrivateIP); err != nil {
return nil, err
}

rn.logger.Info("connected, with public address %q", rn.publicAddress)
return rn, nil
}
}
71 changes: 71 additions & 0 deletions common/tryconnect.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package common

import (
"github.com/meshbird/meshbird/secure"
"net"
"strconv"
"time"
"fmt"
"github.com/meshbird/meshbird/log"
"github.com/anacrolix/utp"
"github.com/meshbird/meshbird/network/protocol"
)

func TryConnect(h string, networkSecret *secure.NetworkSecret, ln *LocalNode) (*RemoteNode, error) {
host, portStr, errSplit := net.SplitHostPort(h)
if errSplit != nil {
return nil, errSplit
}

port, errConvert := strconv.Atoi(portStr)
if errConvert != nil {
return nil, errConvert
}

rn := new(RemoteNode)
rn.lastHeartbeat = time.Now()
rn.publicAddress = fmt.Sprintf("%s:%d", host, port + 1)

rn.logger = log.L(fmt.Sprintf("public %s", rn.publicAddress))
rn.logger.Debug("trying to connect...")

s, errSocket := utp.NewSocket("udp4", ":0")
if errSocket != nil {
rn.logger.Error("unable to crete a socket, %v", errSocket)
return nil, errSocket
}

conn, errDial := s.DialTimeout(rn.publicAddress, 10 * time.Second)
if errDial != nil {
rn.logger.Error("unable to dial, %s", errDial)
return nil, errDial
}

rn.conn = conn
rn.sessionKey = RandomBytes(16)

if err := protocol.WriteEncodeHandshake(rn.conn, rn.sessionKey, networkSecret); err != nil {
return nil, err
}
if _, okError := protocol.ReadDecodeOk(rn.conn); okError != nil {
return nil, okError
}

peerInfo, errPeerInfo := protocol.ReadDecodePeerInfo(rn.conn)
if errPeerInfo != nil {
return nil, errPeerInfo
}

rn.privateIP = peerInfo.PrivateIP()

// create new logger
log.RemoveLogger(rn.logger.Name())
rn.logger = log.L(fmt.Sprintf(rnLoggerFormat, rn.privateIP.String()))

if err := protocol.WriteEncodePeerInfo(rn.conn, ln.State().PrivateIP); err != nil {
return nil, err
}

rn.logger.Info("connected, with public address %q", rn.publicAddress)
return rn, nil
}

0 comments on commit 0937b2b

Please sign in to comment.