Name string
Sink chan []byte
dev io.ReadWriteCloser
+ closed bool
}
var (
bufZ = !bufZ
n, err = tap.dev.Read(buf)
if err != nil {
+ if tap.closed {
+ return
+ }
logger.WithError(err).WithFields(logrus.Fields{
"func": logFuncPrefix + "TAP read sink loop",
"name": tap.Name,
// Close close TAP/TUN virtual network interface
func (t *TAP) Close() error {
- // TODO add chan to stop read loop
- return t.dev.Close()
+ if t.closed {
+ return nil
+ }
+ err := t.dev.Close()
+ if err != nil {
+ return errors.Wrap(err, "water.Interface.Close")
+ }
+ t.closed = true
+ return nil
}
// TAPListen opens an existing TAP (creates if none exists)
bufZ = !bufZ
n, err = tap.dev.Read(buf)
if err != nil {
+ if tap.closed {
+ return
+ }
+
e, ok := err.(*os.PathError)
if ok && e.Err == syscall.EAGAIN {
time.Sleep(time.Millisecond * 20)