/*
GoVPN -- simple secure free software virtual private network daemon
-Copyright (C) 2014-2016 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2014-2018 Sergey Matveev <stargrave@stargrave.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
import (
"bytes"
- "log"
"sync"
- "time"
"cypherpunks.ru/govpn"
)
}
var (
- handshakes map[string]*govpn.Handshake = make(map[string]*govpn.Handshake)
- hsLock sync.RWMutex
-
- peers map[string]*PeerState = make(map[string]*PeerState)
- peersLock sync.RWMutex
-
- peersById map[govpn.PeerId]string = make(map[govpn.PeerId]string)
- peersByIdLock sync.RWMutex
-
- knownPeers govpn.KnownPeers
- kpLock sync.RWMutex
+ handshakes sync.Map
+ peers sync.Map
+ peersByID sync.Map
+ knownPeers sync.Map
)
-func peerReady(ps PeerState) {
- var data []byte
- heartbeat := time.NewTicker(ps.peer.Timeout)
-Processor:
- for {
- select {
- case <-heartbeat.C:
- ps.peer.EthProcess(nil)
- case <-ps.terminator:
- break Processor
- case data = <-ps.tap.Sink:
- ps.peer.EthProcess(data)
- }
- }
- close(ps.terminator)
- ps.peer.Zero()
- heartbeat.Stop()
-}
-
-func callUp(peerId *govpn.PeerId) (string, error) {
- ifaceName := confs[*peerId].Iface
- if confs[*peerId].Up != "" {
- result, err := govpn.ScriptCall(confs[*peerId].Up, "")
+func callUp(peerID *govpn.PeerID, remoteAddr string) (string, error) {
+ ifaceName := confs[*peerID].Iface
+ if confs[*peerID].Up != "" {
+ result, err := govpn.ScriptCall(confs[*peerID].Up, ifaceName, remoteAddr)
if err != nil {
- log.Println("Script", confs[*peerId].Up, "call failed", err)
+ govpn.Printf(
+ `[script-failed bind="%s" path="%s" err="%s"]`,
+ *bindAddr,
+ confs[*peerID].Up,
+ err,
+ )
return "", err
}
if ifaceName == "" {
}
}
if ifaceName == "" {
- log.Println("Can not obtain interface name for", *peerId)
+ govpn.Printf(`[tap-failed bind="%s" peer="%s"]`, *bindAddr, *peerID)
}
return ifaceName, nil
}