From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14583 invoked by alias); 16 Jun 2009 16:14:17 -0000 Received: (qmail 14572 invoked by uid 22791); 16 Jun 2009 16:14:15 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mail.systech.com (HELO mail.systech.com) (207.212.80.162) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 16 Jun 2009 16:14:07 +0000 Received: by mail.systech.com with Internet Mail Service (5.5.2653.19) id <2BJ12C4L>; Tue, 16 Jun 2009 09:13:18 -0700 Message-ID: From: Jay Foster To: 'Grant Edwards' , ecos-discuss@sources.redhat.com Date: Tue, 16 Jun 2009 16:14:00 -0000 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-IsSubscribed: yes Mailing-List: contact ecos-discuss-help@ecos.sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: ecos-discuss-owner@ecos.sourceware.org Subject: RE: [ECOS] Re: How to send UDP broadcast to 255.255.255.255? X-SW-Source: 2009-06/txt/msg00075.txt.bz2 You can try the following patch that someone added to my local source. It adds a CDL option (CYGOPT_NET_INET_FORCE_DIRECTED_BROADCAST) to modify this behavior (the default being the same behavior you have now). Sorry it isn't in "patch" format, but it is straight forward. What is not shown here is configuring this option to '0' in your applications .ecm or template file. int in_pcbladdr(inp, nam, plocal_sin) register struct inpcb *inp; struct sockaddr *nam; struct sockaddr_in **plocal_sin; { struct in_ifaddr *ia; register struct sockaddr_in *sin = (struct sockaddr_in *)nam; if (nam->sa_len != sizeof (*sin)) return (EINVAL); if (sin->sin_family != AF_INET) return (EAFNOSUPPORT); if (sin->sin_port == 0) return (EADDRNOTAVAIL); if (!TAILQ_EMPTY(&in_ifaddrhead)) { /* * 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. */ #define satosin(sa) ((struct sockaddr_in *)(sa)) #define sintosa(sin) ((struct sockaddr *)(sin)) #define ifatoia(ifa) ((struct in_ifaddr *)(ifa)) if (sin->sin_addr.s_addr == INADDR_ANY) sin->sin_addr = IA_SIN(TAILQ_FIRST(&in_ifaddrhead))->sin_addr; #ifdef CYGOPT_NET_INET_FORCE_DIRECTED_BROADCAST else if (sin->sin_addr.s_addr == (u_long)INADDR_BROADCAST && (TAILQ_FIRST(&in_ifaddrhead)->ia_ifp->if_flags & IFF_BROADCAST)) sin->sin_addr = satosin(&TAILQ_FIRST(&in_ifaddrhead)->ia_broadaddr)->sin_addr; #endif } if (inp->inp_laddr.s_addr == INADDR_ANY) { register struct route *ro; >From net.cdl: cdl_component CYGPKG_NET_INET { display "INET support" active_if CYGPKG_NET_STACK_INET flavor bool no_define default_value 1 description " This option enables support for INET (IP) network processing." define INET compile \ inet_addr.c \ inet_ntoa.c \ inet_ntop.c \ inet_pton.c \ bootp_support.c \ dhcp_support.c \ dhcp_prot.c \ network_support.c \ getproto.c \ getserv.c compile getaddrinfo.c \ ifaddrs.c cdl_option CYGOPT_NET_INET_FORCE_DIRECTED_BROADCAST { display "Convert limited broadcast addresses into directed broadcasts" flavor bool default_value 1 description " De-facto IP stack implementations often convert INADDR_BROADCAST destination addresses into a more specific directed broadcast address according to the address configuration of the primary network interface. Over time, this behavior has been criticized for various reasons. The primary reason is that it becomes impossible to send UDP packets to 255.255.255.255 once the primary network (broadcast) interface is configured with address information." } Jay -----Original Message----- From: Grant Edwards [mailto:grante@visi.com] Sent: Tuesday, June 16, 2009 7:23 AM To: ecos-discuss@sources.redhat.com Subject: [ECOS] Re: How to send UDP broadcast to 255.255.255.255? On 2009-06-16, Andrew Lunn wrote: > On Mon, Jun 15, 2009 at 05:41:54PM +0000, Grant Edwards wrote: >> I've been asked by one of my internal customers how to send a >> UDP broadcast packet to IP address 255.255.255.255. > > Hi Grant > > If you have a debugger handy, try putting a break point here: I don't have one handy, but it certainly looks like the right spot. > src/sys/netinet/in_pcb.c > int > in_pcbladdr(inp, nam, plocal_sin) > register struct inpcb *inp; > struct sockaddr *nam; > struct sockaddr_in **plocal_sin; > { > struct in_ifaddr *ia; > register struct sockaddr_in *sin = (struct sockaddr_in *)nam; > > if (nam->sa_len != sizeof (*sin)) > return (EINVAL); > if (sin->sin_family != AF_INET) > return (EAFNOSUPPORT); > if (sin->sin_port == 0) > return (EADDRNOTAVAIL); > if (!TAILQ_EMPTY(&in_ifaddrhead)) { > /* > * 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. > */ > #define satosin(sa) ((struct sockaddr_in *)(sa)) > #define sintosa(sin) ((struct sockaddr *)(sin)) > #define ifatoia(ifa) ((struct in_ifaddr *)(ifa)) > if (sin->sin_addr.s_addr == INADDR_ANY) > sin->sin_addr = IA_SIN(TAILQ_FIRST(&in_ifaddrhead))->sin_addr; > else if (sin->sin_addr.s_addr == (u_long)INADDR_BROADCAST && > (TAILQ_FIRST(&in_ifaddrhead)->ia_ifp->if_flags & IFF_BROADCAST)) > sin->sin_addr = satosin(&TAILQ_FIRST(&in_ifaddrhead)->ia_broadaddr)->sin_addr; > > Unfortunately, if this is the place the address is being changed, i > don't see an obvious way around this. I've been doing some experiments on a FreeBSD 6.1 system, and it won't allow applications to send a 255.255.255.255 broadcast either. In fact, it _requires_ you to specify the interface's broadcast address as a destination before in order to broadcast a packet. FreeBSD 6.1 won't "convert" 255.255.255.255 into the interface broadcast address the way that eCos does. Still, the Linux implementation seems to be a lot more useful. You can specify either 255.255.255.255 or the interface's broadcast address as the destination, and the packet is broadcast to that destination address. I found complaints dating back many years regarding FreeBSD's lack of ability to send broadcast UDP packets to 255.255.255.255. It seems you have to use the raw socket interface to do that. -- Grant Edwards grante Yow! Pardon me, but do you at know what it means to be visi.com TRULY ONE with your BOOTH! -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss