summaryrefslogtreecommitdiffstats
path: root/sys/net/if_tun.c
diff options
context:
space:
mode:
authorbms <bms@FreeBSD.org>2007-02-05 11:15:52 +0000
committerbms <bms@FreeBSD.org>2007-02-05 11:15:52 +0000
commitece591cff47095068426dbdc5847af69e6fabd68 (patch)
treecd586ee45505611cb773389821d64033ed656f11 /sys/net/if_tun.c
parentdd7064368573e8216cbe8a7223b2435fa5ce302a (diff)
downloadFreeBSD-src-ece591cff47095068426dbdc5847af69e6fabd68.zip
FreeBSD-src-ece591cff47095068426dbdc5847af69e6fabd68.tar.gz
Clean up after tun(4) properly; remove routes whose ifp is set to
that of the tun instance even for the !AF_INET case, and properly remove configured addresses by calling if_purgeaddrs(). Maintain the TUN_DSTADDR behaviour for compatibility with the OS/390 emulator. MFC after: 3 weeks PR: 100080 Reviewed by: bz
Diffstat (limited to 'sys/net/if_tun.c')
-rw-r--r--sys/net/if_tun.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c
index efd57a2..61f08d7 100644
--- a/sys/net/if_tun.c
+++ b/sys/net/if_tun.c
@@ -458,16 +458,21 @@ tunclose(struct cdev *dev, int foo, int bar, struct thread *td)
splx(s);
}
+ /* Delete all addresses and routes which reference this interface. */
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
struct ifaddr *ifa;
s = splimp();
- /* find internet addresses and delete routes */
- TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
- if (ifa->ifa_addr->sa_family == AF_INET)
- /* Unlocked read. */
+ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+ /* deal w/IPv4 PtP destination; unlocked read */
+ if (ifa->ifa_addr->sa_family == AF_INET) {
rtinit(ifa, (int)RTM_DELETE,
tp->tun_flags & TUN_DSTADDR ? RTF_HOST : 0);
+ } else {
+ rtinit(ifa, (int)RTM_DELETE, 0);
+ }
+ }
+ if_purgeaddrs(ifp);
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
splx(s);
}
OpenPOWER on IntegriCloud