make edge restore original metric value (-x) at program's end (#742)

This commit is contained in:
Logan oos Even 2021-08-01 09:40:12 +02:00 committed by GitHub
parent e09f3a4875
commit 6a831879d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 46 additions and 8 deletions

View File

@ -21,14 +21,19 @@
#include <inttypes.h>
#endif /* #if defined(__MINGW32__) */
#include <winsock2.h>
#include <windows.h>
#include <winioctl.h>
#include <iptypes.h>
#include <ws2def.h>
#include <ws2ipdef.h>
#if defined(_MSC_VER)
#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib")
#endif
#include <netioapi.h>
#include <winioctl.h>
#include <iptypes.h>
#include "wintap.h"
@ -81,6 +86,7 @@ typedef struct tuntap_dev {
uint32_t device_mask;
unsigned int mtu;
unsigned int metric;
unsigned int metric_original;
} tuntap_dev;

View File

@ -339,16 +339,27 @@ int open_wintap(struct tuntap_dev *device,
/* metric */
PMIB_IPINTERFACE_ROW Row;
if(metric) { /* try to change only if a value has been given, otherwise leave with default or as set before */
// find & store original metric
Row = calloc(1, sizeof(MIB_IPINTERFACE_ROW));
InitializeIpInterfaceEntry(Row);
Row->InterfaceIndex = device->if_idx;
Row->Family = AF_INET;
GetIpInterfaceEntry(Row);
device->metric_original = Row->Metric;
device->metric = metric;
_snprintf(cmd, sizeof(cmd),
"netsh interface ipv4 set interface \"%s\" metric=%d > nul",
device->ifName, device->metric);
// set new value
Row->Metric = metric;
if(system(cmd) != 0)
printf("WARNING: Unable to set device %s parameters metric=%d [%s]\n",
device->ifName, device->metric, cmd);
// store
Row->SitePrefixLength = 0; /* if not set to zero, following function call fails... */
SetIpInterfaceEntry(Row);
free(Row);
}
/* ****************** */
@ -443,6 +454,27 @@ int tuntap_open(struct tuntap_dev *device,
/* ************************************************ */
void tuntap_close(struct tuntap_dev *tuntap) {
PMIB_IPINTERFACE_ROW Row;
if(tuntap->metric) { /* only required if a value has been given (and thus stored) */
// find device entry
Row = calloc(1, sizeof(MIB_IPINTERFACE_ROW));
InitializeIpInterfaceEntry(Row);
Row->InterfaceIndex = tuntap->if_idx;
Row->Family = AF_INET;
GetIpInterfaceEntry(Row);
// restore original value
Row->Metric = tuntap->metric_original;
// store
Row->SitePrefixLength = 0; /* if not set to zero, following function call fails... */
SetIpInterfaceEntry(Row);
free(Row);
}
CloseHandle(tuntap->device_handle);
}