linux 组播接收不到数据包的原因追踪
各位网络界的大神好!小弟最近在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~