Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Jun 2007 18:49:54 +0100
From:      "Bruce M. Simpson" <bms@incunabulum.net>
To:        Ian FREISLICH <ianf@clue.co.za>
Cc:        current@freebsd.org
Subject:   Re: Multicast problems
Message-ID:  <4676C5C2.9030900@incunabulum.net>
In-Reply-To: <E1I0FdR-0000LI-SA@clue.co.za>
References:  <E1I0FdR-0000LI-SA@clue.co.za>

next in thread | previous in thread | raw e-mail | index | archive | help
Ian FREISLICH wrote:
> It looks like it just uses IP_ADD_MEMBERSHIP.  HAVE_BSD_STRUCT_IP_MREQ_HACK
> is defined.  I really don't know anything about how it should be
> doing this to say whether the above code is correct.
>   
This is expected behaviour. The new code phases out the hack which this 
define refers to, which is to encode 24 bits of an interface index in 
0.0.0.0/8 (first 8 bits set to zero).

The reason why the hack was needed in the first place is because of how 
the BSD INADDR_TO_IFP() lookup works with regards to unnumbered and 
point-to-point interfaces, as described in UPDATING.

The issue with joining groups on INADDR_ANY is separate from this -- it 
is related only insofaras code which still expects to abuse the RFC 1724 
style behaviour (0.0.0.0/8) is going to end up with INADDR_TO_IFP 
returning NULL, and will hit the same path. I would expect Quagga to 
fail to add the group with EADDRNOTAVAIL.

There have been attempts to fix this in NetBSD differently, by changing 
the lookup, however, I should point out that it still doesn't fix the 
issue with unnumbered interfaces:
    http://mail-index.netbsd.org/netbsd-bugs/1999/04/02/0001.html

I didn't roll a patch for Quagga as it's not part of the base system. 
Making the required change shouldn't be difficult. It is probably easier 
for the purposes of Quagga to use the Linux-derived ip_mreqn extension 
to the IP_MULTICAST_IF ioctl for interface selection, as ospf should be 
using a locally-scoped address (224.0.0.5 falls under the local 
administrative scope 224.0.0.0/8) -- although the MCAST_JOIN_GROUP ioctl 
is the one to use if one needs to bind to an interface by index and be 
sure that it actually worked.

The patch for Rhyolite routed demonstrates both techniques. It is 
available here:
    http://people.freebsd.org/~bms/dump/routed.rfc3678.diff

Kind regards,
BMS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4676C5C2.9030900>