Module Name:    src
Committed By:   ozaki-r
Date:           Tue Aug 20 08:17:15 UTC 2024

Modified Files:
        src/sys/rump/net/lib/libshmif: if_shmem.c

Log Message:
shmif: support media

It enables to link-down shmif by ifconfig media none and link-up
again by media auto.


To generate a diff of this commit:
cvs rdiff -u -r1.85 -r1.86 src/sys/rump/net/lib/libshmif/if_shmem.c

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

Modified files:

Index: src/sys/rump/net/lib/libshmif/if_shmem.c
diff -u src/sys/rump/net/lib/libshmif/if_shmem.c:1.85 src/sys/rump/net/lib/libshmif/if_shmem.c:1.86
--- src/sys/rump/net/lib/libshmif/if_shmem.c:1.85	Tue Aug 20 08:16:22 2024
+++ src/sys/rump/net/lib/libshmif/if_shmem.c	Tue Aug 20 08:17:15 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_shmem.c,v 1.85 2024/08/20 08:16:22 ozaki-r Exp $	*/
+/*	$NetBSD: if_shmem.c,v 1.86 2024/08/20 08:17:15 ozaki-r Exp $	*/
 
 /*
  * Copyright (c) 2009, 2010 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.85 2024/08/20 08:16:22 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.86 2024/08/20 08:17:15 ozaki-r Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_ether.h>
+#include <net/if_media.h>
 #include <net/ether_sw_offload.h>
 
 #include <netinet/in.h>
@@ -59,6 +60,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v
 static int shmif_clone(struct if_clone *, int);
 static int shmif_unclone(struct ifnet *);
 
+static int shmif_mediachange(struct ifnet *);
+static void shmif_mediastatus(struct ifnet *, struct ifmediareq *);
+
 struct if_clone shmif_cloner =
     IF_CLONE_INITIALIZER("shmif", shmif_clone, shmif_unclone);
 
@@ -84,6 +88,7 @@ static void	shmif_stop(struct ifnet *, i
 
 struct shmif_sc {
 	struct ethercom sc_ec;
+	struct ifmedia sc_im;
 	struct shmif_mem *sc_busmem;
 	int sc_memfd;
 	int sc_kq;
@@ -176,6 +181,11 @@ allocif(int unit, struct shmif_sc **scp)
 
 	ifp = &sc->sc_ec.ec_if;
 
+	ifmedia_init(&sc->sc_im, 0, shmif_mediachange, shmif_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);
+
 	snprintf(ifp->if_xname, sizeof(ifp->if_xname), "shmif%d", unit);
 	ifp->if_softc = sc;
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
@@ -446,6 +456,28 @@ shmif_init(struct ifnet *ifp)
 }
 
 static int
+shmif_mediachange(struct ifnet *ifp)
+{
+	struct shmif_sc *sc = ifp->if_softc;
+
+	if (IFM_SUBTYPE(sc->sc_im.ifm_cur->ifm_media) == IFM_NONE &&
+	    ifp->if_link_state != LINK_STATE_DOWN) {
+		if_link_state_change(ifp, LINK_STATE_DOWN);
+	} else if (IFM_SUBTYPE(sc->sc_im.ifm_cur->ifm_media) == IFM_AUTO &&
+	    ifp->if_link_state != LINK_STATE_UP) {
+		if_link_state_change(ifp, LINK_STATE_UP);
+	}
+	return 0;
+}
+
+static void
+shmif_mediastatus(struct ifnet *ifp, struct ifmediareq *imr)
+{
+	struct shmif_sc *sc = ifp->if_softc;
+	imr->ifm_active = sc->sc_im.ifm_cur->ifm_media;
+}
+
+static int
 shmif_ioctl(struct ifnet *ifp, u_long cmd, void *data)
 {
 	struct shmif_sc *sc = ifp->if_softc;
@@ -529,6 +561,15 @@ shmif_ioctl(struct ifnet *ifp, u_long cm
 
 		if_link_state_change(ifp, LINK_STATE_UP);
 		break;
+
+#ifdef OSIOCSIFMEDIA
+	case OSIOCSIFMEDIA:
+#endif
+	case SIOCSIFMEDIA:
+	case SIOCGIFMEDIA:
+		rv = ifmedia_ioctl(ifp, data, &sc->sc_im, cmd);
+		break;
+
 	default:
 		rv = ether_ioctl(ifp, cmd, data);
 		if (rv == ENETRESET)

Reply via email to