diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-03-21 14:43:04 -0600 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-03-21 14:45:41 -0600 |
commit | 6440f010eec82abb9c999771a8f493af44c6b937 (patch) | |
tree | 187207b768cb2bb477879a1abfad8b732bbece45 /tun | |
parent | 49ea0c9b1aca8662c2e520d84f7eed3019f2697a (diff) |
receive: implement flush semantics
Diffstat (limited to 'tun')
-rw-r--r-- | tun/operateonfd.go (renamed from tun/tun_default.go) | 0 | ||||
-rw-r--r-- | tun/tun.go | 1 | ||||
-rw-r--r-- | tun/tun_darwin.go | 5 | ||||
-rw-r--r-- | tun/tun_freebsd.go | 5 | ||||
-rw-r--r-- | tun/tun_linux.go | 5 | ||||
-rw-r--r-- | tun/tun_openbsd.go | 5 | ||||
-rw-r--r-- | tun/tun_windows.go | 12 |
7 files changed, 28 insertions, 5 deletions
diff --git a/tun/tun_default.go b/tun/operateonfd.go index 31747a2..31747a2 100644 --- a/tun/tun_default.go +++ b/tun/operateonfd.go @@ -21,6 +21,7 @@ type TUNDevice interface { File() *os.File // returns the file descriptor of the device Read([]byte, int) (int, error) // read a packet from the device (without any additional headers) Write([]byte, int) (int, error) // writes a packet to the device (without any additional headers) + Flush() error // flush all previous writes to the device MTU() (int, error) // returns the MTU of the device Name() (string, error) // fetches and returns the current name Events() chan TUNEvent // returns a constant channel of events related to the device diff --git a/tun/tun_darwin.go b/tun/tun_darwin.go index 3b39982..2077de3 100644 --- a/tun/tun_darwin.go +++ b/tun/tun_darwin.go @@ -281,6 +281,11 @@ func (tun *NativeTun) Write(buff []byte, offset int) (int, error) { return tun.tunFile.Write(buff) } +func (tun *NativeTun) Flush() error { + //TODO: can flushing be implemented by buffering and using sendmmsg? + return nil +} + func (tun *NativeTun) Close() error { var err2 error err1 := tun.tunFile.Close() diff --git a/tun/tun_freebsd.go b/tun/tun_freebsd.go index 3a60725..01a4348 100644 --- a/tun/tun_freebsd.go +++ b/tun/tun_freebsd.go @@ -406,6 +406,11 @@ func (tun *NativeTun) Write(buff []byte, offset int) (int, error) { return tun.tunFile.Write(buff) } +func (tun *NativeTun) Flush() error { + //TODO: can flushing be implemented by buffering and using sendmmsg? + return nil +} + func (tun *NativeTun) Close() error { var err3 error err1 := tun.tunFile.Close() diff --git a/tun/tun_linux.go b/tun/tun_linux.go index b7c429c..784cb9f 100644 --- a/tun/tun_linux.go +++ b/tun/tun_linux.go @@ -318,6 +318,11 @@ func (tun *NativeTun) Write(buff []byte, offset int) (int, error) { return tun.tunFile.Write(buff) } +func (tun *NativeTun) Flush() error { + //TODO: can flushing be implemented by buffering and using sendmmsg? + return nil +} + func (tun *NativeTun) Read(buff []byte, offset int) (int, error) { select { case err := <-tun.errors: diff --git a/tun/tun_openbsd.go b/tun/tun_openbsd.go index 57edcb4..645bcca 100644 --- a/tun/tun_openbsd.go +++ b/tun/tun_openbsd.go @@ -237,6 +237,11 @@ func (tun *NativeTun) Write(buff []byte, offset int) (int, error) { return tun.tunFile.Write(buff) } +func (tun *NativeTun) Flush() error { + //TODO: can flushing be implemented by buffering and using sendmmsg? + return nil +} + func (tun *NativeTun) Close() error { var err2 error err1 := tun.tunFile.Close() diff --git a/tun/tun_windows.go b/tun/tun_windows.go index dcb414a..fffd802 100644 --- a/tun/tun_windows.go +++ b/tun/tun_windows.go @@ -281,7 +281,11 @@ func (tun *NativeTun) Read(buff []byte, offset int) (int, error) { // Note: flush() and putTunPacket() assume the caller comes only from a single thread; there's no locking. -func (tun *NativeTun) flush() error { +func (tun *NativeTun) Flush() error { + if tun.wrBuff.offset == 0 { + return nil + } + // Get TUN data pipe. file, err := tun.getTUN() if err != nil { @@ -322,7 +326,7 @@ func (tun *NativeTun) putTunPacket(buff []byte) error { if tun.wrBuff.packetNum >= packetExchangeMax || tun.wrBuff.offset+pSize >= packetExchangeSize { // Exchange buffer is full -> flush first. - err := tun.flush() + err := tun.Flush() if err != nil { return err } @@ -345,9 +349,7 @@ func (tun *NativeTun) Write(buff []byte, offset int) (int, error) { if err != nil { return 0, err } - - // Flush write buffer. - return len(buff) - offset, tun.flush() + return len(buff) - offset, nil } // |