]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
wintun: upgrade deleting all interfaces and make it reusable
authorSimon Rozman <simon@rozman.si>
Wed, 28 Aug 2019 09:39:01 +0000 (11:39 +0200)
committerSimon Rozman <simon@rozman.si>
Wed, 28 Aug 2019 09:39:01 +0000 (11:39 +0200)
DeleteAllInterfaces() didn't check if SPDRP_DEVICEDESC == "WireGuard
Tunnel". It deleted _all_ Wintun adapters, not just WireGuard's.

Furthermore, the DeleteAllInterfaces() was upgraded into a new function
called DeleteMatchingInterfaces() for selectively deletion. This will
be used by WireGuard to clean stale Wintun adapters.

Signed-off-by: Simon Rozman <simon@rozman.si>
tun/wintun/wintun_windows.go

index 3566a76a868d00171ed08cc20373b5cc20429f52..72864350297c6878af5fe20e453b737dee20d2ee 100644 (file)
@@ -426,10 +426,10 @@ func (wintun *Wintun) DeleteInterface() (rebootRequired bool, err error) {
        return checkReboot(devInfoList, deviceData), nil
 }
 
-// DeleteAllInterfaces deletes all Wintun interfaces, and returns which
-// ones it deleted, whether a reboot is required after, and which errors
-// occurred during the process.
-func DeleteAllInterfaces() (deviceInstancesDeleted []uint32, rebootRequired bool, errors []error) {
+// DeleteMatchingInterfaces deletes all Wintun interfaces, which match
+// given criteria, and returns which ones it deleted, whether a reboot
+// is required after, and which errors occurred during the process.
+func DeleteMatchingInterfaces(matches func(wintun *Wintun) bool) (deviceInstancesDeleted []uint32, rebootRequired bool, errors []error) {
        devInfoList, err := setupapi.SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, setupapi.DIGCF_PRESENT, setupapi.DevInfo(0), "")
        if err != nil {
                return nil, false, []error{fmt.Errorf("SetupDiGetClassDevsEx(%v) failed: %v", deviceClassNetGUID, err.Error())}
@@ -472,6 +472,22 @@ func DeleteAllInterfaces() (deviceInstancesDeleted []uint32, rebootRequired bool
                if !isWintun {
                        continue
                }
+               deviceDescVal, err := devInfoList.DeviceRegistryProperty(deviceData, setupapi.SPDRP_DEVICEDESC)
+               if err != nil {
+                       errors = append(errors, fmt.Errorf("DeviceRegistryPropertyString(SPDRP_DEVICEDESC) failed: %v", err))
+                       continue
+               }
+               if deviceDesc, ok := deviceDescVal.(string); !ok || deviceDesc != deviceTypeName {
+                       continue
+               }
+               wintun, err := makeWintun(devInfoList, deviceData)
+               if err != nil {
+                       errors = append(errors, fmt.Errorf("makeWintun failed: %v", err))
+                       continue
+               }
+               if !matches(wintun) {
+                       continue
+               }
 
                err = setQuietInstall(devInfoList, deviceData)
                if err != nil {
@@ -500,6 +516,15 @@ func DeleteAllInterfaces() (deviceInstancesDeleted []uint32, rebootRequired bool
        return
 }
 
+// DeleteAllInterfaces deletes all Wintun interfaces, and returns which
+// ones it deleted, whether a reboot is required after, and which errors
+// occurred during the process.
+func DeleteAllInterfaces() (deviceInstancesDeleted []uint32, rebootRequired bool, errors []error) {
+       return DeleteMatchingInterfaces(func(wintun *Wintun) bool {
+               return true
+       })
+}
+
 // checkReboot checks device install parameters if a system reboot is required.
 func checkReboot(deviceInfoSet setupapi.DevInfo, deviceInfoData *setupapi.DevInfoData) bool {
        devInstallParams, err := deviceInfoSet.DeviceInstallParams(deviceInfoData)