linux 组播接收不到数据包的原因追踪

yunzhizi11 2015-07-31 12:01:15
各位网络界的大神好!小弟最近在Linux系统下测试板子对组播功能的支持。测试过程是这样的,从网络上找到的一个完整的组播收发程序,编译后在两台虚拟机上执行,能够成功的收到组播数据。但是交叉编译后下载到板子上运行则不能收到数据!
原因分析:
跟踪内核对组播数据的处理过程发现,在执行udp_rcv时调用了ip_local_deliver,接着又调用了udp_v4_mcast_next函数,在该函数中查询sk结构为空。故而降数据包丢弃了。
尝试规避丢弃的方法:
在追踪过程中,将上述函数查找sk失败的值打印了出来,inet->daddr和inet->dport均为0,且不等于rmt_daddr和rmt_dport的值,所以udp_v4_mcast_next判断没有找到正确的sk。
临时的解决办法是修改查找sk的判断条件来进行规避问题。但这样的做法需要涉及修改内核代码!!!强烈的不被允许。
现在的疑惑:
1、需要怎样设置才能让这个判断条件成立(等同于虚拟机和板子之间的区别在哪里)?
2、自己追查内核代码 ,struct inet_sock结构只有在创建socket时会赋值,且在绑定时会将收数据的接口地址赋值给Inet->saddr,inet->sport结构。从始至终内核中也没有对inet->daddr,inet->dport结构赋值的过程!!!!
以上是小弟的一些问题。希望大神们给小弟多多的帮助啊。再此以一谢过了的。还有,网络资料里很多同行也提到了同样的问题,均没有得到确切的解答。所以,还是希望大家协力给自己和别人帮助。谢谢!!!O(∩_∩)O~
...全文
1748 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2015-08-03
  • 打赏
  • 举报
回复
协议栈这一块儿,理论上虚拟机或者板子没啥区别。 在板子上,非组播的udp可以正常工作吗?如果可以,说明组播有一些不同于单播报文的逻辑。 不过看起来都是在比较inet->num/d_addr/dport/rcv_saddr? PS,对dport/d_addr的赋值,是在sys_connect中完成的。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