CattaInterfaceAddress *ifaddr;
struct sockaddr *sa = a->Address.lpSockaddr;
+ // skip transient addresses; to quote MSDN: "The IP address is a cluster
+ // address and should not be used by most applications."
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/aa366066(v=vs.85).aspx
+ if(a->Flags & IP_ADAPTER_ADDRESS_TRANSIENT)
+ return;
+
// fill addr struct for address lookup
switch(sa->sa_family) {
case AF_INET:
}
// set global scope flag
+ // XXX should we use the IP_ADAPTER_ADDRESS_DNS_ELIGIBLE flag for this?
+ // it looks like it gets set for IPv4 addresses that are not localhost
+ // and for IPv6 addresses with global scope. not sure about multicast
+ // addresses.
if(addr.proto == CATTA_PROTO_INET6)
ifaddr->global_scope = !(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)addr.data.data)
|| IN6_IS_ADDR_MULTICAST((struct in6_addr *)addr.data.data));
{
char s[CATTA_ADDRESS_STR_MAX];
catta_log_debug(" address: %s\n"
- " global_scope: %d",
+ " global_scope: %d\n"
+ " flags: 0x%.4x",
catta_address_snprint(s, sizeof(s), &addr),
- ifaddr->global_scope);
+ ifaddr->global_scope,
+ (unsigned int)a->Flags);
}
}