忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 4943 | 回复: 7

[网络子系统] 请教驱动程序调用sock_sendmsg的问题 【已解决】 [复制链接]

论坛徽章:
21
亥猪
日期:2013-09-29 08:49:05黑曼巴
日期:2016-06-28 17:38:592016科比退役纪念章
日期:2016-06-28 17:38:5915-16赛季CBA联赛之同曦
日期:2017-02-27 10:48:0215-16赛季CBA联赛之八一
日期:2017-06-23 16:12:4815-16赛季CBA联赛之北控
日期:2017-06-23 16:13:05黑曼巴
日期:2017-07-19 11:07:22黑曼巴
日期:2018-03-07 16:49:35CU十四周年纪念徽章
日期:2018-06-19 21:17:582015-2016NBA季后赛纪念章
日期:2016-06-28 17:38:59技术图书徽章
日期:2016-05-06 16:25:34处女座
日期:2014-02-28 14:13:05
发表于 2012-10-10 13:47 |显示全部楼层
本帖最后由 angeltears 于 2012-10-11 12:56 编辑

我需要在驱动程序中向网络发UDP包,目前是这么处理的。
1. 使用int sock_create(int family, int type, int protocol, struct socket **res)创建socket;
2. 构造结构体struct msghdr,然后调用int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)发送数据包。

但是这样存在一个问题:
用Wireshark抓包发现,ARP查询成功后,数据包能够成功发送,但是最开始的几个包发送不出去。

如果在应用层先ping目的IP地址,这样ARP查询就在sendmsg()之前,这样的话,所有的数据包都能成功发送。

请问大家有没有碰到类似的问题,应该从哪里着手处理?

论坛徽章:
0
发表于 2012-10-10 18:16 |显示全部楼层
你的内核中是否包含了ARP的部分!

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-10-11 08:33 |显示全部楼层
回复 1# angeltears
这个应该不会吧。发送3层数据的时候,如果没有对应的neigh结果,会自动发起arp查询的啊。

   

论坛徽章:
21
亥猪
日期:2013-09-29 08:49:05黑曼巴
日期:2016-06-28 17:38:592016科比退役纪念章
日期:2016-06-28 17:38:5915-16赛季CBA联赛之同曦
日期:2017-02-27 10:48:0215-16赛季CBA联赛之八一
日期:2017-06-23 16:12:4815-16赛季CBA联赛之北控
日期:2017-06-23 16:13:05黑曼巴
日期:2017-07-19 11:07:22黑曼巴
日期:2018-03-07 16:49:35CU十四周年纪念徽章
日期:2018-06-19 21:17:582015-2016NBA季后赛纪念章
日期:2016-06-28 17:38:59技术图书徽章
日期:2016-05-06 16:25:34处女座
日期:2014-02-28 14:13:05
发表于 2012-10-11 09:39 |显示全部楼层
回复 3# 瀚海书香

谢谢版主的答复。
问题就在网络协议栈进行arp查询的时候,sock_sendmsg还在不停地调用。我怀疑在此时,网络协议栈把之前的数据丢弃了。仅仅是怀疑,因为我没有看到网络协议栈对此的处理。

论坛徽章:
21
亥猪
日期:2013-09-29 08:49:05黑曼巴
日期:2016-06-28 17:38:592016科比退役纪念章
日期:2016-06-28 17:38:5915-16赛季CBA联赛之同曦
日期:2017-02-27 10:48:0215-16赛季CBA联赛之八一
日期:2017-06-23 16:12:4815-16赛季CBA联赛之北控
日期:2017-06-23 16:13:05黑曼巴
日期:2017-07-19 11:07:22黑曼巴
日期:2018-03-07 16:49:35CU十四周年纪念徽章
日期:2018-06-19 21:17:582015-2016NBA季后赛纪念章
日期:2016-06-28 17:38:59技术图书徽章
日期:2016-05-06 16:25:34处女座
日期:2014-02-28 14:13:05
发表于 2012-10-11 12:54 |显示全部楼层
原因找到了:在ARP查询没有回应之前,邻居子系统对数据包的缓存是有限的(3个skb)。
具体见如下代码:
  1.         if (neigh->nud_state == NUD_INCOMPLETE) {
  2.                 if (skb) {
  3.                         if (skb_queue_len(&neigh->arp_queue) >=
  4.                             neigh->parms->queue_len) {
  5.                                 struct sk_buff *buff;
  6.                                 buff = neigh->arp_queue.next;
  7.                                 __skb_unlink(buff, &neigh->arp_queue);
  8.                                 kfree_skb(buff);
  9.                         }
  10.                         __skb_queue_tail(&neigh->arp_queue, skb);
  11.                 }
  12.                 rc = 1;
  13.         }
复制代码

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-10-11 15:32 |显示全部楼层
回复 5# angeltears
多谢分享!

   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-10-11 15:32 |显示全部楼层
本帖最后由 瀚海书香 于 2012-10-11 15:35 编辑

回复 5# angeltears
如果确定是这个问题引起的,可以增大这个队列的值,来解决这个问题。
echo 16 > /proc/sys/net/ipv4/neigh/{eth0}/unres_qlen

   

论坛徽章:
27
15-16赛季CBA联赛之江苏
日期:2018-07-27 13:03:112015亚冠之水原三星
日期:2015-11-03 14:09:182015亚冠之柏太阳神
日期:2015-07-18 14:24:16羊年新春福章
日期:2015-04-07 10:31:532015年亚洲杯之澳大利亚
日期:2015-03-09 16:09:08羊年新春福章
日期:2015-02-02 17:40:57处女座
日期:2014-12-18 15:37:46白羊座
日期:2014-11-20 15:41:48巨蟹座
日期:2014-11-07 13:52:59亥猪
日期:2014-09-29 11:27:59黄金圣斗士
日期:2015-11-13 16:34:5715-16赛季CBA联赛之新疆
日期:2016-01-22 13:54:28
发表于 2012-10-11 15:41 |显示全部楼层
不错 回复 5# angeltears


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP