From 243785f92f3510b8e7115b3775e82bb0f4dd4da7 Mon Sep 17 00:00:00 2001 From: Qing Li Date: Fri, 2 Apr 2010 05:05:51 +0000 Subject: [PATCH] MFC 205024 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. --- sys/net/if_tap.c | 2 ++ sys/net/route.h | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c index 93801f10412b..9123e8c85aae 100644 --- a/sys/net/if_tap.c +++ b/sys/net/if_tap.c @@ -502,6 +502,7 @@ tapopen(struct cdev *dev, int flag, int mode, struct thread *td) 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 bar, struct thread *td) } 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); diff --git a/sys/net/route.h b/sys/net/route.h index 6857cb3473dd..66f56b7c93c5 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -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)