let the peer's linkLoop call close if the peer receives no announcements for too long

This commit is contained in:
Arceliar 2018-05-06 17:17:12 -05:00
parent 6026e0a014
commit 80f893aac3
2 changed files with 38 additions and 31 deletions

View File

@ -82,6 +82,8 @@ type peer struct {
throttle uint8
// Called when a peer is removed, to close the underlying connection, or via admin api
close func()
// To allow the peer to call close if idle for too long
lastAnc time.Time
}
const peer_Throttle = 1
@ -106,13 +108,10 @@ func (p *peer) updateBandwidth(bytes int, duration time.Duration) {
func (ps *peers) newPeer(box *boxPubKey,
sig *sigPubKey) *peer {
//in <-chan []byte,
//out chan<- []byte) *peer {
p := peer{box: *box,
sig: *sig,
shared: *getSharedKey(&ps.core.boxPriv, box),
//in: in,
//out: out,
lastAnc: time.Now(),
core: ps.core}
ps.mutex.Lock()
defer ps.mutex.Unlock()
@ -165,7 +164,10 @@ func (p *peer) linkLoop(in <-chan []byte) {
}
p.handleLinkTraffic(packet)
case <-ticker.C:
{
if time.Since(p.lastAnc) > 16*time.Second && p.close != nil {
// Seems to have timed out, try to trigger a close
p.close()
}
p.throttle = 0
if p.port == 0 {
continue
@ -192,7 +194,6 @@ func (p *peer) linkLoop(in <-chan []byte) {
}
}
}
}
func (p *peer) handlePacket(packet []byte, linkIn chan<- []byte) {
pType, pTypeLen := wire_decode_uint64(packet)
@ -217,6 +218,10 @@ func (p *peer) handlePacket(packet []byte, linkIn chan<- []byte) {
}
func (p *peer) handleTraffic(packet []byte, pTypeLen int) {
if p.msgAnc == nil {
// Drop traffic until the peer manages to send us at least one anc
return
}
ttl, ttlLen := wire_decode_uint64(packet[pTypeLen:])
ttlBegin := pTypeLen
ttlEnd := pTypeLen + ttlLen
@ -299,6 +304,7 @@ func (p *peer) handleSwitchAnnounce(packet []byte) {
}
p.msgAnc = &anc
p.processSwitchMessage()
p.lastAnc = time.Now()
}
func (p *peer) requestHop(hop uint64) {

View File

@ -104,6 +104,7 @@ func generateConfig(isAutoconf bool) *nodeConfig {
cfg.SigPub = hex.EncodeToString(spub[:])
cfg.SigPriv = hex.EncodeToString(spriv[:])
cfg.Peers = []string{}
cfg.PeerBoxPubs = []string{}
cfg.Multicast = true
cfg.LinkLocal = ""
cfg.IfName = core.DEBUG_GetTUNDefaultIfName()