mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	update to latest phony, adjust interface use accordingly
This commit is contained in:
		
							parent
							
								
									4d9c6342a7
								
							
						
					
					
						commit
						3845f81357
					
				
					 14 changed files with 80 additions and 76 deletions
				
			
		| 
						 | 
				
			
			@ -27,7 +27,7 @@ type tunConn struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (s *tunConn) close() {
 | 
			
		||||
	s.tun.RecvFrom(s, s._close_from_tun)
 | 
			
		||||
	s.tun.Act(s, s._close_from_tun)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *tunConn) _close_from_tun() {
 | 
			
		||||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ func (s *tunConn) _read(bs []byte) (err error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (s *tunConn) writeFrom(from phony.Actor, bs []byte) {
 | 
			
		||||
	s.RecvFrom(from, func() {
 | 
			
		||||
	s.Act(from, func() {
 | 
			
		||||
		s._write(bs)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -197,7 +197,7 @@ func (s *tunConn) _write(bs []byte) (err error) {
 | 
			
		|||
			// No point in wasting resources to send back an error if there was none
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		s.RecvFrom(s.conn, func() {
 | 
			
		||||
		s.Act(s.conn, func() {
 | 
			
		||||
			if e, eok := err.(yggdrasil.ConnError); !eok {
 | 
			
		||||
				if e.Closed() {
 | 
			
		||||
					s.tun.log.Debugln(s.conn.String(), "TUN/TAP generic write debug:", err)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@ type tunWriter struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (w *tunWriter) writeFrom(from phony.Actor, b []byte) {
 | 
			
		||||
	w.RecvFrom(from, func() {
 | 
			
		||||
	w.Act(from, func() {
 | 
			
		||||
		w._write(b)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -90,7 +90,7 @@ func (w *tunWriter) _write(b []byte) {
 | 
			
		|||
		util.PutBytes(b)
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		w.tun.RecvFrom(w, func() {
 | 
			
		||||
		w.tun.Act(w, func() {
 | 
			
		||||
			if !w.tun.isOpen {
 | 
			
		||||
				w.tun.log.Errorln("TUN/TAP iface write error:", err)
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -118,12 +118,12 @@ func (r *tunReader) _read() {
 | 
			
		|||
	}
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		// Now read again
 | 
			
		||||
		r.RecvFrom(nil, r._read)
 | 
			
		||||
		r.Act(nil, r._read)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tun *TunAdapter) handlePacketFrom(from phony.Actor, packet []byte, err error) {
 | 
			
		||||
	tun.RecvFrom(from, func() {
 | 
			
		||||
	tun.Act(from, func() {
 | 
			
		||||
		tun._handlePacket(packet, err)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -248,7 +248,7 @@ func (tun *TunAdapter) _handlePacket(recvd []byte, err error) {
 | 
			
		|||
		if !known {
 | 
			
		||||
			go func() {
 | 
			
		||||
				conn, err := tun.dialer.DialByNodeIDandMask(dstNodeID, dstNodeIDMask)
 | 
			
		||||
				tun.RecvFrom(nil, func() {
 | 
			
		||||
				tun.Act(nil, func() {
 | 
			
		||||
					packets := tun.dials[*dstNodeID]
 | 
			
		||||
					delete(tun.dials, *dstNodeID)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -125,7 +125,7 @@ func (tun *TunAdapter) Init(config *config.NodeState, log *log.Logger, listener
 | 
			
		|||
// reader actor to handle packets on that interface.
 | 
			
		||||
func (tun *TunAdapter) Start() error {
 | 
			
		||||
	var err error
 | 
			
		||||
	<-tun.SyncExec(func() {
 | 
			
		||||
	phony.Block(tun, func() {
 | 
			
		||||
		err = tun._start()
 | 
			
		||||
	})
 | 
			
		||||
	return err
 | 
			
		||||
| 
						 | 
				
			
			@ -167,7 +167,7 @@ func (tun *TunAdapter) _start() error {
 | 
			
		|||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	go tun.handler()
 | 
			
		||||
	tun.reader.RecvFrom(nil, tun.reader._read) // Start the reader
 | 
			
		||||
	tun.reader.Act(nil, tun.reader._read) // Start the reader
 | 
			
		||||
	tun.icmpv6.Init(tun)
 | 
			
		||||
	if iftapmode {
 | 
			
		||||
		go tun.icmpv6.Solicit(tun.addr)
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +180,7 @@ func (tun *TunAdapter) _start() error {
 | 
			
		|||
// read/write goroutines to handle packets on that interface.
 | 
			
		||||
func (tun *TunAdapter) Stop() error {
 | 
			
		||||
	var err error
 | 
			
		||||
	<-tun.SyncExec(func() {
 | 
			
		||||
	phony.Block(tun, func() {
 | 
			
		||||
		err = tun._stop()
 | 
			
		||||
	})
 | 
			
		||||
	return err
 | 
			
		||||
| 
						 | 
				
			
			@ -233,7 +233,7 @@ func (tun *TunAdapter) handler() error {
 | 
			
		|||
			tun.log.Errorln("TUN/TAP connection accept error:", err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		<-tun.SyncExec(func() {
 | 
			
		||||
		phony.Block(tun, func() {
 | 
			
		||||
			if _, err := tun._wrap(conn); err != nil {
 | 
			
		||||
				// Something went wrong when storing the connection, typically that
 | 
			
		||||
				// something already exists for this address or subnet
 | 
			
		||||
| 
						 | 
				
			
			@ -273,11 +273,11 @@ func (tun *TunAdapter) _wrap(conn *yggdrasil.Conn) (c *tunConn, err error) {
 | 
			
		|||
	tun.subnetToConn[s.snet] = &s
 | 
			
		||||
	// Set the read callback and start the timeout
 | 
			
		||||
	conn.SetReadCallback(func(bs []byte) {
 | 
			
		||||
		s.RecvFrom(conn, func() {
 | 
			
		||||
		s.Act(conn, func() {
 | 
			
		||||
			s._read(bs)
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
	s.RecvFrom(nil, s.stillAlive)
 | 
			
		||||
	s.Act(nil, s.stillAlive)
 | 
			
		||||
	// Return
 | 
			
		||||
	return c, err
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,8 @@ import (
 | 
			
		|||
	"github.com/gologme/log"
 | 
			
		||||
	"github.com/yggdrasil-network/yggdrasil-go/src/address"
 | 
			
		||||
	"github.com/yggdrasil-network/yggdrasil-go/src/crypto"
 | 
			
		||||
 | 
			
		||||
	"github.com/Arceliar/phony"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Peer represents a single peer object. This contains information from the
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +108,7 @@ func (c *Core) GetPeers() []Peer {
 | 
			
		|||
	for _, port := range ps {
 | 
			
		||||
		p := ports[port]
 | 
			
		||||
		var info Peer
 | 
			
		||||
		<-p.SyncExec(func() {
 | 
			
		||||
		phony.Block(p, func() {
 | 
			
		||||
			info = Peer{
 | 
			
		||||
				Endpoint:   p.intf.name,
 | 
			
		||||
				BytesSent:  p.bytesSent,
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +140,7 @@ func (c *Core) GetSwitchPeers() []SwitchPeer {
 | 
			
		|||
		}
 | 
			
		||||
		coords := elem.locator.getCoords()
 | 
			
		||||
		var info SwitchPeer
 | 
			
		||||
		<-peer.SyncExec(func() {
 | 
			
		||||
		phony.Block(peer, func() {
 | 
			
		||||
			info = SwitchPeer{
 | 
			
		||||
				Coords:     append([]uint64{}, wire_coordsBytestoUint64s(coords)...),
 | 
			
		||||
				BytesSent:  peer.bytesSent,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,12 +80,12 @@ func newConn(core *Core, nodeID *crypto.NodeID, nodeMask *crypto.NodeID, session
 | 
			
		|||
 | 
			
		||||
func (c *Conn) String() string {
 | 
			
		||||
	var s string
 | 
			
		||||
	<-c.SyncExec(func() { s = fmt.Sprintf("conn=%p", c) })
 | 
			
		||||
	phony.Block(c, func() { s = fmt.Sprintf("conn=%p", c) })
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Conn) setMTU(from phony.Actor, mtu uint16) {
 | 
			
		||||
	c.RecvFrom(from, func() { c.mtu = mtu })
 | 
			
		||||
	c.Act(from, func() { c.mtu = mtu })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This should never be called from the router goroutine, used in the dial functions
 | 
			
		||||
| 
						 | 
				
			
			@ -143,7 +143,7 @@ func (c *Conn) doSearch() {
 | 
			
		|||
			sinfo.continueSearch()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	c.core.router.RecvFrom(c.session, routerWork)
 | 
			
		||||
	c.core.router.Act(c.session, routerWork)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Conn) _getDeadlineCancellation(t *time.Time) (util.Cancellation, bool) {
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +159,7 @@ func (c *Conn) _getDeadlineCancellation(t *time.Time) (util.Cancellation, bool)
 | 
			
		|||
 | 
			
		||||
// SetReadCallback sets a callback which will be called whenever a packet is received.
 | 
			
		||||
func (c *Conn) SetReadCallback(callback func([]byte)) {
 | 
			
		||||
	c.RecvFrom(nil, func() {
 | 
			
		||||
	c.Act(nil, func() {
 | 
			
		||||
		c.readCallback = callback
 | 
			
		||||
		c._drainReadBuffer()
 | 
			
		||||
	})
 | 
			
		||||
| 
						 | 
				
			
			@ -172,14 +172,14 @@ func (c *Conn) _drainReadBuffer() {
 | 
			
		|||
	select {
 | 
			
		||||
	case bs := <-c.readBuffer:
 | 
			
		||||
		c.readCallback(bs)
 | 
			
		||||
		c.RecvFrom(nil, c._drainReadBuffer) // In case there's more
 | 
			
		||||
		c.Act(nil, c._drainReadBuffer) // In case there's more
 | 
			
		||||
	default:
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Called by the session to pass a new message to the Conn
 | 
			
		||||
func (c *Conn) recvMsg(from phony.Actor, msg []byte) {
 | 
			
		||||
	c.RecvFrom(from, func() {
 | 
			
		||||
	c.Act(from, func() {
 | 
			
		||||
		if c.readCallback != nil {
 | 
			
		||||
			c.readCallback(msg)
 | 
			
		||||
		} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -195,7 +195,7 @@ func (c *Conn) recvMsg(from phony.Actor, msg []byte) {
 | 
			
		|||
func (c *Conn) ReadNoCopy() ([]byte, error) {
 | 
			
		||||
	var cancel util.Cancellation
 | 
			
		||||
	var doCancel bool
 | 
			
		||||
	<-c.SyncExec(func() { cancel, doCancel = c._getDeadlineCancellation(c.readDeadline) })
 | 
			
		||||
	phony.Block(c, func() { cancel, doCancel = c._getDeadlineCancellation(c.readDeadline) })
 | 
			
		||||
	if doCancel {
 | 
			
		||||
		defer cancel.Cancel(nil)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +234,7 @@ func (c *Conn) _write(msg FlowKeyMessage) error {
 | 
			
		|||
	if len(msg.Message) > int(c.mtu) {
 | 
			
		||||
		return ConnError{errors.New("packet too big"), true, false, false, int(c.mtu)}
 | 
			
		||||
	}
 | 
			
		||||
	c.session.RecvFrom(c, func() {
 | 
			
		||||
	c.session.Act(c, func() {
 | 
			
		||||
		// Send the packet
 | 
			
		||||
		c.session._send(msg)
 | 
			
		||||
		// Session keep-alive, while we wait for the crypto workers from send
 | 
			
		||||
| 
						 | 
				
			
			@ -258,7 +258,7 @@ func (c *Conn) _write(msg FlowKeyMessage) error {
 | 
			
		|||
// This is used internaly by WriteNoCopy and Write.
 | 
			
		||||
// If the callback is called with a non-nil value, then it is safe to reuse the argument FlowKeyMessage.
 | 
			
		||||
func (c *Conn) WriteFrom(from phony.Actor, msg FlowKeyMessage, callback func(error)) {
 | 
			
		||||
	c.RecvFrom(from, func() {
 | 
			
		||||
	c.Act(from, func() {
 | 
			
		||||
		callback(c._write(msg))
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -268,7 +268,7 @@ func (c *Conn) WriteFrom(from phony.Actor, msg FlowKeyMessage, callback func(err
 | 
			
		|||
func (c *Conn) WriteNoCopy(msg FlowKeyMessage) error {
 | 
			
		||||
	var cancel util.Cancellation
 | 
			
		||||
	var doCancel bool
 | 
			
		||||
	<-c.SyncExec(func() { cancel, doCancel = c._getDeadlineCancellation(c.writeDeadline) })
 | 
			
		||||
	phony.Block(c, func() { cancel, doCancel = c._getDeadlineCancellation(c.writeDeadline) })
 | 
			
		||||
	var err error
 | 
			
		||||
	select {
 | 
			
		||||
	case <-cancel.Finished():
 | 
			
		||||
| 
						 | 
				
			
			@ -299,7 +299,7 @@ func (c *Conn) Write(b []byte) (int, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (c *Conn) Close() (err error) {
 | 
			
		||||
	<-c.SyncExec(func() {
 | 
			
		||||
	phony.Block(c, func() {
 | 
			
		||||
		if c.session != nil {
 | 
			
		||||
			// Close the session, if it hasn't been closed already
 | 
			
		||||
			if e := c.session.cancel.Cancel(errors.New("connection closed")); e != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -319,7 +319,7 @@ func (c *Conn) LocalAddr() crypto.NodeID {
 | 
			
		|||
func (c *Conn) RemoteAddr() crypto.NodeID {
 | 
			
		||||
	// TODO warn that this can block while waiting for the Conn actor to run, so don't call it from other actors...
 | 
			
		||||
	var n crypto.NodeID
 | 
			
		||||
	<-c.SyncExec(func() { n = *c.nodeID })
 | 
			
		||||
	phony.Block(c, func() { n = *c.nodeID })
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -331,12 +331,12 @@ func (c *Conn) SetDeadline(t time.Time) error {
 | 
			
		|||
 | 
			
		||||
func (c *Conn) SetReadDeadline(t time.Time) error {
 | 
			
		||||
	// TODO warn that this can block while waiting for the Conn actor to run, so don't call it from other actors...
 | 
			
		||||
	<-c.SyncExec(func() { c.readDeadline = &t })
 | 
			
		||||
	phony.Block(c, func() { c.readDeadline = &t })
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Conn) SetWriteDeadline(t time.Time) error {
 | 
			
		||||
	// TODO warn that this can block while waiting for the Conn actor to run, so don't call it from other actors...
 | 
			
		||||
	<-c.SyncExec(func() { c.writeDeadline = &t })
 | 
			
		||||
	phony.Block(c, func() { c.writeDeadline = &t })
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,8 @@ import "github.com/yggdrasil-network/yggdrasil-go/src/config"
 | 
			
		|||
import "github.com/yggdrasil-network/yggdrasil-go/src/crypto"
 | 
			
		||||
import "github.com/yggdrasil-network/yggdrasil-go/src/defaults"
 | 
			
		||||
 | 
			
		||||
import "github.com/Arceliar/phony"
 | 
			
		||||
 | 
			
		||||
// Start the profiler in debug builds, if the required environment variable is set.
 | 
			
		||||
func init() {
 | 
			
		||||
	envVarName := "PPROFLISTEN"
 | 
			
		||||
| 
						 | 
				
			
			@ -572,14 +574,14 @@ func DEBUG_simLinkPeers(p, q *peer) {
 | 
			
		|||
					continue
 | 
			
		||||
				case packet := <-send:
 | 
			
		||||
					packets = append(packets, packet)
 | 
			
		||||
					<-source.core.switchTable.SyncExec(func() {
 | 
			
		||||
					phony.Block(&source.core.switchTable, func() {
 | 
			
		||||
						source.core.switchTable._idleIn(source.port)
 | 
			
		||||
					})
 | 
			
		||||
					continue
 | 
			
		||||
				default:
 | 
			
		||||
				}
 | 
			
		||||
				if len(packets) > 0 {
 | 
			
		||||
					<-dest.SyncExec(func() { dest._handlePacket(packets[0]) })
 | 
			
		||||
					phony.Block(dest, func() { dest._handlePacket(packets[0]) })
 | 
			
		||||
					packets = packets[1:]
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -588,7 +590,7 @@ func DEBUG_simLinkPeers(p, q *peer) {
 | 
			
		|||
					packets = append(packets, packet)
 | 
			
		||||
				case packet := <-send:
 | 
			
		||||
					packets = append(packets, packet)
 | 
			
		||||
					<-source.core.switchTable.SyncExec(func() {
 | 
			
		||||
					phony.Block(&source.core.switchTable, func() {
 | 
			
		||||
						source.core.switchTable._idleIn(source.port)
 | 
			
		||||
					})
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -597,10 +599,10 @@ func DEBUG_simLinkPeers(p, q *peer) {
 | 
			
		|||
	}
 | 
			
		||||
	goWorkers(p, q)
 | 
			
		||||
	goWorkers(q, p)
 | 
			
		||||
	<-p.core.switchTable.SyncExec(func() {
 | 
			
		||||
	phony.Block(&p.core.switchTable, func() {
 | 
			
		||||
		p.core.switchTable._idleIn(p.port)
 | 
			
		||||
	})
 | 
			
		||||
	<-q.core.switchTable.SyncExec(func() {
 | 
			
		||||
	phony.Block(&q.core.switchTable, func() {
 | 
			
		||||
		q.core.switchTable._idleIn(q.port)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -227,7 +227,7 @@ func (intf *linkInterface) handler() error {
 | 
			
		|||
		strings.ToUpper(intf.info.linkType), themString, intf.info.local)
 | 
			
		||||
	// Start things
 | 
			
		||||
	go intf.peer.start()
 | 
			
		||||
	intf.reader.RecvFrom(nil, intf.reader._read)
 | 
			
		||||
	intf.reader.Act(nil, intf.reader._read)
 | 
			
		||||
	// Wait for the reader to finish
 | 
			
		||||
	err = <-intf.reader.err
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -251,7 +251,7 @@ const (
 | 
			
		|||
 | 
			
		||||
// notify the intf that we're currently sending
 | 
			
		||||
func (intf *linkInterface) notifySending(size int, isLinkTraffic bool) {
 | 
			
		||||
	intf.RecvFrom(&intf.writer, func() {
 | 
			
		||||
	intf.Act(&intf.writer, func() {
 | 
			
		||||
		if !isLinkTraffic {
 | 
			
		||||
			intf.inSwitch = false
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -270,7 +270,7 @@ func (intf *linkInterface) _cancelStallTimer() {
 | 
			
		|||
 | 
			
		||||
// called by an AfterFunc if we appear to have timed out
 | 
			
		||||
func (intf *linkInterface) notifyBlockedSend() {
 | 
			
		||||
	intf.RecvFrom(nil, func() { // Sent from a time.AfterFunc
 | 
			
		||||
	intf.Act(nil, func() { // Sent from a time.AfterFunc
 | 
			
		||||
		if intf.sendTimer != nil {
 | 
			
		||||
			//As far as we know, we're still trying to send, and the timer fired.
 | 
			
		||||
			intf.link.core.switchTable.blockPeer(intf.peer.port)
 | 
			
		||||
| 
						 | 
				
			
			@ -280,7 +280,7 @@ func (intf *linkInterface) notifyBlockedSend() {
 | 
			
		|||
 | 
			
		||||
// notify the intf that we've finished sending, returning the peer to the switch
 | 
			
		||||
func (intf *linkInterface) notifySent(size int, isLinkTraffic bool) {
 | 
			
		||||
	intf.RecvFrom(&intf.writer, func() {
 | 
			
		||||
	intf.Act(&intf.writer, func() {
 | 
			
		||||
		intf.sendTimer.Stop()
 | 
			
		||||
		intf.sendTimer = nil
 | 
			
		||||
		if !isLinkTraffic {
 | 
			
		||||
| 
						 | 
				
			
			@ -296,7 +296,7 @@ func (intf *linkInterface) notifySent(size int, isLinkTraffic bool) {
 | 
			
		|||
func (intf *linkInterface) _notifySwitch() {
 | 
			
		||||
	if !intf.inSwitch && !intf.stalled {
 | 
			
		||||
		intf.inSwitch = true
 | 
			
		||||
		intf.link.core.switchTable.RecvFrom(intf, func() {
 | 
			
		||||
		intf.link.core.switchTable.Act(intf, func() {
 | 
			
		||||
			intf.link.core.switchTable._idleIn(intf.peer.port)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -304,7 +304,7 @@ func (intf *linkInterface) _notifySwitch() {
 | 
			
		|||
 | 
			
		||||
// Set the peer as stalled, to prevent them from returning to the switch until a read succeeds
 | 
			
		||||
func (intf *linkInterface) notifyStalled() {
 | 
			
		||||
	intf.RecvFrom(nil, func() { // Sent from a time.AfterFunc
 | 
			
		||||
	intf.Act(nil, func() { // Sent from a time.AfterFunc
 | 
			
		||||
		if intf.stallTimer != nil {
 | 
			
		||||
			intf.stallTimer.Stop()
 | 
			
		||||
			intf.stallTimer = nil
 | 
			
		||||
| 
						 | 
				
			
			@ -316,7 +316,7 @@ func (intf *linkInterface) notifyStalled() {
 | 
			
		|||
 | 
			
		||||
// reset the close timer
 | 
			
		||||
func (intf *linkInterface) notifyReading() {
 | 
			
		||||
	intf.RecvFrom(&intf.reader, func() {
 | 
			
		||||
	intf.Act(&intf.reader, func() {
 | 
			
		||||
		if intf.closeTimer != nil {
 | 
			
		||||
			intf.closeTimer.Stop()
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -326,7 +326,7 @@ func (intf *linkInterface) notifyReading() {
 | 
			
		|||
 | 
			
		||||
// wake up the link if it was stalled, and (if size > 0) prepare to send keep-alive traffic
 | 
			
		||||
func (intf *linkInterface) notifyRead(size int) {
 | 
			
		||||
	intf.RecvFrom(&intf.reader, func() {
 | 
			
		||||
	intf.Act(&intf.reader, func() {
 | 
			
		||||
		if intf.stallTimer != nil {
 | 
			
		||||
			intf.stallTimer.Stop()
 | 
			
		||||
			intf.stallTimer = nil
 | 
			
		||||
| 
						 | 
				
			
			@ -341,7 +341,7 @@ func (intf *linkInterface) notifyRead(size int) {
 | 
			
		|||
 | 
			
		||||
// We need to send keep-alive traffic now
 | 
			
		||||
func (intf *linkInterface) notifyDoKeepAlive() {
 | 
			
		||||
	intf.RecvFrom(nil, func() { // Sent from a time.AfterFunc
 | 
			
		||||
	intf.Act(nil, func() { // Sent from a time.AfterFunc
 | 
			
		||||
		if intf.stallTimer != nil {
 | 
			
		||||
			intf.stallTimer.Stop()
 | 
			
		||||
			intf.stallTimer = nil
 | 
			
		||||
| 
						 | 
				
			
			@ -358,7 +358,7 @@ type linkWriter struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (w *linkWriter) sendFrom(from phony.Actor, bss [][]byte, isLinkTraffic bool) {
 | 
			
		||||
	w.RecvFrom(from, func() {
 | 
			
		||||
	w.Act(from, func() {
 | 
			
		||||
		var size int
 | 
			
		||||
		for _, bs := range bss {
 | 
			
		||||
			size += len(bs)
 | 
			
		||||
| 
						 | 
				
			
			@ -396,5 +396,5 @@ func (r *linkReader) _read() {
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// Now try to read again
 | 
			
		||||
	r.RecvFrom(nil, r._read)
 | 
			
		||||
	r.Act(nil, r._read)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -178,7 +178,7 @@ func (ps *peers) sendSwitchMsgs(from phony.Actor) {
 | 
			
		|||
		if p.port == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		p.RecvFrom(from, p._sendSwitchMsg)
 | 
			
		||||
		p.Act(from, p._sendSwitchMsg)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +187,7 @@ func (ps *peers) sendSwitchMsgs(from phony.Actor) {
 | 
			
		|||
func (p *peer) start() {
 | 
			
		||||
	var updateDHT func()
 | 
			
		||||
	updateDHT = func() {
 | 
			
		||||
		<-p.SyncExec(func() {
 | 
			
		||||
		phony.Block(p, func() {
 | 
			
		||||
			select {
 | 
			
		||||
			case <-p.done:
 | 
			
		||||
			default:
 | 
			
		||||
| 
						 | 
				
			
			@ -198,7 +198,7 @@ func (p *peer) start() {
 | 
			
		|||
	}
 | 
			
		||||
	updateDHT()
 | 
			
		||||
	// Just for good measure, immediately send a switch message to this peer when we start
 | 
			
		||||
	<-p.SyncExec(p._sendSwitchMsg)
 | 
			
		||||
	p.Act(nil, p._sendSwitchMsg)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *peer) _updateDHT() {
 | 
			
		||||
| 
						 | 
				
			
			@ -208,7 +208,7 @@ func (p *peer) _updateDHT() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (p *peer) handlePacketFrom(from phony.Actor, packet []byte) {
 | 
			
		||||
	p.RecvFrom(from, func() {
 | 
			
		||||
	p.Act(from, func() {
 | 
			
		||||
		p._handlePacket(packet)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -246,7 +246,7 @@ func (p *peer) _handleTraffic(packet []byte) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (p *peer) sendPacketsFrom(from phony.Actor, packets [][]byte) {
 | 
			
		||||
	p.RecvFrom(from, func() {
 | 
			
		||||
	p.Act(from, func() {
 | 
			
		||||
		p._sendPackets(packets)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,7 +77,7 @@ func (r *router) reconfigure(e chan error) {
 | 
			
		|||
	defer close(e)
 | 
			
		||||
	var errs []error
 | 
			
		||||
	// Reconfigure the router
 | 
			
		||||
	<-r.SyncExec(func() {
 | 
			
		||||
	phony.Block(r, func() {
 | 
			
		||||
		current := r.core.config.GetCurrent()
 | 
			
		||||
		err := r.nodeinfo.setNodeInfo(current.NodeInfo, current.NodeInfoPrivacy)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ func (r *router) start() error {
 | 
			
		|||
 | 
			
		||||
// In practice, the switch will call this with 1 packet
 | 
			
		||||
func (r *router) handlePackets(from phony.Actor, packets [][]byte) {
 | 
			
		||||
	r.RecvFrom(from, func() {
 | 
			
		||||
	r.Act(from, func() {
 | 
			
		||||
		for _, packet := range packets {
 | 
			
		||||
			r._handlePacket(packet)
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -107,14 +107,14 @@ func (r *router) handlePackets(from phony.Actor, packets [][]byte) {
 | 
			
		|||
 | 
			
		||||
// Insert a peer info into the dht, TODO? make the dht a separate actor
 | 
			
		||||
func (r *router) insertPeer(from phony.Actor, info *dhtInfo) {
 | 
			
		||||
	r.RecvFrom(from, func() {
 | 
			
		||||
	r.Act(from, func() {
 | 
			
		||||
		r.dht.insertPeer(info)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reset sessions and DHT after the switch sees our coords change
 | 
			
		||||
func (r *router) reset(from phony.Actor) {
 | 
			
		||||
	r.RecvFrom(from, func() {
 | 
			
		||||
	r.Act(from, func() {
 | 
			
		||||
		r.sessions.reset()
 | 
			
		||||
		r.dht.reset()
 | 
			
		||||
	})
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +123,7 @@ func (r *router) reset(from phony.Actor) {
 | 
			
		|||
// TODO remove reconfigure so this is just a ticker loop
 | 
			
		||||
// and then find something better than a ticker loop to schedule things...
 | 
			
		||||
func (r *router) doMaintenance() {
 | 
			
		||||
	<-r.SyncExec(func() {
 | 
			
		||||
	phony.Block(r, func() {
 | 
			
		||||
		// Any periodic maintenance stuff goes here
 | 
			
		||||
		r.core.switchTable.doMaintenance()
 | 
			
		||||
		r.dht.doMaintenance()
 | 
			
		||||
| 
						 | 
				
			
			@ -252,7 +252,7 @@ func (r *router) _handleNodeInfo(bs []byte, fromKey *crypto.BoxPubKey) {
 | 
			
		|||
	r.nodeinfo.handleNodeInfo(&req)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO remove this, have things either be actors that send message or else call SyncExec directly
 | 
			
		||||
// TODO remove this, have things either be actors that send message or else call Block directly
 | 
			
		||||
func (r *router) doAdmin(f func()) {
 | 
			
		||||
	<-r.SyncExec(f)
 | 
			
		||||
	phony.Block(r, f)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -153,7 +153,7 @@ func (sinfo *searchInfo) continueSearch() {
 | 
			
		|||
	// Note that this will spawn multiple parallel searches as time passes
 | 
			
		||||
	// Any that die aren't restarted, but a new one will start later
 | 
			
		||||
	time.AfterFunc(search_RETRY_TIME, func() {
 | 
			
		||||
		sinfo.searches.router.RecvFrom(nil, func() {
 | 
			
		||||
		sinfo.searches.router.Act(nil, func() {
 | 
			
		||||
			// FIXME this keeps the search alive forever if not for the searches map, fix that
 | 
			
		||||
			newSearchInfo := sinfo.searches.searches[sinfo.dest]
 | 
			
		||||
			if newSearchInfo != sinfo {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,7 +80,7 @@ func (sinfo *sessionInfo) reconfigure(e chan error) {
 | 
			
		|||
 | 
			
		||||
// TODO remove this, call SyncExec directly
 | 
			
		||||
func (sinfo *sessionInfo) doFunc(f func()) {
 | 
			
		||||
	<-sinfo.SyncExec(f)
 | 
			
		||||
	phony.Block(sinfo, f)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Represents a session ping/pong packet, andincludes information like public keys, a session handle, coords, a timestamp to prevent replays, and the tun/tap MTU.
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +164,7 @@ func (ss *sessions) init(r *router) {
 | 
			
		|||
func (ss *sessions) reconfigure(e chan error) {
 | 
			
		||||
	defer close(e)
 | 
			
		||||
	responses := make(map[crypto.Handle]chan error)
 | 
			
		||||
	<-ss.router.SyncExec(func() {
 | 
			
		||||
	phony.Block(ss.router, func() {
 | 
			
		||||
		for index, session := range ss.sinfos {
 | 
			
		||||
			responses[index] = make(chan error)
 | 
			
		||||
			go session.reconfigure(responses[index])
 | 
			
		||||
| 
						 | 
				
			
			@ -287,7 +287,7 @@ func (ss *sessions) cleanup() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (sinfo *sessionInfo) doRemove() {
 | 
			
		||||
	sinfo.sessions.router.RecvFrom(nil, func() {
 | 
			
		||||
	sinfo.sessions.router.Act(nil, func() {
 | 
			
		||||
		sinfo.sessions.removeSession(sinfo)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -341,7 +341,7 @@ func (ss *sessions) getSharedKey(myPriv *crypto.BoxPrivKey,
 | 
			
		|||
 | 
			
		||||
// Sends a session ping by calling sendPingPong in ping mode.
 | 
			
		||||
func (sinfo *sessionInfo) ping(from phony.Actor) {
 | 
			
		||||
	sinfo.RecvFrom(from, func() {
 | 
			
		||||
	sinfo.Act(from, func() {
 | 
			
		||||
		sinfo._sendPingPong(false)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -362,14 +362,14 @@ func (sinfo *sessionInfo) _sendPingPong(isPong bool) {
 | 
			
		|||
	}
 | 
			
		||||
	packet := p.encode()
 | 
			
		||||
	// TODO rewrite the below if/when the peer struct becomes an actor, to not go through the router first
 | 
			
		||||
	sinfo.sessions.router.RecvFrom(sinfo, func() { sinfo.sessions.router.out(packet) })
 | 
			
		||||
	sinfo.sessions.router.Act(sinfo, func() { sinfo.sessions.router.out(packet) })
 | 
			
		||||
	if sinfo.pingTime.Before(sinfo.time) {
 | 
			
		||||
		sinfo.pingTime = time.Now()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sinfo *sessionInfo) setConn(from phony.Actor, conn *Conn) {
 | 
			
		||||
	sinfo.RecvFrom(from, func() {
 | 
			
		||||
	sinfo.Act(from, func() {
 | 
			
		||||
		sinfo.conn = conn
 | 
			
		||||
		sinfo.conn.setMTU(sinfo, sinfo._getMTU())
 | 
			
		||||
	})
 | 
			
		||||
| 
						 | 
				
			
			@ -404,7 +404,7 @@ func (ss *sessions) handlePing(ping *sessionPing) {
 | 
			
		|||
		ss.listenerMutex.Unlock()
 | 
			
		||||
	}
 | 
			
		||||
	if sinfo != nil {
 | 
			
		||||
		sinfo.RecvFrom(ss.router, func() {
 | 
			
		||||
		sinfo.Act(ss.router, func() {
 | 
			
		||||
			// Update the session
 | 
			
		||||
			if !sinfo._update(ping) { /*panic("Should not happen in testing")*/
 | 
			
		||||
				return
 | 
			
		||||
| 
						 | 
				
			
			@ -472,7 +472,7 @@ func (sinfo *sessionInfo) _updateNonce(theirNonce *crypto.BoxNonce) {
 | 
			
		|||
// Called after coord changes, so attemtps to use a session will trigger a new ping and notify the remote end of the coord change.
 | 
			
		||||
func (ss *sessions) reset() {
 | 
			
		||||
	for _, sinfo := range ss.sinfos {
 | 
			
		||||
		sinfo.RecvFrom(ss.router, func() {
 | 
			
		||||
		sinfo.Act(ss.router, func() {
 | 
			
		||||
			sinfo.reset = true
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -488,7 +488,7 @@ type FlowKeyMessage struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (sinfo *sessionInfo) recv(from phony.Actor, packet *wire_trafficPacket) {
 | 
			
		||||
	sinfo.RecvFrom(from, func() {
 | 
			
		||||
	sinfo.Act(from, func() {
 | 
			
		||||
		sinfo._recvPacket(packet)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -562,7 +562,7 @@ func (sinfo *sessionInfo) _send(msg FlowKeyMessage) {
 | 
			
		|||
			util.PutBytes(p.Payload)
 | 
			
		||||
			// Send the packet
 | 
			
		||||
			// TODO replace this with a send to the peer struct if that becomes an actor
 | 
			
		||||
			sinfo.sessions.router.RecvFrom(sinfo, func() {
 | 
			
		||||
			sinfo.sessions.router.Act(sinfo, func() {
 | 
			
		||||
				sinfo.sessions.router.out(packet)
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -574,7 +574,7 @@ func (sinfo *sessionInfo) _send(msg FlowKeyMessage) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (sinfo *sessionInfo) checkCallbacks() {
 | 
			
		||||
	sinfo.RecvFrom(nil, func() {
 | 
			
		||||
	sinfo.Act(nil, func() {
 | 
			
		||||
		if len(sinfo.callbacks) > 0 {
 | 
			
		||||
			select {
 | 
			
		||||
			case callback := <-sinfo.callbacks[0]:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -192,7 +192,7 @@ func (t *switchTable) init(core *Core) {
 | 
			
		|||
	t.updater.Store(&sync.Once{})
 | 
			
		||||
	t.table.Store(lookupTable{})
 | 
			
		||||
	t.drop = make(map[crypto.SigPubKey]int64)
 | 
			
		||||
	<-t.SyncExec(func() {
 | 
			
		||||
	phony.Block(t, func() {
 | 
			
		||||
		t.queues.totalMaxSize = SwitchQueueTotalMinSize
 | 
			
		||||
		t.queues.bufs = make(map[string]switch_buffer)
 | 
			
		||||
		t.idle = make(map[switchPort]time.Time)
 | 
			
		||||
| 
						 | 
				
			
			@ -827,7 +827,7 @@ func (t *switchTable) _handleIdle(port switchPort) bool {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (t *switchTable) packetInFrom(from phony.Actor, bytes []byte) {
 | 
			
		||||
	t.RecvFrom(from, func() {
 | 
			
		||||
	t.Act(from, func() {
 | 
			
		||||
		t._packetIn(bytes)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -870,5 +870,5 @@ func (t *switchTable) _idleIn(port switchPort) {
 | 
			
		|||
// Passed a function to call.
 | 
			
		||||
// This will send the function to t.admin and block until it finishes.
 | 
			
		||||
func (t *switchTable) doAdmin(f func()) {
 | 
			
		||||
	<-t.SyncExec(f)
 | 
			
		||||
	phony.Block(t, f)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue