diff --git a/src/yggdrasil/api.go b/src/yggdrasil/api.go index 680ed4a9..1b6255dc 100644 --- a/src/yggdrasil/api.go +++ b/src/yggdrasil/api.go @@ -235,10 +235,12 @@ func (c *Core) PacketConn() *PacketConn { // Resolve takes a masked node ID and performs a search, returning the complete // node ID and the node's public key. func (c *Core) Resolve(nodeID, nodeMask *crypto.NodeID) (fullNodeID *crypto.NodeID, boxPubKey *crypto.BoxPubKey, err error) { + fmt.Println("**** START RESOLVE") + defer fmt.Println("**** END RESOLVE") + done := make(chan struct{}) c.router.Act(c, func() { - _, isIn := c.router.searches.searches[*nodeID] - if !isIn { + if _, searching := c.router.searches.searches[*nodeID]; !searching { searchCompleted := func(sinfo *sessionInfo, e error) { select { case <-done: @@ -257,8 +259,7 @@ func (c *Core) Resolve(nodeID, nodeMask *crypto.NodeID) (fullNodeID *crypto.Node close(done) } } - sinfo := c.router.searches.newIterSearch(nodeID, nodeMask, searchCompleted) - sinfo.startSearch() + c.router.searches.newIterSearch(nodeID, nodeMask, searchCompleted).startSearch() } else { err = errors.New("search already exists") close(done) diff --git a/src/yggdrasil/packetconn.go b/src/yggdrasil/packetconn.go index 06c7ace0..2c1f74e7 100644 --- a/src/yggdrasil/packetconn.go +++ b/src/yggdrasil/packetconn.go @@ -2,6 +2,7 @@ package yggdrasil import ( "errors" + "fmt" "net" "time" @@ -73,27 +74,33 @@ func (c *PacketConn) WriteTo(b []byte, addr net.Addr) (int, error) { nodeMask[i] = 0xFF } + var err error var session *sessionInfo phony.Block(c.sessions.router, func() { var ok bool session, ok = c.sessions.getByTheirPerm(boxPubKey) if !ok { - c.sessions.router.core.Resolve(nodeID, nodeMask) - session, _ = c.sessions.getByTheirPerm(boxPubKey) + nodeID, boxPubKey, err = c.sessions.router.core.Resolve(nodeID, nodeMask) + if err == nil { + session, _ = c.sessions.getByTheirPerm(boxPubKey) + } } }) + if err != nil { + return 0, fmt.Errorf("failed to find session/start search: %w", err) + } if session == nil { return 0, errors.New("expected a session but there was none") } - err := make(chan error, 1) + sendErr := make(chan error, 1) msg := FlowKeyMessage{Message: b} session.Act(c, func() { // Check if the packet is small enough to go through this session sessionMTU := session._getMTU() if types.MTU(len(b)) > sessionMTU { - err <- PacketConnError{maxsize: int(sessionMTU)} + sendErr <- PacketConnError{maxsize: int(sessionMTU)} return } @@ -125,11 +132,11 @@ func (c *PacketConn) WriteTo(b []byte, addr net.Addr) (int, error) { default: // Don't do anything, to keep traffic throttled } - err <- nil + sendErr <- nil }) - e := <-err - return len(b), e + err = <-sendErr + return len(b), err } // implements net.PacketConn