X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcypherpunks.ru%2Fgovpn%2Fcmd%2Fgovpn-server%2Ftcp.go;h=aab59b723c57986d5520e64e6251f45c5f3e812e;hb=c982ccb214ba8d0fd8a30dee7439ea2db1559f6f;hp=bfb4709771e5cdc8680aea9ada107a5bae908c69;hpb=4cc7cf27a64355bbe1f64418a55e860baeb63ac0;p=govpn.git diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go index bfb4709..aab59b7 100644 --- a/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go +++ b/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go @@ -1,6 +1,6 @@ /* GoVPN -- simple secure free software virtual private network daemon -Copyright (C) 2014-2016 Sergey Matveev +Copyright (C) 2014-2017 Sergey Matveev 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 @@ -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 }