svn commit: r205024 - head/sys/net
Qing Li
qingli at FreeBSD.org
Thu Mar 11 17:56:47 UTC 2010
Author: qingli
Date: Thu Mar 11 17:56:46 2010
New Revision: 205024
URL: http://svn.freebsd.org/changeset/base/205024
Log:
The if_tap interface is of IFT_ETHERNET type, but it
does not set or update the if_link_state variable.
As such RT_LINK_IS_UP() fails for the if_tap interface.
Also, the RT_LINK_IS_UP() needs to bypass all loopback
interfaces because loopback interfaces are considered
up logically as long as the system is running.
This patch fixes the above issues by setting and updating
the if_link_state variable when the tap interface is
opened or closed respectively. Similary approach is
already done in the if_tun device.
MFC after: 3 days
Modified:
head/sys/net/if_tap.c
head/sys/net/route.h
Modified: head/sys/net/if_tap.c
==============================================================================
--- head/sys/net/if_tap.c Thu Mar 11 17:15:40 2010 (r205023)
+++ head/sys/net/if_tap.c Thu Mar 11 17:56:46 2010 (r205024)
@@ -502,6 +502,7 @@ tapopen(struct cdev *dev, int flag, int
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
if (tapuponopen)
ifp->if_flags |= IFF_UP;
+ if_link_state_change(ifp, LINK_STATE_UP);
splx(s);
TAPDEBUG("%s is open. minor = %#x\n", ifp->if_xname, dev2unit(dev));
@@ -547,6 +548,7 @@ tapclose(struct cdev *dev, int foo, int
} else
mtx_unlock(&tp->tap_mtx);
+ if_link_state_change(ifp, LINK_STATE_DOWN);
funsetown(&tp->tap_sigio);
selwakeuppri(&tp->tap_rsel, PZERO+1);
KNOTE_UNLOCKED(&tp->tap_rsel.si_note, 0);
Modified: head/sys/net/route.h
==============================================================================
--- head/sys/net/route.h Thu Mar 11 17:15:40 2010 (r205023)
+++ head/sys/net/route.h Thu Mar 11 17:56:46 2010 (r205024)
@@ -319,7 +319,9 @@ struct rt_addrinfo {
#ifdef _KERNEL
-#define RT_LINK_IS_UP(ifp) ((ifp)->if_link_state == LINK_STATE_UP)
+#define RT_LINK_IS_UP(ifp) (((ifp)->if_flags & \
+ (IFF_LOOPBACK | IFF_POINTOPOINT)) \
+ || (ifp)->if_link_state == LINK_STATE_UP)
#define RT_LOCK_INIT(_rt) \
mtx_init(&(_rt)->rt_mtx, "rtentry", NULL, MTX_DEF | MTX_DUPOK)
More information about the svn-src-all
mailing list