Module Name:    src
Committed By:   rin
Date:           Tue Oct  1 08:55:58 UTC 2024

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

Log Message:
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.88 -r1.89 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.88 src/sys/rump/net/lib/libshmif/if_shmem.c:1.89
--- src/sys/rump/net/lib/libshmif/if_shmem.c:1.88	Mon Sep  2 05:12:53 2024
+++ src/sys/rump/net/lib/libshmif/if_shmem.c	Tue Oct  1 08:55:58 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_shmem.c,v 1.88 2024/09/02 05:12:53 ozaki-r Exp $	*/
+/*	$NetBSD: if_shmem.c,v 1.89 2024/10/01 08:55:58 rin 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.88 2024/09/02 05:12:53 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.89 2024/10/01 08:55:58 rin 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