tun: windows: Make adapter rename asynchronous
Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
parent
41c30a7279
commit
2faf2dcf90
|
@ -75,11 +75,18 @@ func CreateTUN(ifname string) (TUNDevice, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = wt.SetInterfaceName(ifname)
|
go func() {
|
||||||
if err != nil {
|
retries := retryTimeout * retryRate
|
||||||
wt.DeleteInterface(0)
|
for {
|
||||||
return nil, errors.New("Setting interface name failed: " + err.Error())
|
err := wt.SetInterfaceName(ifname)
|
||||||
}
|
if err != nil && retries > 0 {
|
||||||
|
time.Sleep(time.Second / retryRate)
|
||||||
|
retries--
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
err = wt.FlushInterface()
|
err = wt.FlushInterface()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -297,62 +297,8 @@ func CreateInterface(description string, hwndParent uintptr) (*Wintun, bool, err
|
||||||
// Get network interface. DIF_INSTALLDEVICE returns almost immediately, while the device
|
// Get network interface. DIF_INSTALLDEVICE returns almost immediately, while the device
|
||||||
// installation continues in the background. It might take a while, before all registry
|
// installation continues in the background. It might take a while, before all registry
|
||||||
// keys and values are populated.
|
// keys and values are populated.
|
||||||
getInterface := func() (*Wintun, error) {
|
|
||||||
// Open HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\<class>\<id> registry key.
|
|
||||||
keyDev, err := devInfoList.OpenDevRegKey(deviceData, setupapi.DICS_FLAG_GLOBAL, 0, setupapi.DIREG_DRV, registry.READ)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("Device-specific registry key open failed: " + err.Error())
|
|
||||||
}
|
|
||||||
defer keyDev.Close()
|
|
||||||
|
|
||||||
// Read the NetCfgInstanceId value.
|
|
||||||
value, err := getRegStringValue(keyDev, "NetCfgInstanceId")
|
|
||||||
if err != nil {
|
|
||||||
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_FILE_NOT_FOUND {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.New("RegQueryStringValue(\"NetCfgInstanceId\") failed: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert to windows.GUID.
|
|
||||||
ifid, err := guid.FromString(value)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("NetCfgInstanceId registry value is not a GUID (expected: \"{...}\", provided: %q)", value)
|
|
||||||
}
|
|
||||||
|
|
||||||
wintun := &Wintun{CfgInstanceID: *ifid}
|
|
||||||
keyNetName := wintun.GetNetRegKeyName()
|
|
||||||
keyNet, err := registry.OpenKey(registry.LOCAL_MACHINE, keyNetName, registry.QUERY_VALUE)
|
|
||||||
if err != nil {
|
|
||||||
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_FILE_NOT_FOUND {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.New(fmt.Sprintf("RegOpenKeyEx(%q) failed: ", keyNetName) + err.Error())
|
|
||||||
}
|
|
||||||
defer keyNet.Close()
|
|
||||||
|
|
||||||
// Query the interface name.
|
|
||||||
_, valueType, err := keyNet.GetValue("Name", nil)
|
|
||||||
if err != nil {
|
|
||||||
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_FILE_NOT_FOUND {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.New("RegQueryValueEx(\"Name\") failed: " + err.Error())
|
|
||||||
}
|
|
||||||
switch valueType {
|
|
||||||
case registry.SZ, registry.EXPAND_SZ:
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("Interface name registry value is not REG_SZ or REG_EXPAND_SZ (expected: %v or %v, provided: %v)", registry.SZ, registry.EXPAND_SZ, valueType)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TUN interface is ready. (As much as we need it.)
|
|
||||||
return wintun, nil
|
|
||||||
}
|
|
||||||
for numAttempts := 0; numAttempts < 30; numAttempts++ {
|
for numAttempts := 0; numAttempts < 30; numAttempts++ {
|
||||||
wintun, err = getInterface()
|
wintun, err = MakeWintun(devInfoList, deviceData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_FILE_NOT_FOUND {
|
if errWin, ok := err.(syscall.Errno); ok && errWin == windows.ERROR_FILE_NOT_FOUND {
|
||||||
// Wait and retry. TODO: Wait for a cancellable event instead.
|
// Wait and retry. TODO: Wait for a cancellable event instead.
|
||||||
|
|
Loading…
Reference in a new issue