/*
GoVPN -- simple secure free software virtual private network daemon
-Copyright (C) 2014-2016 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2014-2018 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
var peer *govpn.Peer
var tap *govpn.TAP
var conf *govpn.PeerConf
+ var addrPrev string
+ var peerPrevI interface{}
+ var peerPrev *PeerState
for {
if prev == len(buf) {
break
break
}
prev += n
- peerId := idsCache.Find(buf[:prev])
- if peerId == nil {
+ peerID := idsCache.Find(buf[:prev])
+ if peerID == nil {
continue
}
if hs == nil {
- conf = confs[*peerId]
+ conf = confs[*peerID]
if conf == nil {
govpn.Printf(
`[conf-get-failed bind="%s" peer="%s"]`,
- *bindAddr, peerId.String(),
+ *bindAddr, peerID.String(),
)
break
}
hs.Zero()
govpn.Printf(
`[handshake-completed bind="%s" addr="%s" peer="%s"]`,
- *bindAddr, addr, peerId.String(),
+ *bindAddr, addr, peerID.String(),
)
- peersByIdLock.RLock()
- addrPrev, exists := peersById[*peer.Id]
- peersByIdLock.RUnlock()
+ addrPrevI, exists := peersByID.Load(*peer.ID)
if exists {
- peersLock.Lock()
- peers[addrPrev].terminator <- struct{}{}
- tap = peers[addrPrev].tap
+ addrPrev = addrPrevI.(string)
+ peerPrevI, exists = peers.Load(addrPrev)
+ if exists {
+ peerPrev = peerPrevI.(*PeerState)
+ exists = peerPrev == nil
+ }
+ }
+ if exists {
+ peerPrev.terminator <- struct{}{}
+ tap = peerPrev.tap
ps = &PeerState{
peer: peer,
tap: tap,
terminator: make(chan struct{}),
}
go govpn.PeerTapProcessor(ps.peer, ps.tap, ps.terminator)
- peersByIdLock.Lock()
- kpLock.Lock()
- delete(peers, addrPrev)
- delete(knownPeers, addrPrev)
- peers[addr] = ps
- knownPeers[addr] = &peer
- peersById[*peer.Id] = addr
- peersLock.Unlock()
- peersByIdLock.Unlock()
- kpLock.Unlock()
+ peers.Delete(addrPrev)
+ peers.Store(addr, ps)
+ knownPeers.Delete(addrPrev)
+ knownPeers.Store(addr, &peer)
+ peersByID.Store(*peer.ID, addr)
govpn.Printf(
`[rehandshake-completed bind="%s" peer="%s"]`,
- *bindAddr, peerId.String(),
+ *bindAddr, peerID.String(),
)
} else {
- ifaceName, err := callUp(peer.Id, peer.Addr)
+ ifaceName, err := callUp(peer.ID, peer.Addr)
if err != nil {
peer = nil
break
if err != nil {
govpn.Printf(
`[tap-failed bind="%s" peer="%s" err="%s"]`,
- *bindAddr, peerId.String(), err,
+ *bindAddr, peerID.String(), err,
)
peer = nil
break
terminator: make(chan struct{}, 1),
}
go govpn.PeerTapProcessor(ps.peer, ps.tap, ps.terminator)
- peersLock.Lock()
- peersByIdLock.Lock()
- kpLock.Lock()
- peers[addr] = ps
- peersById[*peer.Id] = addr
- knownPeers[addr] = &peer
- peersLock.Unlock()
- peersByIdLock.Unlock()
- kpLock.Unlock()
- govpn.Printf(`[peer-created bind="%s" peer="%s"]`, *bindAddr, peerId.String())
+ peers.Store(addr, ps)
+ peersByID.Store(*peer.ID, addr)
+ knownPeers.Store(addr, &peer)
+ govpn.Printf(`[peer-created bind="%s" peer="%s"]`, *bindAddr, peerID.String())
}
break
}
if !peer.PktProcess(buf[:i+govpn.NonceSize], tap, false) {
govpn.Printf(
`[packet-unauthenticated bind="%s" addr="%s" peer="%s"]`,
- *bindAddr, addr, peer.Id.String(),
+ *bindAddr, addr, peer.ID.String(),
)
break
}