- if *proxy != "" {
- go proxyStart()
- }
- govpn.BothPrintf(`[started bind="%s"]`, *bindAddr)
-
- var needsDeletion bool
-MainCycle:
- for {
- select {
- case <-termSignal:
- govpn.BothPrintf(`[terminating bind="%s"]`, *bindAddr)
- for _, ps := range peers {
- govpn.ScriptCall(
- confs[*ps.peer.ID].Down,
- ps.tap.Name,
- ps.peer.Addr,
- )
- }
- break MainCycle
- case <-hsHeartbeat:
- now := time.Now()
- hsLock.Lock()
- for addr, hs := range handshakes {
- if hs.LastPing.Add(timeout).Before(now) {
- govpn.Printf(`[handshake-delete bind="%s" addr="%s"]`, *bindAddr, addr)
- hs.Zero()
- delete(handshakes, addr)
- }
- }
- peersLock.Lock()
- peersByIDLock.Lock()
- kpLock.Lock()
- for addr, ps := range peers {
- ps.peer.BusyR.Lock()
- needsDeletion = ps.peer.LastPing.Add(timeout).Before(now)
- ps.peer.BusyR.Unlock()
- if needsDeletion {
- govpn.Printf(`[peer-delete bind="%s" peer="%s"]`, *bindAddr, ps.peer)
- delete(peers, addr)
- delete(knownPeers, addr)
- delete(peersByID, *ps.peer.ID)
- go govpn.ScriptCall(
- confs[*ps.peer.ID].Down,
- ps.tap.Name,
- ps.peer.Addr,
- )
- ps.terminator <- struct{}{}
- }
- }
- hsLock.Unlock()
- peersLock.Unlock()
- peersByIDLock.Unlock()
- kpLock.Unlock()
- }