X-Git-Url: http://www.git.cypherpunks.ru/?p=govpn.git;a=blobdiff_plain;f=src%2Fcypherpunks.ru%2Fgovpn%2Fcmd%2Fgovpn-server%2Fudp.go;fp=src%2Fcypherpunks.ru%2Fgovpn%2Fcmd%2Fgovpn-server%2Fudp.go;h=f074df47a6740ff390a665c3cfc94c3bfb1e0454;hp=037351778f566605fcc28733350ac60d663cc978;hb=f70a3aa49e188be843952738d8ad4eb3a6f1341a;hpb=8b1de1c28a4ef7b651d0196cac4d63eca35b93d1 diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go index 0373517..f074df4 100644 --- a/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go +++ b/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go @@ -57,10 +57,15 @@ func startUDP() { 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 { @@ -72,10 +77,9 @@ func startUDP() { } 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 @@ -83,9 +87,7 @@ func startUDP() { continue } - hsLock.RLock() - hs, exists = handshakes[addr] - hsLock.RUnlock() + hsI, exists = handshakes.Load(addr) if !exists { peerID = idsCache.Find(buf[:n]) if peerID == nil { @@ -109,12 +111,11 @@ func startUDP() { ) 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 @@ -125,24 +126,19 @@ func startUDP() { *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 { @@ -157,16 +153,11 @@ func startUDP() { <-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(), @@ -195,15 +186,9 @@ func startUDP() { <-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,