From 740d9e290bc8e4698c4a004f6dcd4d43be4a863c Mon Sep 17 00:00:00 2001 From: Seonah Moon Date: Mon, 8 Jun 2020 15:20:12 +0900 Subject: [PATCH] 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/commit/280584ff8f147832f008b299d0e32fd4273024db Change-Id: I9bd36dd680a90dce88e8b58547d0922a4f311122 --- lib/core-net/network.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/lib/core-net/network.c b/lib/core-net/network.c index e487369..28b778a 100644 --- a/lib/core-net/network.c +++ b/lib/core-net/network.c @@ -416,14 +416,40 @@ lws_retry_get_delay_ms(struct lws_context *context, #if defined(LWS_WITH_IPV6) LWS_EXTERN unsigned long -lws_get_addr_scope(const char *ipaddr) +lws_get_addr_scope(const char *ifname_or_ipaddr) { - unsigned long scope = 0; + unsigned long scope; -#ifndef WIN32 - struct ifaddrs *addrs, *addr; 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) { @@ -431,6 +457,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), @@ -443,21 +470,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++) { @@ -496,7 +515,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; -- 2.7.4