var (
remoteAddr = flag.String("remote", "", "Remote server address")
proto = flag.String("proto", "udp", "Protocol to use: udp or tcp")
- ifaceName = flag.String("iface", "tap0", "TAP network interface")
+ ifaceName = flag.String("iface", "tap0", "TUN/TAP network interface")
verifierRaw = flag.String("verifier", "", "Verifier")
keyPath = flag.String("key", "", "Path to passphrase file")
upPath = flag.String("up", "", "Path to up-script")
stats = flag.String("stats", "", "Enable stats retrieving on host:port")
proxyAddr = flag.String("proxy", "", "Use HTTP proxy on host:port")
proxyAuth = flag.String("proxy-auth", "", "user:password Basic proxy auth")
- mtu = flag.Int("mtu", govpn.MTUDefault, "MTU of TAP interface")
+ mtu = flag.Int("mtu", govpn.MTUDefault, "MTU of TUN/TAP interface")
timeoutP = flag.Int("timeout", 60, "Timeout seconds")
timeSync = flag.Int("timesync", 0, "Time synchronization requirement")
+ noreconnect = flag.Bool("noreconnect", false, "Disable reconnection after timeout")
noisy = flag.Bool("noise", false, "Enable noise appending")
encless = flag.Bool("encless", false, "Encryptionless mode")
cpr = flag.Int("cpr", 0, "Enable constant KiB/sec out traffic rate")
egdPath = flag.String("egd", "", "Optional path to EGD socket")
syslog = flag.Bool("syslog", false, "Enable logging to syslog")
+ version = flag.Bool("version", false, "Print version information")
warranty = flag.Bool("warranty", false, "Print warranty information")
conf *govpn.PeerConf
timeout int
firstUpCall bool = true
knownPeers govpn.KnownPeers
- idsCache *govpn.CipherCache
+ idsCache *govpn.MACCache
)
func main() {
fmt.Println(govpn.Warranty)
return
}
+ if *version {
+ fmt.Println(govpn.VersionGet())
+ return
+ }
timeout = *timeoutP
var err error
log.SetFlags(log.Ldate | log.Lmicroseconds | log.Lshortfile)
govpn.EGDInit(*egdPath)
}
+ if *proxyAddr != "" {
+ *proto = "tcp"
+ }
+ if !(*proto == "udp" || *proto == "tcp") {
+ log.Fatalln("Unknown protocol specified")
+ }
if *verifierRaw == "" {
log.Fatalln("No verifier specified")
}
Verifier: verifier,
DSAPriv: priv,
}
- idsCache = govpn.NewCipherCache()
+ idsCache = govpn.NewMACCache()
confs := map[govpn.PeerId]*govpn.PeerConf{*verifier.Id: conf}
idsCache.Update(&confs)
log.Println(govpn.VersionGet())
tap, err = govpn.TAPListen(*ifaceName, *mtu)
if err != nil {
- log.Fatalln("Can not listen on TAP interface:", err)
+ log.Fatalln("Can not listen on TUN/TAP interface:", err)
}
if *stats != "" {
timeouted := make(chan struct{})
rehandshaking := make(chan struct{})
termination := make(chan struct{})
- if *proxyAddr != "" {
- *proto = "tcp"
- }
switch *proto {
case "udp":
go startUDP(timeouted, rehandshaking, termination)
} else {
go startTCP(timeouted, rehandshaking, termination)
}
- default:
- log.Fatalln("Unknown protocol specified")
}
select {
case <-termSignal:
termination <- struct{}{}
break MainCycle
case <-timeouted:
- break MainCycle
+ if *noreconnect {
+ break MainCycle
+ }
+ govpn.BothPrintf(`[sleep seconds="%d"]`, timeout)
+ time.Sleep(time.Second * time.Duration(timeout))
case <-rehandshaking:
}
close(timeouted)