diff options
| author | Steinar H. Gunderson <sesse@google.com> | 2011-01-17 12:19:01 -0800 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2011-01-17 12:19:01 -0800 |
| commit | 76b6f084ab555ea5610156153371659320f7b56d (patch) | |
| tree | eeccbfcd3f42c4f183883aece31d0c4dfc494728 /libc/netbsd/net | |
| parent | 8217a9414fb81932074929afd5afd626e45d07bf (diff) | |
| parent | 2be18508f349b74b60b09e1b1118d879afb5928c (diff) | |
| download | bionic-76b6f084ab555ea5610156153371659320f7b56d.zip bionic-76b6f084ab555ea5610156153371659320f7b56d.tar.gz bionic-76b6f084ab555ea5610156153371659320f7b56d.tar.bz2 | |
am 2be18508: am 2e23e292: Backport (simple cherry-pick) d33019030c1f0cddca557f9659e3c471bde0e6a9 to gingerbread.
* commit '2be18508f349b74b60b09e1b1118d879afb5928c':
Backport (simple cherry-pick) d33019030c1f0cddca557f9659e3c471bde0e6a9 to gingerbread.
Diffstat (limited to 'libc/netbsd/net')
| -rw-r--r-- | libc/netbsd/net/getaddrinfo.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/libc/netbsd/net/getaddrinfo.c b/libc/netbsd/net/getaddrinfo.c index 778f44c..993c934 100644 --- a/libc/netbsd/net/getaddrinfo.c +++ b/libc/netbsd/net/getaddrinfo.c @@ -1525,9 +1525,13 @@ _get_scope(const struct sockaddr *addr) #define IN6_IS_ADDR_6TO4(a) \ (((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02)) +/* 6bone testing address area (3ffe::/16), deprecated in RFC 3701. */ +#define IN6_IS_ADDR_6BONE(a) \ + (((a)->s6_addr[0] == 0x3f) && ((a)->s6_addr[1] == 0xfe)) + /* * Get the label for a given IPv4/IPv6 address. - * RFC 3484, section 2.1, plus Teredo added in with label 5. + * RFC 3484, section 2.1, plus changes from draft-ietf-6man-rfc3484-revise-01. */ /*ARGSUSED*/ @@ -1535,19 +1539,27 @@ static int _get_label(const struct sockaddr *addr) { if (addr->sa_family == AF_INET) { - return 4; + return 3; } else if (addr->sa_family == AF_INET6) { const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { return 0; - } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) { + } else if (IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { + return 1; + } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { return 3; + } else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { + return 4; } else if (IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { return 5; - } else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { - return 2; + } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) { + return 10; + } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { + return 11; + } else if (IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { + return 12; } else { - return 1; + return 2; } } else { /* @@ -1560,7 +1572,7 @@ _get_label(const struct sockaddr *addr) /* * Get the precedence for a given IPv4/IPv6 address. - * RFC 3484, section 2.1, plus Teredo added in with precedence 25. + * RFC 3484, section 2.1, plus changes from draft-ietf-6man-rfc3484-revise-01. */ /*ARGSUSED*/ @@ -1568,22 +1580,28 @@ static int _get_precedence(const struct sockaddr *addr) { if (addr->sa_family == AF_INET) { - return 10; + return 30; } else if (addr->sa_family == AF_INET6) { const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { + return 60; + } else if (IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { return 50; - } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) { + } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { + return 30; + } else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { return 20; } else if (IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { - return 25; - } else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { - return 30; + return 10; + } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) || + IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr) || + IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { + return 1; } else { return 40; } } else { - return 5; + return 1; } } |
