Multicast source address in recvfrom()

Derek Tattersall dlt at mebtel.net
Tue Feb 3 04:27:41 PST 2009


* Robert Watson <rwatson at FreeBSD.org> [090203 06:17]:
> 
> >* Robert Watson <rwatson at FreeBSD.org> [090202 17:06]:
> >>On Sun, 1 Feb 2009, Derek Tattersall wrote:
> >>
> >>>In order to become familiar with multicast implementation using FreeBSD, 
> >>>I found via Google a pair of test programs which multicast sent a simple 
> >>>text message and received the text message.  I added some code to report 
> >>>the source address, because none of the references that I looked at 
> >>>specified the source IP address in the frame.
> >>>
> >>>I ran the sender on A -current system, AMD64 vintage last week.  The 
> >>>receiver was on a -current system I386 vintage last week.  TCPDUMP shows 
> >>>the source IP address in the frame as (correctly) 192.168.0.15.  The 
> >>>receiver reports the source IP address as 200.231.191.191.  I have also 
> >>>run the same test with an OpenBSD 4.4 Release I386 system as the 
> >>>receiver. The openBSD system reports the sender as 192.168.0.15.  A 
> >>>Fedora 10 system reported the source IP address as 0.0.0.0.
> >>>
> >>>Googling the RFCs and other information and referring to Comer's and 
> >>>Stevens' books on TCPIP I can't determine what should be reported.  Does 
> >>>anybody have clue for me?
> >>
> >>It might depend on how you're querying the source address.  Could you 
> >>post a code excerpt?
> >
> >It's a straightforward test program.
> 
> Your assumption, that the address returned from recvfrom(2) should be 
> correct, seems generally right to me.  However, it looks like you may not 
> be initializing senderLen to the size of senderAddr, which means that the 
> size getting passed in may be random stack garbage.  In which case what you 
> find in the sockaddr_in might also be random stack garbage, or might be the 
> address, depending on whether the uninitialized length was long enough to 
> fit an IP address in.  Could you try adding something like:
> 
> 	senderLen = sizeof(senderAddr);
> 
> before the call to recvfrom(2)?
> 
> Thanks,
> 
> Robert N M Watson
> Computer Laboratory
> University of Cambridge
> 
-------------------------------- Snip test program ---------------
You nailed it!  Initializing the length of the sockaddr stucture was the
answer.  Thanks very much for pointing out the flaw.

-- 
Best regards,
Derek Tattersall
dlt at mebtel.net		dlt666 at yahoo.com		 dtatters at gmail.com


More information about the freebsd-net mailing list