if err != nil {
log.Fatalln("Can not listen on UDP:", err)
}
- log.Println("Listening on UDP", *bindAddr)
+ log.Println("Listening on UDP:" + *bindAddr)
+
udpBufs <- make([]byte, govpn.MTU)
go func() {
var buf []byte
var conf *govpn.PeerConf
for {
buf = <-udpBufs
-
n, raddr, err = conn.ReadFromUDP(buf)
if err != nil {
+ log.Println("Unexpected error when receiving", err)
break
}
addr = raddr.String()
goto Finished
}
- log.Println("Peer handshake finished:", addr)
+ log.Println("Peer handshake finished:", addr, peer.Id.String())
hs.Zero()
hsLock.Lock()
delete(handshakes, addr)
addrPrev, exists = peersById[*peer.Id]
peersByIdLock.RUnlock()
if exists {
- peersLock.RLock()
+ peersLock.Lock()
+ peers[addrPrev].terminator <- struct{}{}
ps = &PeerState{
peer: peer,
tap: peers[addrPrev].tap,
- terminator: peers[addrPrev].terminator,
+ terminator: make(chan struct{}),
}
- peersLock.RUnlock()
- ps.terminator <- struct{}{}
- peersLock.Lock()
+ go func(ps PeerState) {
+ peerReady(ps)
+ <-udpBufs
+ <-udpBufs
+ }(*ps)
peersByIdLock.Lock()
kpLock.Lock()
delete(peers, addrPrev)
delete(knownPeers, addrPrev)
- delete(peersById, *peer.Id)
peers[addr] = ps
knownPeers[addr] = &peer
peersById[*peer.Id] = addr
peersLock.Unlock()
peersByIdLock.Unlock()
kpLock.Unlock()
- go func(ps PeerState) {
- peerReady(ps)
- <-udpBufs
- <-udpBufs
- }(*ps)
- log.Println("Rehandshake finished:", peer.Id.String())
+ log.Println("Rehandshake processed:", peer.Id.String())
} else {
go func(addr string, peer *govpn.Peer) {
ifaceName, err := callUp(peer.Id)
ps = &PeerState{
peer: peer,
tap: tap,
- terminator: make(chan struct{}, 1),
+ terminator: make(chan struct{}),
}
go func(ps PeerState) {
peerReady(ps)
peersLock.Unlock()
peersByIdLock.Unlock()
kpLock.Unlock()
- log.Println("New peer:", peer.Id.String())
+ log.Println("Peer created:", peer.Id.String())
}(addr, peer)
}
goto Finished
CheckID:
- peerId = govpn.IDsCache.Find(buf[:n])
+ peerId = idsCache.Find(buf[:n])
if peerId == nil {
log.Println("Unknown identity from:", addr)
goto Finished
}
- conf = peerId.Conf()
+ conf = confs[*peerId]
if conf == nil {
- log.Println("Can not get peer configuration:", peerId.String())
+ log.Println("Unable to get peer configuration:", peerId.String())
goto Finished
}
hs = govpn.NewHandshake(