summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoritojun <itojun@NetBSD.org>2003-06-30 10:34:53 +0000
committeritojun <itojun@NetBSD.org>2003-06-30 10:34:53 +0000
commit7e53aaa8ddd8075cacea4a79db311bf59f86c31d (patch)
treee7ca380700edec968d1d8d2d2d8f0835f3697022
parent2317e81b858b498e8f94566be54922f352afc371 (diff)
better ip_mrouter_detach(). by ono@kame
-rw-r--r--sys/netinet/ip_mroute.c38
1 files changed, 14 insertions, 24 deletions
diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c
index f21c06fed5e..09db723fa46 100644
--- a/sys/netinet/ip_mroute.c
+++ b/sys/netinet/ip_mroute.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_mroute.c,v 1.74 2003/06/26 21:49:17 itojun Exp $ */
+/* $NetBSD: ip_mroute.c,v 1.75 2003/06/30 10:34:53 itojun Exp $ */
/*
* Copyright (c) 1989 Stephen Deering
@@ -54,7 +54,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_mroute.c,v 1.74 2003/06/26 21:49:17 itojun Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_mroute.c,v 1.75 2003/06/30 10:34:53 itojun Exp $");
#include "opt_ipsec.h"
@@ -546,8 +546,8 @@ ip_mrouter_detach(ifp)
{
int vifi, i;
struct vif *vifp;
- struct mfc *rt, *nrt;
- struct rtdetq *rte, *nrte, **prte;
+ struct mfc *rt;
+ struct rtdetq *rte;
/* XXX not sure about sideeffect to userland routing daemon */
for (vifi = 0; vifi < numvifs; vifi++) {
@@ -556,25 +556,13 @@ ip_mrouter_detach(ifp)
reset_vif(vifp);
}
for (i = 0; i < MFCTBLSIZ; i++) {
- for (rt = LIST_FIRST(&mfchashtbl[i]); rt; rt = nrt) {
- nrt = LIST_NEXT(rt, mfc_hash);
-
- prte = &rt->mfc_stall;
- for (rte = *prte; rte; rte = nrte) {
- nrte = rte->next;
- if (rte->ifp == ifp) {
- m_freem(rte->m);
- free(rte, M_MRTABLE);
- *prte = nrte;
- } else
- prte = &rte->next;
+ if (nexpire[i] == 0)
+ continue;
+ LIST_FOREACH(rt, &mfchashtbl[i], mfc_hash) {
+ for (rte = rt->mfc_stall; rte; rte = rte->next) {
+ if (rte->ifp == ifp)
+ rte->ifp = NULL;
}
-
- if (rt->mfc_expire == 0)
- continue;
- nexpire[i]--;
- ++mrtstat.mrts_cache_cleanups;
- expire_mfc(rt);
}
}
}
@@ -914,11 +902,13 @@ add_mfc(m)
/* free packets Qed at the end of this entry */
for (; rte != 0; rte = nrte) {
nrte = rte->next;
+ if (rte->ifp) {
#ifdef RSVP_ISI
- ip_mdq(rte->m, rte->ifp, rt, -1);
+ ip_mdq(rte->m, rte->ifp, rt, -1);
#else
- ip_mdq(rte->m, rte->ifp, rt);
+ ip_mdq(rte->m, rte->ifp, rt);
#endif /* RSVP_ISI */
+ }
m_freem(rte->m);
#ifdef UPCALL_TIMING
collate(&rte->t);