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