wintun: revise GetInterface()

- Make foreign interface found error numeric to ease condition
  detection.
- Update GetInterface() documentation.
- Make tun.CreateTUN() quit when foreign interface found before
  attempting to create a Wintun interface with a duplicate name.
  Creation is futile.

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2019-05-24 09:28:50 +02:00
parent 8fdcf5ee30
commit 6a0a3a5406
2 changed files with 6 additions and 3 deletions

View File

@ -71,6 +71,8 @@ func CreateTUN(ifname string) (TUNDevice, error) {
if err != nil { if err != nil {
return nil, fmt.Errorf("Unable to delete already existing Wintun interface: %v", err) return nil, fmt.Errorf("Unable to delete already existing Wintun interface: %v", err)
} }
} else if err == windows.ERROR_ALREADY_EXISTS {
return nil, fmt.Errorf("Foreign network interface with the same name exists")
} }
wt, _, err = wintun.CreateInterface("WireGuard Tunnel Adapter", 0) wt, _, err = wintun.CreateInterface("WireGuard Tunnel Adapter", 0)
if err != nil { if err != nil {

View File

@ -89,8 +89,9 @@ func makeWintun(deviceInfoSet setupapi.DevInfo, deviceInfoData *setupapi.DevInfo
// optional and can be 0. If a specific top-level window is not required, set // optional and can be 0. If a specific top-level window is not required, set
// hwndParent to 0. // hwndParent to 0.
// //
// Function returns interface if found, or nil otherwise. If the interface is // Function returns interface if found, or windows.ERROR_OBJECT_NOT_FOUND
// found but not Wintun-class, the function returns interface and an error. // otherwise. If the interface is found but not Wintun-class, the function
// returns windows.ERROR_ALREADY_EXISTS.
// //
func GetInterface(ifname string, hwndParent uintptr) (*Wintun, error) { func GetInterface(ifname string, hwndParent uintptr) (*Wintun, error) {
// Create a list of network devices. // Create a list of network devices.
@ -164,7 +165,7 @@ func GetInterface(ifname string, hwndParent uintptr) (*Wintun, error) {
} }
// This interface is not using Wintun driver. // This interface is not using Wintun driver.
return nil, errors.New("Foreign network interface with the same name exists") return nil, windows.ERROR_ALREADY_EXISTS
} }
} }