]> Cypherpunks.ru repositories - govpn.git/blobdiff - cmd/govpn-server/main.go
Ability to generate Constant Packet Rate traffic
[govpn.git] / cmd / govpn-server / main.go
index 3d952ea9e0d4e5a62cdb69fad9dba3c115124b74..ffb6d2325bc507c141d42b9fd88d940a1c7d6889 100644 (file)
@@ -35,9 +35,12 @@ import (
 var (
        bindAddr  = flag.String("bind", "[::]:1194", "Bind to address")
        peersPath = flag.String("peers", "peers", "Path to peers keys directory")
-       mtu       = flag.Int("mtu", 1500, "MTU")
+       stats     = flag.String("stats", "", "Enable stats retrieving on host:port")
+       mtu       = flag.Int("mtu", 1452, "MTU for outgoing packets")
        nonceDiff = flag.Int("noncediff", 1, "Allow nonce difference")
        timeoutP  = flag.Int("timeout", 60, "Timeout seconds")
+       noisy     = flag.Bool("noise", false, "Enable noise appending")
+       cpr        = flag.Int("cpr", 0, "Enable constant KiB/s out traffic rate")
 )
 
 type PeerReadyEvent struct {
@@ -82,8 +85,10 @@ func main() {
        log.SetFlags(log.Ldate | log.Lmicroseconds | log.Lshortfile)
 
        govpn.MTU = *mtu
-       govpn.Timeout = *timeoutP
+       govpn.Timeout = timeout
        govpn.Noncediff = *nonceDiff
+       govpn.NoiseEnable = *noisy
+       govpn.CPRInit(*cpr)
        govpn.PeersInit(*peersPath)
 
        bind, err := net.ResolveUDPAddr("udp", *bindAddr)
@@ -110,8 +115,9 @@ func main() {
        states := make(map[string]*govpn.Handshake)
        peers := make(map[string]*PeerState)
        peerReadySink := make(chan PeerReadyEvent)
+       knownPeers := govpn.KnownPeers(make(map[string]**govpn.Peer))
        var peerReady PeerReadyEvent
-       var udpPkt *govpn.UDPPkt
+       var udpPkt govpn.UDPPkt
        var udpPktData []byte
        var ethEvent EthEvent
        var peerId *govpn.PeerId
@@ -119,6 +125,15 @@ func main() {
        ethSink := make(chan EthEvent)
 
        log.Println(govpn.VersionGet())
+       log.Println("Max MTU on TAP interface:", govpn.TAPMaxMTU())
+       if *stats != "" {
+               log.Println("Stats are going to listen on", *stats)
+               statsPort, err := net.Listen("tcp", *stats)
+               if err != nil {
+                       panic(err)
+               }
+               go govpn.StatsProcessor(statsPort, &knownPeers)
+       }
        log.Println("Server started")
 
 MainCycle:
@@ -139,6 +154,7 @@ MainCycle:
                                if state.peer.LastPing.Add(timeout).Before(now) {
                                        log.Println("Deleting peer", state.peer)
                                        delete(peers, addr)
+                                       delete(knownPeers, addr)
                                        downPath := path.Join(
                                                govpn.PeersPath,
                                                state.peer.Id.String(),
@@ -155,6 +171,7 @@ MainCycle:
                                        continue
                                }
                                delete(peers, addr)
+                               delete(knownPeers, addr)
                                state.terminate <- struct{}{}
                                state.peer.Zero()
                                break
@@ -165,6 +182,7 @@ MainCycle:
                                continue
                        }
                        peers[addr] = state
+                       knownPeers[addr] = &peerReady.peer
                        states[addr].Zero()
                        delete(states, addr)
                        log.Println("Registered interface", peerReady.iface, "with peer", peer)
@@ -183,7 +201,7 @@ MainCycle:
                        }
                        ethEvent.peer.EthProcess(ethEvent.data, conn, ethEvent.ready)
                case udpPkt = <-udpSink:
-                       if udpPkt == nil {
+                       if udpPkt.Addr == nil {
                                udpReady <- struct{}{}
                                continue
                        }