mirror of
https://github.com/yggdrasil-network/water.git
synced 2025-05-19 16:35:10 +03:00
47 lines
998 B
Go
47 lines
998 B
Go
// +build openbsd freebsd netbsd
|
|
|
|
package water
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
)
|
|
|
|
func openDev(config Config) (ifce *Interface, err error) {
|
|
switch config.Name[:8] {
|
|
case "/dev/tap":
|
|
return newTAP(config)
|
|
case "/dev/tun":
|
|
return newTUN(config)
|
|
default:
|
|
return nil, errors.New("unrecognized driver")
|
|
}
|
|
}
|
|
|
|
func newTAP(config Config) (ifce *Interface, err error) {
|
|
if config.Name[:8] != "/dev/tap" {
|
|
panic("TUN/TAP name must be in format /dev/tunX or /dev/tapX")
|
|
}
|
|
|
|
file, err := os.OpenFile(config.Name, os.O_RDWR, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ifce = &Interface{isTAP: true, ReadWriteCloser: file, name: config.Name[5:]}
|
|
return
|
|
}
|
|
|
|
func newTUN(config Config) (ifce *Interface, err error) {
|
|
if config.Name[:8] != "/dev/tun" {
|
|
panic("TUN/TAP name must be in format /dev/tunX or /dev/tapX")
|
|
}
|
|
|
|
file, err := os.OpenFile(config.Name, os.O_RDWR, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ifce = &Interface{isTAP: false, ReadWriteCloser: file, name: config.Name[5:]}
|
|
return
|
|
}
|