Module Name: src
Committed By: roy
Date: Thu Sep 26 09:59:56 UTC 2024
Modified Files:
src/share/man/man4: vether.4
src/sys/net: if_vether.c
Log Message:
vether(4): control link state via media rather than flags
This mirrors shmif(4) from rump.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/share/man/man4/vether.4
cvs rdiff -u -r1.3 -r1.4 src/sys/net/if_vether.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/vether.4
diff -u src/share/man/man4/vether.4:1.5 src/share/man/man4/vether.4:1.6
--- src/share/man/man4/vether.4:1.5 Tue Sep 24 15:23:53 2024
+++ src/share/man/man4/vether.4 Thu Sep 26 09:59:56 2024
@@ -1,4 +1,4 @@
-.\" $NetBSD: vether.4,v 1.5 2024/09/24 15:23:53 roy Exp $
+.\" $NetBSD: vether.4,v 1.6 2024/09/26 09:59:56 roy Exp $
.\"
.\" $OpenBSD: vether.4,v 1.5 2017/10/17 22:47:58 schwarze Exp $
.\"
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd September 24, 2017
+.Dd September 26, 2017
.Dt VETHER 4
.Os
.Sh NAME
@@ -48,10 +48,10 @@ link state can be controlled using
.Xr ifconfig 8 :
.Pp
.Bl -tag -offset indent -width Cm -compact
-.It Cm link0
+.It Cm media auto
link state
.Dq up
-.It Fl link0
+.It Cm media none
link state
.Dq down
.El
Index: src/sys/net/if_vether.c
diff -u src/sys/net/if_vether.c:1.3 src/sys/net/if_vether.c:1.4
--- src/sys/net/if_vether.c:1.3 Tue Sep 24 15:23:53 2024
+++ src/sys/net/if_vether.c Thu Sep 26 09:59:55 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vether.c,v 1.3 2024/09/24 15:23:53 roy Exp $ */
+/* $NetBSD: if_vether.c,v 1.4 2024/09/26 09:59:55 roy Exp $ */
/* $OpenBSD: if_vether.c,v 1.27 2016/04/13 11:41:15 mpi Exp $ */
/*
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vether.c,v 1.3 2024/09/24 15:23:53 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vether.c,v 1.4 2024/09/26 09:59:55 roy Exp $");
#include <sys/cprng.h>
#include <sys/kmem.h>
@@ -27,10 +27,13 @@ __KERNEL_RCSID(0, "$NetBSD: if_vether.c,
#include <net/if.h>
#include <net/if_ether.h>
+#include <net/if_media.h>
#include <net/bpf.h>
void vetherattach(int);
static int vether_ioctl(struct ifnet *, u_long, void *);
+static int vether_mediachange(struct ifnet *);
+static void vether_mediastatus(struct ifnet *, struct ifmediareq *);
static void vether_start(struct ifnet *);
static int vether_clone_create(struct if_clone *, int);
static int vether_clone_destroy(struct ifnet *);
@@ -40,6 +43,7 @@ static int vether_init(struct ifnet *);
struct vether_softc {
struct ethercom sc_ec;
+ struct ifmedia sc_im;
};
struct if_clone vether_cloner =
@@ -61,10 +65,17 @@ vether_clone_create(struct if_clone *ifc
{ 0xf2, 0x0b, 0xa4, 0xff, 0xff, 0xff };
sc = kmem_zalloc(sizeof(*sc), KM_SLEEP);
+
+ sc->sc_ec.ec_ifmedia = &sc->sc_im;
+ ifmedia_init(&sc->sc_im, 0, vether_mediachange, vether_mediastatus);
+ ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_AUTO, 0, NULL);
+ ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_NONE, 0, NULL);
+ ifmedia_set(&sc->sc_im, IFM_ETHER|IFM_AUTO);
+
ifp = &sc->sc_ec.ec_if;
if_initname(ifp, ifc->ifc_name, unit);
ifp->if_softc = sc;
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | IFF_LINK0;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
#ifdef NET_MPSAFE
ifp->if_extflags = IFEF_MPSAFE;
#endif
@@ -89,7 +100,8 @@ vether_clone_create(struct if_clone *ifc
ether_ifattach(ifp, enaddr);
if_register(ifp);
- if_link_state_change(ifp, LINK_STATE_UP);
+ /* Notify our link state */
+ vether_mediachange(ifp);
return 0;
}
@@ -114,6 +126,33 @@ vether_init(struct ifnet *ifp)
return 0;
}
+static int
+vether_mediachange(struct ifnet *ifp)
+{
+ struct vether_softc *sc = ifp->if_softc;
+ int link_state;
+
+ if (IFM_SUBTYPE(sc->sc_im.ifm_cur->ifm_media) == IFM_NONE)
+ link_state = LINK_STATE_DOWN;
+ else
+ link_state = LINK_STATE_UP;
+
+ if_link_state_change(ifp, link_state);
+ return 0;
+}
+
+static void
+vether_mediastatus(struct ifnet *ifp, struct ifmediareq *imr)
+{
+ struct vether_softc *sc = ifp->if_softc;
+
+ imr->ifm_active = sc->sc_im.ifm_cur->ifm_media;
+
+ imr->ifm_status = IFM_AVALID;
+ if (IFM_SUBTYPE(imr->ifm_active) != IFM_NONE)
+ imr->ifm_status |= IFM_ACTIVE;
+}
+
/*
* The bridge has magically already done all the work for us,
* and we only need to discard the packets.
@@ -150,13 +189,6 @@ vether_ioctl(struct ifnet *ifp, unsigned
case SIOCDELMULTI:
break;
- case SIOCSIFFLAGS:
- if ((error = ifioctl_common(ifp, cmd, data)) != 0)
- break;
- if_link_state_change(ifp, ifp->if_flags & IFF_LINK0 ?
- LINK_STATE_UP : LINK_STATE_DOWN);
- break;
-
default:
error = ether_ioctl(ifp, cmd, data);
}