]> Cypherpunks.ru repositories - govpn.git/commitdiff
Merge branch 'develop' 7.4
authorSergey Matveev <stargrave@stargrave.org>
Sun, 27 Aug 2017 10:01:50 +0000 (13:01 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 27 Aug 2017 10:01:50 +0000 (13:01 +0300)
28 files changed:
.gitmodules
README
README.RU
THANKS
VERSION
common.mk
doc/about.ru.texi
doc/about.texi
doc/contacts.texi
doc/download.texi
doc/installation.texi
doc/news.ru.texi
doc/news.texi
doc/sources.texi
ports/govpn/Makefile
src/cypherpunks.ru/balloon
src/cypherpunks.ru/govpn/client/client.go
src/cypherpunks.ru/govpn/client/tcp.go
src/cypherpunks.ru/govpn/client/udp.go
src/cypherpunks.ru/govpn/cmd/govpn-server/common.go
src/cypherpunks.ru/govpn/cmd/govpn-server/main.go
src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go
src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go
src/cypherpunks.ru/govpn/stats.go
src/cypherpunks.ru/govpn/verifier.go
src/golang.org/x/crypto
src/golang.org/x/sys [new submodule]
utils/makedist.sh

index c837a039e17a5ea45e75cc416ebcd3cbe97f1dda..8b03d42057f6d46223b8695c24ddb201205987b6 100644 (file)
@@ -14,3 +14,6 @@
        path = src/gopkg.in/yaml.v2
        url = https://github.com/go-yaml/yaml.git
        branch = v2
+[submodule "src/golang.org/x/sys"]
+       path = src/golang.org/x/sys
+       url = https://go.googlesource.com/sys
diff --git a/README b/README
index 51ee94e4b2e4af34c87f5dfc7331e78bbf849555..221809ea61dc3139fa8eb0c19c0578160dcf2d29 100644 (file)
--- a/README
+++ b/README
@@ -15,13 +15,14 @@ GNU/Linux and FreeBSD support.
 GoVPN is free software: see the file COPYING for copying conditions.
 
 Home page: http://www.govpn.info/
-also available as Tor hidden service: http://2wir2p7ibeu72jk3.onion/
+Also available as I2P service:
+http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/
 
 Please send questions regarding the use of GoVPN, bug reports and
 patches to govpn-devel mailing list:
 https://lists.cypherpunks.ru/pipermail/govpn-devel/
 
 Development Git source code repository currently is located here:
-http://git.cypherpunks.ru/cgit.cgi/govpn.git/
+https://git.cypherpunks.ru/cgit.cgi/govpn.git/
 
 For further information please read either doc/govpn.info or doc/govpn.texi.
index 63b702462f3f6ea8eb48b55200ab5dbf152a6dff..f1731a21830c7355e28dfb1c904ffdc4f70d5046 100644 (file)
--- a/README.RU
+++ b/README.RU
@@ -19,14 +19,15 @@ GoVPN это свободное программное обеспечением:
 находятся в файле COPYING.
 
 Домашняя страница: http://www.govpn.info/
-также доступна как скрытый сервис Tor: http://2wir2p7ibeu72jk3.onion/
+Также доступная как I2P сервис:
+http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/
 
 Пожалуйста все вопросы касающиеся использования GoVPN, отчёты об ошибках
 и патчи отправляйте в govpn-devel почтовую рассылку:
 https://lists.cypherpunks.ru/pipermail/govpn-devel/
 
 Исходный код для разработчика находится в Git репозитории:
-http://git.cypherpunks.ru/cgit.cgi/govpn.git/
+https://git.cypherpunks.ru/cgit.cgi/govpn.git/
 
\97а Ð±Ð¾Ð»Ñ\8cÑ\88ей Ð¸Ð½Ñ\84оÑ\80маÑ\86ией Ð¿Ð¾Ð¶Ð°Ð»Ñ\83йÑ\81Ñ\82а Ð¿Ñ\80оÑ\87Ñ\82иÑ\82е Ð¸Ð»Ð¸ doc/govpn.info Ð¸Ð»Ð¸
-doc/govpn.texi.
\94лÑ\8f Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cной Ð¸Ð½Ñ\84оÑ\80маÑ\86ии Ð¿Ð¾Ð¶Ð°Ð»Ñ\83йÑ\81Ñ\82а Ñ\87иÑ\82айÑ\82е Ð¸Ð»Ð¸ doc/govpn.info
+или doc/govpn.texi.
diff --git a/THANKS b/THANKS
index a7fe0af928a49fd277d4e7705927aa906c011744..d2294bfc0f3f7c461e7886e542570cf9a601d600 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -2,4 +2,4 @@
 * Zhuoyun Wei <wzyboy at wzyboy dot org> for AUR port maintaining and
   his documentation related fixes.
 * Bruno Clermont <bruno at robotinfra dot com> for finding serious bugs
-  and code refactoring
+  and code refactoring.
diff --git a/VERSION b/VERSION
index f99416236e9fc148fb5b694705c04492d60793dd..37722ebbc756a3160e7f4aeb04d4c8f69e5fa8a3 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-7.3
+7.4
index 99e1c0d1b6c9eb1247020f598b0fa2b8240ce666..988964fdd09892feaf487460efc952847abeb682 100644 (file)
--- a/common.mk
+++ b/common.mk
@@ -38,7 +38,7 @@ install: all doc
        cp -f utils/newclient.sh $(SHAREDIR)
        chmod 755 $(SHAREDIR)/newclient.sh
        mkdir -p $(DOCDIR)
-       cp -f -L AUTHORS INSTALL NEWS README README.RU THANKS $(DOCDIR)
+       cp -f -L AUTHORS INSTALL NEWS NEWS.RU README README.RU THANKS $(DOCDIR)
        chmod 644 $(DOCDIR)/*
 
 install-strip: install
index 0c45017ca7ed2b3d2422c36f4d2ebeb9bea5f6d8..c56eaafb0a2b57163108b48b566589a4b08cd924 100644 (file)
@@ -10,7 +10,7 @@ GoVPN это простой демон виртуальных частных с
 @url{https://www.gnu.org/philosophy/free-sw.ru.html, Свободное программное
 обеспечение}, @url{https://www.gnu.org/philosophy/pragmatic.ru.html, копилефт}:
 лицензировано под условиями @url{https://www.gnu.org/licenses/gpl-3.0.ru.html,
-GPLv3+}.
+GNU GPLv3+}.
 
 @item
 Быстрый сильный @ref{PAKE, аутентифицируемый по парольной фразе}
index 7cda5af5d6db5f52bc8d6466b986c1888538a54b..5fbafe7fd2530d29d7fa774e01d95346f4efb8b8 100644 (file)
@@ -9,7 +9,7 @@ See also this page @ref{О демоне, on russian}.
 @item
 @url{https://www.gnu.org/philosophy/pragmatic.html, Copylefted}
 @url{https://www.gnu.org/philosophy/free-sw.html, free software}:
-licenced under @url{https://www.gnu.org/licenses/gpl-3.0.html, GPLv3+}.
+licenced under @url{https://www.gnu.org/licenses/gpl-3.0.html, GNU GPLv3+}.
 
 @item
 Fast strong @ref{PAKE, passphrase authenticated} augmented
index 15e5235c6d3a94893f0c2a14e2c9f1e5b0fe8410..1c8b5b27219e7e370461db8333350028ef1c2755 100644 (file)
@@ -5,7 +5,6 @@ Please send questions regarding the use of GoVPN, bug reports and patches to
 @url{https://lists.cypherpunks.ru/pipermail/govpn-devel/, govpn-devel}
 mailing list. Announcements also go to this mailing list.
 
-Official website is @url{http://www.govpn.info/}, also available via
-@url{https://www.govpn.info/, HTTPS} and as
-@url{https://www.torproject.org/, Tor} hidden service:
-@url{http://2wir2p7ibeu72jk3.onion/}.
+Official website is @url{http://www.govpn.info/}, also available as
+@url{https://geti2p.net/en/, I2P} service
+@url{http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/}.
index f12e40ea8baf78ffde4f6cf12a3c246ca1ec54e3..463aa91408662278ddc0c4276575c0cfd960e630 100644 (file)
@@ -1,23 +1,28 @@
 @node Tarballs
 @section Prepared tarballs
 
-You can obtain releases source code prepared tarballs from the links below
-(or use @url{https://sourceforge.net/projects/govpn/files/, Sourceforge mirror}).
+You can obtain releases source code prepared tarballs from the links below.
 Do not forget to check tarball @ref{Integrity, integrity}.
 
 Tarballs include all necessary required libraries:
 
 @multitable @columnfractions .40 .20 .40
 @headitem Library @tab Platform @tab Licence
+@item @code{cypherpunks.ru/balloon} @tab All @tab GNU LGPLv3+
 @item @code{github.com/agl/ed25519} @tab All @tab BSD 3-Clause
 @item @code{github.com/bigeagle/water} @tab GNU/Linux @tab BSD 3-Clause
 @item @code{github.com/go-yaml/yaml} @tab All @tab Apache License 2.0 and MIT
 @item @code{golang.org/x/crypto} @tab All @tab BSD 3-Clause
+@item @code{golang.org/x/sys} @tab All @tab BSD 3-Clause
 @end multitable
 
 @multitable {XXXXX} {XXXX KiB} {link sign} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
 @headitem Version @tab Size @tab Tarball @tab SHA256 checksum
 
+@item @ref{Release 7.3, 7.3} @tab 289 KiB
+@tab @url{download/govpn-7.3.tar.xz, link} @url{download/govpn-7.3.tar.xz.sig, sign}
+@tab @code{C3A27353 4A448112 09C4CB1D CA26EBFE 56644D5A D51C8216 BA22EC18 150A4EE8}
+
 @item @ref{Release 7.2, 7.2} @tab 289 KiB
 @tab @url{download/govpn-7.2.tar.xz, link} @url{download/govpn-7.2.tar.xz.sig, sign}
 @tab @code{8C787DCD 6FFB718E 850F287E 959FCB45 7880A8A1 1C417BCA 17A86346 AC9BAAEE}
@@ -136,4 +141,4 @@ Tarballs include all necessary required libraries:
 
 @end multitable
 
-Also you can try its @ref{Contacts, .onion} version.
+Also you can try its @ref{Contacts, .i2p} version.
index 9abc8229d6a215403f6ef11e9d0fe16ce38f4cc8..1f8a74c36bf06b4a70a4965f2c595b21d6b554c8 100644 (file)
@@ -11,14 +11,14 @@ Possibly GoVPN already exists in your distribution:
 @end itemize
 
 GoVPN is written on @url{https://golang.org/, Go} programming language
-and you have to install Go compiler (1.5+ version is highly recommended,
-1.4 is the minimal sufficient): @code{lang/go} port in FreeBSD and
-@code{golang} package in most GNU/Linux distributions. @emph{Make} (BSD
-and GNU ones are fine) is recommended for convenient building.
-@url{https://www.gnu.org/software/texinfo/, Texinfo} (6.1+ version is
-recommended) is used for building documentation. Possibly you also need
-to install TUN/TAP interface utilities (depending on your operating
-system): @command{uml-utilities} package in most GNU/Linux distributions.
+and you have to install Go compiler 1.9+ version: @code{lang/go} port in
+FreeBSD and @code{golang} package in most GNU/Linux distributions.
+@emph{Make} (BSD and GNU ones are fine) is recommended for convenient
+building. @url{https://www.gnu.org/software/texinfo/, Texinfo} (6.1+
+version is recommended) is used for building documentation. Possibly you
+also need to install TUN/TAP interface utilities (depending on your
+operating system): @command{uml-utilities} package in most GNU/Linux
+distributions.
 
 Get @ref{Tarballs, the tarball}, check its
 @ref{Integrity, integrity and authenticity} and run @command{make}.
index f00c3b1b1aa36fb30f98ac7de7dd8f845af3216c..08aa4c792c698d60564ac5b489f757e928634263 100644 (file)
@@ -1,6 +1,13 @@
 @node Новости
 @section Новости
 
+@node Релиз 7.4
+@subsection Релиз 7.4
+@itemize
+@item Маленький рефакторинг. Минимальная необходимая версия Go 1.9.
+@item Обновлены зависимые криптографические библиотеки.
+@end itemize
+
 @node Релиз 7.3
 @subsection Релиз 7.3
 @itemize
index cb119e25ab565d8bb49dc1dc3edc9d72f5fe0e78..03d61ef30df7ea66c02ca10ff9314cde2bf4a3f5 100644 (file)
@@ -3,6 +3,13 @@
 
 See also this page @ref{Новости, on russian}.
 
+@node Release 7.4
+@section Release 7.4
+@itemize
+@item Tiny refactoring. Go 1.9 is minimal required version.
+@item Dependant cryptographic libraries are updated.
+@end itemize
+
 @node Release 7.3
 @section Release 7.3
 @itemize
index f3864ef47fef546637e4611d8133c097b0e08331..7ceeebf2a8a113e4e0e32aee46f08488c965924b 100644 (file)
@@ -7,7 +7,7 @@ libraries source code. Because of that, it is recommended for porters
 to use @ref{Tarballs, tarballs} instead.
 
 You can obtain it by cloning @url{http://git-scm.com/, Git}
-@url{http://git.cypherpunks.ru/cgit.cgi/govpn.git/log/, repository}
+@url{https://git.cypherpunks.ru/cgit.cgi/govpn.git/log/, repository}
 and fetching dependent libraries source code as git submodules:
 
 @verbatim
@@ -22,7 +22,6 @@ repositories will be unavailable (they are seldom updated):
 
 @multitable @columnfractions .50 .50
 @headitem Software/library @tab Mirror
-@item @code{cypherpunks.ru/govpn} @tab @url{https://github.com/stargrave/govpn.git}
 @item @code{github.com/agl/ed25519} @tab @url{git://git.cypherpunks.ru/ed25519.git}
 @item @code{github.com/bigeagle/water} @tab @url{git://git.cypherpunks.ru/water.git}
 @item @code{github.com/go-yaml/yaml} @tab @url{git://git.cypherpunks.ru/yaml.git}
index 5d78be67a0148e00d9f6e2c1a7cf51fa34b8bf49..8e7a2eb1986d9a3d5dae4334aa54e0741e494522 100644 (file)
@@ -1,10 +1,9 @@
 # $FreeBSD$
 
 PORTNAME=      govpn
-PORTVERSION=   7.3
+PORTVERSION=   7.4
 CATEGORIES=    security
-MASTER_SITES=  http://www.govpn.info/download/ \
-               http://sourceforge.net/projects/govpn/files/
+MASTER_SITES=  http://www.govpn.info/download/
 
 MAINTAINER=    stargrave@stargrave.org
 COMMENT=       Simple secure, DPI-resistant VPN daemon
@@ -17,7 +16,7 @@ BUILD_DEPENDS=        go:lang/go
 USES=          tar:xz
 MAKEFILE=      BSDmakefile
 
-PORTDOCS=      AUTHORS INSTALL NEWS README THANKS README.RU
+PORTDOCS=      AUTHORS INSTALL NEWS NEWS.RU README README.RU THANKS
 INFO=          govpn
 INSTALL_TARGET=        install-strip
 
index 9e7f63092012aa91a6690d93f00f5bc476e4d3b5..3cd3006ad829a0afc7ca3d964ff333ef068464bd 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 9e7f63092012aa91a6690d93f00f5bc476e4d3b5
+Subproject commit 3cd3006ad829a0afc7ca3d964ff333ef068464bd
index 8102cc6cdf1430217a27052526496b8c8af446a4..3014bdfab6adf0bf9276d6e31a7575286917791b 100644 (file)
@@ -23,6 +23,7 @@ import (
        "fmt"
        "net"
        "os"
+       "sync"
        "time"
 
        "github.com/agl/ed25519"
@@ -72,7 +73,7 @@ func (c *Configuration) isProxy() bool {
 type Client struct {
        idsCache      *govpn.MACCache
        tap           *govpn.TAP
-       knownPeers    govpn.KnownPeers
+       knownPeers    sync.Map
        statsPort     net.Listener
        timeouted     chan struct{}
        rehandshaking chan struct{}
@@ -99,7 +100,6 @@ func (c *Client) MainCycle() {
                        c.Error <- fmt.Errorf("Can't listen on stats port: %s", err.Error())
                        return
                }
-               c.knownPeers = govpn.KnownPeers(make(map[string]**govpn.Peer))
                go govpn.StatsProcessor(c.statsPort, &c.knownPeers)
        }
 
index 40d81ca818081789c3a9f87ac4e4a2f063c63a76..4bb7a5fd4856390f812045da4b03bd831270709d 100644 (file)
@@ -86,7 +86,7 @@ HandshakeCycle:
                        continue
                }
                govpn.Printf(`[handshake-completed remote="%s"]`, c.config.RemoteAddress)
-               c.knownPeers = govpn.KnownPeers(map[string]**govpn.Peer{c.config.RemoteAddress: &peer})
+               c.knownPeers.Store(c.config.RemoteAddress, &peer)
                if c.firstUpCall {
                        go govpn.ScriptCall(c.config.UpPath, c.config.InterfaceName, c.config.RemoteAddress)
                        c.firstUpCall = false
index bb7045ac711778f25e8a9f8d839dea3ae9f11d92..bb29dccd961f4fd0385046a23f33de123277d433 100644 (file)
@@ -93,7 +93,7 @@ MainCycle:
                        continue
                }
                govpn.Printf(`[handshake-completed remote="%s"]`, c.config.RemoteAddress)
-               c.knownPeers = govpn.KnownPeers(map[string]**govpn.Peer{c.config.RemoteAddress: &peer})
+               c.knownPeers.Store(c.config.RemoteAddress, &peer)
                if c.firstUpCall {
                        go govpn.ScriptCall(c.config.UpPath, c.config.InterfaceName, c.config.RemoteAddress)
                        c.firstUpCall = false
index f18d34b420c964a644dcbc4ae76170c1672e8800..e0e8e033da043f42a000a219f3559d1f0fbda613 100644 (file)
@@ -32,17 +32,10 @@ type PeerState struct {
 }
 
 var (
-       handshakes map[string]*govpn.Handshake = make(map[string]*govpn.Handshake)
-       hsLock     sync.RWMutex
-
-       peers     = make(map[string]*PeerState)
-       peersLock sync.RWMutex
-
-       peersByID     = make(map[govpn.PeerID]string)
-       peersByIDLock sync.RWMutex
-
-       knownPeers govpn.KnownPeers
-       kpLock     sync.RWMutex
+       handshakes sync.Map
+       peers      sync.Map
+       peersByID  sync.Map
+       knownPeers sync.Map
 )
 
 func callUp(peerID *govpn.PeerID, remoteAddr string) (string, error) {
index 3e80975587fbe6df3abd8572d9ae23d7ddea9aa1..0dfd8ab83198f449f7d4148f8e1e11c780eff189 100644 (file)
@@ -58,7 +58,6 @@ func main() {
        log.Println(govpn.VersionGet())
 
        confInit()
-       knownPeers = govpn.KnownPeers(make(map[string]**govpn.Peer))
 
        if *egdPath != "" {
                log.Println("Using", *egdPath, "EGD")
@@ -106,28 +105,33 @@ MainCycle:
                select {
                case <-termSignal:
                        govpn.BothPrintf(`[terminating bind="%s"]`, *bindAddr)
-                       for _, ps := range peers {
+                       peers.Range(func(_, psI interface{}) bool {
+                               ps := psI.(*PeerState)
                                govpn.ScriptCall(
                                        confs[*ps.peer.ID].Down,
                                        ps.tap.Name,
                                        ps.peer.Addr,
                                )
-                       }
+                               return true
+                       })
                        break MainCycle
                case <-hsHeartbeat:
                        now := time.Now()
-                       hsLock.Lock()
-                       for addr, hs := range handshakes {
+
+                       handshakes.Range(func(addrI, hsI interface{}) bool {
+                               addr := addrI.(string)
+                               hs := hsI.(*govpn.Handshake)
                                if hs.LastPing.Add(timeout).Before(now) {
                                        govpn.Printf(`[handshake-delete bind="%s" addr="%s"]`, *bindAddr, addr)
                                        hs.Zero()
-                                       delete(handshakes, addr)
+                                       handshakes.Delete(addr)
                                }
-                       }
-                       peersLock.Lock()
-                       peersByIDLock.Lock()
-                       kpLock.Lock()
-                       for addr, ps := range peers {
+                               return true
+                       })
+
+                       peers.Range(func(addrI, psI interface{}) bool {
+                               addr := addrI.(string)
+                               ps := psI.(*PeerState)
                                ps.peer.BusyR.Lock()
                                needsDeletion = ps.peer.LastPing.Add(timeout).Before(now)
                                ps.peer.BusyR.Unlock()
@@ -137,9 +141,9 @@ MainCycle:
                                                *bindAddr,
                                                ps.peer.ID.String(),
                                        )
-                                       delete(peers, addr)
-                                       delete(knownPeers, addr)
-                                       delete(peersByID, *ps.peer.ID)
+                                       peers.Delete(addr)
+                                       knownPeers.Delete(addr)
+                                       peersByID.Delete(*ps.peer.ID)
                                        go govpn.ScriptCall(
                                                confs[*ps.peer.ID].Down,
                                                ps.tap.Name,
@@ -147,11 +151,8 @@ MainCycle:
                                        )
                                        ps.terminator <- struct{}{}
                                }
-                       }
-                       hsLock.Unlock()
-                       peersLock.Unlock()
-                       peersByIDLock.Unlock()
-                       kpLock.Unlock()
+                               return true
+                       })
                }
        }
 }
index 61eb1e07395fcc8b10ddf690d43b706b0f28300b..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
@@ -96,16 +99,13 @@ func handleTCP(conn net.Conn) {
                        `[handshake-completed bind="%s" addr="%s" peer="%s"]`,
                        *bindAddr, addr, peerID.String(),
                )
-               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 {
@@ -117,16 +117,11 @@ func handleTCP(conn net.Conn) {
                                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(),
@@ -152,15 +147,9 @@ 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()
+                       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
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,
index c8ea6223e655912e60e6623344838174a7f6a718..8354d39de8a2f73008cb0883ae23eea51d0946b3 100644 (file)
@@ -22,6 +22,7 @@ import (
        "encoding/json"
        "log"
        "net"
+       "sync"
        "time"
 )
 
@@ -29,15 +30,13 @@ const (
        RWTimeout = 10 * time.Second
 )
 
-type KnownPeers map[string]**Peer
-
 // StatsProcessor is assumed to be run in background. It accepts
 // connection on statsPort, reads anything one send to them and show
 // information about known peers in serialized JSON format. peers
 // argument is a reference to the map with references to the peers as
 // values. Map is used here because of ease of adding and removing
 // elements in it.
-func StatsProcessor(statsPort net.Listener, peers *KnownPeers) {
+func StatsProcessor(statsPort net.Listener, peers *sync.Map) {
        var conn net.Conn
        var err error
        var data []byte
@@ -52,9 +51,10 @@ func StatsProcessor(statsPort net.Listener, peers *KnownPeers) {
                conn.Read(buf)
                conn.Write([]byte("HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n"))
                var peersList []*Peer
-               for _, peer := range *peers {
-                       peersList = append(peersList, *peer)
-               }
+               peers.Range(func(_, peerI interface{}) bool {
+                       peersList = append(peersList, *peerI.(**Peer))
+                       return true
+               })
                data, err = json.Marshal(peersList)
                if err != nil {
                        panic(err)
index 8be6ea7ac62c1f25e1d2222d4176c7465b7b1c71..26e0275df46e7db2226c9d8b388663e530ed4a7a 100644 (file)
@@ -133,9 +133,9 @@ func KeyRead(path string) (string, error) {
        var err error
        var pass string
        if path == "" {
-               os.Stderr.Write([]byte("Passphrase:"))
+               os.Stderr.WriteString("Passphrase:")
                p, err = terminal.ReadPassword(0)
-               os.Stderr.Write([]byte("\n"))
+               os.Stderr.WriteString("\n")
                pass = string(p)
        } else {
                p, err = ioutil.ReadFile(path)
index 573951cbe80bb6352881271bb276f48749eab6f4..81e90905daefcd6fd217b62423c0908922eadb30 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 573951cbe80bb6352881271bb276f48749eab6f4
+Subproject commit 81e90905daefcd6fd217b62423c0908922eadb30
diff --git a/src/golang.org/x/sys b/src/golang.org/x/sys
new file mode 160000 (submodule)
index 0000000..2d6f6f8
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 2d6f6f883a06fc0d5f4b14a81e4c28705ea64c15
index 3deab39ef1f53b5038561736b142ecd4b34a0733..7b1547bdd7a15b9c00b17e1ca9e451ce7028aac2 100755 (executable)
@@ -12,6 +12,7 @@ repos="
     src/github.com/bigeagle/water
     src/gopkg.in/yaml.v2
     src/golang.org/x/crypto
+    src/golang.org/x/sys
 "
 for repo in $repos; do
     git clone $repo $tmp/govpn-$release/$repo
@@ -25,12 +26,18 @@ golang.org/x/crypto/AUTHORS
 golang.org/x/crypto/CONTRIBUTORS
 golang.org/x/crypto/LICENSE
 golang.org/x/crypto/PATENTS
-golang.org/x/crypto/README
+golang.org/x/crypto/README.md
 golang.org/x/crypto/blake2b
 golang.org/x/crypto/chacha20poly1305/internal/chacha20
 golang.org/x/crypto/curve25519
 golang.org/x/crypto/poly1305
 golang.org/x/crypto/ssh/terminal
+golang.org/x/sys/AUTHORS
+golang.org/x/sys/CONTRIBUTORS
+golang.org/x/sys/LICENSE
+golang.org/x/sys/PATENTS
+golang.org/x/sys/README
+golang.org/x/sys/unix
 EOF
 tar cfCI - src $tmp/includes | tar xfC - $tmp
 rm -fr src/golang.org
@@ -99,7 +106,8 @@ $(git cat-file -p $release | sed -n '6,/^.*BEGIN/p' | sed '$d')
 ------------------------ >8 ------------------------
 
 GoVPN's home page is: http://www.govpn.info/
-also available as Tor hidden service: http://2wir2p7ibeu72jk3.onion/
+Also available as I2P service:
+http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/
 
 Source code and its signature for that version can be found here:
 
@@ -145,10 +153,11 @@ $(git cat-file -p $release | sed -n '6,/^.*BEGIN/p' | sed '$d')
 ------------------------ >8 ------------------------
 
 Домашняя страница GoVPN: http://www.govpn.info/
-также доступна как скрытый сервис Tor: http://2wir2p7ibeu72jk3.onion/
+Также доступная как I2P сервис:
+http://zy2qxyziqzledqqb5vcq5unfxnn2csv6revteliybd7qxb64dpxq.b32.i2p/
 Коротко о демоне: http://www.govpn.info/O-demone.html
 
-Исходный код и его подпись для этой версии находится здесь:
+Исходный код и его подпись для этой версии находятся здесь:
 
     http://www.govpn.info/download/govpn-${release}.tar.xz ($size KiB)
     http://www.govpn.info/download/govpn-${release}.tar.xz.sig