diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-02-28 12:40:56 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-02-28 19:58:51 +0100 |
commit | fd248c6cb1873229b5e487045accdf7ed7ac822e (patch) | |
tree | 9be95c4853d449da2cd7df25b81d19ce442b1dd6 /tun_linux.go | |
parent | 09de7d1342a6d069ee888370a9bdcc289fadc73b (diff) |
Support nopi mode
Diffstat (limited to 'tun_linux.go')
-rw-r--r-- | tun_linux.go | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/tun_linux.go b/tun_linux.go index 97973a7..da53907 100644 --- a/tun_linux.go +++ b/tun_linux.go @@ -27,6 +27,7 @@ type NativeTun struct { name string // name of interface errors chan error // async error handling events chan TUNEvent // device related events + nopi bool // the device was pased IFF_NO_PI } func toRTMGRP(sc uint) uint { @@ -242,21 +243,25 @@ func (tun *NativeTun) MTU() (int, error) { func (tun *NativeTun) Write(buff []byte, offset int) (int, error) { - // reserve space for header + if tun.nopi { + buff = buff[offset:] + } else { + // reserve space for header - buff = buff[offset-4:] + buff = buff[offset-4:] - // add packet information header + // add packet information header - buff[0] = 0x00 - buff[1] = 0x00 + buff[0] = 0x00 + buff[1] = 0x00 - if buff[4] == ipv6.Version<<4 { - buff[2] = 0x86 - buff[3] = 0xdd - } else { - buff[2] = 0x08 - buff[3] = 0x00 + if buff[4] == ipv6.Version<<4 { + buff[2] = 0x86 + buff[3] = 0xdd + } else { + buff[2] = 0x08 + buff[3] = 0x00 + } } // write @@ -269,12 +274,16 @@ func (tun *NativeTun) Read(buff []byte, offset int) (int, error) { case err := <-tun.errors: return 0, err default: - buff := buff[offset-4:] - n, err := tun.fd.Read(buff[:]) - if n < 4 { - return 0, err + if tun.nopi { + return tun.fd.Read(buff[offset:]) + } else { + buff := buff[offset-4:] + n, err := tun.fd.Read(buff[:]) + if n < 4 { + return 0, err + } + return n - 4, err } - return n - 4, err } } @@ -292,6 +301,7 @@ func CreateTUNFromFile(name string, fd *os.File) (TUNDevice, error) { name: name, events: make(chan TUNEvent, 5), errors: make(chan error, 5), + nopi: false, } // start event listener @@ -349,6 +359,7 @@ func CreateTUN(name string) (TUNDevice, error) { name: newName, events: make(chan TUNEvent, 5), errors: make(chan error, 5), + nopi: false, } // start event listener |