Module Name: src Committed By: riastradh Date: Sat Aug 20 14:08:59 UTC 2022
Modified Files: src/share/man/man9: usbnet.9 src/sys/dev/usb: if_aue.c if_axe.c if_axen.c if_cue.c if_kue.c if_mos.c if_mue.c if_smsc.c if_udav.c if_ure.c if_url.c usbnet.c usbnet.h Log Message: usbnet(9): New usbnet_ispromisc(un). Replaces ifp->if_flags & IFF_PROMISC in multicast filter updates. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/share/man/man9/usbnet.9 cvs rdiff -u -r1.190 -r1.191 src/sys/dev/usb/if_aue.c cvs rdiff -u -r1.150 -r1.151 src/sys/dev/usb/if_axe.c cvs rdiff -u -r1.93 -r1.94 src/sys/dev/usb/if_axen.c cvs rdiff -u -r1.106 -r1.107 src/sys/dev/usb/if_cue.c cvs rdiff -u -r1.118 -r1.119 src/sys/dev/usb/if_kue.c cvs rdiff -u -r1.22 -r1.23 src/sys/dev/usb/if_mos.c cvs rdiff -u -r1.81 -r1.82 src/sys/dev/usb/if_mue.c cvs rdiff -u -r1.92 -r1.93 src/sys/dev/usb/if_smsc.c cvs rdiff -u -r1.97 -r1.98 src/sys/dev/usb/if_udav.c cvs rdiff -u -r1.56 -r1.57 src/sys/dev/usb/if_ure.c cvs rdiff -u -r1.96 -r1.97 src/sys/dev/usb/if_url.c cvs rdiff -u -r1.108 -r1.109 src/sys/dev/usb/usbnet.c cvs rdiff -u -r1.33 -r1.34 src/sys/dev/usb/usbnet.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/share/man/man9/usbnet.9 diff -u src/share/man/man9/usbnet.9:1.18 src/share/man/man9/usbnet.9:1.19 --- src/share/man/man9/usbnet.9:1.18 Fri Aug 12 15:30:41 2022 +++ src/share/man/man9/usbnet.9 Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -.\" $NetBSD: usbnet.9,v 1.18 2022/08/12 15:30:41 riastradh Exp $ +.\" $NetBSD: usbnet.9,v 1.19 2022/08/20 14:08:59 riastradh Exp $ .\" .\" Copyright (c) 2019 Matthew R. Green .\" All rights reserved. @@ -47,6 +47,8 @@ .Fn usbnet_softc "struct usbnet *un" .Ft bool .Fn usbnet_havelink "struct usbnet *un" +.Ft int +.Fn usbnet_ispromisc "struct usbnet *un" .Ft bool .Fn usbnet_isdying "struct usbnet *un" .Ft void @@ -243,6 +245,20 @@ Returns pointer to this device softc. .It Fn usbnet_havelink un Returns true if link is active. +.It Fn usbnet_ispromisc un +True if +.Dv IFF_PROMISC +is enabled, false if not. +.Pp +May be used only in +.Dq uno_init +and +.Dq uno_mcast . +.Pp +Drivers must use this in +.Dq uno_mcast +instead of reading +.Li ifp->if_flags . .It Fn usbnet_isdying un Returns true if device is dying (has been pulled or deactivated, pending detach). Index: src/sys/dev/usb/if_aue.c diff -u src/sys/dev/usb/if_aue.c:1.190 src/sys/dev/usb/if_aue.c:1.191 --- src/sys/dev/usb/if_aue.c:1.190 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_aue.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_aue.c,v 1.190 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_aue.c,v 1.191 2022/08/20 14:08:59 riastradh Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.190 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.191 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -619,7 +619,7 @@ aue_uno_mcast(struct ifnet *ifp) AUEHIST_FUNC(); AUEHIST_CALLARGSN(5, "aue%jd: enter", device_unit(un->un_dev), 0, 0, 0); - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ETHER_LOCK(ec); allmulti: ec->ec_flags |= ETHER_F_ALLMULTI; @@ -962,7 +962,7 @@ aue_uno_init(struct ifnet *ifp) aue_csr_write_1(sc, AUE_PAR0 + i, eaddr[i]); /* If we want promiscuous mode, set the allframes bit. */ - if (ifp->if_flags & IFF_PROMISC) + if (usbnet_ispromisc(un)) AUE_SETBIT(sc, AUE_CTL2, AUE_CTL2_RX_PROMISC); else AUE_CLRBIT(sc, AUE_CTL2, AUE_CTL2_RX_PROMISC); Index: src/sys/dev/usb/if_axe.c diff -u src/sys/dev/usb/if_axe.c:1.150 src/sys/dev/usb/if_axe.c:1.151 --- src/sys/dev/usb/if_axe.c:1.150 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_axe.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axe.c,v 1.150 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_axe.c,v 1.151 2022/08/20 14:08:59 riastradh Exp $ */ /* $OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */ /* @@ -87,7 +87,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.150 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.151 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -452,7 +452,7 @@ axe_uno_mcast(struct ifnet *ifp) ~(AXE_RXCMD_ALLMULTI | AXE_RXCMD_PROMISC | AXE_RXCMD_MULTICAST); ETHER_LOCK(ec); - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ec->ec_flags |= ETHER_F_ALLMULTI; ETHER_UNLOCK(ec); /* run promisc. mode */ Index: src/sys/dev/usb/if_axen.c diff -u src/sys/dev/usb/if_axen.c:1.93 src/sys/dev/usb/if_axen.c:1.94 --- src/sys/dev/usb/if_axen.c:1.93 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_axen.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axen.c,v 1.93 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_axen.c,v 1.94 2022/08/20 14:08:59 riastradh Exp $ */ /* $OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $ */ /* @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.93 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.94 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -249,7 +249,7 @@ axen_uno_mcast(struct ifnet *ifp) rxmode &= ~(AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_PROMISC | AXEN_RXCTL_ACPT_MCAST); - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { DPRINTF(("%s: promisc\n", device_xname(un->un_dev))); rxmode |= AXEN_RXCTL_PROMISC; allmulti: Index: src/sys/dev/usb/if_cue.c diff -u src/sys/dev/usb/if_cue.c:1.106 src/sys/dev/usb/if_cue.c:1.107 --- src/sys/dev/usb/if_cue.c:1.106 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_cue.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_cue.c,v 1.106 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_cue.c,v 1.107 2022/08/20 14:08:59 riastradh Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.106 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.107 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -366,10 +366,10 @@ cue_uno_mcast(struct ifnet *ifp) struct ether_multistep step; uint32_t h, i; - DPRINTFN(2,("%s: cue_setiff if_flags=%#x\n", - device_xname(un->un_dev), ifp->if_flags)); + DPRINTFN(2,("%s: cue_setiff promisc=%d\n", + device_xname(un->un_dev), usbnet_ispromisc(un))); - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ETHER_LOCK(ec); allmulti: ec->ec_flags |= ETHER_F_ALLMULTI; @@ -636,7 +636,7 @@ cue_uno_init(struct ifnet *ifp) /* Enable RX logic. */ ctl = CUE_ETHCTL_RX_ON | CUE_ETHCTL_MCAST_ON; - if (ifp->if_flags & IFF_PROMISC) + if (usbnet_ispromisc(un)) ctl |= CUE_ETHCTL_PROMISC; cue_csr_write_1(un, CUE_ETHCTL, ctl); Index: src/sys/dev/usb/if_kue.c diff -u src/sys/dev/usb/if_kue.c:1.118 src/sys/dev/usb/if_kue.c:1.119 --- src/sys/dev/usb/if_kue.c:1.118 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_kue.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_kue.c,v 1.118 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_kue.c,v 1.119 2022/08/20 14:08:59 riastradh Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.118 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.119 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -330,12 +330,12 @@ kue_uno_mcast(struct ifnet *ifp) DPRINTFN(5,("%s: %s: enter\n", device_xname(un->un_dev), __func__)); /* If we want promiscuous mode, set the allframes bit. */ - if (ifp->if_flags & IFF_PROMISC) + if (usbnet_ispromisc(un)) sc->kue_rxfilt |= KUE_RXFILT_PROMISC; else sc->kue_rxfilt &= ~KUE_RXFILT_PROMISC; - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ETHER_LOCK(ec); allmulti: ec->ec_flags |= ETHER_F_ALLMULTI; Index: src/sys/dev/usb/if_mos.c diff -u src/sys/dev/usb/if_mos.c:1.22 src/sys/dev/usb/if_mos.c:1.23 --- src/sys/dev/usb/if_mos.c:1.22 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_mos.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mos.c,v 1.22 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_mos.c,v 1.23 2022/08/20 14:08:59 riastradh Exp $ */ /* $OpenBSD: if_mos.c,v 1.40 2019/07/07 06:40:10 kevlo Exp $ */ /* @@ -72,7 +72,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mos.c,v 1.22 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mos.c,v 1.23 2022/08/20 14:08:59 riastradh Exp $"); #include <sys/param.h> @@ -477,7 +477,7 @@ mos_uno_mcast(struct ifnet *ifp) rxmode &= ~(MOS_CTL_ALLMULTI | MOS_CTL_RX_PROMISC); ETHER_LOCK(ec); - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ec->ec_flags |= ETHER_F_ALLMULTI; ETHER_UNLOCK(ec); /* run promisc. mode */ Index: src/sys/dev/usb/if_mue.c diff -u src/sys/dev/usb/if_mue.c:1.81 src/sys/dev/usb/if_mue.c:1.82 --- src/sys/dev/usb/if_mue.c:1.81 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_mue.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mue.c,v 1.81 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_mue.c,v 1.82 2022/08/20 14:08:59 riastradh Exp $ */ /* $OpenBSD: if_mue.c,v 1.3 2018/08/04 16:42:46 jsg Exp $ */ /* @@ -20,7 +20,7 @@ /* Driver for Microchip LAN7500/LAN7800 chipsets. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.81 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.82 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -1028,11 +1028,11 @@ mue_uno_mcast(struct ifnet *ifp) rxfilt |= MUE_RFE_CTL_BROADCAST; ETHER_LOCK(ec); - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { rxfilt |= MUE_RFE_CTL_UNICAST; allmulti: rxfilt |= MUE_RFE_CTL_MULTICAST; ec->ec_flags |= ETHER_F_ALLMULTI; - if (ifp->if_flags & IFF_PROMISC) + if (usbnet_ispromisc(un)) DPRINTF(un, "promisc\n"); else DPRINTF(un, "allmulti\n"); Index: src/sys/dev/usb/if_smsc.c diff -u src/sys/dev/usb/if_smsc.c:1.92 src/sys/dev/usb/if_smsc.c:1.93 --- src/sys/dev/usb/if_smsc.c:1.92 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_smsc.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_smsc.c,v 1.92 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_smsc.c,v 1.93 2022/08/20 14:08:59 riastradh Exp $ */ /* $OpenBSD: if_smsc.c,v 1.4 2012/09/27 12:38:11 jsg Exp $ */ /* $FreeBSD: src/sys/dev/usb/net/if_smsc.c,v 1.1 2012/08/15 04:03:55 gonzo Exp $ */ @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.92 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.93 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -425,7 +425,7 @@ smsc_uno_mcast(struct ifnet *ifp) if (usbnet_isdying(un)) return; - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ETHER_LOCK(ec); allmulti: ec->ec_flags |= ETHER_F_ALLMULTI; Index: src/sys/dev/usb/if_udav.c diff -u src/sys/dev/usb/if_udav.c:1.97 src/sys/dev/usb/if_udav.c:1.98 --- src/sys/dev/usb/if_udav.c:1.97 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_udav.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_udav.c,v 1.97 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_udav.c,v 1.98 2022/08/20 14:08:59 riastradh Exp $ */ /* $nabe: if_udav.c,v 1.3 2003/08/21 16:57:19 nabe Exp $ */ /* @@ -45,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.97 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.98 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -482,7 +482,7 @@ udav_uno_init(struct ifnet *ifp) UDAV_SETBIT(un, UDAV_RCR, UDAV_RCR_DIS_LONG | UDAV_RCR_DIS_CRC); /* If we want promiscuous mode, accept all physical frames. */ - if (ifp->if_flags & IFF_PROMISC) + if (usbnet_ispromisc(un)) UDAV_SETBIT(un, UDAV_RCR, UDAV_RCR_ALL | UDAV_RCR_PRMSC); else UDAV_CLRBIT(un, UDAV_RCR, UDAV_RCR_ALL | UDAV_RCR_PRMSC); @@ -576,7 +576,7 @@ udav_uno_mcast(struct ifnet *ifp) return; } - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ETHER_LOCK(ec); ec->ec_flags |= ETHER_F_ALLMULTI; ETHER_UNLOCK(ec); Index: src/sys/dev/usb/if_ure.c diff -u src/sys/dev/usb/if_ure.c:1.56 src/sys/dev/usb/if_ure.c:1.57 --- src/sys/dev/usb/if_ure.c:1.56 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_ure.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ure.c,v 1.56 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_ure.c,v 1.57 2022/08/20 14:08:59 riastradh Exp $ */ /* $OpenBSD: if_ure.c,v 1.10 2018/11/02 21:32:30 jcs Exp $ */ /*- @@ -30,7 +30,7 @@ /* RealTek RTL8152/RTL8153 10/100/Gigabit USB Ethernet device */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.56 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.57 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -352,7 +352,7 @@ ure_uno_mcast(struct ifnet *ifp) /* continue to accept my own DA and bcast frames */ ETHER_LOCK(ec); - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ec->ec_flags |= ETHER_F_ALLMULTI; ETHER_UNLOCK(ec); /* run promisc. mode */ Index: src/sys/dev/usb/if_url.c diff -u src/sys/dev/usb/if_url.c:1.96 src/sys/dev/usb/if_url.c:1.97 --- src/sys/dev/usb/if_url.c:1.96 Thu Mar 3 05:56:28 2022 +++ src/sys/dev/usb/if_url.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_url.c,v 1.96 2022/03/03 05:56:28 riastradh Exp $ */ +/* $NetBSD: if_url.c,v 1.97 2022/08/20 14:08:59 riastradh Exp $ */ /* * Copyright (c) 2001, 2002 @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.96 2022/03/03 05:56:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.97 2022/08/20 14:08:59 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -433,7 +433,7 @@ url_uno_mcast(struct ifnet *ifp) rcr &= ~(URL_RCR_AAP | URL_RCR_AAM | URL_RCR_AM); ETHER_LOCK(ec); - if (ifp->if_flags & IFF_PROMISC) { + if (usbnet_ispromisc(un)) { ec->ec_flags |= ETHER_F_ALLMULTI; ETHER_UNLOCK(ec); /* run promisc. mode */ Index: src/sys/dev/usb/usbnet.c diff -u src/sys/dev/usb/usbnet.c:1.108 src/sys/dev/usb/usbnet.c:1.109 --- src/sys/dev/usb/usbnet.c:1.108 Sat Aug 20 14:08:47 2022 +++ src/sys/dev/usb/usbnet.c Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: usbnet.c,v 1.108 2022/08/20 14:08:47 riastradh Exp $ */ +/* $NetBSD: usbnet.c,v 1.109 2022/08/20 14:08:59 riastradh Exp $ */ /* * Copyright (c) 2019 Matthew R. Green @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.108 2022/08/20 14:08:47 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.109 2022/08/20 14:08:59 riastradh Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -1013,8 +1013,22 @@ usbnet_ifflags_cb(struct ethercom *ec) const u_short changed = ifp->if_flags ^ unp->unp_if_flags; if ((changed & ~(IFF_CANTCHANGE | IFF_DEBUG)) == 0) { + mutex_enter(&unp->unp_mcastlock); unp->unp_if_flags = ifp->if_flags; - if ((changed & IFF_PROMISC) != 0) + mutex_exit(&unp->unp_mcastlock); + /* + * XXX Can we just do uno_mcast synchronously here + * instead of resetting the whole interface? + * + * Not yet, because some usbnet drivers (e.g., aue(4)) + * initialize the hardware differently in uno_init + * depending on IFF_PROMISC. But some (again, aue(4)) + * _also_ need to know whether IFF_PROMISC is set in + * uno_mcast and do something different with it there. + * Maybe the logic can be unified, but it will require + * an audit and testing of all the usbnet drivers. + */ + if (changed & IFF_PROMISC) rv = ENETRESET; } else { rv = ENETRESET; @@ -1023,6 +1037,18 @@ usbnet_ifflags_cb(struct ethercom *ec) return rv; } +bool +usbnet_ispromisc(struct usbnet *un) +{ + struct ifnet * const ifp = usbnet_ifp(un); + struct usbnet_private * const unp = un->un_pri; + + KASSERTMSG(mutex_owned(&unp->unp_mcastlock) || IFNET_LOCKED(ifp), + "%s", ifp->if_xname); + + return unp->unp_if_flags & IFF_PROMISC; +} + static int usbnet_if_ioctl(struct ifnet *ifp, u_long cmd, void *data) { Index: src/sys/dev/usb/usbnet.h diff -u src/sys/dev/usb/usbnet.h:1.33 src/sys/dev/usb/usbnet.h:1.34 --- src/sys/dev/usb/usbnet.h:1.33 Thu Mar 3 05:56:51 2022 +++ src/sys/dev/usb/usbnet.h Sat Aug 20 14:08:59 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: usbnet.h,v 1.33 2022/03/03 05:56:51 riastradh Exp $ */ +/* $NetBSD: usbnet.h,v 1.34 2022/08/20 14:08:59 riastradh Exp $ */ /* * Copyright (c) 2019 Matthew R. Green @@ -285,6 +285,7 @@ void *usbnet_softc(struct usbnet *); bool usbnet_havelink(struct usbnet *); bool usbnet_isdying(struct usbnet *); +bool usbnet_ispromisc(struct usbnet *); /* * Endpoint / rx/tx chain management: