From 7eb2096f568d4b9b3d6c25ed010c51a9560de0c1 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sun, 23 Aug 2015 12:31:33 +0300 Subject: [PATCH] Server can listen on all network protocols at once Signed-off-by: Sergey Matveev --- doc/client.texi | 4 ++-- src/govpn/cmd/govpn-server/main.go | 14 ++++++++------ src/govpn/cmd/govpn-server/tcp.go | 9 ++++----- src/govpn/cmd/govpn-server/udp.go | 9 ++++----- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/doc/client.texi b/doc/client.texi index e2c26fd..d224fff 100644 --- a/doc/client.texi +++ b/doc/client.texi @@ -1,8 +1,8 @@ @node Client part @section Client part -Except for common @code{-mtu}, @code{-stats}, @code{-egd} options client -has the following ones: +Except for common @code{-proto}, @code{-mtu}, @code{-stats}, @code{-egd} +options client has the following ones: @table @code diff --git a/src/govpn/cmd/govpn-server/main.go b/src/govpn/cmd/govpn-server/main.go index 669a3ab..664e04d 100644 --- a/src/govpn/cmd/govpn-server/main.go +++ b/src/govpn/cmd/govpn-server/main.go @@ -35,7 +35,7 @@ import ( var ( bindAddr = flag.String("bind", "[::]:1194", "Bind to address") - proto = flag.String("proto", "udp", "Protocol to use: udp or tcp") + proto = flag.String("proto", "udp", "Protocol to use: udp, tcp or all") peersPath = flag.String("peers", "peers", "Path to peers keys directory") stats = flag.String("stats", "", "Enable stats retrieving on host:port") mtu = flag.Int("mtu", 1452, "MTU for outgoing packets") @@ -88,6 +88,7 @@ func main() { flag.Parse() timeout := time.Second * time.Duration(govpn.TimeoutDefault) log.SetFlags(log.Ldate | log.Lmicroseconds | log.Lshortfile) + log.Println(govpn.VersionGet()) govpn.MTU = *mtu govpn.PeersInit(*peersPath) @@ -97,12 +98,15 @@ func main() { govpn.EGDInit(*egdPath) } - var sink chan Pkt + sink := make(chan Pkt) switch *proto { case "udp": - sink = startUDP() + startUDP(&sink) case "tcp": - sink = startTCP() + startTCP(&sink) + case "all": + startUDP(&sink) + startTCP(&sink) default: log.Fatalln("Unknown protocol specified") } @@ -129,8 +133,6 @@ func main() { var handshakeProcessForce bool ethSink := make(chan EthEvent) - log.Println(govpn.VersionGet()) - log.Println("Listening on", *proto, *bindAddr) log.Println("Max MTU on TAP interface:", govpn.TAPMaxMTU()) if *stats != "" { log.Println("Stats are going to listen on", *stats) diff --git a/src/govpn/cmd/govpn-server/tcp.go b/src/govpn/cmd/govpn-server/tcp.go index 85081a6..c7b1788 100644 --- a/src/govpn/cmd/govpn-server/tcp.go +++ b/src/govpn/cmd/govpn-server/tcp.go @@ -36,7 +36,7 @@ func (c TCPSender) Write(data []byte) (int, error) { return c.conn.Write(append(size, data...)) } -func startTCP() chan Pkt { +func startTCP(sink *chan Pkt) { bind, err := net.ResolveTCPAddr("tcp", *bindAddr) if err != nil { log.Fatalln("Can not resolve bind address:", err) @@ -45,7 +45,7 @@ func startTCP() chan Pkt { if err != nil { log.Fatalln("Can not listen on TCP:", err) } - sink := make(chan Pkt) + log.Println("Listening on TCP", *bindAddr) go func() { for { conn, _ := listener.AcceptTCP() @@ -72,7 +72,7 @@ func startTCP() chan Pkt { if sizeNeed > uint16(govpn.MTU)-2 { log.Println("Invalid TCP size, skipping") sizeNbuf = 0 - sink <- Pkt{ready: ready} + *sink <- Pkt{ready: ready} continue } bufN = 0 @@ -88,7 +88,7 @@ func startTCP() chan Pkt { goto ReadMore } sizeNbuf = 0 - sink <- Pkt{ + *sink <- Pkt{ addr, TCPSender{conn}, buf[:sizeNeed], @@ -99,5 +99,4 @@ func startTCP() chan Pkt { ready <- struct{}{} } }() - return sink } diff --git a/src/govpn/cmd/govpn-server/udp.go b/src/govpn/cmd/govpn-server/udp.go index d5e1296..26b28a8 100644 --- a/src/govpn/cmd/govpn-server/udp.go +++ b/src/govpn/cmd/govpn-server/udp.go @@ -35,7 +35,7 @@ func (c UDPSender) Write(data []byte) (int, error) { return c.conn.WriteToUDP(data, c.addr) } -func startUDP() chan Pkt { +func startUDP(sink *chan Pkt) { bind, err := net.ResolveUDPAddr("udp", *bindAddr) ready := make(chan struct{}) if err != nil { @@ -45,7 +45,7 @@ func startUDP() chan Pkt { if err != nil { log.Fatalln("Can not listen on UDP:", err) } - sink := make(chan Pkt) + log.Println("Listening on UDP", *bindAddr) go func() { buf := make([]byte, govpn.MTU) var n int @@ -56,10 +56,10 @@ func startUDP() chan Pkt { lconn.SetReadDeadline(time.Now().Add(time.Second)) n, raddr, err = lconn.ReadFromUDP(buf) if err != nil { - sink <- Pkt{ready: ready} + *sink <- Pkt{ready: ready} continue } - sink <- Pkt{ + *sink <- Pkt{ raddr.String(), UDPSender{lconn, raddr}, buf[:n], @@ -68,5 +68,4 @@ func startUDP() chan Pkt { } }() ready <- struct{}{} - return sink } -- 2.44.0