Compare commits
8 Commits
android-2.
...
gingerbrea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f14ff34df | ||
|
|
6139fa33ab | ||
|
|
6bd73ed417 | ||
|
|
2081fda69a | ||
|
|
ba96e30fa0 | ||
|
|
2e23e29245 | ||
|
|
f4dca7be3b | ||
|
|
a798b9f0e1 |
@@ -60,6 +60,10 @@
|
|||||||
#define IN6_IS_ADDR_SITELOCAL(a) \
|
#define IN6_IS_ADDR_SITELOCAL(a) \
|
||||||
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
|
(((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) \
|
#define IN6_IS_ADDR_MULTICAST(a) \
|
||||||
(((__const uint8_t *) (a))[0] == 0xff)
|
(((__const uint8_t *) (a))[0] == 0xff)
|
||||||
|
|
||||||
|
|||||||
43
libc/kernel/common/linux/usb/f_accessory.h
Normal file
43
libc/kernel/common/linux/usb/f_accessory.h
Normal 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
|
||||||
@@ -340,35 +340,55 @@ str2number(const char *p)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine whether IPv6 connectivity is available. */
|
/*
|
||||||
static int
|
* Connect a UDP socket to a given unicast address. This will cause no network
|
||||||
_have_ipv6() {
|
* 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, ...).
|
||||||
* 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 = {
|
static int
|
||||||
/* family, port, flow label */
|
_test_connect(int pf, struct sockaddr *addr, size_t addrlen) {
|
||||||
AF_INET6, 0, 0,
|
int s = socket(pf, SOCK_DGRAM, IPPROTO_UDP);
|
||||||
/* 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);
|
|
||||||
if (s < 0)
|
if (s < 0)
|
||||||
return 0;
|
return 0;
|
||||||
int ret;
|
int ret;
|
||||||
do {
|
do {
|
||||||
ret = connect(s, &addr_test.generic, sizeof(addr_test.in6));
|
ret = connect(s, addr, addrlen);
|
||||||
} while (ret < 0 && errno == EINTR);
|
} while (ret < 0 && errno == EINTR);
|
||||||
int have_ipv6 = (ret == 0);
|
int success = (ret == 0);
|
||||||
do {
|
do {
|
||||||
ret = close(s);
|
ret = close(s);
|
||||||
} while (ret < 0 && errno == EINTR);
|
} 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
|
int
|
||||||
@@ -1299,11 +1319,13 @@ _get_scope(const struct sockaddr *addr)
|
|||||||
if (IN_LOOPBACK(na) || /* 127.0.0.0/8 */
|
if (IN_LOOPBACK(na) || /* 127.0.0.0/8 */
|
||||||
(na & 0xffff0000) == 0xa9fe0000) { /* 169.254.0.0/16 */
|
(na & 0xffff0000) == 0xa9fe0000) { /* 169.254.0.0/16 */
|
||||||
return IPV6_ADDR_SCOPE_LINKLOCAL;
|
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 {
|
} 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;
|
return IPV6_ADDR_SCOPE_GLOBAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1325,9 +1347,13 @@ _get_scope(const struct sockaddr *addr)
|
|||||||
#define IN6_IS_ADDR_6TO4(a) \
|
#define IN6_IS_ADDR_6TO4(a) \
|
||||||
(((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02))
|
(((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.
|
* 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*/
|
/*ARGSUSED*/
|
||||||
@@ -1335,19 +1361,27 @@ static int
|
|||||||
_get_label(const struct sockaddr *addr)
|
_get_label(const struct sockaddr *addr)
|
||||||
{
|
{
|
||||||
if (addr->sa_family == AF_INET) {
|
if (addr->sa_family == AF_INET) {
|
||||||
return 4;
|
return 3;
|
||||||
} else if (addr->sa_family == AF_INET6) {
|
} else if (addr->sa_family == AF_INET6) {
|
||||||
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr;
|
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr;
|
||||||
if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) {
|
if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) {
|
||||||
return 0;
|
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;
|
return 3;
|
||||||
|
} else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) {
|
||||||
|
return 4;
|
||||||
} else if (IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) {
|
} else if (IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) {
|
||||||
return 5;
|
return 5;
|
||||||
} else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) {
|
} else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) {
|
||||||
return 2;
|
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 {
|
} else {
|
||||||
return 1;
|
return 2;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
@@ -1360,7 +1394,7 @@ _get_label(const struct sockaddr *addr)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the precedence for a given IPv4/IPv6 address.
|
* 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*/
|
/*ARGSUSED*/
|
||||||
@@ -1368,22 +1402,28 @@ static int
|
|||||||
_get_precedence(const struct sockaddr *addr)
|
_get_precedence(const struct sockaddr *addr)
|
||||||
{
|
{
|
||||||
if (addr->sa_family == AF_INET) {
|
if (addr->sa_family == AF_INET) {
|
||||||
return 10;
|
return 30;
|
||||||
} else if (addr->sa_family == AF_INET6) {
|
} else if (addr->sa_family == AF_INET6) {
|
||||||
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr;
|
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr;
|
||||||
if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) {
|
if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) {
|
||||||
|
return 60;
|
||||||
|
} else if (IN6_IS_ADDR_ULA(&addr6->sin6_addr)) {
|
||||||
return 50;
|
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;
|
return 20;
|
||||||
} else if (IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) {
|
} else if (IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) {
|
||||||
return 25;
|
return 10;
|
||||||
} else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) {
|
} else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) ||
|
||||||
return 30;
|
IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr) ||
|
||||||
|
IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) {
|
||||||
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
return 40;
|
return 40;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return 5;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1667,17 +1707,27 @@ _dns_getaddrinfo(void *rv, void *cb_data, va_list ap)
|
|||||||
q.qclass = C_IN;
|
q.qclass = C_IN;
|
||||||
q.answer = buf->buf;
|
q.answer = buf->buf;
|
||||||
q.anslen = sizeof(buf->buf);
|
q.anslen = sizeof(buf->buf);
|
||||||
/* If AI_ADDRCONFIG, lookup IPv6 only if we have connectivity */
|
int query_ipv6 = 1, query_ipv4 = 1;
|
||||||
if (!(pai->ai_flags & AI_ADDRCONFIG) || _have_ipv6()) {
|
if (pai->ai_flags & AI_ADDRCONFIG) {
|
||||||
|
query_ipv6 = _have_ipv6();
|
||||||
|
query_ipv4 = _have_ipv4();
|
||||||
|
}
|
||||||
|
if (query_ipv6) {
|
||||||
q.qtype = T_AAAA;
|
q.qtype = T_AAAA;
|
||||||
|
if (query_ipv4) {
|
||||||
q.next = &q2;
|
q.next = &q2;
|
||||||
q2.name = name;
|
q2.name = name;
|
||||||
q2.qclass = C_IN;
|
q2.qclass = C_IN;
|
||||||
q2.qtype = T_A;
|
q2.qtype = T_A;
|
||||||
q2.answer = buf2->buf;
|
q2.answer = buf2->buf;
|
||||||
q2.anslen = sizeof(buf2->buf);
|
q2.anslen = sizeof(buf2->buf);
|
||||||
} else {
|
}
|
||||||
|
} else if (query_ipv4) {
|
||||||
q.qtype = T_A;
|
q.qtype = T_A;
|
||||||
|
} else {
|
||||||
|
free(buf);
|
||||||
|
free(buf2);
|
||||||
|
return NS_NOTFOUND;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
|
|||||||
Reference in New Issue
Block a user