- 论坛徽章:
- 0
|
本帖最后由 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- if (in_ifaddr.tqh_first != 0) {
- /*
- * If the destination address is INADDR_ANY,
- * use the primary local address.
- * If the supplied address is INADDR_BROADCAST,
- * and the primary interface supports broadcast,
- * choose the broadcast address for that interface.
- */
- if (sin->sin_addr.s_addr == INADDR_ANY)
- sin->sin_addr = in_ifaddr.tqh_first->ia_addr.sin_addr;
- else if (sin->sin_addr.s_addr == INADDR_BROADCAST &&
- (in_ifaddr.tqh_first->ia_ifp->if_flags & IFF_BROADCAST))
- sin->sin_addr = in_ifaddr.tqh_first->ia_broadaddr.sin_addr;//***这里
- }
复制代码 同时,在ip_output.c 的 ip_output()中, 协议栈也将目的地址255.255.255.255改成了192.168.0.255- /*
- * If routing to interface only,
- * short circuit routing lookup.
- */
- if (flags & IP_ROUTETOIF) {
- if ((ia = ifatoia(ifa_ifwithdstaddr(sintosa(dst)))) == 0 &&
- (ia = ifatoia(ifa_ifwithnet(sintosa(dst)))) == 0) {
- ipstat.ips_noroute++;
- error = ENETUNREACH;
- goto bad;
- }
- ifp = ia->ia_ifp;
- ip->ip_ttl = 1;
- } else if (!(IN_MULTICAST(ip->ip_dst.s_addr) && imo &&
- ((imo->imo_multicast_ifp != NULL)))) {
- if (ro->ro_rt == 0)
- rtalloc_mpath(ro, &ip->ip_src.s_addr, 0);
- if (ro->ro_rt == 0) {
- net_hook_func(NHOOK_L3_ROUTE_FAIL, &m, 0, 0);
- ipstat.ips_noroute++;
- error = EHOSTUNREACH;
- goto bad;
- }
- ia = ifatoia(ro->ro_rt->rt_ifa);
- ifp = ro->ro_rt->rt_ifp;
- ro->ro_rt->rt_use++;
- if (ro->ro_rt->rt_flags & RTF_GATEWAY)
- dst = satosin(ro->ro_rt->rt_gateway);//***这里
- }
复制代码 我暂时将这两行注释掉。
这下开发板可以发出目的地址为255.255.255.255的UDP有限广播包了。但是源IP地址却变成了另一个接口(eth1而不是原来的eth0)的IP地址。
跟踪发现同样是在udp_output()调用的in_pcbconnect()中设置了源IP地址。
同样的程序,我在linux的协议栈下就可以达到预期的效果。BSD的就不行。
请熟悉BSD的TCPIP协议栈的朋友指点。
要解决BSD的TCPIP发送有限广播包,应给怎么做。或者如何改协议栈。 |
|