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)