Compare commits

..

8 Commits

Author SHA1 Message Date
Mike Lockwood
3f14ff34df DO NOT MERGE: Update USB accessory kernel header to include serial number support
Change-Id: I61d889b107bd5e052ebac393883b87dac730ea6a
Signed-off-by: Mike Lockwood <lockwood@android.com>
2011-03-14 19:16:28 -04:00
Mike Lockwood
6139fa33ab DO NOT MERGE: linux/usb/f_accessory.h: Update USB accessory kernel header
For bugs b/4079236, b/4073248 and b/4080288

Change-Id: Id9cdbe95d7dd892bf38e16e7da505ee0eae26b99
Signed-off-by: Mike Lockwood <lockwood@android.com>
2011-03-11 19:02:16 -05:00
Mike Lockwood
6bd73ed417 Add linux/usb/f_accessory.h header for USB accessory driver DO NOT MERGE
Change-Id: I972d28065ee7e77e93699512310fcd6d5742ed0d
Signed-off-by: Mike Lockwood <lockwood@android.com>
2011-02-21 12:35:22 -05:00
David Turner
2081fda69a Merge "Only look up A records if the system has IPv4." into gingerbread 2011-01-18 17:32:02 -08:00
Lorenzo Colitti
ba96e30fa0 Only look up A records if the system has IPv4.
getaddrinfo only asks DNS for IPv6 addresses if the system
has IPv6 connectivity, but always asks for IPv4 addresses.
Don't ask for IPv4 addresses if there is no IPv4
connectivity.

Change-Id: Iefe9fcb006fabe60b4b11dd4653a7c4a406506f4
2011-01-15 19:02:58 -08:00
Steinar H. Gunderson
2e23e29245 Backport (simple cherry-pick) d33019030c
to gingerbread.

Implement RFC3484 policy table changes from draft-ietf-6man-rfc3484-revise-01.

The changes in a nutshell:

 - Handle v4-mapped as different from v4-compat (this was probably
   an existing bug in our code).
 - Add policy entries for ULA, above most everything else.
 - Put v4-compat, old-style IPv6 site-local and 6bone addresses
   way down in the preference table.

The rest is just shuffling numbers around (no actual changes to
priority).
2011-01-14 21:41:18 +01:00
Steinar H. Gunderson
f4dca7be3b Backport (simple cherry-pick) 64b6c43379
to gingerbread.

Add a new #define IN6_IS_ADDR_ULA, for testing for Universal Local IPv6 Unicast addresses (ULAs). These replace the old site-local IPv6 addresses.
2011-01-14 21:40:57 +01:00
Steinar H. Gunderson
a798b9f0e1 Backport (simple cherry-pick) d1624add2b
to gingerbread.

Don't treat private IPv4 addresses as being in a non-global scope. The effect of this change is essentially to prefer NATed IPv4 over 6to4.
2011-01-14 21:40:34 +01:00
3 changed files with 143 additions and 46 deletions

View File

@@ -60,6 +60,10 @@
#define IN6_IS_ADDR_SITELOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
/* RFC 4193. */
#define IN6_IS_ADDR_ULA(a) \
(((a)->s6_addr[0] & 0xfe) == 0xfc)
#define IN6_IS_ADDR_MULTICAST(a) \
(((__const uint8_t *) (a))[0] == 0xff)

View File

@@ -0,0 +1,43 @@
/****************************************************************************
****************************************************************************
***
*** This header was automatically generated from a Linux kernel header
*** of the same name, to make information necessary for userspace to
*** call into the kernel available to libc. It contains only constants,
*** structures, and macros generated from the original header, and thus,
*** contains no copyrightable information.
***
*** To edit the content of this header, modify the corresponding
*** source file (e.g. under external/kernel-headers/original/) then
*** run bionic/libc/kernel/tools/update_all.py
***
*** Any manual change here will be lost the next time this script will
*** be run. You've been warned!
***
****************************************************************************
****************************************************************************/
#ifndef __LINUX_USB_F_ACCESSORY_H
#define __LINUX_USB_F_ACCESSORY_H
#define USB_ACCESSORY_VENDOR_ID 0x18D1
#define USB_ACCESSORY_PRODUCT_ID 0x2D00
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_ACCESSORY_ADB_PRODUCT_ID 0x2D01
#define ACCESSORY_STRING_MANUFACTURER 0
#define ACCESSORY_STRING_MODEL 1
#define ACCESSORY_STRING_DESCRIPTION 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ACCESSORY_STRING_VERSION 3
#define ACCESSORY_STRING_URI 4
#define ACCESSORY_STRING_SERIAL 5
#define ACCESSORY_GET_PROTOCOL 51
#define ACCESSORY_SEND_STRING 52
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ACCESSORY_START 53
#define ACCESSORY_GET_STRING_MANUFACTURER _IOW('M', 1, char[256])
#define ACCESSORY_GET_STRING_MODEL _IOW('M', 2, char[256])
#define ACCESSORY_GET_STRING_DESCRIPTION _IOW('M', 3, char[256])
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ACCESSORY_GET_STRING_VERSION _IOW('M', 4, char[256])
#define ACCESSORY_GET_STRING_URI _IOW('M', 5, char[256])
#define ACCESSORY_GET_STRING_SERIAL _IOW('M', 6, char[256])
#endif

