mirror of
https://github.com/yggdrasil-network/water.git
synced 2025-05-20 00:45:09 +03:00
87 lines
2.4 KiB
Go
87 lines
2.4 KiB
Go
package water
|
|
|
|
import "io"
|
|
|
|
// Interface is a TUN/TAP interface.
|
|
type Interface struct {
|
|
isTAP bool
|
|
io.ReadWriteCloser
|
|
name string
|
|
}
|
|
|
|
// DeviceType is the type for specifying device types.
|
|
type DeviceType int
|
|
|
|
// TUN and TAP device types.
|
|
const (
|
|
_ = iota
|
|
TUN
|
|
TAP
|
|
)
|
|
|
|
// Config defines parameters required to create a TUN/TAP interface. It's only
|
|
// used when the device is initialized. A zero-value Config is a valid
|
|
// configuration.
|
|
type Config struct {
|
|
// DeviceType specifies whether the device is a TUN or TAP interface. A
|
|
// zero-value is treated as TUN.
|
|
DeviceType DeviceType
|
|
|
|
// PlatformSpecificParams defines parameters that differ on different
|
|
// platforms. See comments for the type for more details.
|
|
PlatformSpecificParams
|
|
}
|
|
|
|
func defaultConfig() Config {
|
|
return Config{
|
|
DeviceType: TUN,
|
|
PlatformSpecificParams: defaultPlatformSpecificParams(),
|
|
}
|
|
}
|
|
|
|
var zeroConfig Config
|
|
|
|
// New creates a new TUN/TAP interface using config.
|
|
func New(config Config) (ifce *Interface, err error) {
|
|
if zeroConfig == config {
|
|
config = defaultConfig()
|
|
}
|
|
return newDev(config)
|
|
}
|
|
|
|
// NewTAP creates a new TAP interface whose name is ifName. If ifName is empty, a
|
|
// default name (tap0, tap1, ... ) will be assigned. ifName should not exceed
|
|
// 16 bytes. TAP interfaces are not supported on darwin.
|
|
// ifName cannot be specified on windows, you will need ifce.Name() to use some cmds.
|
|
//
|
|
// Note: this function is deprecated and will be removed from the library.
|
|
// Please use New() instead.
|
|
func NewTAP(ifName string) (ifce *Interface, err error) {
|
|
return newTAP(ifName)
|
|
}
|
|
|
|
// NewTUN creates a new TUN interface whose name is ifName. If ifName is empty, a
|
|
// default name (tap0, tap1, ... ) will be assigned. ifName should not exceed
|
|
// ifName cannot be specified on windows, you will need ifce.Name() to use some cmds.
|
|
//
|
|
// Note: this function is deprecated and will be removed from the library.
|
|
// Please use New() instead.
|
|
// 16 bytes. Setting interface name is NOT supported on darwin.
|
|
func NewTUN(ifName string) (ifce *Interface, err error) {
|
|
return newTUN(ifName)
|
|
}
|
|
|
|
// IsTUN returns true if ifce is a TUN interface.
|
|
func (ifce *Interface) IsTUN() bool {
|
|
return !ifce.isTAP
|
|
}
|
|
|
|
// IsTAP returns true if ifce is a TAP interface.
|
|
func (ifce *Interface) IsTAP() bool {
|
|
return ifce.isTAP
|
|
}
|
|
|
|
// Name returns the interface name of ifce, e.g. tun0, tap1, tun0, etc..
|
|
func (ifce *Interface) Name() string {
|
|
return ifce.name
|
|
}
|