소스 검색

add new interface for init configuration (#15)

Song Gao 8 년 전
부모
커밋
37d6645a51
5개의 변경된 파일109개의 추가작업 그리고 0개의 파일을 삭제
  1. 46 0
      if.go
  2. 16 0
      if_unix.go
  3. 11 0
      params_others.go
  4. 18 0
      params_unix.go
  5. 18 0
      params_windows.go

+ 46 - 0
if.go

@@ -9,15 +9,61 @@ type Interface struct {
 	name string
 	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
 // 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
 // default name (tap0, tap1, ... ) will be assigned. ifName should not exceed
 // 16 bytes. TAP interfaces are not supported on darwin.
 // 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) {
 func NewTAP(ifName string) (ifce *Interface, err error) {
 	return newTAP(ifName)
 	return newTAP(ifName)
 }
 }
 
 
 // NewTUN creates a new TUN interface whose name is ifName. If ifName is empty, a
 // 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
 // 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.
 // 16 bytes. Setting interface name is NOT supported on darwin.
 func NewTUN(ifName string) (ifce *Interface, err error) {
 func NewTUN(ifName string) (ifce *Interface, err error) {
 	return newTUN(ifName)
 	return newTUN(ifName)

+ 16 - 0
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")
+	}
+}

+ 11 - 0
params_others.go

@@ -0,0 +1,11 @@
+// +build !linux,!darwin,!windows
+
+package water
+
+// PlatformSpeficParams
+type PlatformSpecificParams struct {
+}
+
+func defaultPlatformSpecificParams() PlatformSpecificParams {
+	return PlatformSpecificParams{}
+}

+ 18 - 0
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{}
+}

+ 18 - 0
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",
+	}
+}