ipv6: use netlink RTM_GETADDR to properly detect permanent vs temporary IPv6 addresses
getifaddrs() ifa_flags contains interface flags (IFF_UP etc.), NOT address flags (IFA_F_TEMPORARY). Since IFA_F_TEMPORARY == IFA_F_SECONDARY == 0x01, and 0x01 in interface flags is IFF_UP, ALL addresses appeared as 'temporary', making the permanent>temporary priority non-functional. New netlink-based get_interface_ipv6_addr_nl() reads real IFA_FLAGS from RTM_GETADDR response, correctly identifying: - Temporary: IFA_F_TEMPORARY=1, IFA_F_MANAGETEMPADDR=0 - Stable/mngtmp: IFA_F_TEMPORARY=1, IFA_F_MANAGETEMPADDR=1 - Legacy static: IFA_F_TEMPORARY=0 Verified: wlo1 permanent (3a7a:eff:fef5:9637) now correctly selected for prefer_stable=1, temporary (1fb5:b7c:7538:dcf4) for prefer_stable=0.
This commit is contained in:
1 parent
f67bc23cd3
commit
fdbb5b7bc0
3 files changed
+104
-3
No files matched your search
@@ -519,7 +519,7 @@ struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct CFG_S
|
||||
}
|
||||
int temp = (server->ipv6_mode == CFG_IPV6_MODE_TEMPORARY) ? 1 : 0;
|
||||
uint8_t v6addr[16];
|
||||
if (get_interface_ipv6_by_index(netif_index, temp, v6addr) != 0) {
|
||||
if (get_interface_ipv6_addr_nl(netif_index, !temp, v6addr) != 0) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CONNECTION, "Failed to get %s IPv6 from netif_index=%u for socket %s",
|
||||
temp ? "temporary" : "permanent", netif_index, name);
|
||||
u_free(e_sock);
|
||||
@@ -649,8 +649,8 @@ struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct CFG_S
|
||||
uint16_t v6if = (netif_index > 0) ? netif_index : get_default_route_netif_index(AF_INET6);
|
||||
if (v6if > 0) {
|
||||
uint8_t v6addr[16];
|
||||
int got = get_interface_ipv6_by_index(v6if, 0, v6addr);
|
||||
if (got != 0) got = get_interface_ipv6_by_index(v6if, 1, v6addr);
|
||||
int got = get_interface_ipv6_addr_nl(v6if, 1, v6addr);
|
||||
if (got != 0) got = get_interface_ipv6_addr_nl(v6if, 0, v6addr);
|
||||
if (got == 0) {
|
||||
struct sockaddr_in6* if6 = (struct sockaddr_in6*)&e_sock->interface_addr;
|
||||
if6->sin6_family = AF_INET6;
|
||||
|
||||
Reference in new issue
Block a user