summaryrefslogtreecommitdiffhomepage
path: root/tun_linux.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-05-05 03:36:09 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-05-05 03:40:52 +0200
commit36659454ceadf2f323150cbe02e9d5f52a98582d (patch)
tree3ab1076764c61ee5bd2ab426614f8798fafb619c /tun_linux.go
parent142e53f69827e6778d809d9606bb7cd4e77694a2 (diff)
tun: simplify and combine creation logic on Linux
Diffstat (limited to 'tun_linux.go')
-rw-r--r--tun_linux.go63
1 files changed, 17 insertions, 46 deletions
diff --git a/tun_linux.go b/tun_linux.go
index e3e1512..18994cc 100644
--- a/tun_linux.go
+++ b/tun_linux.go
@@ -20,7 +20,6 @@ import (
"net"
"os"
"strconv"
- "strings"
"syscall"
"time"
"unsafe"
@@ -361,6 +360,7 @@ func (tun *NativeTun) doRead(buff []byte, offset int) (int, error) {
}
}
+/* https://golang.org/src/crypto/rand/eagain.go */
func unixIsEAGAIN(err error) bool {
if pe, ok := err.(*os.PathError); ok {
if errno, ok := pe.Err.(syscall.Errno); ok && errno == syscall.EAGAIN {
@@ -395,57 +395,18 @@ func (tun *NativeTun) Close() error {
return nil
}
-func CreateTUNFromFile(fd *os.File) (TUNDevice, error) {
- device := &NativeTun{
- fd: fd,
- events: make(chan TUNEvent, 5),
- errors: make(chan error, 5),
- nopi: false,
- }
- var err error
-
- err = syscall.SetNonblock(int(fd.Fd()), true)
- if err != nil {
- return nil, err
- }
-
- _, err = device.Name()
- if err != nil {
- return nil, err
- }
-
- device.closingReader, device.closingWriter, err = os.Pipe()
- if err != nil {
- return nil, err
- }
-
- // start event listener
-
- device.index, err = getIFIndex(device.name)
- if err != nil {
- return nil, err
- }
-
- go device.RoutineNetlinkListener()
- go device.RoutineHackListener() // cross namespace
-
- // set default MTU
-
- return device, device.setMTU(DefaultMTU)
-}
-
func CreateTUN(name string) (TUNDevice, error) {
// open clone device
// HACK: we open it as a raw Fd first, so that f.nonblock=false
// when we make it into a file object.
- nfd, err := syscall.Open(cloneDevicePath, os.O_RDWR, 0)
+ nfd, err := unix.Open(cloneDevicePath, os.O_RDWR, 0)
if err != nil {
return nil, err
}
- err = syscall.SetNonblock(nfd, true)
+ err = unix.SetNonblock(nfd, true)
if err != nil {
return nil, err
}
@@ -476,17 +437,27 @@ func CreateTUN(name string) (TUNDevice, error) {
return nil, errno
}
- // read (new) name of interface
+ return CreateTUNFromFile(fd)
+}
- newName := string(ifr[:])
- newName = newName[:strings.Index(newName, "\000")]
+func CreateTUNFromFile(fd *os.File) (TUNDevice, error) {
device := &NativeTun{
fd: fd,
- name: newName,
events: make(chan TUNEvent, 5),
errors: make(chan error, 5),
nopi: false,
}
+ var err error
+
+ err = unix.SetNonblock(int(fd.Fd()), true)
+ if err != nil {
+ return nil, err
+ }
+
+ _, err = device.Name()
+ if err != nil {
+ return nil, err
+ }
device.closingReader, device.closingWriter, err = os.Pipe()
if err != nil {