/*
GoVPN -- simple secure free software virtual private network daemon
-Copyright (C) 2014-2017 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 addr string
var n int
var err error
+ var exists bool
+ var psI interface{}
var ps *PeerState
+ var hsI interface{}
var hs *govpn.Handshake
+ var addrPrevI interface{}
var addrPrev string
- var exists bool
+ var peerPrevI interface{}
+ var peerPrev *PeerState
var peerID *govpn.PeerID
var conf *govpn.PeerConf
for {
}
addr = raddr.String()
- peersLock.RLock()
- ps, exists = peers[addr]
- peersLock.RUnlock()
+ psI, exists = peers.Load(addr)
if exists {
+ ps = psI.(*PeerState)
go func(peer *govpn.Peer, tap *govpn.TAP, buf []byte, n int) {
peer.PktProcess(buf[:n], tap, true)
udpBufs <- buf
continue
}
- hsLock.RLock()
- hs, exists = handshakes[addr]
- hsLock.RUnlock()
+ hsI, exists = handshakes.Load(addr)
if !exists {
peerID = idsCache.Find(buf[:n])
if peerID == nil {
)
hs.Server(buf[:n])
udpBufs <- buf
- hsLock.Lock()
- handshakes[addr] = hs
- hsLock.Unlock()
+ handshakes.Store(addr, hs)
continue
}
+ hs = hsI.(*govpn.Handshake)
peer := hs.Server(buf[:n])
if peer == nil {
udpBufs <- buf
*bindAddr, addr, peerID.String(),
)
hs.Zero()
- hsLock.Lock()
- delete(handshakes, addr)
- hsLock.Unlock()
+ handshakes.Delete(addr)
go func() {
udpBufs <- make([]byte, govpn.MTUMax)
udpBufs <- make([]byte, govpn.MTUMax)
}()
- peersByIDLock.RLock()
- addrPrev, exists = peersByID[*peer.ID]
- peersByIDLock.RUnlock()
- var peerPrev *PeerState
+ addrPrevI, exists = peersByID.Load(*peer.ID)
if exists {
- peersLock.Lock()
- peerPrev = peers[addrPrev]
- if peerPrev == nil {
- exists = false
- peersLock.Unlock()
+ addrPrev = addrPrevI.(string)
+ peerPrevI, exists = peers.Load(addrPrev)
+ if exists {
+ peerPrev = peerPrevI.(*PeerState)
+ exists = peerPrev == nil
}
}
if exists {
<-udpBufs
<-udpBufs
}(psNew.peer, psNew.tap, psNew.terminator)
- peersByIDLock.Lock()
- kpLock.Lock()
- delete(peers, addrPrev)
- delete(knownPeers, addrPrev)
- peers[addr] = psNew
- knownPeers[addr] = &peer
- peersByID[*peer.ID] = addr
- peersLock.Unlock()
- peersByIDLock.Unlock()
- kpLock.Unlock()
+ peers.Delete(addrPrev)
+ peers.Store(addr, psNew)
+ knownPeers.Delete(addrPrev)
+ knownPeers.Store(addr, &peer)
+ peersByID.Store(*peer.ID, addr)
govpn.Printf(
`[rehandshake-completed bind="%s" peer="%s"]`,
*bindAddr, peer.ID.String(),
<-udpBufs
<-udpBufs
}(psNew.peer, psNew.tap, psNew.terminator)
- peersLock.Lock()
- peersByIDLock.Lock()
- kpLock.Lock()
- peers[addr] = psNew
- knownPeers[addr] = &peer
- peersByID[*peer.ID] = addr
- peersLock.Unlock()
- peersByIDLock.Unlock()
- kpLock.Unlock()
+ peers.Store(addr, psNew)
+ knownPeers.Store(addr, &peer)
+ peersByID.Store(*peer.ID, addr)
govpn.Printf(
`[peer-created bind="%s" peer="%s"]`,
*bindAddr,