Skip to content

Commit e55789a

Browse files
committed
Return IPv6 addresses when scanning
1 parent d42f1f7 commit e55789a

File tree

2 files changed

+61
-18
lines changed

2 files changed

+61
-18
lines changed

include/ableton/platforms/posix/ScanIpIfAddrs.hpp

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
#include <ableton/discovery/AsioTypes.hpp>
2323
#include <arpa/inet.h>
2424
#include <ifaddrs.h>
25+
#include <map>
2526
#include <net/if.h>
27+
#include <string>
2628
#include <vector>
2729

2830
namespace ableton
@@ -77,31 +79,46 @@ struct ScanIpIfAddrs
7779
std::vector<discovery::IpAddress> operator()()
7880
{
7981
std::vector<discovery::IpAddress> addrs;
82+
std::map<std::string, discovery::IpAddress> IpInterfaceNames;
8083

8184
detail::GetIfAddrs getIfAddrs;
82-
getIfAddrs.withIfAddrs([&addrs](const struct ifaddrs& interfaces) {
85+
getIfAddrs.withIfAddrs([&addrs, &IpInterfaceNames](const struct ifaddrs& interfaces) {
8386
const struct ifaddrs* interface;
8487
for (interface = &interfaces; interface; interface = interface->ifa_next)
8588
{
8689
auto addr = reinterpret_cast<const struct sockaddr_in*>(interface->ifa_addr);
87-
if (addr && interface->ifa_flags & IFF_UP)
90+
if (addr && interface->ifa_flags & IFF_RUNNING && addr->sin_family == AF_INET)
8891
{
89-
if (addr->sin_family == AF_INET)
90-
{
91-
auto bytes = reinterpret_cast<const char*>(&addr->sin_addr);
92-
addrs.emplace_back(discovery::makeAddress<discovery::IpAddressV4>(bytes));
93-
}
94-
else if (addr->sin_family == AF_INET6)
92+
auto bytes = reinterpret_cast<const char*>(&addr->sin_addr);
93+
auto address = discovery::makeAddress<discovery::IpAddressV4>(bytes);
94+
addrs.emplace_back(std::move(address));
95+
IpInterfaceNames.insert(std::make_pair(interface->ifa_name, address));
96+
}
97+
}
98+
});
99+
100+
getIfAddrs.withIfAddrs([&addrs, &IpInterfaceNames](const struct ifaddrs& interfaces) {
101+
const struct ifaddrs* interface;
102+
for (interface = &interfaces; interface; interface = interface->ifa_next)
103+
{
104+
auto addr = reinterpret_cast<const struct sockaddr_in*>(interface->ifa_addr);
105+
if (addr && interface->ifa_flags & IFF_RUNNING && addr->sin_family == AF_INET6)
106+
{
107+
auto addr6 = reinterpret_cast<const struct sockaddr_in6*>(addr);
108+
auto bytes = reinterpret_cast<const char*>(&addr6->sin6_addr);
109+
auto scopeId = addr6->sin6_scope_id;
110+
auto address = discovery::makeAddress<discovery::IpAddressV6>(bytes, scopeId);
111+
if (IpInterfaceNames.find(interface->ifa_name) != IpInterfaceNames.end()
112+
&& !address.is_loopback() && address.is_link_local())
95113
{
96-
auto addr6 = reinterpret_cast<const struct sockaddr_in6*>(addr);
97-
auto bytes = reinterpret_cast<const char*>(&addr6->sin6_addr);
98-
addrs.emplace_back(discovery::makeAddress<discovery::IpAddressV6>(bytes));
114+
addrs.emplace_back(std::move(address));
99115
}
100116
}
101117
}
102118
});
119+
103120
return addrs;
104-
}
121+
};
105122
};
106123

107124
} // namespace posix

include/ableton/platforms/windows/ScanIpIfAddrs.hpp

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121

2222
#include <ableton/discovery/AsioTypes.hpp>
2323
#include <iphlpapi.h>
24+
#include <map>
2425
#include <stdio.h>
26+
#include <string>
2527
#include <vector>
2628
#include <winsock2.h>
2729
#include <ws2tcpip.h>
@@ -101,9 +103,10 @@ struct ScanIpIfAddrs
101103
std::vector<discovery::IpAddress> operator()()
102104
{
103105
std::vector<discovery::IpAddress> addrs;
106+
std::map<std::string, discovery::IpAddress> IpInterfaceNames;
104107

105108
detail::GetIfAddrs getIfAddrs;
106-
getIfAddrs.withIfAddrs([&addrs](const IP_ADAPTER_ADDRESSES& interfaces) {
109+
getIfAddrs.withIfAddrs([&](const IP_ADAPTER_ADDRESSES& interfaces) {
107110
const IP_ADAPTER_ADDRESSES* networkInterface;
108111
for (networkInterface = &interfaces; networkInterface;
109112
networkInterface = networkInterface->Next)
@@ -118,18 +121,41 @@ struct ScanIpIfAddrs
118121
SOCKADDR_IN* addr4 =
119122
reinterpret_cast<SOCKADDR_IN*>(address->Address.lpSockaddr);
120123
auto bytes = reinterpret_cast<const char*>(&addr4->sin_addr);
121-
addrs.emplace_back(discovery::makeAddress<discovery::IpAddressV4>(bytes));
124+
auto ipv4address = discovery::makeAddress<discovery::IpAddressV4>(bytes);
125+
addrs.emplace_back(ipv4address);
126+
IpInterfaceNames.insert(
127+
std::make_pair(networkInterface->AdapterName, ipv4address));
122128
}
123-
else if (AF_INET6 == family)
129+
}
130+
}
131+
});
132+
133+
getIfAddrs.withIfAddrs([&](const IP_ADAPTER_ADDRESSES& interfaces) {
134+
const IP_ADAPTER_ADDRESSES* networkInterface;
135+
for (networkInterface = &interfaces; networkInterface;
136+
networkInterface = networkInterface->Next)
137+
{
138+
for (IP_ADAPTER_UNICAST_ADDRESS* address = networkInterface->FirstUnicastAddress;
139+
NULL != address; address = address->Next)
140+
{
141+
auto family = address->Address.lpSockaddr->sa_family;
142+
if (AF_INET6 == family
143+
&& IpInterfaceNames.find(networkInterface->AdapterName)
144+
!= IpInterfaceNames.end())
124145
{
125-
SOCKADDR_IN6* addr6 =
146+
SOCKADDR_IN6* sockAddr =
126147
reinterpret_cast<SOCKADDR_IN6*>(address->Address.lpSockaddr);
127-
auto bytes = reinterpret_cast<const char*>(&addr6->sin6_addr);
128-
addrs.emplace_back(discovery::makeAddress<discovery::IpAddressV6>(bytes));
148+
auto bytes = reinterpret_cast<const char*>(&sockAddr->sin6_addr);
149+
auto addr6 = discovery::makeAddress<discovery::IpAddressV6>(bytes);
150+
if (!addr6.is_loopback() && addr6.is_link_local())
151+
{
152+
addrs.emplace_back(addr6);
153+
}
129154
}
130155
}
131156
}
132157
});
158+
133159
return addrs;
134160
}
135161
};

0 commit comments

Comments
 (0)