Use GetAdaptersAddresses instead of GetAdaptersInfo
squash squash
This commit is contained in:
parent
0aeb15ed69
commit
354ad123cc
1 changed files with 28 additions and 18 deletions
46
ethsock.c
46
ethsock.c
|
@ -353,7 +353,7 @@ out:
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool intf_get_info(const char *intf, uint8_t *hwaddr, bool *bridge)
|
static bool intf_get_hwaddr_and_bridge(const char *intf, uint8_t *hwaddr, bool *bridge)
|
||||||
{
|
{
|
||||||
struct ifaddrs *ifas, *ifa;
|
struct ifaddrs *ifas, *ifa;
|
||||||
bool found;
|
bool found;
|
||||||
|
@ -424,37 +424,45 @@ static bool intf_get_if_row(NET_IFINDEX index, MIB_IF_ROW2* row)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool intf_get_info(const char *intf, uint8_t *hwaddr, DWORD *index)
|
static bool intf_get_hwaddr_and_index(const char *intf, uint8_t *hwaddr, DWORD *index)
|
||||||
{
|
{
|
||||||
PIP_ADAPTER_INFO adapters, adapter;
|
PIP_ADAPTER_ADDRESSES adapters, adapter;
|
||||||
DWORD ret;
|
ULONG ret, flags, bufLen;
|
||||||
ULONG bufLen = 0;
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
if ((ret = GetAdaptersInfo(NULL, &bufLen)) != ERROR_BUFFER_OVERFLOW) {
|
flags = GAA_FLAG_INCLUDE_ALL_INTERFACES;
|
||||||
win_perror2("GetAdaptersInfo", ret);
|
bufLen = 0;
|
||||||
|
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, NULL, &bufLen);
|
||||||
|
if (ret != ERROR_BUFFER_OVERFLOW) {
|
||||||
|
win_perror2("GetAdaptersAddresses", ret);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bufLen *= 2;
|
||||||
|
|
||||||
adapters = malloc(bufLen);
|
adapters = malloc(bufLen);
|
||||||
if (!adapters) {
|
if (!adapters) {
|
||||||
xperror("malloc");
|
xperror("malloc");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = GetAdaptersInfo(adapters, &bufLen) == NO_ERROR)) {
|
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapters, &bufLen);
|
||||||
|
if (ret == NO_ERROR) {
|
||||||
for (adapter = adapters; adapter; adapter = adapter->Next) {
|
for (adapter = adapters; adapter; adapter = adapter->Next) {
|
||||||
if (adapter->Type != MIB_IF_TYPE_ETHERNET && adapter->Type != IF_TYPE_IEEE80211) {
|
if (verbosity > 2) {
|
||||||
|
printf(" %s: Type=%lu, Name=%ls\n", adapter->AdapterName, adapter->IfType, adapter->FriendlyName);
|
||||||
|
}
|
||||||
|
if (adapter->IfType != IF_TYPE_ETHERNET_CSMACD && adapter->IfType != IF_TYPE_IEEE80211) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Interface names from WinPcap are "\Device\NPF_{GUID}", while
|
/* Interface names from WinPcap are "\Device\NPF_{GUID}", while
|
||||||
* AdapterName from GetAdaptersInfo is just "{GUID}".*/
|
* AdapterName from GetAdaptersAddresses is just "{GUID}".*/
|
||||||
if (strstr(intf, adapter->AdapterName)) {
|
if (strstr(intf, adapter->AdapterName)) {
|
||||||
if (adapter->AddressLength == 6) {
|
if (adapter->PhysicalAddressLength == 6) {
|
||||||
memcpy(hwaddr, adapter->Address, 6);
|
memcpy(hwaddr, adapter->PhysicalAddress, 6);
|
||||||
if (index) {
|
if (index) {
|
||||||
*index = adapter->Index;
|
*index = adapter->IfIndex;
|
||||||
}
|
}
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
|
@ -462,7 +470,7 @@ static bool intf_get_info(const char *intf, uint8_t *hwaddr, DWORD *index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
win_perror2("GetAdaptersInfo", ret);
|
win_perror2("GetAdaptersAddresses", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(adapters);
|
free(adapters);
|
||||||
|
@ -672,9 +680,9 @@ struct ethsock *ethsock_create(const char *intf, uint16_t protocol)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NMRPFLASH_WINDOWS
|
#ifndef NMRPFLASH_WINDOWS
|
||||||
err = !intf_get_info(intf, sock->hwaddr, &is_bridge);
|
err = !intf_get_hwaddr_and_bridge(intf, sock->hwaddr, &is_bridge);
|
||||||
#else
|
#else
|
||||||
err = !intf_get_info(intf, sock->hwaddr, &sock->index);
|
err = !intf_get_hwaddr_and_index(intf, sock->hwaddr, &sock->index);
|
||||||
#endif
|
#endif
|
||||||
if (err) {
|
if (err) {
|
||||||
fprintf(stderr, "Failed to get interface info.\n");
|
fprintf(stderr, "Failed to get interface info.\n");
|
||||||
|
@ -949,9 +957,11 @@ static bool get_hwaddr_from_pcap(const pcap_if_t *dev, uint8_t *hwaddr)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return intf_get_info(dev->name, hwaddr, NULL);
|
return intf_get_hwaddr_and_bridge(dev->name, hwaddr, NULL);
|
||||||
|
#else
|
||||||
|
return intf_get_hwaddr_and_index(dev->name, hwaddr, NULL);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int ethsock_list_all(void)
|
int ethsock_list_all(void)
|
||||||
|
|
Loading…
Add table
Reference in a new issue