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: