Stop using rt_ifp in mpe(4), ok?

Index: net/if_mpe.c
===================================================================
RCS file: /cvs/src/sys/net/if_mpe.c,v
retrieving revision 1.49
diff -u -p -r1.49 if_mpe.c
--- net/if_mpe.c        22 Oct 2015 17:48:34 -0000      1.49
+++ net/if_mpe.c        5 Nov 2015 10:58:07 -0000
@@ -139,17 +139,18 @@ struct sockaddr_storage    mpedst;
  * Start output on the mpe interface.
  */
 void
-mpestart(struct ifnet *ifp)
+mpestart(struct ifnet *ifp0)
 {
        struct mbuf             *m;
        struct sockaddr         *sa = (struct sockaddr *)&mpedst;
        int                      s;
        sa_family_t              af;
        struct rtentry          *rt;
+       struct ifnet            *ifp;
 
        for (;;) {
                s = splnet();
-               IFQ_DEQUEUE(&ifp->if_snd, m);
+               IFQ_DEQUEUE(&ifp0->if_snd, m);
                splx(s);
 
                if (m == NULL)
@@ -172,19 +173,25 @@ mpestart(struct ifnet *ifp)
                }
 
                rt = rtalloc(sa, RT_REPORT|RT_RESOLVE, 0);
-               if (rt == NULL) {
-                       /* no route give up */
+               if (!rtisvalid(rt)) {
                        m_freem(m);
                        continue;
                }
 
+               ifp = if_get(rt->rt_ifidx);
+               if (ifp == NULL) {
+                       m_freem(m);
+                       rtfree(rt);
+                       continue;
+               }
+
 #if NBPFILTER > 0
-               if (ifp->if_bpf) {
+               if (ifp0->if_bpf) {
                        /* remove MPLS label before passing packet to bpf */
                        m->m_data += sizeof(struct shim_hdr);
                        m->m_len -= sizeof(struct shim_hdr);
                        m->m_pkthdr.len -= sizeof(struct shim_hdr);
-                       bpf_mtap_af(ifp->if_bpf, af, m, BPF_DIRECTION_OUT);
+                       bpf_mtap_af(ifp0->if_bpf, af, m, BPF_DIRECTION_OUT);
                        m->m_data -= sizeof(struct shim_hdr);
                        m->m_len += sizeof(struct shim_hdr);
                        m->m_pkthdr.len += sizeof(struct shim_hdr);
@@ -193,7 +200,8 @@ mpestart(struct ifnet *ifp)
                /* XXX lie, but mpls_output will only look at sa_family */
                sa->sa_family = AF_MPLS;
 
-               mpls_output(rt->rt_ifp, m, sa, rt);
+               mpls_output(ifp, m, sa, rt);
+               if_put(ifp);
                rtfree(rt);
        }
 }

Reply via email to