On Thu, Oct 29, 2015 at 03:51:57PM +0100, Martin Pieuchot wrote: > Stop using rt_ifp in this function. > > ok?
OK bluhm@ > > Index: netinet6/ip6_forward.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/ip6_forward.c,v > retrieving revision 1.85 > diff -u -p -r1.85 ip6_forward.c > --- netinet6/ip6_forward.c 28 Oct 2015 12:14:25 -0000 1.85 > +++ netinet6/ip6_forward.c 29 Oct 2015 14:36:35 -0000 > @@ -89,6 +89,7 @@ ip6_forward(struct mbuf *m, int srcrt) > struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); > struct sockaddr_in6 *dst; > struct rtentry *rt; > + struct ifnet *ifp = NULL; > int error = 0, type = 0, code = 0; > struct mbuf *mcopy = NULL; > #ifdef IPSEC > @@ -362,11 +363,12 @@ reroute: > * Also, don't send redirect if forwarding using a route > * modified by a redirect. > */ > - if (rt->rt_ifp->if_index == m->m_pkthdr.ph_ifidx && !srcrt && > + ifp = if_get(rt->rt_ifidx); > + if (rt->rt_ifidx == m->m_pkthdr.ph_ifidx && !srcrt && > ip6_sendredirects && > (rt->rt_flags & (RTF_DYNAMIC|RTF_MODIFIED)) == 0) { > - if ((rt->rt_ifp->if_flags & IFF_POINTOPOINT) && > - nd6_is_addr_neighbor(&ip6_forward_rt.ro_dst, rt->rt_ifp)) { > + if ((ifp->if_flags & IFF_POINTOPOINT) && > + nd6_is_addr_neighbor(&ip6_forward_rt.ro_dst, ifp)) { > /* > * If the incoming interface is equal to the outgoing > * one, the link attached to the interface is > @@ -405,7 +407,7 @@ reroute: > ip6->ip6_dst.s6_addr16[1] = 0; > > #if NPF > 0 > - if (pf_test(AF_INET6, PF_FWD, rt->rt_ifp, &m) != PF_PASS) { > + if (pf_test(AF_INET6, PF_FWD, ifp, &m) != PF_PASS) { > m_freem(m); > goto senderr; > } > @@ -420,21 +422,23 @@ reroute: > /* tag as generated to skip over pf_test on rerun */ > m->m_pkthdr.pf.flags |= PF_TAG_GENERATED; > srcrt = 1; > + if_put(ifp); > + ifp = NULL; > goto reroute; > } > #endif > - in6_proto_cksum_out(m, rt->rt_ifp); > + in6_proto_cksum_out(m, ifp); > > /* Check the size after pf_test to give pf a chance to refragment. */ > - if (m->m_pkthdr.len > rt->rt_ifp->if_mtu) { > + if (m->m_pkthdr.len > ifp->if_mtu) { > if (mcopy) > icmp6_error(mcopy, ICMP6_PACKET_TOO_BIG, 0, > - rt->rt_ifp->if_mtu); > + ifp->if_mtu); > m_freem(m); > goto freert; > } > > - error = nd6_output(rt->rt_ifp, m, dst, rt); > + error = nd6_output(ifp, m, dst, rt); > if (error) { > ip6stat.ip6s_cantforward++; > } else { > @@ -490,5 +494,5 @@ senderr: > ip6_forward_rt.ro_rt = NULL; > } > #endif > - return; > + if_put(ifp); > }