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);
}
}