Re: Do UDP broadcasts work in FreeBSD?

2009-01-08 Thread Pieter de Goeje
On Tuesday 06 January 2009 17:49:49 Peter Steele wrote:
 Our efforts so far indicate the answer is no, which baffles us. We want
 to send a limited broadcast to 255.255.255.255 but the message never
 arrives. The same code works fine under Linux. Is there a trick for
 doing this kind of thing under FreeBSD?

Did you enable SO_BROADCAST and IP_ONESBCAST on the socket? I remember needing 
this on FreeBSD but not on Linux. I know UDP broadcasting works fine, but is 
somewhat more involved:

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(130.89.191.255);
addr.sin_port = htons(UDP_PORT_ET);

optval = 1;
if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, optval, sizeof optval) == -1)
err(1, setsockopt);

optval = 1;
if(setsockopt(sock, IPPROTO_IP, IP_ONESBCAST, optval, sizeof optval) == -1)
err(1, setsockopt);

const char data[] = report;

if(sendto(sock, data, sizeof data, 0, (struct sockaddr*)addr, addrlen) == -1)
warn(sendto);


This code will send a packet with destination address 255.255.255.255, on the 
interface with broadcast address 130.89.191.255. netintro(4) talks about how 
to discover these addresses. SO_ONESBCAST is documented in ip(4), SO_BROADCAST 
in getsockopt(4).

-- 
Pieter de Goeje

___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org


RE: Do UDP broadcasts work in FreeBSD?

2009-01-08 Thread Peter Steele
Did you enable SO_BROADCAST and IP_ONESBCAST on the socket? I remember
needing 
this on FreeBSD but not on Linux.

Yes we did, but...

I know UDP broadcasting works fine, but is 
somewhat more involved:

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(130.89.191.255);
addr.sin_port = htons(UDP_PORT_ET);

You are using a subnet broadcast here. We are dealing with systems that
do not have IPs assigned, and as a result we have to send our broadcasts
to 255.255.255.255. This works fine on other operating systems but for
some reason the implementation is different on FreeBSD. It appears that
the only way this kind of broadcast can be sent on FreeBSD is using raw
sockets. This is how the FreeBSD DHCP client/server is written, so we're
taking that approach as well...


___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org


RE: Do UDP broadcasts work in FreeBSD?

2009-01-08 Thread Peter Steele
 why 255.255.255.255 not your net broadcast address?

Because the systems we are using do not have IPs assigned and you to
know your subnet before you can use subnet broadcasting. We're
developing our own DHCP-like service to distribute IPs to all of the
systems, and we need limited broadcast to 255.255.255.255 to do this.

___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org


Do UDP broadcasts work in FreeBSD?

2009-01-06 Thread Peter Steele
Our efforts so far indicate the answer is no, which baffles us. We want
to send a limited broadcast to 255.255.255.255 but the message never
arrives. The same code works fine under Linux. Is there a trick for
doing this kind of thing under FreeBSD?

 

___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org


Re: Do UDP broadcasts work in FreeBSD?

2009-01-06 Thread Wojciech Puchar

why 255.255.255.255 not your net broadcast address?

On Tue, 6 Jan 2009, Peter Steele wrote:


Our efforts so far indicate the answer is no, which baffles us. We want
to send a limited broadcast to 255.255.255.255 but the message never
arrives. The same code works fine under Linux. Is there a trick for
doing this kind of thing under FreeBSD?



___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org



___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org


Re: Do UDP broadcasts work in FreeBSD?

2009-01-06 Thread Chuck Swiger

On Jan 6, 2009, at 8:49 AM, Peter Steele wrote:
Our efforts so far indicate the answer is no, which baffles us. We  
want

to send a limited broadcast to 255.255.255.255 but the message never
arrives. The same code works fine under Linux. Is there a trick for
doing this kind of thing under FreeBSD?


What you're trying to do with sending to the all-ones broadcast  
address is known as sending a link-local packet.  On some systems,  
sending a UDP packet to 255.255.255.255 will actually cause a packet  
with that destination to be generated from all network interfaces  
which are UP.  That seems to be the behavior you are expecting.


