On Thu, Nov 05, 2015 at 11:59:45AM +0100, Martin Pieuchot wrote:
> Stop using rt_ifp in mpe(4), ok?
Looks good untested but just move on. OK claudio
> 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);
> }
> }
--
:wq Claudio