Make DeviceStandby control network interface link status on Windows.
[tinc] / src / mingw / device.c
index 85c0c7b..a765ce3 100644 (file)
@@ -94,7 +94,6 @@ static bool setup_device(void) {
        char adaptername[1024];
        char tapname[1024];
        DWORD len;
-       unsigned long status;
 
        bool found = false;
 
@@ -200,11 +199,6 @@ static bool setup_device(void) {
                return false;
        }
 
-       /* Set media status for newer TAP-Win32 devices */
-
-       status = true;
-       DeviceIoControl(device_handle, TAP_IOCTL_SET_MEDIA_STATUS, &status, sizeof status, &status, sizeof status, &len, NULL);
-
        device_info = "Windows tap device";
 
        logger(DEBUG_ALWAYS, LOG_INFO, "%s (%s) is a %s", device, iface, device_info);
@@ -212,6 +206,20 @@ static bool setup_device(void) {
        return true;
 }
 
+static void enable_device(void) {
+       logger(DEBUG_ALWAYS, LOG_INFO, "Enabling %s", device_info);
+       ULONG status = 1;
+       DWORD len;
+       DeviceIoControl(device_handle, TAP_IOCTL_SET_MEDIA_STATUS, &status, sizeof status, &status, sizeof status, &len, NULL);
+}
+
+static void disable_device(void) {
+       logger(DEBUG_ALWAYS, LOG_INFO, "Disabling %s", device_info);
+       ULONG status = 0;
+       DWORD len;
+       DeviceIoControl(device_handle, TAP_IOCTL_SET_MEDIA_STATUS, &status, sizeof status, &status, sizeof status, &len, NULL);
+}
+
 static void close_device(void) {
        CloseHandle(device_handle); device_handle = INVALID_HANDLE_VALUE;
 
@@ -246,4 +254,6 @@ const devops_t os_devops = {
        .close = close_device,
        .read = read_packet,
        .write = write_packet,
+       .enable = enable_device,
+       .disable = disable_device,
 };