This commit is contained in:
nickkelsey 2022-10-21 20:02:07 -07:00
commit 0aae263492
4 changed files with 42 additions and 12 deletions

View file

@ -93,11 +93,19 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
continue;
}
if (ifa->ifa_addr->sa_family == AF_INET) {
uint32_t ifindex = if_nametoindex(ifa->ifa_name);
uint32_t ifindex = if_nametoindex(ifa->ifa_name);
if (ifindex == 0) {
ifa = ifa->ifa_next;
continue;
}
if (ifa->ifa_addr->sa_family == AF_INET) {
struct sockaddr_in *netmask_in = (struct sockaddr_in *)ifa->ifa_netmask;
uint8_t cidr = hdhomerun_local_ip_netmask_to_cidr((uint8_t *)&netmask_in->sin_addr.s_addr, 4);
if ((cidr == 0) || (cidr >= 32)) {
ifa = ifa->ifa_next;
continue;
}
callback(callback_arg, ifindex, ifa->ifa_addr, cidr);
@ -106,6 +114,13 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
}
if (ifa->ifa_addr->sa_family == AF_INET6) {
struct sockaddr_in6 *netmask_in = (struct sockaddr_in6 *)ifa->ifa_netmask;
uint8_t cidr = hdhomerun_local_ip_netmask_to_cidr(netmask_in->sin6_addr.s6_addr, 16);
if ((cidr == 0) || (cidr >= 128)) {
ifa = ifa->ifa_next;
continue;
}
#if !defined(TARGET_OS_IPHONE)
struct in6_ifreq ifr6;
memset(&ifr6, 0, sizeof(ifr6));
@ -114,21 +129,17 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
strcpy(ifr6.ifr_name, ifa->ifa_name);
ifr6.ifr_addr = *addr_in;
if (ioctl(af6_sock, SIOCGIFALIFETIME_IN6, &ifr6) < 0) {
if (ioctl(af6_sock, SIOCGIFAFLAG_IN6, &ifr6) < 0) {
ifa = ifa->ifa_next;
continue;
}
if (ifr6.ifr_ifru.ifru_lifetime.ia6t_vltime != 0xFFFFFFFF) {
uint32_t flags6 = ifr6.ifr_ifru.ifru_flags6;
if (flags6 & (IN6_IFF_ANYCAST | IN6_IFF_TENTATIVE | IN6_IFF_DETACHED | IN6_IFF_TEMPORARY | IN6_IFF_DEPRECATED)) {
ifa = ifa->ifa_next;
continue;
}
#endif
uint32_t ifindex = if_nametoindex(ifa->ifa_name);
struct sockaddr_in6 *netmask_in = (struct sockaddr_in6 *)ifa->ifa_netmask;
uint8_t cidr = hdhomerun_local_ip_netmask_to_cidr(netmask_in->sin6_addr.s6_addr, 16);
callback(callback_arg, ifindex, ifa->ifa_addr, cidr);
ifa = ifa->ifa_next;

View file

@ -110,6 +110,9 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
struct sockaddr_in *netmask_in = (struct sockaddr_in *)&ifr->ifr_addr;
uint8_t cidr = hdhomerun_local_ip_netmask_to_cidr((uint8_t *)&netmask_in->sin_addr.s_addr, 4);
if ((cidr == 0) || (cidr >= 32)) {
continue;
}
/* ifindex. */
if (ioctl(sock, SIOCGIFINDEX, ifr) != 0) {
@ -117,6 +120,9 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
}
uint32_t ifindex = ifr->ifr_ifindex;
if (ifindex == 0) {
continue;
}
/* Result. */
callback(callback_arg, ifindex, (const struct sockaddr *)&ip_addr_in, cidr);

View file

@ -46,6 +46,9 @@ static void hdhomerun_local_ip_info2_newaddr(int af_sock, struct nlmsghdr *hdr,
/* ifindex */
uint32_t ifindex = addrmsg->ifa_index;
if (ifindex == 0) {
return;
}
/* interface flags */
struct ifreq ifr;
@ -78,6 +81,11 @@ static void hdhomerun_local_ip_info2_newaddr(int af_sock, struct nlmsghdr *hdr,
}
uint8_t cidr = (uint8_t)addrmsg->ifa_prefixlen;
uint8_t cidr_fail = (addrmsg->ifa_family == AF_INET6) ? 128 : 32;
if ((cidr == 0) || (cidr >= cidr_fail)) {
rta = RTA_NEXT(rta, ifa_payload_length);
continue;
}
if (addrmsg->ifa_family == AF_INET) {
struct sockaddr_in local_ip;

View file

@ -77,6 +77,10 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
}
uint32_t ifindex = adapter->IfIndex;
if (ifindex == 0) {
adapter = adapter->Next;
continue;
}
IP_ADAPTER_UNICAST_ADDRESS *adapter_address = adapter->FirstUnicastAddress;
while (adapter_address) {
@ -91,12 +95,13 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
continue;
}
if ((local_ip->sa_family == AF_INET6) && (adapter_address->ValidLifetime != 0xFFFFFFFF)) {
uint8_t cidr = adapter_address->OnLinkPrefixLength;
uint8_t cidr_fail = (local_ip->sa_family == AF_INET6) ? 128 : 32;
if ((cidr == 0) || (cidr >= cidr_fail)) {
adapter_address = adapter_address->Next;
continue; /* skip temporary addresses */
continue;
}
uint8_t cidr = adapter_address->OnLinkPrefixLength;
callback(callback_arg, ifindex, local_ip, cidr);
adapter_address = adapter_address->Next;