diff --git a/tun_android.go b/tun_android.go new file mode 100644 index 0000000..a2a2e90 --- /dev/null +++ b/tun_android.go @@ -0,0 +1,69 @@ +package nebula + +import ( + "fmt" + "io" + "net" + "os" + + "golang.org/x/sys/unix" +) + +type Tun struct { + io.ReadWriteCloser + fd int + Device string + Cidr *net.IPNet + MaxMTU int + DefaultMTU int + TXQueueLen int + Routes []route + UnsafeRoutes []route +} + +func newTunFromFd(deviceFd int, cidr *net.IPNet, defaultMTU int, routes []route, unsafeRoutes []route, txQueueLen int) (ifce *Tun, err error) { + file := os.NewFile(uintptr(deviceFd), "/dev/net/tun") + + ifce = &Tun{ + ReadWriteCloser: file, + fd: int(file.Fd()), + Device: "tun0", + Cidr: cidr, + DefaultMTU: defaultMTU, + TXQueueLen: txQueueLen, + Routes: routes, + UnsafeRoutes: unsafeRoutes, + } + return +} + +func newTun(deviceName string, cidr *net.IPNet, defaultMTU int, routes []route, unsafeRoutes []route, txQueueLen int) (ifce *Tun, err error) { + return nil, fmt.Errorf("newTun not supported in Android") +} + +func (c *Tun) WriteRaw(b []byte) error { + var nn int + for { + max := len(b) + n, err := unix.Write(c.fd, b[nn:max]) + if n > 0 { + nn += n + } + if nn == len(b) { + return err + } + + if err != nil { + return err + } + + if n == 0 { + return io.ErrUnexpectedEOF + } + } +} + +func (c Tun) Activate() error { + c.Device = "android" + return nil +} diff --git a/tun_linux.go b/tun_linux.go index 1cce919..dc8f3ea 100644 --- a/tun_linux.go +++ b/tun_linux.go @@ -1,3 +1,5 @@ +// +build !android + package nebula import (