当前位置: 首页 > 知识库问答 >
问题:

Android AOSP SIOCADDRT ioctl 调用失败: 网络无法访问

戚哲
2023-03-14

Android派(android-9.0.0_r16)

构建:PQ1A.181105.017. A1

设备:像素 2

我正在尝试使用 dhcp 工具(重命名为 dhcpdbg)将蜂窝调制解调器与 RNDIS 模式下的Android 9 派连接。相同的设置对于以前版本的机器人工作正常,但对于Pie,它在ioctl(3,SIOCADDRT,0x7ffb9b8030)上失败。它说“网络无法访问”。

我已经检查了ifconfig中的端口,即usb0,它枚举正确,但dhcpdbg调用失败,网络不可ping通。

设备上的分离处于允许模式。此外,dmesg 日志中没有权限或其他错误。注意:默认情况下,RNDIS 驱动程序未在Android派内核中配置,因此我们在内核中启用了 RNDIS 模式,并在 AOSP 源代码中集成了更改的内核。

以下是“strace dhcpdbg usb0”中的一些日志

ioctl(3, SIOCGIFFLAGS, {ifr_name="usb0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(3, SIOCSIFFLAGS, {ifr_name="usb0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(3, SIOCSIFADDR, {ifr_name="usb0", ifr_addr={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.1.100")}}) = 0
ioctl(3, SIOCSIFNETMASK, {ifr_name="usb0", ifr_netmask={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("255.255.255.0")}}) = 0
ioctl(3, SIOCADDRT, 0x7ffb9b8030)       = -1 ENETUNREACH (Network is unreachable)
close(3)                                = 0
getuid()                                = 0
writev(5, [{iov_base="\0\355\25o\6X\\=\267\254%", iov_len=11}, {iov_base="\3", iov_len=1}, {iov_base="DHCP\0", iov_len=5}, {iov_base="failed to set default         route 192."..., iov_len=65}], 4) = 82
getuid()                                = 0
writev(6, [{iov_base="lY\0\0\0\355\25", iov_len=7}, {iov_base="\0\355\25o\6X\\=\267\254%", iov_len=11}, {iov_base="\3", iov_len=1}, {iov_base="DHCP\0",     iov_len=5}, {iov_base="failed to set default route 192ioctl(3, SIOCADDRT, 0x7ffb9b8030)."..., iov_len=65}], 5) = 89
write(2, "dhcpdbg: ", 9dhcpdbg: )                = 9
write(2, "dhcptool usb0: do_dhcp failed", 29dhcptool usb0: do_dhcp failed) = 29
write(2, ": ", 2: )                       = 2
write(2, "Network is unreachable\n", 23Network is unreachable
) = 23
mprotect(0x6ffbc65000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x6ffbc65000, 4096, PROT_READ) = 0
mprotect(0x6ffbc65000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x6ffbc65000, 4096, PROT_READ) = 0
mprotect(0x6ffbc65000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x6ffbc65000, 4096, PROT_READ) = 0
munmap(0x6ffbc65000, 4096)              = 0
exit_group(101)                         = ?
+++ exited with 101 +++

以下是网络命令的一些输出:

ifconfig:

usb0      Link encap:Ethernet  HWaddr 02:06:06:15:00:0b  Driver rndis_host
      inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:4 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:80 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1000 
      RX bytes:1312 TX bytes:25155 

ip添加显示:

28: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 02:06:06:15:00:0b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global usb0
    valid_lft forever preferred_lft forever

IP路由显示:

192.168.1.0/24 dev usb0 proto kernel scope link src 192.168.1.100 
192.168.43.0/24 dev wlan0 proto kernel scope link src 192.168.43.222 

内核 IP 路由表:

Destination Gateway     Genmask     Flags   MSS Window  irtt Iface
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 usb0
192.168.43.0    0.0.0.0         255.255.255.0   U         0 0          0 wlan0

ping 8.8.8:

connect: Network is unreachable

这个dhcp工具工具在所有早期的Android版本上运行良好,直到Android8。以下是在同一usb0端口上运行的Android 8 dhcp工具的工作记录。

ioctl(3, SIOCGIFFLAGS, {ifr_name="usb0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(3, SIOCSIFFLAGS, {ifr_name="usb0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(3, SIOCSIFADDR, {ifr_name="usb0", ifr_addr={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.1.100")}}) = 0
ioctl(3, SIOCSIFNETMASK, {ifr_name="usb0", ifr_netmask={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("255.255.255.0")}}) = 0
ioctl(3, SIOCADDRT, 0x7fd2bb6cd0)       = 0
close(3)                                = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/socket/property_service"}, 31) = 0
writev(3, [{iov_base="\1\0\2\0", iov_len=4}, {iov_base="\r\0\0\0", iov_len=4}, {iov_base="net.usb0.dns1", iov_len=13}, {iov_base="\v\0\0\0", iov_len=4}, {iov_base="192.168.1.1", iov_len=11}], 5) = 36
recvfrom(3, "\0\0\0\0", 4, MSG_WAITALL, NULL, NULL) = 4
close(3)                                = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/socket/property_service"}, 31) = 0
writev(3, [{iov_base="\1\0\2\0", iov_len=4}, {iov_base="\r\0\0\0", iov_len=4}, {iov_base="net.usb0.dns2", iov_len=13}, {iov_base="\0\0\0\0", iov_len=4}], 4) = 25
recvfrom(3, "\0\0\0\0", 4, MSG_WAITALL, NULL, NULL) = 4
close(3)                                = 0
write(2, "dhcptool: ", 10dhcptool: )              = 10
write(2, "IP assignment is for debug purpo"..., 40IP assignment is for debug purposes ONLY) = 40
write(2, ": ", 2: )                       = 2
write(2, "Success\n", 8Success
)                = 8
mprotect(0x7729153000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x7729153000, 4096, PROT_READ) = 0
mprotect(0x7729153000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x7729153000, 4096, PROT_READ) = 0
munmap(0x7729153000, 4096)              = 0
exit_group(0)                           = ?
+++ exited with 0 +++
bullhead:/ # ping 8.8.8.8                                                                                                                                                                                   
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=131 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=58.4 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 58.496/95.044/131.592/36.548 ms
bullhead:/ # 

共有3个答案

东郭赞
2023-03-14

请参阅 https://elinux.org/Android_Networking#Setting_up_networking_on_bootup。命令

netcfg eth0 dhcp
setprop net.dns1 8.8.8.8

应该足够了。

邹坚壁
2023-03-14

从上面共享的信息中,似乎缺少默认路由。您可以使用下面的命令添加默认路由:

ip route add default dev usb0

添加上面的路由后,我建议您使用跟踪路由工具或ping(如果跟踪路由不可用,则修改TTL)来跟踪更远的数据包。

慕凌
2023-03-14

似乎您缺少一条到8.8.8的路线(可能是默认路线)。比较工作和非工作设置之间的路线。

 类似资料:
  • 我在我的公司网络上建立Docker图像时遇到了问题。我刚刚开始使用Docker,所以我有以下用于hello-world类型应用程序的Dockerfile: 当我在家里的笔记本电脑上,在我自己的无线网络上构建它时,这很好用。它拉下必要的依赖关系,并正确地构建映像。 我没有网络技术来弄清楚这里发生了什么。有人知道为什么在构建Docker容器时会出现这种奇怪的行为吗?

  • 问题内容: 我在公司网络上构建Docker映像时遇到问题。我刚刚开始使用Docker,因此我有一个用于hello-world类型应用程序的以下Dockerfile: 当我在家中通过自己的无线网络在笔记本电脑上构建笔记本电脑时,这种方法效果很好。它拉下必要的依赖关系并正确构建映像。 但是,当我在公司网络上工作时,尝试从download.fedoraproject.org拉下RPM时,此同一个Dock

  • 问题内容: 我有一个具有多个IP地址的专用服务器,某些IP关联了mac地址,而其他IP(在子网中)则没有mac地址。我已经使用以下方法创建了docker macvlan网络: 我的IP:88.99.102.115,Mac:00:50:56:00:60:42。使用以下方法创建了一个容器: 这有效,我可以从外部访问该IP地址托管的Nginx。 IP没有MAC地址且网关不在子网中的情况。 子网:88.9

  • 问题内容: 当我使用(RN版本0.29.1)创建一个全新的项目并将提取内容放入公共Facebook演示电影API的render方法中时,它将引发。堆栈跟踪非常无用,我无法在chrome控制台中调试网络请求。这是我要发送的内容: 问题答案: 这里的问题是,iOS默认情况下不允许HTTP请求,仅允许HTTPS。如果要启用HTTP请求,请将其添加到您的:

  • 当我使用(RN版本0.29.1)创建一个全新的项目,并将render方法中的一个fetch放到公共facebook演示电影API中时,它会抛出一个。有一个非常无用的堆栈跟踪和我不能调试网络请求在chrome控制台。以下是我正在发送的fetch:

  • 处理这些网络管理员:用户名:admin ✖创业网络定义。这可能需要一分钟...错误:尝试启动业务网络时出错。错误:没有来自任何对等点的有效响应。尝试对等通信的响应是错误:错误:未能执行事务AE276DA81F756AC76EDCCF85A79F1C11A554F1285C2A8C4CC2899DB433220500:启动容器错误:启动容器错误:未能生成特定于平台的docker构建:从构建返回的错误