蹊跷的错误connect: Network is unreach
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
是而以此为纪念!