The first rt_ifp of the day, make use of if_get() inside icmp_mtudisc(). ok?
Index: netinet/ip_icmp.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_icmp.c,v retrieving revision 1.145 diff -u -p -r1.145 ip_icmp.c --- netinet/ip_icmp.c 30 Oct 2015 09:39:42 -0000 1.145 +++ netinet/ip_icmp.c 19 Nov 2015 11:34:21 -0000 @@ -981,12 +981,17 @@ void icmp_mtudisc(struct icmp *icp, u_int rtableid) { struct rtentry *rt; + struct ifnet *ifp; u_long mtu = ntohs(icp->icmp_nextmtu); /* Why a long? IPv6 */ rt = icmp_mtudisc_clone(icp->icmp_ip.ip_dst, rtableid); if (rt == NULL) return; + ifp = if_get(rt->rt_ifidx); + if (ifp == NULL) + return; + if (mtu == 0) { int i = 0; @@ -1002,7 +1007,7 @@ icmp_mtudisc(struct icmp *icp, u_int rta /* If no route mtu, default to the interface mtu */ if (mtu == 0) - mtu = rt->rt_ifp->if_mtu; + mtu = ifp->if_mtu; } for (i = 0; i < nitems(mtu_table); i++) @@ -1019,15 +1024,14 @@ icmp_mtudisc(struct icmp *icp, u_int rta * on a route. We should be using a separate flag * for the kernel to indicate this. */ - if ((rt->rt_rmx.rmx_locks & RTV_MTU) == 0) { - if (mtu < 296 || mtu > rt->rt_ifp->if_mtu) + if (mtu < 296 || mtu > ifp->if_mtu) rt->rt_rmx.rmx_locks |= RTV_MTU; - else if (rt->rt_rmx.rmx_mtu > mtu || - rt->rt_rmx.rmx_mtu == 0) + else if (rt->rt_rmx.rmx_mtu > mtu || rt->rt_rmx.rmx_mtu == 0) rt->rt_rmx.rmx_mtu = mtu; } + if_put(ifp); rtfree(rt); }