免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5037 | 回复: 4

BSD的TCPIP协议栈,不支持有限广播(255.255.255.255) 的问题 [复制链接]

论坛徽章:
0
发表于 2010-05-20 16:37 |显示全部楼层
本帖最后由 amaverick 于 2010-05-20 17:15 编辑

我从windows pc机(192.168.0.100)发送一个UDP的有限广播包(目的地址为255.255.255.255)
位于192.168.0.1的开发板收到后,发送UDP响应包的目的IP却成了 192.168.0.255 。我希望开发板的UDP 响应包的目的地址也为有限广播地址255.255.255.255 而不是直接广播地址192.168.0.255
上层用的是socket() , sendto() , recvfrom()。

开发板是一个用BSD TCPIP栈的路由器。
pc机发送广播包给开发板的eth0


查看了BSD的TCPIP协议栈源码。
在in_pcb.c 中的in_pcbconnect()中, 协议栈将目的地址255.255.255.255 改成了192.168.0.255
  1.         if (in_ifaddr.tqh_first != 0) {
  2.                 /*
  3.                  * If the destination address is INADDR_ANY,
  4.                  * use the primary local address.
  5.                  * If the supplied address is INADDR_BROADCAST,
  6.                  * and the primary interface supports broadcast,
  7.                  * choose the broadcast address for that interface.
  8.                  */
  9.                 if (sin->sin_addr.s_addr == INADDR_ANY)
  10.                         sin->sin_addr = in_ifaddr.tqh_first->ia_addr.sin_addr;
  11.                 else if (sin->sin_addr.s_addr == INADDR_BROADCAST &&
  12.                   (in_ifaddr.tqh_first->ia_ifp->if_flags & IFF_BROADCAST))
  13.                         sin->sin_addr = in_ifaddr.tqh_first->ia_broadaddr.sin_addr;//***这里
  14.         }
复制代码
同时,在ip_output.c 的 ip_output()中, 协议栈也将目的地址255.255.255.255改成了192.168.0.255
  1.         /*
  2.          * If routing to interface only,
  3.          * short circuit routing lookup.
  4.          */
  5.         if (flags & IP_ROUTETOIF) {
  6.                 if ((ia = ifatoia(ifa_ifwithdstaddr(sintosa(dst)))) == 0 &&
  7.                     (ia = ifatoia(ifa_ifwithnet(sintosa(dst)))) == 0) {
  8.                         ipstat.ips_noroute++;
  9.                         error = ENETUNREACH;
  10.                         goto bad;
  11.                 }
  12.                 ifp = ia->ia_ifp;
  13.                 ip->ip_ttl = 1;
  14.     } else if (!(IN_MULTICAST(ip->ip_dst.s_addr) && imo &&
  15.                       ((imo->imo_multicast_ifp != NULL)))) {
  16.                 if (ro->ro_rt == 0)
  17.                         rtalloc_mpath(ro, &ip->ip_src.s_addr, 0);
  18.                 if (ro->ro_rt == 0) {
  19.                         net_hook_func(NHOOK_L3_ROUTE_FAIL, &m, 0, 0);

  20.                         ipstat.ips_noroute++;
  21.                         error = EHOSTUNREACH;
  22.                         goto bad;
  23.                 }
  24.                 ia = ifatoia(ro->ro_rt->rt_ifa);
  25.                 ifp = ro->ro_rt->rt_ifp;

  26.                 ro->ro_rt->rt_use++;
  27.                 if (ro->ro_rt->rt_flags & RTF_GATEWAY)
  28.                         dst = satosin(ro->ro_rt->rt_gateway);//***这里
  29.         }
复制代码
我暂时将这两行注释掉。
这下开发板可以发出目的地址为255.255.255.255的UDP有限广播包了。但是源IP地址却变成了另一个接口(eth1而不是原来的eth0)的IP地址。
跟踪发现同样是在udp_output()调用的in_pcbconnect()中设置了源IP地址。

同样的程序,我在linux的协议栈下就可以达到预期的效果。BSD的就不行。
请熟悉BSD的TCPIP协议栈的朋友指点。
要解决BSD的TCPIP发送有限广播包,应给怎么做。或者如何改协议栈。

论坛徽章:
0
发表于 2010-05-20 16:49 |显示全部楼层
上层用的socket,并设置了SO_BROADCAST属性。这样在linux下就可以实现。BSD却不行。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
发表于 2010-05-21 23:22 |显示全部楼层
既然都知道哪了,咋不会改嗫

论坛徽章:
0
发表于 2010-06-04 09:09 |显示全部楼层
协议栈不好改,
最后还是绕过协议栈,通过 raw socket 解决的。

论坛徽章:
0
发表于 2012-06-29 16:38 |显示全部楼层
回复 4# amaverick


    开发板有网关吗?

如果没有网关能发送响应包吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP