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=f8a76e23dbf0b9a60330a161bf01b7831d83d8d9;hpb=649e55e1ead338121ea76d6ae1187617ea9839d6;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 f8a76e2..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 @@ -36,13 +36,12 @@ func startTCP() { if err != nil { log.Fatalln("Can not listen on TCP:", err) } - log.Println("Listening on TCP:" + *bindAddr) - govpn.Println("Listening on TCP:" + *bindAddr) + govpn.BothPrintf(`[tcp-listen bind="%s"]`, *bindAddr) go func() { for { conn, err := listener.AcceptTCP() if err != nil { - govpn.Println("Error accepting TCP:", err) + govpn.Printf(`[tcp-accept-failed bind="%s" err="%s"]`, *bindAddr, err) continue } go handleTCP(conn) @@ -61,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 @@ -72,14 +74,17 @@ 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.Println("Can not get peer configuration:", peerId.String()) + govpn.Printf( + `[conf-get-failed bind="%s" peer="%s"]`, + *bindAddr, peerID.String(), + ) break } hs = govpn.NewHandshake(addr, conn, conf) @@ -90,40 +95,49 @@ func handleTCP(conn net.Conn) { continue } hs.Zero() - govpn.Println("Peer handshake finished:", addr, peer.Id.String()) - peersByIdLock.RLock() - addrPrev, exists := peersById[*peer.Id] - peersByIdLock.RUnlock() + govpn.Printf( + `[handshake-completed bind="%s" addr="%s" peer="%s"]`, + *bindAddr, addr, peerID.String(), + ) + 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 peerReady(*ps) - 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() - govpn.Println("Rehandshake processed:", peer.Id.String()) + go govpn.PeerTapProcessor(ps.peer, ps.tap, ps.terminator) + 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(), + ) } else { - ifaceName, err := callUp(peer.Id, peer.Addr) + ifaceName, err := callUp(peer.ID, peer.Addr) if err != nil { peer = nil break } tap, err = govpn.TAPListen(ifaceName, peer.MTU) if err != nil { - govpn.Println("Unable to create TAP:", err) + govpn.Printf( + `[tap-failed bind="%s" peer="%s" err="%s"]`, + *bindAddr, peerID.String(), err, + ) peer = nil break } @@ -132,17 +146,11 @@ func handleTCP(conn net.Conn) { tap: tap, terminator: make(chan struct{}, 1), } - go peerReady(*ps) - peersLock.Lock() - peersByIdLock.Lock() - kpLock.Lock() - peers[addr] = ps - peersById[*peer.Id] = addr - knownPeers[addr] = &peer - peersLock.Unlock() - peersByIdLock.Unlock() - kpLock.Unlock() - govpn.Println("Peer created:", peer.Id.String()) + go govpn.PeerTapProcessor(ps.peer, ps.tap, ps.terminator) + 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 } @@ -153,8 +161,6 @@ func handleTCP(conn net.Conn) { return } - nonceExpectation := make([]byte, govpn.NonceSize) - peer.NonceExpectation(nonceExpectation) prev = 0 var i int for { @@ -172,18 +178,17 @@ func handleTCP(conn net.Conn) { if prev < govpn.MinPktLength { continue } - i = bytes.Index(buf[:prev], nonceExpectation) + i = bytes.Index(buf[:prev], peer.NonceExpect) if i == -1 { continue } if !peer.PktProcess(buf[:i+govpn.NonceSize], tap, false) { - govpn.Println( - "Unauthenticated packet, dropping connection", - addr, peer.Id.String(), + govpn.Printf( + `[packet-unauthenticated bind="%s" addr="%s" peer="%s"]`, + *bindAddr, addr, peer.ID.String(), ) break } - peer.NonceExpectation(nonceExpectation) copy(buf, buf[i+govpn.NonceSize:prev]) prev = prev - i - govpn.NonceSize goto CheckMore