]> Cypherpunks.ru repositories - govpn.git/blob - src/govpn/cmd/govpn-server/common.go
4692e52b4c297270a61f30f81f5213cbeef00827
[govpn.git] / src / govpn / cmd / govpn-server / common.go
1 package main
2
3 import (
4         "bytes"
5         "sync"
6         "time"
7
8         "govpn"
9 )
10
11 type PeerState struct {
12         peer       *govpn.Peer
13         terminator chan struct{}
14         tap        *govpn.TAP
15 }
16
17 var (
18         handshakes map[string]*govpn.Handshake = make(map[string]*govpn.Handshake)
19         hsLock     sync.RWMutex
20
21         peers     map[string]*PeerState = make(map[string]*PeerState)
22         peersLock sync.RWMutex
23
24         peersById     map[govpn.PeerId]string = make(map[govpn.PeerId]string)
25         peersByIdLock sync.RWMutex
26
27         knownPeers govpn.KnownPeers
28         kpLock     sync.RWMutex
29 )
30
31 func peerReady(ps PeerState) {
32         var data []byte
33         heartbeat := time.NewTicker(ps.peer.Timeout)
34 Processor:
35         for {
36                 select {
37                 case <-heartbeat.C:
38                         ps.peer.EthProcess(nil)
39                 case <-ps.terminator:
40                         break Processor
41                 case data = <-ps.tap.Sink:
42                         ps.peer.EthProcess(data)
43                 }
44         }
45         close(ps.terminator)
46         ps.peer.Zero()
47         heartbeat.Stop()
48 }
49
50 func callUp(peerId *govpn.PeerId) (string, error) {
51         result, err := govpn.ScriptCall(confs[*peerId].Up, "")
52         if err != nil {
53                 return "", err
54         }
55         sepIndex := bytes.Index(result, []byte{'\n'})
56         if sepIndex < 0 {
57                 sepIndex = len(result)
58         }
59         ifaceName := string(result[:sepIndex])
60         return ifaceName, nil
61 }