diff options
author | qingli <qingli@FreeBSD.org> | 2011-10-07 18:01:34 +0000 |
---|---|---|
committer | qingli <qingli@FreeBSD.org> | 2011-10-07 18:01:34 +0000 |
commit | d0874dfb4502f2a9936a9e985787767ffa232b0e (patch) | |
tree | 110ab48571e5682969323bfaa765422ae582fc79 /sys/netinet | |
parent | f1deb54a54fc376b943ab56a6a4b4364b078c0b1 (diff) | |
download | FreeBSD-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.c | 4 |
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)) { |