View File

@@ -340,35 +340,55 @@ str2number(const char *p)
return -1;
}
/* Determine whether IPv6 connectivity is available. */
/*
* Connect a UDP socket to a given unicast address. This will cause no network
* traffic, but will fail fast if the system has no or limited reachability to
* the destination (e.g., no IPv4 address, no IPv6 default route, ...).
*/
static int
_have_ipv6() {
/*
* Connect a UDP socket to an global unicast IPv6 address. This will
* cause no network traffic, but will fail fast if the system has no or
* limited IPv6 connectivity (e.g., only a link-local address).
*/
static const struct sockaddr_in6 sin6_test = {
/* family, port, flow label */
AF_INET6, 0, 0,
/* 2000:: */
{{{ 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}},
/* scope ID */
0};
sockaddr_union addr_test;
addr_test.in6 = sin6_test;
int s = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
_test_connect(int pf, struct sockaddr *addr, size_t addrlen) {
int s = socket(pf, SOCK_DGRAM, IPPROTO_UDP);
if (s < 0)
return 0;
int ret;
do {
ret = connect(s, &addr_test.generic, sizeof(addr_test.in6));
ret = connect(s, addr, addrlen);
} while (ret < 0 && errno == EINTR);
int have_ipv6 = (ret == 0);
int success = (ret == 0);
do {
ret = close(s);
} while (ret < 0 && errno == EINTR);
return have_ipv6;
return success;
}
/*
* The following functions determine whether IPv4 or IPv6 connectivity is
* available in order to implement AI_ADDRCONFIG.
*
* Strictly speaking, AI_ADDRCONFIG should not look at whether connectivity is
* available, but whether addresses of the specified family are "configured
* on the local system". However, bionic doesn't currently support getifaddrs,
* so checking for connectivity is the next best thing.
*/
static int
_have_ipv6() {
static const struct sockaddr_in6 sin6_test = {
.sin6_family = AF_INET6,
.sin6_addr.s6_addr = { // 2000::
0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
sockaddr_union addr = { .in6 = sin6_test };
return _test_connect(PF_INET6, &addr.generic, sizeof(addr.in6));
}
static int
_have_ipv4() {
static const struct sockaddr_in sin_test = {
.sin_family = AF_INET,
.sin_addr.s_addr = __constant_htonl(0x08080808L) // 8.8.8.8
};
sockaddr_union addr = { .in = sin_test };
return _test_connect(PF_INET, &addr.generic, sizeof(addr.in));
}
int
@@ -1299,11 +1319,13 @@ _get_scope(const struct sockaddr *addr)
if (IN_LOOPBACK(na) || /* 127.0.0.0/8 */
(na & 0xffff0000) == 0xa9fe0000) { /* 169.254.0.0/16 */
return IPV6_ADDR_SCOPE_LINKLOCAL;
} else if ((na & 0xff000000) == 0x0a000000 || /* 10.0.0.0/8 */
(na & 0xfff00000) == 0xac100000 || /* 172.16.0.0/12 */
(na & 0xffff0000) == 0xc0a80000) { /* 192.168.0.0/16 */
return IPV6_ADDR_SCOPE_SITELOCAL;
} else {
/*
* According to draft-ietf-6man-rfc3484-revise-01 section 2.3,
* it is best not to treat the private IPv4 ranges
* (10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16) as being
* in a special scope, so we don't.
*/
return IPV6_ADDR_SCOPE_GLOBAL;
}
} else {
@@ -1325,9 +1347,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*/
@@ -1335,19 +1361,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 {
/*
@@ -1360,7 +1394,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*/
@@ -1368,22 +1402,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;
}
}
@@ -1667,17 +1707,27 @@ _dns_getaddrinfo(void *rv, void *cb_data, va_list ap)
q.qclass = C_IN;
q.answer = buf->buf;
q.anslen = sizeof(buf->buf);
/* If AI_ADDRCONFIG, lookup IPv6 only if we have connectivity */
if (!(pai->ai_flags & AI_ADDRCONFIG) || _have_ipv6()) {
int query_ipv6 = 1, query_ipv4 = 1;
if (pai->ai_flags & AI_ADDRCONFIG) {
query_ipv6 = _have_ipv6();
query_ipv4 = _have_ipv4();
}
if (query_ipv6) {
q.qtype = T_AAAA;
q.next = &q2;
q2.name = name;
q2.qclass = C_IN;
q2.qtype = T_A;
q2.answer = buf2->buf;
q2.anslen = sizeof(buf2->buf);
} else {
if (query_ipv4) {
q.next = &q2;
q2.name = name;
q2.qclass = C_IN;
q2.qtype = T_A;
q2.answer = buf2->buf;
q2.anslen = sizeof(buf2->buf);
}
} else if (query_ipv4) {
q.qtype = T_A;
} else {
free(buf);
free(buf2);
return NS_NOTFOUND;
}
break;
case AF_INET: