diff --git a/if.go b/if.go index 21f1d4c..d841023 100644 --- a/if.go +++ b/if.go @@ -9,15 +9,61 @@ type Interface struct { 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. +// +// 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 +// +// 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) diff --git a/if_unix.go b/if_unix.go new file mode 100644 index 0000000..f2de759 --- /dev/null +++ b/if_unix.go @@ -0,0 +1,16 @@ +// +build linux darwin + +package water + +import "errors" + +func newDev(config Config) (ifce *Interface, err error) { + switch config.DeviceType { + case TUN: + return newTUN(config.Name) + case TAP: + return newTAP(config.Name) + default: + return nil, errors.New("unknown device type") + } +} diff --git a/params_others.go b/params_others.go new file mode 100644 index 0000000..c5c4f6e --- /dev/null +++ b/params_others.go @@ -0,0 +1,11 @@ +// +build !linux,!darwin,!windows + +package water + +// PlatformSpeficParams +type PlatformSpecificParams struct { +} + +func defaultPlatformSpecificParams() PlatformSpecificParams { + return PlatformSpecificParams{} +} diff --git a/params_unix.go b/params_unix.go new file mode 100644 index 0000000..4a926c7 --- /dev/null +++ b/params_unix.go @@ -0,0 +1,18 @@ +// +build linux darwin + +package water + +// PlatformSpecificParams defines parameters in Config that are specific to +// Linux and macOS. A zero-value of such type is valid, yielding an interface +// with OS defined name. +type PlatformSpecificParams struct { + // Name is the name to be set for the interface to be created. This overrides + // the default name assigned by OS such as tap0 or tun0. A zero-value of this + // field, i.e. an emapty string, indicates that the default name should be + // used. + Name string +} + +func defaultPlatformSpecificParams() PlatformSpecificParams { + return PlatformSpecificParams{} +} diff --git a/params_windows.go b/params_windows.go new file mode 100644 index 0000000..2287c85 --- /dev/null +++ b/params_windows.go @@ -0,0 +1,18 @@ +package water + +// PlatformSpecificParams defines parameters in Config that are specific to +// Windows. A zero-value of such type is valid. +type PlatformSpecificParams struct { + // ComponentID associates with the virtual adapter that exists in Windows. + // This is usually configured when driver for the adapter is installed. A + // zero-value of this field, i.e., an empty string, causes the interface to + // use the default ComponentId. The default ComponentId is set to tap0901, + // the one used by OpenVPN. + ComponentID string +} + +func defaultPlatformSpecificParams() PlatformSpecificParams { + return PlatformSpecificParams{ + ComponentId: "tap0901", + } +}