]> Cypherpunks.ru repositories - govpn.git/blobdiff - transport.go
Keep TAP listener state and skip sinkReady step if necessary
[govpn.git] / transport.go
index 8c5e8eb249eb65473c38cda1da4892cd0ad182c3..d72fcc15ea140c74584514dd380fbc3fe6dea607 100644 (file)
@@ -102,6 +102,7 @@ func TAPListen(ifaceName string) (*TAP, chan []byte, chan struct{}, chan struct{
        sink := make(chan []byte)
        sinkReady := make(chan struct{})
        sinkTerminate := make(chan struct{})
+       sinkSkip := make(chan struct{})
 
        go func() {
                heartbeat := time.Tick(heartbeatPeriodGet())
@@ -114,12 +115,10 @@ func TAPListen(ifaceName string) (*TAP, chan []byte, chan struct{}, chan struct{
                        case <-heartbeat:
                                go func() { sink <- make([]byte, 0) }()
                                continue
+                       case <-sinkSkip:
                        case <-sinkReady:
-                               if exists {
-                                       exists = false
-                                       break
-                               }
                                tap.ready <- struct{}{}
+                               tap.synced = true
                        }
                HeartbeatCatched:
                        select {
@@ -129,12 +128,19 @@ func TAPListen(ifaceName string) (*TAP, chan []byte, chan struct{}, chan struct{
                        case <-sinkTerminate:
                                break ListenCycle
                        case pkt = <-tap.sink:
+                               tap.synced = false
                                sink <- pkt
                        }
                }
                close(sink)
+               close(sinkReady)
+               close(sinkTerminate)
        }()
-       sinkReady <- struct{}{}
+       if exists && tap.synced {
+               sinkSkip <- struct{}{}
+       } else {
+               sinkReady <- struct{}{}
+       }
        return tap, sink, sinkReady, sinkTerminate, nil
 }