Fewer rt_ifp in arp, ok?

Index: netinet/if_ether.c
===================================================================
RCS file: /cvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.188
diff -u -p -r1.188 if_ether.c
--- netinet/if_ether.c  18 Nov 2015 13:58:02 -0000      1.188
+++ netinet/if_ether.c  19 Nov 2015 10:52:54 -0000
@@ -621,7 +621,7 @@ in_arpinput(struct mbuf *m)
                rt->rt_flags &= ~RTF_REJECT;
                /* Notify userland that an ARP resolution has been done. */
                if (la->la_asked || changed)
-                       rt_sendmsg(rt, RTM_RESOLVE, rt->rt_ifp->if_rdomain);
+                       rt_sendmsg(rt, RTM_RESOLVE, ifp->if_rdomain);
                la->la_asked = 0;
                while ((len = ml_len(&la->la_ml)) != 0) {
                        mh = ml_dequeue(&la->la_ml);
@@ -680,7 +680,6 @@ out:
        sa.sa_len = sizeof(sa);
        ifp->if_output(ifp, m, &sa, NULL);
        if_put(ifp);
-       return;
 }
 
 /*
@@ -691,13 +690,16 @@ arptfree(struct rtentry *rt)
 {
        struct llinfo_arp *la = (struct llinfo_arp *)rt->rt_llinfo;
        struct sockaddr_dl *sdl = satosdl(rt->rt_gateway);
+       struct ifnet *ifp;
 
+       ifp = if_get(rt->rt_ifidx);
        if ((sdl != NULL) && (sdl->sdl_family == AF_LINK)) {
                sdl->sdl_alen = 0;
                la->la_asked = 0;
        }
 
-       rtdeletemsg(rt, rt->rt_ifp->if_rdomain);
+       rtdeletemsg(rt, ifp->if_rdomain);
+       if_put(ifp);
 }
 
 /*
@@ -742,8 +744,10 @@ arpproxy(struct in_addr in, unsigned int
        int found = 0;
 
        rt = arplookup(in.s_addr, 0, SIN_PROXY, rtableid);
-       if (rt == NULL)
+       if (!rtisvalid(rt)) {
+               rtfree(rt);
                return (0);
+       }
 
        /* Check that arp information are correct. */
        sdl = satosdl(rt->rt_gateway);
@@ -752,10 +756,16 @@ arpproxy(struct in_addr in, unsigned int
                return (0);
        }
 
-       ifp = rt->rt_ifp;
+       ifp = if_get(rt->rt_ifidx);
+       if (ifp == NULL) {
+               rtfree(rt);
+               return (0);
+       }
+
        if (!memcmp(LLADDR(sdl), LLADDR(ifp->if_sadl), sdl->sdl_alen))
                found = 1;
 
+       if_put(ifp);
        rtfree(rt);
        return (found);
 }

Reply via email to