1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

ipv6: support interface name for scope lookup

Currently for ipv6, we look up the scope assuming we were given an interface ip for
binding.  But with ipv4, we also support giving an interface name.

Check it against an interface name first and return that if valid.

https://github.com/warmcat/libwebsockets/issues/1944
This commit is contained in:
Andy Green 2020-06-08 05:27:11 +01:00
parent 2a772776a9
commit 280584ff8f

View file

@ -436,14 +436,39 @@ lws_retry_sul_schedule_retry_wsi(struct lws *wsi, lws_sorted_usec_list_t *sul,
#if defined(LWS_WITH_IPV6)
unsigned long
lws_get_addr_scope(const char *ipaddr)
lws_get_addr_scope(const char *ifname_or_ipaddr)
{
unsigned long scope = 0;
#ifndef WIN32
struct ifaddrs *addrs, *addr;
unsigned long scope;
char ip[NI_MAXHOST];
unsigned int i;
#if !defined(WIN32)
struct ifaddrs *addrs, *addr;
#else
PIP_ADAPTER_ADDRESSES adapter, addrs = NULL;
PIP_ADAPTER_UNICAST_ADDRESS addr;
struct sockaddr_in6 *sockaddr;
ULONG size = 0;
int found = 0;
DWORD ret;
#endif
/*
* First see if we can look the string up as a network interface name...
* windows vista+ also has this
*/
scope = if_nametoindex(ifname_or_ipaddr);
if (scope > 0)
/* we found it from the interface name lookup */
return scope;
/*
* if not, try to look it up as an IP -> interface -> interface index
*/
scope = 0;
#if !defined(WIN32)
getifaddrs(&addrs);
for (addr = addrs; addr; addr = addr->ifa_next) {
@ -451,6 +476,7 @@ lws_get_addr_scope(const char *ipaddr)
addr->ifa_addr->sa_family != AF_INET6)
continue;
ip[0] = '\0';
getnameinfo(addr->ifa_addr,
sizeof(struct sockaddr_in6),
ip, sizeof(ip),
@ -463,21 +489,13 @@ lws_get_addr_scope(const char *ipaddr)
break;
}
if (!strcmp(ip, ipaddr)) {
if (!strcmp(ip, ifname_or_ipaddr)) {
scope = if_nametoindex(addr->ifa_name);
break;
}
}
freeifaddrs(addrs);
#else
PIP_ADAPTER_ADDRESSES adapter, addrs = NULL;
PIP_ADAPTER_UNICAST_ADDRESS addr;
ULONG size = 0;
DWORD ret;
struct sockaddr_in6 *sockaddr;
char ip[NI_MAXHOST];
unsigned int i;
int found = 0;
for (i = 0; i < 5; i++)
{
@ -516,7 +534,7 @@ lws_get_addr_scope(const char *ipaddr)
&sockaddr->sin6_addr,
ip, sizeof(ip));
if (!strcmp(ip, ipaddr)) {
if (!strcmp(ip, ifname_or_ipaddr)) {
scope = sockaddr->sin6_scope_id;
found = 1;
break;