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().

ok?

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 15:01:30 -0000
@@ -1278,9 +1278,8 @@ ifaof_ifpforaddr(struct sockaddr *addr, 
  * 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_bridge.c
===================================================================
RCS file: /cvs/src/sys/net/if_bridge.c,v
retrieving revision 1.268
diff -u -p -r1.268 if_bridge.c
--- net/if_bridge.c     12 Oct 2015 10:03:25 -0000      1.268
+++ net/if_bridge.c     24 Oct 2015 15:59:58 -0000
@@ -115,6 +115,7 @@
 void   bridgeattach(int);
 int    bridge_ioctl(struct ifnet *, u_long, caddr_t);
 void   bridge_start(struct ifnet *);
+void   bridge_rtrequest(struct ifnet *, int, struct rtentry *);
 void   bridge_process(struct ifnet *, struct mbuf *);
 void   bridgeintr_frame(struct bridge_softc *, struct ifnet *, struct mbuf *);
 void   bridge_broadcast(struct bridge_softc *, struct ifnet *,
@@ -686,6 +687,11 @@ bridge_ioctl(struct ifnet *ifp, u_long c
 
        splx(s);
        return (error);
+}
+
+void
+bridge_rtrequest(struct ifnet *ifp, int cmd, struct rtentry *rt)
+{
 }
 
 /* Detach an interface from a bridge.  */
Index: net/if_enc.c
===================================================================
RCS file: /cvs/src/sys/net/if_enc.c,v
retrieving revision 1.62
diff -u -p -r1.62 if_enc.c
--- net/if_enc.c        22 Oct 2015 17:48:34 -0000      1.62
+++ net/if_enc.c        24 Oct 2015 15:59:33 -0000
@@ -49,6 +49,7 @@ void   enc_start(struct ifnet *);
 int     enc_output(struct ifnet *, struct mbuf *, struct sockaddr *,
            struct rtentry *);
 int     enc_ioctl(struct ifnet *, u_long, caddr_t);
+void    enc_rtrequest(struct ifnet *, int, struct rtentry *);
 
 int     enc_setif(struct ifnet *, u_int);
 void    enc_unsetif(struct ifnet *);
@@ -89,6 +90,7 @@ enc_clone_create(struct if_clone *ifc, i
        ifp->if_start = enc_start;
        ifp->if_output = enc_output;
        ifp->if_ioctl = enc_ioctl;
+       ifp->if_rtrequest = enc_rtrequest;
        ifp->if_hdrlen = ENC_HDRLEN;
 
        snprintf(ifp->if_xname, sizeof(ifp->if_xname), "%s%d",
@@ -203,6 +205,11 @@ enc_ioctl(struct ifnet *ifp, u_long cmd,
        }
 
        return (0);
+}
+
+void
+enc_rtrequest(struct ifnet *ifp, int cmd, struct rtentry *rt)
+{
 }
 
 struct ifnet *
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 15:58:24 -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 15:42:24 -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 15:43:25 -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 15:24:11 -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 15:25:00 -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 15:23:34 -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 15:43:14 -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 15:44:16 -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 15:24:17 -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 15:40:09 -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 */
@@ -415,6 +415,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 +423,7 @@ 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   p2p_rtrequest(struct ifnet *, int, struct rtentry *);
 
 void   if_clone_attach(struct if_clone *);
 void   if_clone_detach(struct if_clone *);
@@ -440,7 +441,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 15:43:46 -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 15:21:41 -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 15:29:23 -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;
 }
 
 /*
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 15:01:05 -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 15:41:05 -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 15:41:33 -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));
        }
 
Index: netinet6/nd6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6.c,v
retrieving revision 1.158
diff -u -p -r1.158 nd6.c
--- netinet6/nd6.c      22 Oct 2015 16:44:54 -0000      1.158
+++ netinet6/nd6.c      24 Oct 2015 15:41:51 -0000
@@ -662,7 +662,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;
@@ -918,11 +918,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.49
diff -u -p -r1.49 nd6.h
--- netinet6/nd6.h      31 Aug 2015 10:03:47 -0000      1.49
+++ netinet6/nd6.h      24 Oct 2015 15:01:16 -0000
@@ -273,7 +273,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.126
diff -u -p -r1.126 nd6_rtr.c
--- netinet6/nd6_rtr.c  22 Oct 2015 15:37:47 -0000      1.126
+++ netinet6/nd6_rtr.c  24 Oct 2015 15:42:03 -0000
@@ -1785,10 +1785,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;

Reply via email to