On FreeBSD, IIRC, the behavior you get is that it will send to the  
local network broadcast address for each interface [1] using the  
network broadcast address (ie, if an interface is configured for  
10.1.1.1 with /16 netmask, the packet will have destination  
10.1.255.255).  If an interface is UP but not configured with an IP 
+netmask, I don't believe a packet will be sent.  (In fact, it might  
depend upon whether the BROADCAST flag is enabled, which gets set when  
an inet-enabled interface is setup with a netmask...)


Arguably, this is a bug in FreeBSD, but you can work around it by  
using the BPF interface to send the traffic directly rather than using  
the network stack via socket()+send()/write().  I believe the ISC DHCP  
server software provides examples of how to do this, as dhclient is  
commonly used to send DHCP requests to the all-ones broadcast addr,  
without needing an interface being configured with an IP


--
-Chuck

[1]: And I could be mis-remembering that part; it might do a routing  
table lookup and use only the interface which matches the destination  
IP, which is probably the default route.


___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org


RE: Do UDP broadcasts work in FreeBSD?

2009-01-06 Thread Peter Steele
 What you're trying to do with sending to the all-ones broadcast  
 address is known as sending a link-local packet.  On some systems,  
 sending a UDP packet to 255.255.255.255 will actually cause a packet  
 with that destination to be generated from all network interfaces  
 which are UP.  That seems to be the behavior you are expecting.

Yes it is. This is the behavior I've seen on every system I've used for
20+ years, except for FreeBSD.

 On FreeBSD, IIRC, the behavior you get is that it will send to the  
 local network broadcast address for each interface [1] using the  
 network broadcast address (ie, if an interface is configured for  
 10.1.1.1 with /16 netmask, the packet will have destination  
 10.1.255.255).  If an interface is UP but not configured with an IP 
 +netmask, I don't believe a packet will be sent.  (In fact, it might  
 depend upon whether the BROADCAST flag is enabled, which gets set when

 an inet-enabled interface is setup with a netmask...)

In our case our systems have no IP identity of any kind, and we don't
want to have to rely on whether or not our customers have a DHCP server
available. So we've come up with our own light DHCP. It works fine for
Linux and Windows. Not FreeBSD though.

 Arguably, this is a bug in FreeBSD

I don't think there is any doubt about that. And from what I understand
it even used to work under FreeBSD a few years ago.

 but you can work around it by  
 using the BPF interface to send the traffic directly rather than using

 the network stack via socket()+send()/write().  I believe the ISC DHCP

 server software provides examples of how to do this, as dhclient is  
 commonly used to send DHCP requests to the all-ones broadcast addr,  
 without needing an interface being configured with an IP

I've already looked at the ISC DHCP source code. They use raw sockets to
send their broadcasts, which seems to us to be a convoluted way of
sending a simple broadcast. I've seen examples of DHCP client/server
code written in Java using standard UDP. Unfortunately, our own system
is already largely implemented in Java/Python, so we'll need to provide
a JNI interface to support raw sockets. Alternatively we may patch the
kernel to fix the bug at its source.

___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org


RE: Do UDP broadcasts work in FreeBSD?

2009-01-06 Thread Peter Steele
 I've already looked at the ISC DHCP source code. They use raw sockets
to
 send their broadcasts, which seems to us to be a convoluted way of
 sending a simple broadcast. I've seen examples of DHCP client/server
 code written in Java using standard UDP. Unfortunately, our own system
 is already largely implemented in Java/Python, so we'll need to
provide
 a JNI interface to support raw sockets. Alternatively we may patch the
 kernel to fix the bug at its source.

Another option we're considering is to use the firewall to detect
broadcasts and rewrite the MAC addresses in the outgoing packets. In
looking at tcpdump output of broadcasts, the IP address is set to
255.255.255.255 and the MAC address is set to the MAC address of the
gateway. On Linux boxes the MAC address is ff:ff:ff:ff:ff:ff, and that's
the only significant difference in the packet. We thought we might be
able to come up with a firewall rule to detect broadcasts and change the
MAC address to the same as what Linux uses. I'm still in the process of
researching this, but if someone can tell me this is impossible, I'll
move on.

___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to freebsd-questions-unsubscr...@freebsd.org