Module Name: src Committed By: ozaki-r Date: Mon Aug 31 06:25:15 UTC 2015
Modified Files: src/sys/net: route.c route.h src/sys/netinet: ip_icmp.c src/sys/netinet6: icmp6.c Log Message: Make rt_refcnt take into account rt_timer To generate a diff of this commit: cvs rdiff -u -r1.149 -r1.150 src/sys/net/route.c cvs rdiff -u -r1.93 -r1.94 src/sys/net/route.h cvs rdiff -u -r1.141 -r1.142 src/sys/netinet/ip_icmp.c cvs rdiff -u -r1.175 -r1.176 src/sys/netinet6/icmp6.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/route.c diff -u src/sys/net/route.c:1.149 src/sys/net/route.c:1.150 --- src/sys/net/route.c:1.149 Mon Aug 24 22:21:26 2015 +++ src/sys/net/route.c Mon Aug 31 06:25:15 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: route.c,v 1.149 2015/08/24 22:21:26 pooka Exp $ */ +/* $NetBSD: route.c,v 1.150 2015/08/31 06:25:15 ozaki-r Exp $ */ /*- * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc. @@ -96,7 +96,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.149 2015/08/24 22:21:26 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.150 2015/08/31 06:25:15 ozaki-r Exp $"); #include <sys/param.h> #ifdef RTFLUSH_DEBUG @@ -1270,6 +1270,7 @@ rt_timer_queue_remove_all(struct rttimer TAILQ_REMOVE(&rtq->rtq_head, r, rtt_next); if (destroy) RTTIMER_CALLOUT(r); + rtfree(r->rtt_rt); /* we are already at splsoftnet */ pool_put(&rttimer_pool, r); if (rtq->rtq_count > 0) @@ -1313,6 +1314,7 @@ rt_timer_remove_all(struct rtentry *rt, r->rtt_queue->rtq_count--; else printf("rt_timer_remove_all: rtq_count reached 0\n"); + rtfree(r->rtt_rt); /* we are already at splsoftnet */ pool_put(&rttimer_pool, r); } @@ -1341,6 +1343,7 @@ rt_timer_add(struct rtentry *rt, r->rtt_queue->rtq_count--; else printf("rt_timer_add: rtq_count reached 0\n"); + rtfree(r->rtt_rt); } else { s = splsoftnet(); r = pool_get(&rttimer_pool, PR_NOWAIT); @@ -1351,6 +1354,7 @@ rt_timer_add(struct rtentry *rt, memset(r, 0, sizeof(*r)); + rt->rt_refcnt++; r->rtt_rt = rt; r->rtt_time = time_uptime; r->rtt_func = func; @@ -1377,6 +1381,7 @@ rt_timer_timer(void *arg) LIST_REMOVE(r, rtt_link); TAILQ_REMOVE(&rtq->rtq_head, r, rtt_next); RTTIMER_CALLOUT(r); + rtfree(r->rtt_rt); pool_put(&rttimer_pool, r); if (rtq->rtq_count > 0) rtq->rtq_count--; Index: src/sys/net/route.h diff -u src/sys/net/route.h:1.93 src/sys/net/route.h:1.94 --- src/sys/net/route.h:1.93 Mon Aug 24 04:44:54 2015 +++ src/sys/net/route.h Mon Aug 31 06:25:15 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: route.h,v 1.93 2015/08/24 04:44:54 ozaki-r Exp $ */ +/* $NetBSD: route.h,v 1.94 2015/08/31 06:25:15 ozaki-r Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -412,6 +412,13 @@ rt_get_gwroute(struct rtentry *rt) return rt->rt_gwroute; } +static inline void +rt_assert_referenced(const struct rtentry *rt) +{ + + KASSERT(rt->rt_refcnt > 0); +} + void rtcache_copy(struct route *, const struct route *); void rtcache_free(struct route *); struct rtentry * Index: src/sys/netinet/ip_icmp.c diff -u src/sys/netinet/ip_icmp.c:1.141 src/sys/netinet/ip_icmp.c:1.142 --- src/sys/netinet/ip_icmp.c:1.141 Mon Aug 24 22:21:26 2015 +++ src/sys/netinet/ip_icmp.c Mon Aug 31 06:25:15 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_icmp.c,v 1.141 2015/08/24 22:21:26 pooka Exp $ */ +/* $NetBSD: ip_icmp.c,v 1.142 2015/08/31 06:25:15 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -94,7 +94,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.141 2015/08/24 22:21:26 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.142 2015/08/31 06:25:15 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_ipsec.h" @@ -1214,7 +1214,9 @@ ip_next_mtu(u_int mtu, int dir) /* XXX * static void icmp_mtudisc_timeout(struct rtentry *rt, struct rttimer *r) { + KASSERT(rt != NULL); + rt_assert_referenced(rt); if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) == (RTF_DYNAMIC | RTF_HOST)) { @@ -1230,7 +1232,9 @@ icmp_mtudisc_timeout(struct rtentry *rt, static void icmp_redirect_timeout(struct rtentry *rt, struct rttimer *r) { + KASSERT(rt != NULL); + rt_assert_referenced(rt); if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) == (RTF_DYNAMIC | RTF_HOST)) { Index: src/sys/netinet6/icmp6.c diff -u src/sys/netinet6/icmp6.c:1.175 src/sys/netinet6/icmp6.c:1.176 --- src/sys/netinet6/icmp6.c:1.175 Mon Aug 24 22:21:27 2015 +++ src/sys/netinet6/icmp6.c Mon Aug 31 06:25:15 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: icmp6.c,v 1.175 2015/08/24 22:21:27 pooka Exp $ */ +/* $NetBSD: icmp6.c,v 1.176 2015/08/31 06:25:15 ozaki-r Exp $ */ /* $KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.175 2015/08/24 22:21:27 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.176 2015/08/31 06:25:15 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -2714,8 +2714,10 @@ icmp6_mtudisc_clone(struct sockaddr *dst static void icmp6_mtudisc_timeout(struct rtentry *rt, struct rttimer *r) { - if (rt == NULL) - panic("icmp6_mtudisc_timeout: bad route to timeout"); + + KASSERT(rt != NULL); + rt_assert_referenced(rt); + if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) == (RTF_DYNAMIC | RTF_HOST)) { rtrequest((int) RTM_DELETE, rt_getkey(rt), @@ -2729,8 +2731,10 @@ icmp6_mtudisc_timeout(struct rtentry *rt static void icmp6_redirect_timeout(struct rtentry *rt, struct rttimer *r) { - if (rt == NULL) - panic("icmp6_redirect_timeout: bad route to timeout"); + + KASSERT(rt != NULL); + rt_assert_referenced(rt); + if ((rt->rt_flags & (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) == (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) { rtrequest((int) RTM_DELETE, rt_getkey(rt),