免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1860 | 回复: 7
打印 上一主题 下一主题

[内核模块] linux内核数据包的流动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-26 12:44 |只看该作者 |倒序浏览
一个数据包经过一些处理后用ip_route_output_key和ip_local_out发送出去,然后我跟踪了一下数据包从ip_local_out出去后在内核中的流动,如下:@@@will enter ip_local_out
enter ip_loacl_out
enter __ip_loacl_out
in __ip_local_out: saddr:10.0.0.2
in __ip_local_out: daddr:20.0.0.2
in __ip_local_out: iph->tot_len = 15360
in __ip_local_out: over ip_send_check
in ip_local_out:err(1)=1
enter likely and will enter dst_output
enter ip_output
enter ip_finish_output
Don't fargmeng and enter ip_finish_output2
in ip_finish_output2: rt->rt_type=1
in ip_finish_output2: rt_flags =  0x0
in ip_finish_output2 router src address is 20.0.0.1
in ip_finish_output2 router dst address is 20.0.0.2
enter dst->hh
enter dev_queue_xmit
in ip_local_out:err(2)=0
@@@err = 0
enter ip_rcv
enter ip_rcv_finish
enter ip_forward
enter ip_forward_finish
enter ip_output
enter ip_finish_output
Don't fargmeng and enter ip_finish_output2
in ip_finish_output2: rt->rt_type=1
in ip_finish_output2: rt_flags =  0x4000000
in ip_finish_output2 router src address is 20.0.0.2
in ip_finish_output2 router dst address is 10.0.0.2
enter dst->neighbour
enter dev_queue_xmit
为什么走了两次dev_queue_xmit,第一次为什么没有把数据包发出去

论坛徽章:
0
2 [报告]
发表于 2013-12-26 12:46 |只看该作者
代码是这样的:struct flowi fl = {.oif = 0, /*.oif = t->parms.link,*/
                          .nl_u = {.ip4_u = {.daddr = dst,
                                                                 .saddr = 0,
                                                                 .tos = RT_TOS(tos)}},
                          .proto = IPPROTO_IPIP
                        };
                        if (ip_route_output_key(dev_net(t->dev), &rt, &fl))
                        {
                          t->dev->stats.tx_carrier_errors++;
                          goto discard;
                        }
                  }
..................................
err = ip_local_out(skb);       

论坛徽章:
0
3 [报告]
发表于 2013-12-26 15:57 |只看该作者
你是自己在内核中添加了打印信息然后编译了内核吗?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2013-12-26 16:26 |只看该作者
cu_sang 发表于 2013-12-26 12:44
一个数据包经过一些处理后用ip_route_output_key和ip_local_out发送出去,然后我跟踪了一下数据包从ip_loca ...

建议在dev_queue_xmit处使用dump_stack将完整的堆栈打印出来,就可以看到完整的调用链了~

论坛徽章:
0
5 [报告]
发表于 2013-12-26 16:47 |只看该作者
内核是编译过的回复 3# jasonsungblog


   

论坛徽章:
0
6 [报告]
发表于 2013-12-26 16:49 |只看该作者
没用过这个函数,能详细告知怎么用吗,是加在dev_queue_xmit函数的哪个位置,信息输出到屏幕上还是日志文件中?谢谢回复 4# humjb_1983


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2013-12-26 17:11 |只看该作者
cu_sang 发表于 2013-12-26 16:49
没用过这个函数,能详细告知怎么用吗,是加在dev_queue_xmit函数的哪个位置,信息输出到屏幕上还是日志文件 ...

就在dev_queue_xmit入口调用dump_stack()函数即可,堆栈默认打到messages中
dev_queue_xmit函数调用频率应该很高,建议对包过滤下,仅针对你的包打堆栈。

论坛徽章:
2
申猴
日期:2013-12-26 22:11:31天秤座
日期:2014-12-23 10:23:19
8 [报告]
发表于 2013-12-26 21:31 |只看该作者
很正常啊,像tun设备,macvlan这些基于物理设备的网卡。第一次dev_queue_xmit是这些虚拟设备的发包逻辑,第二次dev_queue_xmit是真正通过物理网卡发包
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP