On Wed, Jul 11, 2018 at 10:04:53AM +0200, Martin Pieuchot wrote:
> On 10/07/18(Tue) 18:01, Florian Obser wrote:
> > When an interface doesn't have a layer 2 address in6_get_soii_ifid()
> > failes and then later on a in in6_get_ifid() a layer 2 address is
> > "borrowed" from from another interface.
> >
> > Do the "borrowing" in in6_get_soii_ifid(), too so that semantically
> > opaque interface identifiers work for these kind of interfaces, too.
>
> Why do we need to borrow? Can't we generate a random one?
Sure, this was just an afterthough to the "stable IPv6 link local
addresses for interfaces without layer 2 addresses" diff.
phessler and me are still debating / wondering if we should get rid of
soii for link local addresses entirly. Since we haven't completly made
up our mind (actually, I asked for more time) it goes the same way as
in6_get_ifid() for now.
I find the whole borrowing here and in in6_get_ifid() stupid and want
to get rid of it, I haven't made up my mind yet on how.
>
> > diff --git in6_ifattach.c in6_ifattach.c
> > index f40b1905fe4..adc54b1a4da 100644
> > --- in6_ifattach.c
> > +++ in6_ifattach.c
> > @@ -216,8 +216,9 @@ in6_get_hw_ifid(struct ifnet *ifp, struct in6_addr *in6)
> > * in6 - upper 64bits are preserved
> > */
> > int
> > -in6_get_soii_ifid(struct ifnet *ifp, struct in6_addr *in6)
> > +in6_get_soii_ifid(struct ifnet *ifp0, struct in6_addr *in6)
> > {
> > + struct ifnet *ifp;
> > SHA2_CTX ctx;
> > u_int8_t digest[SHA512_DIGEST_LENGTH];
> > struct in6_addr prefix;
> > @@ -225,10 +226,25 @@ in6_get_soii_ifid(struct ifnet *ifp, struct in6_addr
> > *in6)
> > int dad_counter = 0; /* XXX not used */
> > char *addr;
> >
> > - if (ifp->if_xflags & IFXF_INET6_NOSOII)
> > + if (ifp0->if_xflags & IFXF_INET6_NOSOII)
> > return -1;
> >
> > - sdl = ifp->if_sadl;
> > + sdl = ifp0->if_sadl;
> > +
> > + if (sdl == NULL || sdl->sdl_alen == 0) {
> > + /*
> > + * try to get it from some other hardware interface like
> > + * in in6_get_ifid()
> > + */
> > + TAILQ_FOREACH(ifp, &ifnet, if_list) {
> > + if (ifp == ifp0)
> > + continue;
> > + sdl = ifp->if_sadl;
> > + if (sdl != NULL && sdl->sdl_alen != 0)
> > + break;
> > + }
> > + }
> > +
> > if (sdl == NULL || sdl->sdl_alen == 0)
> > return -1;
> >
> >
> >
> > --
> > I'm not entirely sure you are real.
> >
>
--
I'm not entirely sure you are real.