From: Sergey Matveev Date: Thu, 17 Sep 2015 17:49:37 +0000 (+0300) Subject: Fixed rehandshake-related code X-Git-Tag: 4.0^2~5 X-Git-Url: http://www.git.cypherpunks.ru/?p=govpn.git;a=commitdiff_plain;h=0b9229f5d3bb97423e7f38cd209ca8e5014c9c76 Fixed rehandshake-related code * Do not use buffered termination channels: we need guarantee that processor is stopped. Otherwise we can be locked and client will be timeouted * Single peersLock call, no separate read and write related * Create processing goroutine earlier Signed-off-by: Sergey Matveev --- diff --git a/src/govpn/cmd/govpn-server/common.go b/src/govpn/cmd/govpn-server/common.go index 92e1bb1..06e82e6 100644 --- a/src/govpn/cmd/govpn-server/common.go +++ b/src/govpn/cmd/govpn-server/common.go @@ -43,6 +43,7 @@ Processor: ps.peer.EthProcess(data) } } + close(ps.terminator) ps.peer.Zero() heartbeat.Stop() } diff --git a/src/govpn/cmd/govpn-server/tcp.go b/src/govpn/cmd/govpn-server/tcp.go index 6dd3a01..c1969fa 100644 --- a/src/govpn/cmd/govpn-server/tcp.go +++ b/src/govpn/cmd/govpn-server/tcp.go @@ -95,28 +95,25 @@ func handleTCP(conn net.Conn) { addrPrev, exists := peersById[*peer.Id] peersByIdLock.RUnlock() if exists { - peersLock.RLock() + peersLock.Lock() + peers[addrPrev].terminator <- struct{}{} tap = peers[addrPrev].tap ps = &PeerState{ peer: peer, tap: tap, - terminator: peers[addrPrev].terminator, + terminator: make(chan struct{}), } - peersLock.RUnlock() - ps.terminator <- struct{}{} - peersLock.Lock() + go peerReady(*ps) peersByIdLock.Lock() kpLock.Lock() delete(peers, addrPrev) delete(knownPeers, addrPrev) - delete(peersById, *peer.Id) peers[addr] = ps knownPeers[addr] = &peer peersById[*peer.Id] = addr peersLock.Unlock() peersByIdLock.Unlock() kpLock.Unlock() - go peerReady(*ps) log.Println("Rehandshake processed:", peer.Id.String()) } else { ifaceName, err := callUp(peer.Id) diff --git a/src/govpn/cmd/govpn-server/udp.go b/src/govpn/cmd/govpn-server/udp.go index 2c6a0f3..148ff68 100644 --- a/src/govpn/cmd/govpn-server/udp.go +++ b/src/govpn/cmd/govpn-server/udp.go @@ -110,31 +110,28 @@ func startUDP() { addrPrev, exists = peersById[*peer.Id] peersByIdLock.RUnlock() if exists { - peersLock.RLock() + peersLock.Lock() + peers[addrPrev].terminator <- struct{}{} ps = &PeerState{ peer: peer, tap: peers[addrPrev].tap, - terminator: peers[addrPrev].terminator, + terminator: make(chan struct{}), } - peersLock.RUnlock() - ps.terminator <- struct{}{} - peersLock.Lock() + go func(ps PeerState) { + peerReady(ps) + <-udpBufs + <-udpBufs + }(*ps) peersByIdLock.Lock() kpLock.Lock() delete(peers, addrPrev) delete(knownPeers, addrPrev) - delete(peersById, *peer.Id) peers[addr] = ps knownPeers[addr] = &peer peersById[*peer.Id] = addr peersLock.Unlock() peersByIdLock.Unlock() kpLock.Unlock() - go func(ps PeerState) { - peerReady(ps) - <-udpBufs - <-udpBufs - }(*ps) log.Println("Rehandshake processed:", peer.Id.String()) } else { go func(addr string, peer *govpn.Peer) { @@ -150,7 +147,7 @@ func startUDP() { ps = &PeerState{ peer: peer, tap: tap, - terminator: make(chan struct{}, 1), + terminator: make(chan struct{}), } go func(ps PeerState) { peerReady(ps)