Module Name:    src
Committed By:   roy
Date:           Sun Sep 27 13:44:47 UTC 2020

Modified Files:
        src/share/man/man4: tap.4
        src/sys/net: if_tap.c

Log Message:
tap: Report link state based on if the interface has been opened or not

While a nice addition, it does render tap(4) useless as a bridge(4)
endpoint. We now have vether(4) for use as bridge endpoint.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/share/man/man4/tap.4
cvs rdiff -u -r1.118 -r1.119 src/sys/net/if_tap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/share/man/man4/tap.4
diff -u src/share/man/man4/tap.4:1.12 src/share/man/man4/tap.4:1.13
--- src/share/man/man4/tap.4:1.12	Tue Aug 14 06:21:36 2018
+++ src/share/man/man4/tap.4	Sun Sep 27 13:44:47 2020
@@ -1,4 +1,4 @@
-.\" $NetBSD: tap.4,v 1.12 2018/08/14 06:21:36 maxv Exp $
+.\" $NetBSD: tap.4,v 1.13 2020/09/27 13:44:47 roy Exp $
 .\"
 .\"  Copyright (c) 2004, 2005 The NetBSD Foundation.
 .\"  All rights reserved.
@@ -24,7 +24,7 @@
 .\"  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\"  POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 14, 2018
+.Dd September 27, 2020
 .Dt TAP 4
 .Os
 .Sh NAME
@@ -170,9 +170,21 @@ individual character device nodes
 .Xr bridge 4 ,
 .Xr l2tp 4 ,
 .Xr tun 4 ,
+.Xr vether 4 ,
 .Xr ifconfig 8
 .Sh HISTORY
 The
 .Nm
 driver first appeared in
 .Nx 3.0 .
+.Sh CAVEATS
+Starting from
+.Nx 10.0 ,
+the
+.Nm
+driver can no longer be used as a
+.Xr bridge 4
+endpoint because it supports a link state based on if it has been opened or not.
+Use the
+.Xr vether 4
+driver instead as it's been explicitly designed for this purpose.

Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.118 src/sys/net/if_tap.c:1.119
--- src/sys/net/if_tap.c:1.118	Sat Sep 26 19:38:45 2020
+++ src/sys/net/if_tap.c	Sun Sep 27 13:44:47 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_tap.c,v 1.118 2020/09/26 19:38:45 roy Exp $	*/
+/*	$NetBSD: if_tap.c,v 1.119 2020/09/27 13:44:47 roy Exp $	*/
 
 /*
  *  Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.118 2020/09/26 19:38:45 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.119 2020/09/27 13:44:47 roy Exp $");
 
 #if defined(_KERNEL_OPT)
 
@@ -334,9 +334,8 @@ tap_attach(device_t parent, device_t sel
 	strcpy(ifp->if_xname, device_xname(self));
 	ifp->if_softc	= sc;
 	ifp->if_flags	= IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
-	ifp->if_extflags = IFEF_NO_LINK_STATE_CHANGE;
 #ifdef NET_MPSAFE
-	ifp->if_extflags |= IFEF_MPSAFE;
+	ifp->if_extflags = IFEF_MPSAFE;
 #endif
 	ifp->if_ioctl	= tap_ioctl;
 	ifp->if_start	= tap_start;
@@ -358,6 +357,8 @@ tap_attach(device_t parent, device_t sel
 	}
 	ifp->if_percpuq = if_percpuq_create(ifp);
 	ether_ifattach(ifp, enaddr);
+	/* Opening the device will bring the link state up. */
+	ifp->if_link_state = LINK_STATE_DOWN;
 	if_register(ifp);
 
 	/*
@@ -708,6 +709,8 @@ tap_cdev_open(dev_t dev, int flags, int 
 	if (sc->sc_flags & TAP_INUSE)
 		return EBUSY;
 	sc->sc_flags |= TAP_INUSE;
+	if_link_state_change(&sc->sc_ec.ec_if, LINK_STATE_UP);
+
 	return 0;
 }
 
@@ -844,6 +847,7 @@ tap_dev_close(struct tap_softc *sc)
 		sc->sc_sih = NULL;
 	}
 	sc->sc_flags &= ~(TAP_INUSE | TAP_ASYNCIO);
+	if_link_state_change(ifp, LINK_STATE_DOWN);
 
 	return 0;
 }

Reply via email to