- 论坛徽章:
- 0
|
本帖最后由 NewCore 于 2017-02-15 01:28 编辑
各位,现在我基于andriod终端上开发一个功能,需要虚拟一个网卡rndis0,并通过rndis0来访问外网。
问题的现象是:
1. 在终端上通过ping命令ping任意外网IP(比如baidu.com, qq.com),都能够ping通过,并且确认reply的数据包是外网IP返回的;
2. 在终端上通过浏览器或其他上网的APP来访问外网,无法正常访问。以浏览器为例,同时输入www.baidu.com,或者baidu.com对应的ip地址,均无法打开baidu首页。同时,查看到rndis0上的tx数据包计数,并没有变化。于是推测是通过终端上的浏览器或ip访问,数据包被丢弃了,并没有到达rndis网卡,从而数据包计数没有变化。
针对以上现象,考虑在通过浏览器访问域名或ip的时候,跟踪kernel的网络数据包发送流程。
现在的问题是:
1. 我的测试步骤是,在终端浏览器中输入域名或ip地址,点击浏览器的“转到”,发现某些时候数据包发送流程会打印出来,比如会看到
tcp_write_xmit->ip_queue_xmit的调用(我在这两个函数中均添加了打印),但是某些时候,同样的操作步骤,却发现有的时候不会打印出来tcp_write_xmit及ip_queue_xmit的调用。
所以,我的第一个问题是:ip_queue_xmit的调用时机是什么?按照我的操作步骤,每次都应该有http的数据包发送,那么不应该每次点击浏览器中的“转到”,就应该有这个调用流程打印出来吗?
2. 针对我上面描述的问题(即除了ping命令,rndis的tx数据包没有变化),是否可以认为是数据包在某个地方被丢弃了?我这种验证试验的思路是否可行?(如上所述,从打印log来看,实际上在某些时候,ip_queue_xmit也是有调用到的,这是否说明实际上数据包也是到了IP层的,说明路由这些都是OK的吧,那么还会在哪里可能把数据包丢掉呢?)
谢谢各位回答,顺祝新年快乐~
|
|