package peer import ( "log" "time" "vppn/peer/control" "vppn/peer/wginterface" ) func (a *App) onTick() { wgPeers := a.devPeers() now := time.Now().UnixNano() for _, wgPeer := range wgPeers { p, ok := a.peersByKey[wgPeer.PublicKey] if !ok { log.Printf("Wireguard peer not in index, removing: %v", wgPeer) a.devRemove(&Peer{wgPeer: wgPeer}) continue } p.wgPeer = wgPeer // Send pings to peers where we're the client. if p.Role == control.Client { a.sendPing(p, now) } switch p.State() { case StateProbing: // Promote probing peers to direct once alive (direct path confirmed // working). if time.Since(p.LastHandshakeTime()) < wginterface.SessionTimeout { a.devAddDirect(p, p.WGEndpoint()) } case StateDirect: // Demote stale non-public direct peers back to probing. if !p.IsPublic && !p.Up() { a.devAddProbe(p, p.WGEndpoint()) } } } // Ensure we have a live relay. if a.relay == nil || !a.relay.Up() { a.switchActiveRelay() } }