]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go
Use convenient simpler Go 1.9's sync.Map
[govpn.git] / src / cypherpunks.ru / govpn / cmd / govpn-server / tcp.go
index ad7bcc6a02bde0f9b3ba2ea48e3f9a6a7b90cf8c..aab59b723c57986d5520e64e6251f45c5f3e812e 100644 (file)
@@ -60,6 +60,9 @@ func handleTCP(conn net.Conn) {
        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
@@ -71,16 +74,16 @@ func handleTCP(conn net.Conn) {
                        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
                        }
@@ -94,37 +97,37 @@ func handleTCP(conn net.Conn) {
                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
@@ -133,7 +136,7 @@ func handleTCP(conn net.Conn) {
                        if err != nil {
                                govpn.Printf(
                                        `[tap-failed bind="%s" peer="%s" err="%s"]`,
-                                       *bindAddr, peerId.String(), err,
+                                       *bindAddr, peerID.String(), err,
                                )
                                peer = nil
                                break
@@ -144,16 +147,10 @@ func handleTCP(conn net.Conn) {
                                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
        }
@@ -188,7 +185,7 @@ func handleTCP(conn net.Conn) {
                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
                }