@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
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")
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)
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")
}
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)
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)
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()
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
goto ReadMore
}
sizeNbuf = 0
- sink <- Pkt{
+ *sink <- Pkt{
addr,
TCPSender{conn},
buf[:sizeNeed],
ready <- struct{}{}
}
}()
- return sink
}
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 {
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
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],
}
}()
ready <- struct{}{}
- return sink
}