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:

Reply via email to