mirror of
https://github.com/Silicondust/libhdhomerun
synced 2025-08-14 10:47:04 -07:00
20221021
This commit is contained in:
parent
a8ac7a6659
commit
0aae263492
4 changed files with 42 additions and 12 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue