diff options
author | Adam Ierymenko <adam.ierymenko@zerotier.com> | 2015-07-06 17:58:04 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@zerotier.com> | 2015-07-06 17:58:04 -0700 |
commit | 56285ec0d47191f61f7b551747203b6e8f933a36 (patch) | |
tree | 673a49827bcb6336892a3a319fe9c3b19a68972b /osdep | |
parent | 25a067c8c3a4987c3366c3f9e8b4d9f5743db71c (diff) | |
download | infinitytier-56285ec0d47191f61f7b551747203b6e8f933a36.tar.gz infinitytier-56285ec0d47191f61f7b551747203b6e8f933a36.zip |
Another attempt at a fix for all the Windows driver coma issues.
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/WindowsEthernetTap.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/osdep/WindowsEthernetTap.cpp b/osdep/WindowsEthernetTap.cpp index d477f2e3..b2d3ed8b 100644 --- a/osdep/WindowsEthernetTap.cpp +++ b/osdep/WindowsEthernetTap.cpp @@ -692,17 +692,20 @@ void WindowsEthernetTap::threadMain() ULONGLONG tc = GetTickCount64(); if ((tc - timeOfLastBorkCheck) >= 2500) { timeOfLastBorkCheck = tc; - MIB_IF_TABLE2 *ift = NULL; - if ((GetIfTable2(&ift) == NO_ERROR)&&(ift)) { + char aabuf[16384]; + ULONG aalen = sizeof(aabuf); + if (GetAdaptersAddresses(AF_UNSPEC,GAA_FLAG_SKIP_UNICAST|GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST|GAA_FLAG_SKIP_DNS_SERVER|GAA_FLAG_SKIP_FRIENDLY_NAME,(void *)0,reinterpret_cast<PIP_ADAPTER_ADDRESSES>(aabuf),&aalen) == NO_ERROR) { bool isBorked = false; - for(ULONG r=0;r<ift->NumEntries;++r) { - if (ift->Table[r].InterfaceLuid.Value == _deviceLuid.Value) { - if ((ift->Table[r].InterfaceAndOperStatusFlags.NotMediaConnected)||(ift->Table[r].MediaConnectState == MediaConnectStateDisconnected)) - isBorked = true; + + PIP_ADAPTER_ADDRESSES aa = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(aabuf); + while (aa) { + if (_deviceLuid.Value == aa->Luid.Value) { + isBorked = (aa->OperStatus != IfOperStatusUp); break; } + aa = aa->Next; } - FreeMibTable(ift); + if (isBorked) { // Close and reopen tap device if there's an issue (outer loop) break; |