While testing the default address selection support in linux, i found some issues in the getaddrinfo() implementation of Rule 3 and Rule 7 in the destination address selection process as described in RFC3484.
Rule 3: Avoid deprecated addresses. ----------------------------------- This one turned out to be a bug in getaddrinfo() routine while looking for a matching address in the deprecated/temporary address list. Instead of searching for the source address, the current code uses the dest. address. The following patch fixes this issue. ========================================================================= diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -2085,10 +2085,12 @@ #endif if (q->ai_family == PF_INET6 && in6ai != NULL) { - /* See whether the address is the list of deprecated - or temporary addresses. */ + /* See whether the source address is in the list of + deprecated or temporary addresses. */ struct in6addrinfo tmp; - memcpy (tmp.addr, q->ai_addr, IN6ADDRSZ); + struct sockaddr_in6 *sin6p = + (struct sockaddr_in6 *)&results[i].source_addr; + memcpy (tmp.addr, &sin6p->sin6_addr, IN6ADDRSZ); struct in6addrinfo *found = bsearch (&tmp, in6ai, in6ailen, sizeof (*in6ai), ============================================================================ Rule 7: Prefer native transport. -------------------------------- I don't think checking for IFA_F_TEMPORARY flag is the right thing to do to figure out if we are using a tunnel transport. The temporary flag is used to support privacy extensions for stateless address autoconfiguration. Instead, i think we need a way to determine if a source address belongs to a configured tunnel link sit. Currently, the kernel doesn't provide a flag to indicate that an address belongs to a tunnel interface. We could add a new IFA_F_TUNNEL flag, but it requires kernel changes. The other option is to get the interface type associated with the address. Is there a convenient way to get device type associated with a particular address in the getaddrinfo code path? Which option is preferable? Thanks Sridhar - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html