]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/govpn/cmd/govpn-server/udp.go
JSON configuration
[govpn.git] / src / govpn / cmd / govpn-server / udp.go
index 4a57d87aa7d2098ba4bb8327f85bb6d9654a5568..0f5e5551d6bc853ffa3dbe29886434b1ed02d1e0 100644 (file)
@@ -48,7 +48,8 @@ func startUDP() {
        if err != nil {
                log.Fatalln("Can not listen on UDP:", err)
        }
-       log.Println("Listening on UDP", *bindAddr)
+       log.Println("Listening on UDP:" + *bindAddr)
+
        udpBufs <- make([]byte, govpn.MTU)
        go func() {
                var buf []byte
@@ -65,9 +66,9 @@ func startUDP() {
                var conf *govpn.PeerConf
                for {
                        buf = <-udpBufs
-
                        n, raddr, err = conn.ReadFromUDP(buf)
                        if err != nil {
+                               log.Println("Unexpected error when receiving", err)
                                break
                        }
                        addr = raddr.String()
@@ -95,7 +96,7 @@ func startUDP() {
                                goto Finished
                        }
 
-                       log.Println("Peer handshake finished:", addr)
+                       log.Println("Peer handshake finished:", addr, peer.Id.String())
                        hs.Zero()
                        hsLock.Lock()
                        delete(handshakes, addr)
@@ -109,32 +110,29 @@ 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 finished:", peer.Id.String())
+                               log.Println("Rehandshake processed:", peer.Id.String())
                        } else {
                                go func(addr string, peer *govpn.Peer) {
                                        ifaceName, err := callUp(peer.Id)
@@ -149,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)
@@ -165,19 +163,19 @@ func startUDP() {
                                        peersLock.Unlock()
                                        peersByIdLock.Unlock()
                                        kpLock.Unlock()
-                                       log.Println("New peer:", peer.Id.String())
+                                       log.Println("Peer created:", peer.Id.String())
                                }(addr, peer)
                        }
                        goto Finished
                CheckID:
-                       peerId = govpn.IDsCache.Find(buf[:n])
+                       peerId = idsCache.Find(buf[:n])
                        if peerId == nil {
                                log.Println("Unknown identity from:", addr)
                                goto Finished
                        }
-                       conf = peerId.Conf()
+                       conf = confs[*peerId]
                        if conf == nil {
-                               log.Println("Can not get peer configuration:", peerId.String())
+                               log.Println("Unable to get peer configuration:", peerId.String())
                                goto Finished
                        }
                        hs = govpn.NewHandshake(