On Sat, Oct 24, 2015 at 06:22:10PM +0200, Martin Pieuchot wrote: > On 24/10/15(Sat) 18:01, Martin Pieuchot wrote: > > Revamping the network stack design continue here at u2k15... > > > > This times it's about the L2 resolution mechanism plugged into the > > routing table. While discussing with Alexander we figured out that > > the actual ifa_rtrequest() is always called with a valid ``ifp''... > > > > So this diff change this function into a per-ifp one an pass an ifp > > pointer as first argument. This makes obvious that if_get/if_put is > > not needed there. > > > > As a side effect arp_ifinit() can now die since every Ethernet driver > > initialize if_rtrequest in ether_ifattach(). > > Now with a dummy function as suggested by Claudio. > > ok?
I like this. Two comments inline. Anyway, OK claudio > Index: net/if.c > =================================================================== > RCS file: /cvs/src/sys/net/if.c,v > retrieving revision 1.394 > diff -u -p -r1.394 if.c > --- net/if.c 24 Oct 2015 10:52:05 -0000 1.394 > +++ net/if.c 24 Oct 2015 16:19:49 -0000 > @@ -520,6 +520,7 @@ if_attach_common(struct ifnet *ifp) > M_TEMP, M_WAITOK); > TAILQ_INIT(ifp->if_detachhooks); > > + ifp->if_rtrequest = if_rtrequest_dummy; > ifp->if_slowtimo = malloc(sizeof(*ifp->if_slowtimo), M_TEMP, > M_WAITOK|M_ZERO); > ifp->if_watchdogtask = malloc(sizeof(*ifp->if_watchdogtask), > @@ -1273,14 +1274,18 @@ ifaof_ifpforaddr(struct sockaddr *addr, > return (ifa_maybe); > } > > +void > +if_rtrequest_dummy(struct ifnet *ifp, int req, struct rtentry *rt) > +{ > +} > + > /* > * Default action when installing a local route on a point-to-point > * interface. > */ > void > -p2p_rtrequest(int req, struct rtentry *rt) > +p2p_rtrequest(struct ifnet *ifp, int req, struct rtentry *rt) > { > - struct ifnet *ifp = rt->rt_ifp; > struct ifaddr *ifa, *lo0ifa; > > switch (req) { > Index: net/if_ethersubr.c > =================================================================== > RCS file: /cvs/src/sys/net/if_ethersubr.c,v > retrieving revision 1.229 > diff -u -p -r1.229 if_ethersubr.c > --- net/if_ethersubr.c 22 Oct 2015 15:37:47 -0000 1.229 > +++ net/if_ethersubr.c 24 Oct 2015 16:19:49 -0000 > @@ -161,6 +161,23 @@ ether_ioctl(struct ifnet *ifp, struct ar > return (error); > } > > + > +void > +ether_rtrequest(struct ifnet *ifp, int req, struct rtentry *rt) > +{ > + switch (rt_key(rt)->sa_family) { > + case AF_INET: > + arp_rtrequest(ifp, req, rt); > + break; > +#ifdef INET6 > + case AF_INET6: > + nd6_rtrequest(ifp, req, rt); > + break; > +#endif > + default: > + break; > + } > +} > /* > * Ethernet output routine. > * Encapsulate a packet of type family for the local net. > @@ -505,6 +522,7 @@ ether_ifattach(struct ifnet *ifp) > ifp->if_hdrlen = ETHER_HDR_LEN; > ifp->if_mtu = ETHERMTU; > ifp->if_output = ether_output; > + ifp->if_rtrequest = ether_rtrequest; > > if_ih_insert(ifp, ether_input, NULL); > > Index: net/if_gif.c > =================================================================== > RCS file: /cvs/src/sys/net/if_gif.c,v > retrieving revision 1.80 > diff -u -p -r1.80 if_gif.c > --- net/if_gif.c 28 Sep 2015 08:32:05 -0000 1.80 > +++ net/if_gif.c 24 Oct 2015 16:19:49 -0000 > @@ -120,6 +120,7 @@ gif_clone_create(struct if_clone *ifc, i > sc->gif_if.if_ioctl = gif_ioctl; > sc->gif_if.if_start = gif_start; > sc->gif_if.if_output = gif_output; > + sc->gif_if.if_rtrequest = p2p_rtrequest; > sc->gif_if.if_type = IFT_GIF; > IFQ_SET_MAXLEN(&sc->gif_if.if_snd, IFQ_MAXLEN); > IFQ_SET_READY(&sc->gif_if.if_snd); > @@ -326,7 +327,6 @@ gif_ioctl(struct ifnet *ifp, u_long cmd, > { > struct gif_softc *sc = (struct gif_softc*)ifp; > struct ifreq *ifr = (struct ifreq *)data; > - struct ifaddr *ifa = (struct ifaddr *)data; > int error = 0, size; > struct sockaddr *dst, *src; > struct sockaddr *sa; > @@ -335,7 +335,6 @@ gif_ioctl(struct ifnet *ifp, u_long cmd, > > switch (cmd) { > case SIOCSIFADDR: > - ifa->ifa_rtrequest = p2p_rtrequest; > break; > > case SIOCSIFDSTADDR: > Index: net/if_gre.c > =================================================================== > RCS file: /cvs/src/sys/net/if_gre.c,v > retrieving revision 1.75 > diff -u -p -r1.75 if_gre.c > --- net/if_gre.c 16 Jul 2015 16:12:15 -0000 1.75 > +++ net/if_gre.c 24 Oct 2015 16:19:49 -0000 > @@ -132,6 +132,7 @@ gre_clone_create(struct if_clone *ifc, i > sc->sc_if.if_flags = IFF_POINTOPOINT|IFF_MULTICAST; > sc->sc_if.if_output = gre_output; > sc->sc_if.if_ioctl = gre_ioctl; > + sc->sc_if.if_rtrequest = p2p_rtrequest; > sc->sc_if.if_collisions = 0; > sc->sc_if.if_ierrors = 0; > sc->sc_if.if_oerrors = 0; > @@ -436,7 +437,6 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, > { > > struct ifreq *ifr = (struct ifreq *)data; > - struct ifaddr *ifa = (struct ifaddr *)data; > struct if_laddrreq *lifr = (struct if_laddrreq *)data; > struct ifkalivereq *ikar = (struct ifkalivereq *)data; > struct gre_softc *sc = ifp->if_softc; > @@ -450,7 +450,6 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, > switch(cmd) { > case SIOCSIFADDR: > ifp->if_flags |= IFF_UP; > - ifa->ifa_rtrequest = p2p_rtrequest; > break; > case SIOCSIFDSTADDR: > break; > Index: net/if_loop.c > =================================================================== > RCS file: /cvs/src/sys/net/if_loop.c,v > retrieving revision 1.71 > diff -u -p -r1.71 if_loop.c > --- net/if_loop.c 12 Sep 2015 13:34:12 -0000 1.71 > +++ net/if_loop.c 24 Oct 2015 16:19:50 -0000 > @@ -168,6 +168,7 @@ loop_clone_create(struct if_clone *ifc, > ifp->if_softc = NULL; > ifp->if_mtu = LOMTU; > ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST; > + ifp->if_rtrequest = lortrequest; > ifp->if_ioctl = loioctl; > ifp->if_output = looutput; > ifp->if_type = IFT_LOOP; > @@ -217,7 +218,7 @@ looutput(struct ifnet *ifp, struct mbuf > > /* ARGSUSED */ > void > -lortrequest(int cmd, struct rtentry *rt) > +lortrequest(struct ifnet *ifp, int cmd, struct rtentry *rt) > { > if (rt && rt->rt_rmx.rmx_mtu == 0) > rt->rt_rmx.rmx_mtu = LOMTU; > @@ -230,7 +231,6 @@ lortrequest(int cmd, struct rtentry *rt) > int > loioctl(struct ifnet *ifp, u_long cmd, caddr_t data) > { > - struct ifaddr *ifa; > struct ifreq *ifr; > int error = 0; > > @@ -239,10 +239,6 @@ loioctl(struct ifnet *ifp, u_long cmd, c > case SIOCSIFADDR: > ifp->if_flags |= IFF_RUNNING; > if_up(ifp); /* send up RTM_IFINFO */ > - > - ifa = (struct ifaddr *)data; > - if (ifa != 0) > - ifa->ifa_rtrequest = lortrequest; > /* > * Everything else is done at a higher level. > */ > Index: net/if_ppp.c > =================================================================== > RCS file: /cvs/src/sys/net/if_ppp.c,v > retrieving revision 1.90 > diff -u -p -r1.90 if_ppp.c > --- net/if_ppp.c 12 Oct 2015 13:17:58 -0000 1.90 > +++ net/if_ppp.c 24 Oct 2015 16:19:50 -0000 > @@ -223,6 +223,7 @@ ppp_clone_create(struct if_clone *ifc, i > sc->sc_if.if_ioctl = pppsioctl; > sc->sc_if.if_output = pppoutput; > sc->sc_if.if_start = ppp_ifstart; > + sc->sc_if.if_rtrequest = p2p_rtrequest; > IFQ_SET_MAXLEN(&sc->sc_if.if_snd, IFQ_MAXLEN); > mq_init(&sc->sc_inq, IFQ_MAXLEN, IPL_NET); > IFQ_SET_MAXLEN(&sc->sc_fastq, IFQ_MAXLEN); > @@ -593,7 +594,6 @@ pppsioctl(struct ifnet *ifp, u_long cmd, > case SIOCSIFADDR: > if (ifa->ifa_addr->sa_family != AF_INET) > error = EAFNOSUPPORT; > - ifa->ifa_rtrequest = p2p_rtrequest; > break; > > case SIOCSIFDSTADDR: > Index: net/if_pppoe.c > =================================================================== > RCS file: /cvs/src/sys/net/if_pppoe.c,v > retrieving revision 1.48 > diff -u -p -r1.48 if_pppoe.c > --- net/if_pppoe.c 13 Sep 2015 17:53:44 -0000 1.48 > +++ net/if_pppoe.c 24 Oct 2015 16:19:50 -0000 > @@ -228,6 +228,7 @@ pppoe_clone_create(struct if_clone *ifc, > sc->sc_sppp.pp_framebytes = PPPOE_HEADERLEN; /* framing added to ppp > packets */ > sc->sc_sppp.pp_if.if_ioctl = pppoe_ioctl; > sc->sc_sppp.pp_if.if_start = pppoe_start; > + sc->sc_sppp.pp_if.if_rtrequest = p2p_rtrequest; > sc->sc_sppp.pp_tls = pppoe_tls; > sc->sc_sppp.pp_tlf = pppoe_tlf; > IFQ_SET_MAXLEN(&sc->sc_sppp.pp_if.if_snd, IFQ_MAXLEN); > Index: net/if_pppx.c > =================================================================== > RCS file: /cvs/src/sys/net/if_pppx.c,v > retrieving revision 1.43 > diff -u -p -r1.43 if_pppx.c > --- net/if_pppx.c 6 Sep 2015 12:59:20 -0000 1.43 > +++ net/if_pppx.c 24 Oct 2015 16:19:50 -0000 > @@ -832,6 +832,7 @@ pppx_add_session(struct pppx_dev *pxd, s > ifp->if_start = pppx_if_start; > ifp->if_output = pppx_if_output; > ifp->if_ioctl = pppx_if_ioctl; > + ifp->if_rtrequest = p2p_rtrequest; > ifp->if_type = IFT_PPP; > IFQ_SET_MAXLEN(&ifp->if_snd, 1); > IFQ_SET_READY(&ifp->if_snd); > @@ -1069,12 +1070,10 @@ pppx_if_ioctl(struct ifnet *ifp, u_long > { > struct pppx_if *pxi = (struct pppx_if *)ifp->if_softc; > struct ifreq *ifr = (struct ifreq *)addr; > - struct ifaddr *ifa = (struct ifaddr *)addr; > int error = 0; > > switch (cmd) { > case SIOCSIFADDR: > - ifa->ifa_rtrequest = p2p_rtrequest; > break; > > case SIOCSIFFLAGS: > Index: net/if_spppsubr.c > =================================================================== > RCS file: /cvs/src/sys/net/if_spppsubr.c,v > retrieving revision 1.142 > diff -u -p -r1.142 if_spppsubr.c > --- net/if_spppsubr.c 24 Oct 2015 11:58:46 -0000 1.142 > +++ net/if_spppsubr.c 24 Oct 2015 16:19:51 -0000 > @@ -871,7 +871,6 @@ int > sppp_ioctl(struct ifnet *ifp, u_long cmd, void *data) > { > struct ifreq *ifr = data; > - struct ifaddr *ifa = data; > struct sppp *sp = (struct sppp*) ifp; > int s, rv, going_up, going_down, newmode; > > @@ -884,7 +883,6 @@ sppp_ioctl(struct ifnet *ifp, u_long cmd > > case SIOCSIFADDR: > if_up(ifp); > - ifa->ifa_rtrequest = p2p_rtrequest; > /* FALLTHROUGH */ > > case SIOCSIFFLAGS: > Index: net/if_tun.c > =================================================================== > RCS file: /cvs/src/sys/net/if_tun.c,v > retrieving revision 1.157 > diff -u -p -r1.157 if_tun.c > --- net/if_tun.c 24 Oct 2015 04:12:24 -0000 1.157 > +++ net/if_tun.c 24 Oct 2015 16:19:51 -0000 > @@ -219,6 +219,7 @@ tun_create(struct if_clone *ifc, int uni > ifp->if_flags = IFF_POINTOPOINT; > ifp->if_type = IFT_TUNNEL; > ifp->if_hdrlen = sizeof(u_int32_t); > + ifp->if_rtrequest = p2p_rtrequest; > > if_attach(ifp); > if_alloc_sadl(ifp); > @@ -506,8 +507,6 @@ tun_ioctl(struct ifnet *ifp, u_long cmd, > default: > break; > } > - } else { > - ifa->ifa_rtrequest = p2p_rtrequest; > } > break; > case SIOCSIFDSTADDR: > Index: net/if_var.h > =================================================================== > RCS file: /cvs/src/sys/net/if_var.h,v > retrieving revision 1.50 > diff -u -p -r1.50 if_var.h > --- net/if_var.h 24 Oct 2015 10:52:05 -0000 1.50 > +++ net/if_var.h 24 Oct 2015 16:19:51 -0000 > @@ -129,6 +129,8 @@ struct ifnet { /* and the > entries */ > struct hook_desc_head *if_addrhooks; /* address change callbacks */ > struct hook_desc_head *if_linkstatehooks; /* link change callbacks */ > struct hook_desc_head *if_detachhooks; /* detach callbacks */ > + /* check or clean routes (+ or -)'d */ > + void (*if_rtrequest)(struct ifnet *, int, struct rtentry *); > char if_xname[IFNAMSIZ]; /* external name (name + unit) */ > int if_pcount; /* number of promiscuous listeners */ > caddr_t if_bpf; /* packet filter structure */ > @@ -213,8 +215,6 @@ struct ifaddr { > struct sockaddr *ifa_netmask; /* used to determine subnet */ > struct ifnet *ifa_ifp; /* back-pointer to interface */ > TAILQ_ENTRY(ifaddr) ifa_list; /* list of addresses for interface */ > - /* check or clean routes (+ or -)'d */ > - void (*ifa_rtrequest)(int, struct rtentry *); > u_int ifa_flags; /* interface flags, see below */ > u_int ifa_refcnt; /* number of `rt_ifa` references */ > int ifa_metric; /* cost of going out this interface */ > @@ -408,6 +408,8 @@ void if_start(struct ifnet *); > int if_enqueue(struct ifnet *, struct mbuf *); > void if_input(struct ifnet *, struct mbuf_list *); > int if_input_local(struct ifnet *, struct mbuf *, sa_family_t); > +void if_rtrequest_dummy(struct ifnet *, int, struct rtentry *); > +void p2p_rtrequest(struct ifnet *, int, struct rtentry *); > > void ether_ifattach(struct ifnet *); > void ether_ifdetach(struct ifnet *); > @@ -415,6 +417,7 @@ int ether_ioctl(struct ifnet *, struct a > int ether_input(struct ifnet *, struct mbuf *, void *); > int ether_output(struct ifnet *, > struct mbuf *, struct sockaddr *, struct rtentry *); > +void ether_rtrequest(struct ifnet *, int, struct rtentry *); > char *ether_sprintf(u_char *); > > struct ifaddr *ifa_ifwithaddr(struct sockaddr *, u_int); > @@ -422,7 +425,6 @@ struct ifaddr *ifa_ifwithdstaddr(struct > struct ifaddr *ifa_ifwithnet(struct sockaddr *, u_int); > struct ifaddr *ifaof_ifpforaddr(struct sockaddr *, struct ifnet *); > void ifafree(struct ifaddr *); > -void p2p_rtrequest(int, struct rtentry *); > > void if_clone_attach(struct if_clone *); > void if_clone_detach(struct if_clone *); > @@ -440,7 +442,7 @@ int loioctl(struct ifnet *, u_long, cadd > void loopattach(int); > int looutput(struct ifnet *, > struct mbuf *, struct sockaddr *, struct rtentry *); > -void lortrequest(int, struct rtentry *); > +void lortrequest(struct ifnet *, int, struct rtentry *); > > void ifa_add(struct ifnet *, struct ifaddr *); > void ifa_del(struct ifnet *, struct ifaddr *); > Index: net/route.c > =================================================================== > RCS file: /cvs/src/sys/net/route.c,v > retrieving revision 1.260 > diff -u -p -r1.260 route.c > --- net/route.c 24 Oct 2015 11:58:46 -0000 1.260 > +++ net/route.c 24 Oct 2015 16:19:51 -0000 > @@ -783,8 +783,7 @@ rtrequest1(int req, struct rt_addrinfo * > rt->rt_parent = NULL; > > rt->rt_flags &= ~RTF_UP; > - if ((ifa = rt->rt_ifa) && ifa->ifa_rtrequest) > - ifa->ifa_rtrequest(RTM_DELETE, rt); > + rt->rt_ifp->if_rtrequest(rt->rt_ifp, RTM_DELETE, rt); > atomic_inc_int(&rttrash); > > if (ret_nrt != NULL) > @@ -923,15 +922,14 @@ rtrequest1(int req, struct rt_addrinfo * > if ((*ret_nrt)->rt_ifa->ifa_ifp == NULL) { > printf("rtrequest1 RTM_RESOLVE: wrong ifa (%p) " > "was (%p)\n", ifa, (*ret_nrt)->rt_ifa); > - if ((*ret_nrt)->rt_ifa->ifa_rtrequest) > - (*ret_nrt)->rt_ifa->ifa_rtrequest( > - RTM_DELETE, *ret_nrt); > + (*ret_nrt)->rt_ifp->if_rtrequest(rt->rt_ifp, > + RTM_DELETE, *ret_nrt); > ifafree((*ret_nrt)->rt_ifa); > (*ret_nrt)->rt_ifa = ifa; > (*ret_nrt)->rt_ifp = ifa->ifa_ifp; > ifa->ifa_refcnt++; > - if (ifa->ifa_rtrequest) > - ifa->ifa_rtrequest(RTM_ADD, *ret_nrt); > + (*ret_nrt)->rt_ifp->if_rtrequest(rt->rt_ifp, > + RTM_ADD, *ret_nrt); > } > /* > * Copy both metrics and a back pointer to the cloned > @@ -979,9 +977,7 @@ rtrequest1(int req, struct rt_addrinfo * > pool_put(&rtentry_pool, rt); > return (EEXIST); > } > - > - if (ifa->ifa_rtrequest) > - ifa->ifa_rtrequest(req, rt); > + rt->rt_ifp->if_rtrequest(rt->rt_ifp, req, rt); > > if ((rt->rt_flags & RTF_CLONING) != 0) { > /* clean up any cloned children */ > Index: net/rtsock.c > =================================================================== > RCS file: /cvs/src/sys/net/rtsock.c,v > retrieving revision 1.176 > diff -u -p -r1.176 rtsock.c > --- net/rtsock.c 24 Oct 2015 11:58:47 -0000 1.176 > +++ net/rtsock.c 24 Oct 2015 16:19:51 -0000 > @@ -766,9 +766,8 @@ report: > goto flush; > if (ifa) { > if (rt->rt_ifa != ifa) { > - if (rt->rt_ifa->ifa_rtrequest) > - rt->rt_ifa->ifa_rtrequest( > - RTM_DELETE, rt); > + rt->rt_ifp->if_rtrequest( > + rt->rt_ifp, RTM_DELETE, rt); > ifafree(rt->rt_ifa); > rt->rt_ifa = ifa; > ifa->ifa_refcnt++; > @@ -832,8 +831,7 @@ report: > rtm->rtm_index = rt->rt_ifidx; > rtm->rtm_priority = rt->rt_priority & RTP_MASK; > rtm->rtm_flags = rt->rt_flags; > - if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest) > - rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt); > + rt->rt_ifp->if_rtrequest(rt->rt_ifp, RTM_ADD, rt); > if (info.rti_info[RTAX_LABEL] != NULL) { > char *rtlabel = ((struct sockaddr_rtlabel *) > info.rti_info[RTAX_LABEL])->sr_label; > Index: netinet/if_ether.c > =================================================================== > RCS file: /cvs/src/sys/netinet/if_ether.c,v > retrieving revision 1.176 > diff -u -p -r1.176 if_ether.c > --- netinet/if_ether.c 22 Oct 2015 18:14:53 -0000 1.176 > +++ netinet/if_ether.c 24 Oct 2015 16:19:51 -0000 > @@ -137,11 +137,10 @@ arptimer(void *arg) > } > > void > -arp_rtrequest(int req, struct rtentry *rt) > +arp_rtrequest(struct ifnet *ifp, int req, struct rtentry *rt) > { > struct sockaddr *gate = rt->rt_gateway; > struct llinfo_arp *la = (struct llinfo_arp *)rt->rt_llinfo; > - struct ifnet *ifp = rt->rt_ifp; > struct ifaddr *ifa; > struct mbuf *m; > > @@ -821,7 +820,6 @@ arpproxy(struct in_addr in, unsigned int > void > arp_ifinit(struct arpcom *ac, struct ifaddr *ifa) > { > - ifa->ifa_rtrequest = arp_rtrequest; > } > Woohoo empty function. Guess somebody can make a big diff killing this function for real. Any volunteer? > /* > Index: netinet/if_ether.h > =================================================================== > RCS file: /cvs/src/sys/netinet/if_ether.h,v > retrieving revision 1.60 > diff -u -p -r1.60 if_ether.h > --- netinet/if_ether.h 27 Sep 2015 16:50:40 -0000 1.60 > +++ netinet/if_ether.h 24 Oct 2015 16:19:51 -0000 > @@ -197,7 +197,7 @@ void arpintr(void); > int arpresolve(struct ifnet *, > struct rtentry *, struct mbuf *, struct sockaddr *, u_char *); > void arp_ifinit(struct arpcom *, struct ifaddr *); > -void arp_rtrequest(int, struct rtentry *); > +void arp_rtrequest(struct ifnet *, int, struct rtentry *); > > int ether_addmulti(struct ifreq *, struct arpcom *); > int ether_delmulti(struct ifreq *, struct arpcom *); > Index: netinet/ip_carp.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_carp.c,v > retrieving revision 1.277 > diff -u -p -r1.277 ip_carp.c > --- netinet/ip_carp.c 22 Oct 2015 13:30:29 -0000 1.277 > +++ netinet/ip_carp.c 24 Oct 2015 16:19:51 -0000 > @@ -2097,7 +2097,6 @@ carp_ioctl(struct ifnet *ifp, u_long cmd > switch (ifa->ifa_addr->sa_family) { > case AF_INET: > sc->sc_if.if_flags |= IFF_UP; > - ifa->ifa_rtrequest = arp_rtrequest; > error = carp_set_addr(sc, satosin(ifa->ifa_addr)); > break; > #ifdef INET6 > Index: netinet6/in6.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/in6.c,v > retrieving revision 1.175 > diff -u -p -r1.175 in6.c > --- netinet6/in6.c 12 Sep 2015 20:50:17 -0000 1.175 > +++ netinet6/in6.c 24 Oct 2015 16:19:51 -0000 > @@ -1263,10 +1263,6 @@ in6_ifinit(struct ifnet *ifp, struct in6 > > /* Add ownaddr as loopback rtentry, if necessary (ex. on p2p link). */ > if (newhost) { > - /* set the rtrequest function to create llinfo */ > - if ((ifp->if_flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) == 0) > - ia6->ia_ifa.ifa_rtrequest = nd6_rtrequest; > - > rt_ifa_addlocal(&(ia6->ia_ifa)); > } You can remove the { } from the if statement and save some additional vertical space. > > Index: netinet6/nd6.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/nd6.c,v > retrieving revision 1.159 > diff -u -p -r1.159 nd6.c > --- netinet6/nd6.c 24 Oct 2015 16:08:48 -0000 1.159 > +++ netinet6/nd6.c 24 Oct 2015 16:19:51 -0000 > @@ -661,7 +661,7 @@ nd6_lookup(struct in6_addr *addr6, int c > * Create a new route. RTF_LLINFO is necessary > * to create a Neighbor Cache entry for the > * destination in nd6_rtrequest which will be > - * called in rtrequest1 via ifa->ifa_rtrequest. > + * called in rtrequest1. > */ > bzero(&info, sizeof(info)); > info.rti_flags = RTF_HOST | RTF_LLINFO; > @@ -917,11 +917,10 @@ nd6_nud_hint(struct rtentry *rt, u_int r > } > > void > -nd6_rtrequest(int req, struct rtentry *rt) > +nd6_rtrequest(struct ifnet *ifp, int req, struct rtentry *rt) > { > struct sockaddr *gate = rt->rt_gateway; > struct llinfo_nd6 *ln = (struct llinfo_nd6 *)rt->rt_llinfo; > - struct ifnet *ifp = rt->rt_ifp; > struct ifaddr *ifa; > struct nd_defrouter *dr; > > Index: netinet6/nd6.h > =================================================================== > RCS file: /cvs/src/sys/netinet6/nd6.h,v > retrieving revision 1.50 > diff -u -p -r1.50 nd6.h > --- netinet6/nd6.h 24 Oct 2015 16:08:48 -0000 1.50 > +++ netinet6/nd6.h 24 Oct 2015 16:19:51 -0000 > @@ -272,7 +272,7 @@ void nd6_purge(struct ifnet *); > void nd6_nud_hint(struct rtentry *, u_int); > int nd6_resolve(struct ifnet *, struct rtentry *, > struct mbuf *, struct sockaddr *, u_char *); > -void nd6_rtrequest(int, struct rtentry *); > +void nd6_rtrequest(struct ifnet *, int, struct rtentry *); > int nd6_ioctl(u_long, caddr_t, struct ifnet *); > void nd6_cache_lladdr(struct ifnet *, struct in6_addr *, char *, int, int, > int); > int nd6_output(struct ifnet *, struct mbuf *, struct sockaddr_in6 *, > Index: netinet6/nd6_rtr.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/nd6_rtr.c,v > retrieving revision 1.127 > diff -u -p -r1.127 nd6_rtr.c > --- netinet6/nd6_rtr.c 24 Oct 2015 16:08:48 -0000 1.127 > +++ netinet6/nd6_rtr.c 24 Oct 2015 16:19:52 -0000 > @@ -1789,10 +1789,6 @@ nd6_prefix_onlink(struct nd_prefix *pr) > return (0); > } > > - /* > - * in6_ifinit() sets nd6_rtrequest to ifa_rtrequest for all ifaddrs. > - * ifa->ifa_rtrequest = nd6_rtrequest; > - */ > bzero(&mask6, sizeof(mask6)); > mask6.sin6_len = sizeof(mask6); > mask6.sin6_addr = pr->ndpr_mask; > -- :wq Claudio