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