Date: Fri, 9 Apr 2004 04:27:20 -0700 From: Luigi Rizzo <rizzo@icir.org> To: ume@freebsd.org, net@freebsd.org, ru@freebsd.org, andre@freebsd.org Cc: current@freebsd.org Subject: suggested patches for netinet6/ Message-ID: <20040409042720.A99087@xorpc.icir.org>
next in thread | raw e-mail | index | archive | help
While adapting to ipv6 the new arp table code I am developing following Andre's ideas, i hit a few places that would deserve a fix independently of that: + nd6_nud_hint() is only called as nd6_nud_hint(NULL, NULL, 0); in some cases from netinet/tcp_input.c With these args, the routine is a NOP. I propose to remove it (and the associated field, ln_byhint, in struct llinfo_nd6) + In a couple of places, the logic to compute 'olladdr' and 'llchange' is rather convoluted, and it could be greatly simplified (see below) + nd6_output() contains a tail-recursive call which certainly can be removed by using a 'goto' near the beginning of the function (or maybe in a better way!) Also: + in nd6_na_input() we are responding to an nd6 message on interface 'ifp', so i guess in the routine rt->rt_ifp == ifp, and we can use the latter when needed instead of rt->rt_ifp ? + is it ok to remove the __P() from the header files, ANSIfy the function declarations and make them static as appropriate ? Of course this ought to be done as a separate step. I am attaching the relevant snippets of the diff... Can anyone comment ? Any objection if i commit the trivial fixes to the first 3 issues above ? What about the style changes ? cheers luigi Index: nd6.c =================================================================== - olladdr = (sdl->sdl_alen) ? 1 : 0; - if (olladdr && lladdr) { - if (bcmp(lladdr, LLADDR(sdl), ifp->if_addrlen)) - llchange = 1; - else - llchange = 0; - } else - llchange = 0; + olladdr = ln->ln_state >= ND6_LLINFO_REACHABLE; + llchange = olladdr && lladdr && bcmp(lladdr, &ln->ll_addr, ifp->if_addrlen); @@ -1844,11 +1836,8 @@ nd6_output(ifp, origifp, m0, dst, rt0) +again: /* * next hop determination. This routine is derived from ether_outpout. */ if (rt) { if ((rt->rt_flags & RTF_UP) == 0) { rt0 = rt = rtalloc1((struct sockaddr *)dst, 1, 0UL); if (rt != NULL) { RT_REMREF(rt); RT_UNLOCK(rt); - if (rt->rt_ifp != ifp) { - /* XXX: loop care? */ - return nd6_output(ifp, origifp, m0, - dst, rt); - } + if (rt->rt_ifp != ifp) + goto again; /* rt has changed. */ } else senderr(EHOSTUNREACH); } Index: nd6_nbr.c =================================================================== @@ -653,17 +650,9 @@ nd6_na_input(m, off, icmp6len) /* * Check if the link-layer address has changed or not. */ - if (!lladdr) - llchange = 0; - else { - if (sdl->sdl_alen) { - if (bcmp(lladdr, LLADDR(sdl), ifp->if_addrlen)) - llchange = 1; - else - llchange = 0; - } else - llchange = 1; - } + llchange = lladdr && + ( (ln->ln_state < ND6_LLINFO_REACHABLE) || + bcmp(lladdr, &ln->l3_addr, ifp->if_addrlen) ); @@ -744,7 +728,7 @@ nd6_na_input(m, off, icmp6len) * context. However, we keep it just for safety. */ s = splnet(); - dr = defrouter_lookup(in6, rt->rt_ifp); + dr = defrouter_lookup(&ln->l3_addr, ifp); if (dr) defrtrlist_del(dr); else if (!ip6_forwarding && ip6_accept_rtadv) { @@ -755,21 +739,25 @@ nd6_na_input(m, off, icmp6len) * (e.g. redirect case). So we must * call rt6_flush explicitly. */ - rt6_flush(&ip6->ip6_src, rt->rt_ifp); + rt6_flush(&ip6->ip6_src, ifp); } splx(s); } ln->ln_router = is_router; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040409042720.A99087>