/*
GoVPN -- simple secure free software virtual private network daemon
-Copyright (C) 2014-2015 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2014-2016 Sergey Matveev <stargrave@stargrave.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
import (
"bytes"
- "encoding/binary"
"log"
"net"
"time"
func handleTCP(conn net.Conn) {
addr := conn.RemoteAddr().String()
- buf := make([]byte, govpn.MTU)
+ buf := make([]byte, govpn.EncLessEnlargeSize+2*govpn.MTU)
var n int
var err error
var prev int
var tap *govpn.TAP
var conf *govpn.PeerConf
for {
- if prev == govpn.MTU {
+ if prev == len(buf) {
break
}
conn.SetReadDeadline(time.Now().Add(time.Duration(govpn.TimeoutDefault) * time.Second))
break
}
prev += n
- peerId := govpn.IDsCache.Find(buf[:prev])
+ peerId := idsCache.Find(buf[:prev])
if peerId == nil {
continue
}
if hs == nil {
- conf = peerId.Conf()
+ conf = confs[*peerId]
if conf == nil {
log.Println("Can not get peer configuration:", peerId.String())
break
} else {
ifaceName, err := callUp(peer.Id)
if err != nil {
+ peer = nil
break
}
tap, err = govpn.TAPListen(ifaceName)
if err != nil {
log.Println("Unable to create TAP:", err)
+ peer = nil
break
}
ps = &PeerState{
}
nonceExpectation := make([]byte, govpn.NonceSize)
- binary.BigEndian.PutUint64(nonceExpectation, peer.NonceExpect)
- peer.NonceCipher.Encrypt(nonceExpectation, nonceExpectation)
+ peer.NonceExpectation(nonceExpectation)
prev = 0
var i int
for {
- if prev == govpn.MTU {
+ if prev == len(buf) {
break
}
conn.SetReadDeadline(time.Now().Add(conf.Timeout))
)
break
}
- binary.BigEndian.PutUint64(nonceExpectation, peer.NonceExpect)
- peer.NonceCipher.Encrypt(nonceExpectation, nonceExpectation)
+ peer.NonceExpectation(nonceExpectation)
copy(buf, buf[i+govpn.NonceSize:prev])
prev = prev - i - govpn.NonceSize
goto CheckMore