簡體   English   中英

Android AOSP SIOCADDRT ioctl 調用失敗:網絡無法訪問

[英]Android AOSP SIOCADDRT ioctl call fail: Network is unreachable

AOSP:Android Pie (android-9.0.0_r16)

版本:PQ1A.181105.017.A1

設備:像素 2

我正在嘗試使用 dhcptool(重命名為 dhcpdbg)和 Android 9 Pie 在 RNDIS 模式下連接蜂窩調制解調器。 相同的設置適用於以前版本的 android,但對於 Pie,它在 ioctl(3, SIOCADDRT, 0x7ffb9b8030) 上失敗。 它說“網絡無法訪問”。

我已經檢查了 ifconfig 中的端口 ie usb0,它枚舉正確,但 dhcpdbg 調用失敗並且網絡無法 ping 通。

設備上的 Sepolicy 處於許可模式。 此外,dmesg 日志中沒有權限或其他錯誤。 注意:默認情況下,Android Pie 內核中未配置 RNDIS 驅動程序,因此我們在內核中啟用了 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 +++

以下是網絡命令的一些輸出:

如果配置:

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

平 8.8.8.8:

connect: Network is unreachable

這個 dhcptool 工具在 Android 8 之前的所有早期 android 版本上都可以正常工作。以下是運行在同一 usb0 端口上的 Android 8 dhcptool 的工作 strace 日志。

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:/ # 

看來您缺少通往 8.8.8.8 的路線(可能是默認路線)。 比較工作和非工作設置之間的路由。

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

ip route add default dev usb0

添加上述路由后,我建議您使用traceroute工具或ping (如果 traceroute 不可用,則修改 TTL)從那里進一步跟蹤數據包。

請參閱https://elinux.org/Android_Networking#Setting_up_networking_on_bootup 命令

netcfg eth0 dhcp
setprop net.dns1 8.8.8.8

應該足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM