]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go
Merge branch 'develop'
[govpn.git] / src / cypherpunks.ru / govpn / cmd / govpn-server / udp.go
index 037351778f566605fcc28733350ac60d663cc978..f074df47a6740ff390a665c3cfc94c3bfb1e0454 100644 (file)
@@ -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,