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