Module Name:    src
Committed By:   martin
Date:           Thu Oct  3 16:19:59 UTC 2024

Modified Files:
        src/sys/rump/net/lib/libshmif [netbsd-10]: if_shmem.c

Log Message:
Pull up following revision(s) (requested by rin in ticket #924):

        sys/rump/net/lib/libshmif/if_shmem.c: revision 1.89

shmif: Fix logics for media change and status

- shmif_mediachange: Drop check for if_link_state. Otherwise,
   there can be race b/w events in if_link_queue.
- shmif_mediastatus: Set ifm_status appropriately, by which
   link state appears in ifconfig(8) "status:" line.

Pointed out by roy@, and taken from his codes in vether(4). Thanks!!


To generate a diff of this commit:
cvs rdiff -u -r1.84.4.2 -r1.84.4.3 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.84.4.2 src/sys/rump/net/lib/libshmif/if_shmem.c:1.84.4.3
--- src/sys/rump/net/lib/libshmif/if_shmem.c:1.84.4.2	Thu Sep  5 09:22:44 2024
+++ src/sys/rump/net/lib/libshmif/if_shmem.c	Thu Oct  3 16:19:59 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_shmem.c,v 1.84.4.2 2024/09/05 09:22:44 martin Exp $	*/
+/*	$NetBSD: if_shmem.c,v 1.84.4.3 2024/10/03 16:19:59 martin 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.84.4.2 2024/09/05 09:22:44 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.84.4.3 2024/10/03 16:19:59 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -455,14 +455,14 @@ static int
 shmif_mediachange(struct ifnet *ifp)
 {
 	struct shmif_sc *sc = ifp->if_softc;
+	int link_state;
 
-	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);
-	}
+	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;
 }
 
@@ -470,7 +470,12 @@ 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;
+
+	imr->ifm_status = IFM_AVALID;
+	if (IFM_SUBTYPE(imr->ifm_active) != IFM_NONE)
+		imr->ifm_status |= IFM_ACTIVE;
 }
 
 static int

Reply via email to