summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorqingli <qingli@FreeBSD.org>2011-10-07 18:01:34 +0000
committerqingli <qingli@FreeBSD.org>2011-10-07 18:01:34 +0000
commitd0874dfb4502f2a9936a9e985787767ffa232b0e (patch)
tree110ab48571e5682969323bfaa765422ae582fc79 /sys/netinet
parentf1deb54a54fc376b943ab56a6a4b4364b078c0b1 (diff)
downloadFreeBSD-src-d0874dfb4502f2a9936a9e985787767ffa232b0e.zip
FreeBSD-src-d0874dfb4502f2a9936a9e985787767ffa232b0e.tar.gz
Remove the reference held on the loopback route when the interface
address is being deleted. Only the last reference holder deletes the loopback route. All other delete operations just clear the IFA_RTSELF flag. PR: kern/159601 Submitted by: pluknet Reviewed by: discussed on net@ MFC after: 3 days
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/in.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index da4e8a0..3201fa6 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -1126,8 +1126,10 @@ in_scrubprefix(struct in_ifaddr *target, u_int flags)
RT_LOCK(ia_ro.ro_rt);
if (ia_ro.ro_rt->rt_refcnt <= 1)
freeit = 1;
- else
+ else if (flags & LLE_STATIC) {
RT_REMREF(ia_ro.ro_rt);
+ target->ia_flags &= ~IFA_RTSELF;
+ }
RTFREE_LOCKED(ia_ro.ro_rt);
}
if (freeit && (flags & LLE_STATIC)) {
OpenPOWER on IntegriCloud