)
type TAP struct {
- Name string
- dev io.ReadWriter
- buf []byte
- sink chan []byte
- ready chan struct{}
+ Name string
+ dev io.ReadWriter
+ buf []byte
+ sink chan []byte
+ ready chan struct{}
+ synced bool
}
func NewTAP(ifaceName string) (*TAP, error) {
return nil, err
}
tap := TAP{
- Name: ifaceName,
- dev: tapRaw,
- buf: make([]byte, maxIfacePktSize),
- sink: make(chan []byte),
- ready: make(chan struct{}),
+ Name: ifaceName,
+ dev: tapRaw,
+ buf: make([]byte, maxIfacePktSize),
+ sink: make(chan []byte),
+ ready: make(chan struct{}),
+ synced: false,
}
go func() {
var n int
sink := make(chan []byte)
sinkReady := make(chan struct{})
sinkTerminate := make(chan struct{})
+ sinkSkip := make(chan struct{})
go func() {
heartbeat := time.Tick(heartbeatPeriodGet())
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 {
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
}