Improved seed for zcip

Joachim Nilsson joachim.nilsson at vmlinux.org
Fri Oct 31 11:55:06 UTC 2008


On Fri, Oct 31, 2008 at 02:15:34AM +0100, Denys Vlasenko wrote:
> On Wednesday 29 October 2008 23:29, Joachim Nilsson wrote:
> > When I run udhcpc, with zcip as fallback, simultaneously on many
> > VLAN interfaces I get exactly the same link-local address assigned
> > for all of them.  It  turns out the random seed basically just uses
> > the MAC address, which for VLAN interfaces is shared with the base
> > interface.  To fix this I added the ifindex of the requested iface
> > to the seed and everything works much better.
> So the addresses now *most of the time, but not always*
> are different. Not so good. You still need to have a mechanism
> to prevent collisions, but now you have an excuse to
> not do it - it does not happen all the time ;)

This was just to correct the seeding so that local interfaces are not
seeded the same way.  This seed could probably be made even better, 
but I didn't know how, so I just used the ifindex. 

The link-local protocol has its own built-in back-off algorithm to
prevent address collisions, which I didn't study in detail.

> But more to it, I do not really understand how it works
> at all when you have more than one zcip-controlled inteface.
> All ifaces get 169.254.x.x addresses. Let's imagine
> I want to talk to the remote host 169.254.22.33,
> from which iface should I (or kernel) send the packet?
> How does it work in practice?

Hmm, you have good point here. :)

Incoming packets should be no problem, the headache starts when
the system sends the reply.  The route for 169.254.0.0/16 will
become the first zcip-assigned interface, which is subject to
race.

I clearly hadn't thought this through fully.  Maybe different routing
tables can help?  Something like this:

   http://pontus.ullgren.com/view/Multiple_interfaces_on_the_same_subnet

> > -		memcpy(&t, (char*)&eth_addr + 2, 4);
> > +		memcpy(&t, (char*)&eth_addr + 2 + if_nametoindex(intf), 4);
> Oops... you added if_nametoindex() to the _address_!
> You had to add it to t here:
> >  		srand(t);
> >  	}

Yes, that was surely not my intention, but perhaps makes an even better
seed? ;-)

Regards
 /Jocke

--  
Joachim Nilsson :: <joachim AT vmlinux DOT org>
+46(0)21-123348 :: <http://vmlinux.org/joachim>



More information about the busybox mailing list