tun: allow special methods in NativeTun

This commit is contained in:
Jason A. Donenfeld 2019-03-01 00:05:57 +01:00
parent 88ff67fb6f
commit 967d1a0f3d
6 changed files with 65 additions and 65 deletions

View file

@ -28,7 +28,7 @@ type TUNDevice interface {
Close() error // stops the device and closes the event channel Close() error // stops the device and closes the event channel
} }
func (tun *nativeTun) operateOnFd(fn func(fd uintptr)) { func (tun *NativeTun) operateOnFd(fn func(fd uintptr)) {
sysconn, err := tun.tunFile.SyscallConn() sysconn, err := tun.tunFile.SyscallConn()
if err != nil { if err != nil {
tun.errors <- fmt.Errorf("unable to find sysconn for tunfile: %s", err.Error()) tun.errors <- fmt.Errorf("unable to find sysconn for tunfile: %s", err.Error())

View file

@ -31,7 +31,7 @@ type sockaddrCtl struct {
scReserved [5]uint32 scReserved [5]uint32
} }
type nativeTun struct { type NativeTun struct {
name string name string
tunFile *os.File tunFile *os.File
events chan TUNEvent events chan TUNEvent
@ -41,7 +41,7 @@ type nativeTun struct {
var sockaddrCtlSize uintptr = 32 var sockaddrCtlSize uintptr = 32
func (tun *nativeTun) routineRouteListener(tunIfindex int) { func (tun *NativeTun) routineRouteListener(tunIfindex int) {
var ( var (
statusUp bool statusUp bool
statusMTU int statusMTU int
@ -160,7 +160,7 @@ func CreateTUN(name string, mtu int) (TUNDevice, error) {
if err == nil && name == "utun" { if err == nil && name == "utun" {
fname := os.Getenv("WG_TUN_NAME_FILE") fname := os.Getenv("WG_TUN_NAME_FILE")
if fname != "" { if fname != "" {
ioutil.WriteFile(fname, []byte(tun.(*nativeTun).name+"\n"), 0400) ioutil.WriteFile(fname, []byte(tun.(*NativeTun).name+"\n"), 0400)
} }
} }
@ -168,7 +168,7 @@ func CreateTUN(name string, mtu int) (TUNDevice, error) {
} }
func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) { func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
tun := &nativeTun{ tun := &NativeTun{
tunFile: file, tunFile: file,
events: make(chan TUNEvent, 10), events: make(chan TUNEvent, 10),
errors: make(chan error, 1), errors: make(chan error, 1),
@ -209,7 +209,7 @@ func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
return tun, nil return tun, nil
} }
func (tun *nativeTun) Name() (string, error) { func (tun *NativeTun) Name() (string, error) {
var ifName struct { var ifName struct {
name [16]byte name [16]byte
} }
@ -234,15 +234,15 @@ func (tun *nativeTun) Name() (string, error) {
return tun.name, nil return tun.name, nil
} }
func (tun *nativeTun) File() *os.File { func (tun *NativeTun) File() *os.File {
return tun.tunFile return tun.tunFile
} }
func (tun *nativeTun) Events() chan TUNEvent { func (tun *NativeTun) Events() chan TUNEvent {
return tun.events return tun.events
} }
func (tun *nativeTun) Read(buff []byte, offset int) (int, error) { func (tun *NativeTun) Read(buff []byte, offset int) (int, error) {
select { select {
case err := <-tun.errors: case err := <-tun.errors:
return 0, err return 0, err
@ -256,7 +256,7 @@ func (tun *nativeTun) Read(buff []byte, offset int) (int, error) {
} }
} }
func (tun *nativeTun) Write(buff []byte, offset int) (int, error) { func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
// reserve space for header // reserve space for header
@ -279,7 +279,7 @@ func (tun *nativeTun) Write(buff []byte, offset int) (int, error) {
return tun.tunFile.Write(buff) return tun.tunFile.Write(buff)
} }
func (tun *nativeTun) Close() error { func (tun *NativeTun) Close() error {
var err2 error var err2 error
err1 := tun.tunFile.Close() err1 := tun.tunFile.Close()
if tun.routeSocket != -1 { if tun.routeSocket != -1 {
@ -295,7 +295,7 @@ func (tun *nativeTun) Close() error {
return err2 return err2
} }
func (tun *nativeTun) setMTU(n int) error { func (tun *NativeTun) setMTU(n int) error {
// open datagram socket // open datagram socket
@ -332,7 +332,7 @@ func (tun *nativeTun) setMTU(n int) error {
return nil return nil
} }
func (tun *nativeTun) MTU() (int, error) { func (tun *NativeTun) MTU() (int, error) {
// open datagram socket // open datagram socket

View file

@ -48,7 +48,7 @@ type ifstat struct {
Ascii [_IFSTATMAX]byte Ascii [_IFSTATMAX]byte
} }
type nativeTun struct { type NativeTun struct {
name string name string
tunFile *os.File tunFile *os.File
events chan TUNEvent events chan TUNEvent
@ -56,7 +56,7 @@ type nativeTun struct {
routeSocket int routeSocket int
} }
func (tun *nativeTun) routineRouteListener(tunIfindex int) { func (tun *NativeTun) routineRouteListener(tunIfindex int) {
var ( var (
statusUp bool statusUp bool
statusMTU int statusMTU int
@ -240,7 +240,7 @@ func CreateTUN(name string, mtu int) (TUNDevice, error) {
return nil, err return nil, err
} }
tun := nativeTun{tunFile: tunFile} tun := NativeTun{tunFile: tunFile}
var assignedName string var assignedName string
tun.operateOnFd(func(fd uintptr) { tun.operateOnFd(func(fd uintptr) {
assignedName, err = tunName(fd) assignedName, err = tunName(fd)
@ -307,7 +307,7 @@ func CreateTUN(name string, mtu int) (TUNDevice, error) {
func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) { func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
tun := &nativeTun{ tun := &NativeTun{
tunFile: file, tunFile: file,
events: make(chan TUNEvent, 10), events: make(chan TUNEvent, 10),
errors: make(chan error, 1), errors: make(chan error, 1),
@ -348,7 +348,7 @@ func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
return tun, nil return tun, nil
} }
func (tun *nativeTun) Name() (string, error) { func (tun *NativeTun) Name() (string, error) {
var name string var name string
var err error var err error
tun.operateOnFd(func(fd uintptr) { tun.operateOnFd(func(fd uintptr) {
@ -361,15 +361,15 @@ func (tun *nativeTun) Name() (string, error) {
return name, nil return name, nil
} }
func (tun *nativeTun) File() *os.File { func (tun *NativeTun) File() *os.File {
return tun.tunFile return tun.tunFile
} }
func (tun *nativeTun) Events() chan TUNEvent { func (tun *NativeTun) Events() chan TUNEvent {
return tun.events return tun.events
} }
func (tun *nativeTun) Read(buff []byte, offset int) (int, error) { func (tun *NativeTun) Read(buff []byte, offset int) (int, error) {
select { select {
case err := <-tun.errors: case err := <-tun.errors:
return 0, err return 0, err
@ -383,7 +383,7 @@ func (tun *nativeTun) Read(buff []byte, offset int) (int, error) {
} }
} }
func (tun *nativeTun) Write(buff []byte, offset int) (int, error) { func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
// reserve space for header // reserve space for header
@ -406,7 +406,7 @@ func (tun *nativeTun) Write(buff []byte, offset int) (int, error) {
return tun.tunFile.Write(buff) return tun.tunFile.Write(buff)
} }
func (tun *nativeTun) Close() error { func (tun *NativeTun) Close() error {
var err3 error var err3 error
err1 := tun.tunFile.Close() err1 := tun.tunFile.Close()
err2 := tunDestroy(tun.name) err2 := tunDestroy(tun.name)
@ -426,7 +426,7 @@ func (tun *nativeTun) Close() error {
return err3 return err3
} }
func (tun *nativeTun) setMTU(n int) error { func (tun *NativeTun) setMTU(n int) error {
// open datagram socket // open datagram socket
var fd int var fd int
@ -463,7 +463,7 @@ func (tun *nativeTun) setMTU(n int) error {
return nil return nil
} }
func (tun *nativeTun) MTU() (int, error) { func (tun *NativeTun) MTU() (int, error) {
// open datagram socket // open datagram socket
fd, err := unix.Socket( fd, err := unix.Socket(

View file

@ -28,7 +28,7 @@ const (
ifReqSize = unix.IFNAMSIZ + 64 ifReqSize = unix.IFNAMSIZ + 64
) )
type nativeTun struct { type NativeTun struct {
tunFile *os.File tunFile *os.File
fd uintptr fd uintptr
fdCancel *rwcancel.RWCancel fdCancel *rwcancel.RWCancel
@ -43,11 +43,11 @@ type nativeTun struct {
statusListenersShutdown chan struct{} statusListenersShutdown chan struct{}
} }
func (tun *nativeTun) File() *os.File { func (tun *NativeTun) File() *os.File {
return tun.tunFile return tun.tunFile
} }
func (tun *nativeTun) routineHackListener() { func (tun *NativeTun) routineHackListener() {
defer tun.hackListenerClosed.Unlock() defer tun.hackListenerClosed.Unlock()
/* This is needed for the detection to work across network namespaces /* This is needed for the detection to work across network namespaces
* If you are reading this and know a better method, please get in touch. * If you are reading this and know a better method, please get in touch.
@ -87,7 +87,7 @@ func createNetlinkSocket() (int, error) {
return sock, nil return sock, nil
} }
func (tun *nativeTun) routineNetlinkListener() { func (tun *NativeTun) routineNetlinkListener() {
defer func() { defer func() {
unix.Close(tun.netlinkSock) unix.Close(tun.netlinkSock)
tun.hackListenerClosed.Lock() tun.hackListenerClosed.Lock()
@ -157,7 +157,7 @@ func (tun *nativeTun) routineNetlinkListener() {
} }
} }
func (tun *nativeTun) isUp() (bool, error) { func (tun *NativeTun) isUp() (bool, error) {
inter, err := net.InterfaceByName(tun.name) inter, err := net.InterfaceByName(tun.name)
return inter.Flags&net.FlagUp != 0, err return inter.Flags&net.FlagUp != 0, err
} }
@ -190,7 +190,7 @@ func getIFIndex(name string) (int32, error) {
return *(*int32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ])), nil return *(*int32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ])), nil
} }
func (tun *nativeTun) setMTU(n int) error { func (tun *NativeTun) setMTU(n int) error {
// open datagram socket // open datagram socket
fd, err := unix.Socket( fd, err := unix.Socket(
unix.AF_INET, unix.AF_INET,
@ -223,7 +223,7 @@ func (tun *nativeTun) setMTU(n int) error {
return nil return nil
} }
func (tun *nativeTun) MTU() (int, error) { func (tun *NativeTun) MTU() (int, error) {
// open datagram socket // open datagram socket
fd, err := unix.Socket( fd, err := unix.Socket(
unix.AF_INET, unix.AF_INET,
@ -254,7 +254,7 @@ func (tun *nativeTun) MTU() (int, error) {
return int(*(*int32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ]))), nil return int(*(*int32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ]))), nil
} }
func (tun *nativeTun) Name() (string, error) { func (tun *NativeTun) Name() (string, error) {
var ifr [ifReqSize]byte var ifr [ifReqSize]byte
_, _, errno := unix.Syscall( _, _, errno := unix.Syscall(
unix.SYS_IOCTL, unix.SYS_IOCTL,
@ -274,7 +274,7 @@ func (tun *nativeTun) Name() (string, error) {
return tun.name, nil return tun.name, nil
} }
func (tun *nativeTun) Write(buff []byte, offset int) (int, error) { func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
if tun.nopi { if tun.nopi {
buff = buff[offset:] buff = buff[offset:]
@ -302,7 +302,7 @@ func (tun *nativeTun) Write(buff []byte, offset int) (int, error) {
return tun.tunFile.Write(buff) return tun.tunFile.Write(buff)
} }
func (tun *nativeTun) doRead(buff []byte, offset int) (int, error) { func (tun *NativeTun) doRead(buff []byte, offset int) (int, error) {
select { select {
case err := <-tun.errors: case err := <-tun.errors:
return 0, err return 0, err
@ -320,7 +320,7 @@ func (tun *nativeTun) doRead(buff []byte, offset int) (int, error) {
} }
} }
func (tun *nativeTun) Read(buff []byte, offset int) (int, error) { func (tun *NativeTun) Read(buff []byte, offset int) (int, error) {
for { for {
n, err := tun.doRead(buff, offset) n, err := tun.doRead(buff, offset)
if err == nil || !rwcancel.RetryAfterError(err) { if err == nil || !rwcancel.RetryAfterError(err) {
@ -332,11 +332,11 @@ func (tun *nativeTun) Read(buff []byte, offset int) (int, error) {
} }
} }
func (tun *nativeTun) Events() chan TUNEvent { func (tun *NativeTun) Events() chan TUNEvent {
return tun.events return tun.events
} }
func (tun *nativeTun) Close() error { func (tun *NativeTun) Close() error {
var err1 error var err1 error
if tun.statusListenersShutdown != nil { if tun.statusListenersShutdown != nil {
close(tun.statusListenersShutdown) close(tun.statusListenersShutdown)
@ -394,7 +394,7 @@ func CreateTUN(name string, mtu int) (TUNDevice, error) {
} }
func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) { func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
tun := &nativeTun{ tun := &NativeTun{
tunFile: file, tunFile: file,
fd: file.Fd(), fd: file.Fd(),
events: make(chan TUNEvent, 5), events: make(chan TUNEvent, 5),

View file

@ -25,7 +25,7 @@ type ifreq_mtu struct {
const _TUNSIFMODE = 0x8004745d const _TUNSIFMODE = 0x8004745d
type nativeTun struct { type NativeTun struct {
name string name string
tunFile *os.File tunFile *os.File
events chan TUNEvent events chan TUNEvent
@ -33,7 +33,7 @@ type nativeTun struct {
routeSocket int routeSocket int
} }
func (tun *nativeTun) routineRouteListener(tunIfindex int) { func (tun *NativeTun) routineRouteListener(tunIfindex int) {
var ( var (
statusUp bool statusUp bool
statusMTU int statusMTU int
@ -131,7 +131,7 @@ func CreateTUN(name string, mtu int) (TUNDevice, error) {
if err == nil && name == "tun" { if err == nil && name == "tun" {
fname := os.Getenv("WG_TUN_NAME_FILE") fname := os.Getenv("WG_TUN_NAME_FILE")
if fname != "" { if fname != "" {
ioutil.WriteFile(fname, []byte(tun.(*nativeTun).name+"\n"), 0400) ioutil.WriteFile(fname, []byte(tun.(*NativeTun).name+"\n"), 0400)
} }
} }
@ -140,7 +140,7 @@ func CreateTUN(name string, mtu int) (TUNDevice, error) {
func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) { func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
tun := &nativeTun{ tun := &NativeTun{
tunFile: file, tunFile: file,
events: make(chan TUNEvent, 10), events: make(chan TUNEvent, 10),
errors: make(chan error, 1), errors: make(chan error, 1),
@ -181,7 +181,7 @@ func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
return tun, nil return tun, nil
} }
func (tun *nativeTun) Name() (string, error) { func (tun *NativeTun) Name() (string, error) {
gostat, err := tun.tunFile.Stat() gostat, err := tun.tunFile.Stat()
if err != nil { if err != nil {
tun.name = "" tun.name = ""
@ -192,15 +192,15 @@ func (tun *nativeTun) Name() (string, error) {
return tun.name, nil return tun.name, nil
} }
func (tun *nativeTun) File() *os.File { func (tun *NativeTun) File() *os.File {
return tun.tunFile return tun.tunFile
} }
func (tun *nativeTun) Events() chan TUNEvent { func (tun *NativeTun) Events() chan TUNEvent {
return tun.events return tun.events
} }
func (tun *nativeTun) Read(buff []byte, offset int) (int, error) { func (tun *NativeTun) Read(buff []byte, offset int) (int, error) {
select { select {
case err := <-tun.errors: case err := <-tun.errors:
return 0, err return 0, err
@ -214,7 +214,7 @@ func (tun *nativeTun) Read(buff []byte, offset int) (int, error) {
} }
} }
func (tun *nativeTun) Write(buff []byte, offset int) (int, error) { func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
// reserve space for header // reserve space for header
@ -237,7 +237,7 @@ func (tun *nativeTun) Write(buff []byte, offset int) (int, error) {
return tun.tunFile.Write(buff) return tun.tunFile.Write(buff)
} }
func (tun *nativeTun) Close() error { func (tun *NativeTun) Close() error {
var err2 error var err2 error
err1 := tun.tunFile.Close() err1 := tun.tunFile.Close()
if tun.routeSocket != -1 { if tun.routeSocket != -1 {
@ -253,7 +253,7 @@ func (tun *nativeTun) Close() error {
return err2 return err2
} }
func (tun *nativeTun) setMTU(n int) error { func (tun *NativeTun) setMTU(n int) error {
// open datagram socket // open datagram socket
var fd int var fd int
@ -290,7 +290,7 @@ func (tun *nativeTun) setMTU(n int) error {
return nil return nil
} }
func (tun *nativeTun) MTU() (int, error) { func (tun *NativeTun) MTU() (int, error) {
// open datagram socket // open datagram socket
fd, err := unix.Socket( fd, err := unix.Socket(

View file

@ -34,7 +34,7 @@ type exchgBufWrite struct {
packetNum uint32 packetNum uint32
} }
type nativeTun struct { type NativeTun struct {
wt *wintun.Wintun wt *wintun.Wintun
tunName string tunName string
signalName *uint16 signalName *uint16
@ -88,7 +88,7 @@ func CreateTUN(ifname string) (TUNDevice, error) {
} }
// Create instance. // Create instance.
tun := &nativeTun{ tun := &NativeTun{
wt: wt, wt: wt,
tunName: wt.DataFileName(), tunName: wt.DataFileName(),
signalName: signalNameUTF16, signalName: signalNameUTF16,
@ -108,7 +108,7 @@ func CreateTUN(ifname string) (TUNDevice, error) {
return tun, nil return tun, nil
} }
func (tun *nativeTun) openTUN() error { func (tun *NativeTun) openTUN() error {
for { for {
// Open interface data pipe. // Open interface data pipe.
// Data pipe must be opened first, as the interface data available event is created when somebody actually connects to the data pipe. // Data pipe must be opened first, as the interface data available event is created when somebody actually connects to the data pipe.
@ -140,7 +140,7 @@ func (tun *nativeTun) openTUN() error {
} }
} }
func (tun *nativeTun) closeTUN() (err error) { func (tun *NativeTun) closeTUN() (err error) {
tun.tunLock.Lock() tun.tunLock.Lock()
defer tun.tunLock.Unlock() defer tun.tunLock.Unlock()
@ -167,7 +167,7 @@ func (tun *nativeTun) closeTUN() (err error) {
return return
} }
func (tun *nativeTun) getTUN() (*os.File, windows.Handle, error) { func (tun *NativeTun) getTUN() (*os.File, windows.Handle, error) {
tun.tunLock.Lock() tun.tunLock.Lock()
defer tun.tunLock.Unlock() defer tun.tunLock.Unlock()
@ -182,19 +182,19 @@ func (tun *nativeTun) getTUN() (*os.File, windows.Handle, error) {
return tun.tunFile, tun.tunDataAvail, nil return tun.tunFile, tun.tunDataAvail, nil
} }
func (tun *nativeTun) Name() (string, error) { func (tun *NativeTun) Name() (string, error) {
return tun.wt.GetInterfaceName() return tun.wt.GetInterfaceName()
} }
func (tun *nativeTun) File() *os.File { func (tun *NativeTun) File() *os.File {
return nil return nil
} }
func (tun *nativeTun) Events() chan TUNEvent { func (tun *NativeTun) Events() chan TUNEvent {
return tun.events return tun.events
} }
func (tun *nativeTun) Close() error { func (tun *NativeTun) Close() error {
windows.SetEvent(tun.userClose) windows.SetEvent(tun.userClose)
err := windows.CloseHandle(tun.userClose) err := windows.CloseHandle(tun.userClose)
@ -215,11 +215,11 @@ func (tun *nativeTun) Close() error {
return err return err
} }
func (tun *nativeTun) MTU() (int, error) { func (tun *NativeTun) MTU() (int, error) {
return 1500, nil return 1500, nil
} }
func (tun *nativeTun) Read(buff []byte, offset int) (int, error) { func (tun *NativeTun) Read(buff []byte, offset int) (int, error) {
select { select {
case err := <-tun.errors: case err := <-tun.errors:
return 0, err return 0, err
@ -292,7 +292,7 @@ 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. // 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 {
// Get TUN data pipe. // Get TUN data pipe.
file, _, err := tun.getTUN() file, _, err := tun.getTUN()
if err != nil { if err != nil {
@ -312,7 +312,7 @@ func (tun *nativeTun) flush() error {
return nil return nil
} }
func (tun *nativeTun) putTunPacket(buff []byte) error { func (tun *NativeTun) putTunPacket(buff []byte) error {
size := uint32(len(buff)) size := uint32(len(buff))
if size == 0 { if size == 0 {
return errors.New("Empty packet") return errors.New("Empty packet")
@ -341,7 +341,7 @@ func (tun *nativeTun) putTunPacket(buff []byte) error {
return nil return nil
} }
func (tun *nativeTun) Write(buff []byte, offset int) (int, error) { func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
err := tun.putTunPacket(buff[offset:]) err := tun.putTunPacket(buff[offset:])
if err != nil { if err != nil {
return 0, err return 0, err