蹊跷的错误connect: Network is unreachable

Android-7.1.2系统成功跑起来后,下一步调试Ethernet网口,试图将网口驱动起来,以便Android系统可以上网。

在Android系统的shell中,ifconfig发现网口已经成功通过DHCP server获取到IP地址:

layerscape:/ # ifconfig

eth5      Link encap:Ethernet  HWaddr 00:04:9f:04:4d:51

          inet addr:10.193.20.44  Bcast:10.193.20.255  Mask:255.255.255.0

          inet6 addr: fe80::204:9fff:fe04:4d51/64 Scope: Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:5864 errors:0 dropped:0 overruns:0 frame:0

          TX packets:884 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:800941 TX bytes:79302

          Memory:1aea000-1aeafff

而且看到实际有收发包,于是试图ping测试一下网络连通性:

layerscape:/ # ping 10.193.20.64

connect: Network is unreachable

直接告诉网络不通,开始不明白同一网段不需要缺省路由,以为路由有问题,而且网上google都指向路由有问题,于是一顿的搜索和学习。

根据Ping过程 原理 详解(图),最后发现并不是缺少缺省路由导致,因为同一网段ping直接通过ARP广播就可以得到目标地址,从而必然可以ping通同一网段的其他IP。

而且也确实看到eth5有收发包,只不过收包远大于发包,进一步使用

layerscape:/ # tcpdump -i eth5

也确实看到不断收到来自于其他IP地址发过来的包。在进一步google,网上有人遇到类似问题,提到使用带-I ethx的ping可以正常工作,验证确实如此:

layerscape:/ # ping -I eth5 10.193.20.64

PING 10.193.20.64 (10.193.20.64) from 10.193.20.83 eth5: 56(84) bytes of data.

64 bytes from 10.193.20.64: icmp_seq=1 ttl=64 time=0.345 ms

64 bytes from 10.193.20.64: icmp_seq=2 ttl=64 time=0.354 ms

从而知道问题所在,Android系统某处拦截外发的包,但究竟在何处呢?于是又是一顿的google,但几乎所有的与“connect: Network is unreachable”提示的案例都没有帮助,但有没有更多一些线索。最后的侥幸的是,在Android-x86讨论组,搜索了上面的错误提示,偶然看到问题的答案:

layerscape:/ # ip rule add from all lookup main pref 0

是而以此为纪念!

你可能感兴趣的:(蹊跷的错误connect: Network is unreachable)