summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2013-11-26 09:50:32 +0000
committermpi <mpi@openbsd.org>2013-11-26 09:50:32 +0000
commitf2e23e596b1b06b721745d9632fc95f41b255c36 (patch)
treebe9eb75816987c95e8df7407c902b63b863ffc84
parentfix incorrectly converted CIRCLEQ_END comparison to prevent NULL deref's (diff)
downloadwireguard-openbsd-f2e23e596b1b06b721745d9632fc95f41b255c36.tar.xz
wireguard-openbsd-f2e23e596b1b06b721745d9632fc95f41b255c36.zip
Instead of comparing the lower and higher addresses of all the multicast
entries to decide if the IFF_ALLMULTI flag should be set, check if there is at least one real range between them. This should not change the behavior of any driver but if you encounter any problem, feel free to revert the offending chunk and ping me about it. ok naddy@, dlg@
-rw-r--r--sys/dev/ic/aic6915.c16
-rw-r--r--sys/dev/ic/ath.c18
-rw-r--r--sys/dev/ic/athn.c10
-rw-r--r--sys/dev/ic/atw.c13
-rw-r--r--sys/dev/ic/dp8390.c20
-rw-r--r--sys/dev/ic/i82596.c17
-rw-r--r--sys/dev/ic/if_wi.c11
-rw-r--r--sys/dev/ic/lance.c16
-rw-r--r--sys/dev/ic/lemac.c16
-rw-r--r--sys/dev/ic/mtd8xx.c13
-rw-r--r--sys/dev/ic/rtw.c16
-rw-r--r--sys/dev/ic/smc83c170.c8
-rw-r--r--sys/dev/isa/if_ie.c17
-rw-r--r--sys/dev/pci/if_de.c28
-rw-r--r--sys/dev/pci/if_ixgb.c13
-rw-r--r--sys/dev/pci/if_lge.c10
-rw-r--r--sys/dev/pci/if_nge.c10
-rw-r--r--sys/dev/pci/if_pcn.c17
-rw-r--r--sys/dev/pci/if_tl.c17
-rw-r--r--sys/dev/pci/if_txp.c21
-rw-r--r--sys/dev/pci/if_wb.c10
-rw-r--r--sys/dev/pci/if_xge.c9
-rw-r--r--sys/dev/pcmcia/if_xe.c21
-rw-r--r--sys/dev/sbus/be.c21
-rw-r--r--sys/dev/sbus/qe.c25
25 files changed, 136 insertions, 257 deletions
diff --git a/sys/dev/ic/aic6915.c b/sys/dev/ic/aic6915.c
index 8a6d6e5c510..02a5fcf3b97 100644
--- a/sys/dev/ic/aic6915.c
+++ b/sys/dev/ic/aic6915.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: aic6915.c,v 1.10 2013/08/07 01:06:27 bluhm Exp $ */
+/* $OpenBSD: aic6915.c,v 1.11 2013/11/26 09:50:32 mpi Exp $ */
/* $NetBSD: aic6915.c,v 1.15 2005/12/24 20:27:29 perry Exp $ */
/*-
@@ -1341,6 +1341,9 @@ sf_set_filter(struct sf_softc *sc)
*/
sf_set_filter_perfect(sc, 0, LLADDR(ifp->if_sadl));
+ if (ac->ac_multirangecnt > 0)
+ goto allmulti;
+
/*
* Now set the hash bits for each multicast address in our
* list.
@@ -1349,17 +1352,6 @@ sf_set_filter(struct sf_softc *sc)
if (enm == NULL)
goto done;
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- /*
- * We must listen to a range of multicast addresses.
- * For now, just accept all multicasts, rather than
- * trying to set only those filter bits needed to match
- * the range. (At this time, the only use of address
- * ranges is for IP multicast routing, for which the
- * range is big enough to require all bits set.)
- */
- goto allmulti;
- }
sf_set_filter_hash(sc, enm->enm_addrlo);
ETHER_NEXT_MULTI(step, enm);
}
diff --git a/sys/dev/ic/ath.c b/sys/dev/ic/ath.c
index d8d90a3e2f3..83cd2339197 100644
--- a/sys/dev/ic/ath.c
+++ b/sys/dev/ic/ath.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ath.c,v 1.97 2013/11/21 16:16:08 mpi Exp $ */
+/* $OpenBSD: ath.c,v 1.98 2013/11/26 09:50:32 mpi Exp $ */
/* $NetBSD: ath.c,v 1.37 2004/08/18 21:59:39 dyoung Exp $ */
/*-
@@ -1147,18 +1147,20 @@ ath_mcastfilter_accum(caddr_t dl, u_int32_t (*mfilt)[2])
void
ath_mcastfilter_compute(struct ath_softc *sc, u_int32_t (*mfilt)[2])
{
+ struct arpcom *ac = &sc->sc_ic.ic_ac;
struct ifnet *ifp = &sc->sc_ic.ic_if;
struct ether_multi *enm;
struct ether_multistep estep;
- ETHER_FIRST_MULTI(estep, &sc->sc_ic.ic_ac, enm);
- while (enm != NULL) {
+ if (ac->ac_multirangecnt > 0) {
/* XXX Punt on ranges. */
- if (!IEEE80211_ADDR_EQ(enm->enm_addrlo, enm->enm_addrhi)) {
- (*mfilt)[0] = (*mfilt)[1] = ~((u_int32_t)0);
- ifp->if_flags |= IFF_ALLMULTI;
- return;
- }
+ (*mfilt)[0] = (*mfilt)[1] = ~((u_int32_t)0);
+ ifp->if_flags |= IFF_ALLMULTI;
+ return;
+ }
+
+ ETHER_FIRST_MULTI(estep, ac, enm);
+ while (enm != NULL) {
ath_mcastfilter_accum(enm->enm_addrlo, mfilt);
ETHER_NEXT_MULTI(estep, enm);
}
diff --git a/sys/dev/ic/athn.c b/sys/dev/ic/athn.c
index ffa6cb65a09..5d5ab61c569 100644
--- a/sys/dev/ic/athn.c
+++ b/sys/dev/ic/athn.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: athn.c,v 1.78 2013/11/15 01:45:44 krw Exp $ */
+/* $OpenBSD: athn.c,v 1.79 2013/11/26 09:50:32 mpi Exp $ */
/*-
* Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
@@ -2626,6 +2626,9 @@ athn_set_multi(struct athn_softc *sc)
uint32_t val, lo, hi;
uint8_t bit;
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if ((ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
lo = hi = 0xffffffff;
goto done;
@@ -2633,11 +2636,6 @@ athn_set_multi(struct athn_softc *sc)
lo = hi = 0;
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
- ifp->if_flags |= IFF_ALLMULTI;
- lo = hi = 0xffffffff;
- goto done;
- }
addr = enm->enm_addrlo;
/* Calculate the XOR value of all eight 6-bit words. */
val = addr[0] | addr[1] << 8 | addr[2] << 16;
diff --git a/sys/dev/ic/atw.c b/sys/dev/ic/atw.c
index 042bf6cf2e7..27e98c64f94 100644
--- a/sys/dev/ic/atw.c
+++ b/sys/dev/ic/atw.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: atw.c,v 1.77 2013/11/14 12:30:39 dlg Exp $ */
+/* $OpenBSD: atw.c,v 1.78 2013/11/26 09:50:32 mpi Exp $ */
/* $NetBSD: atw.c,v 1.69 2004/07/23 07:07:55 dyoung Exp $ */
/*-
@@ -2030,7 +2030,7 @@ void
atw_filter_setup(struct atw_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
- struct arpcom *ec = &ic->ic_ac;
+ struct arpcom *ac = &ic->ic_ac;
struct ifnet *ifp = &sc->sc_ic.ic_if;
int hash;
u_int32_t hashes[2];
@@ -2058,15 +2058,14 @@ atw_filter_setup(struct atw_softc *sc)
hashes[0] = hashes[1] = 0x0;
+ if (ac->ac_multirangecnt > 0)
+ goto allmulti;
+
/*
* Program the 64-bit multicast hash filter.
*/
- ETHER_FIRST_MULTI(step, ec, enm);
+ ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
- ETHER_ADDR_LEN) != 0)
- goto allmulti;
-
hash = atw_calchash(enm->enm_addrlo);
hashes[hash >> 5] |= 1 << (hash & 0x1f);
ETHER_NEXT_MULTI(step, enm);
diff --git a/sys/dev/ic/dp8390.c b/sys/dev/ic/dp8390.c
index 4868f9fcb62..b4ec9323467 100644
--- a/sys/dev/ic/dp8390.c
+++ b/sys/dev/ic/dp8390.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dp8390.c,v 1.45 2013/08/07 01:06:29 bluhm Exp $ */
+/* $OpenBSD: dp8390.c,v 1.46 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: dp8390.c,v 1.13 1998/07/05 06:49:11 jonathan Exp $ */
/*
@@ -923,7 +923,7 @@ dp8390_getmcaf(struct arpcom *ac, u_int8_t *af)
* the word.
*/
- if (ifp->if_flags & IFF_PROMISC) {
+ if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0) {
ifp->if_flags |= IFF_ALLMULTI;
for (i = 0; i < 8; i++)
af[i] = 0xff;
@@ -933,22 +933,6 @@ dp8390_getmcaf(struct arpcom *ac, u_int8_t *af)
af[i] = 0;
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
- sizeof(enm->enm_addrlo)) != 0) {
- /*
- * We must listen to a range of multicast addresses.
- * For now, just accept all multicasts, rather than
- * trying to set only those filter bits needed to match
- * the range. (At this time, the only use of address
- * ranges is for IP multicast routing, for which the
- * range is big enough to require all bits set.)
- */
- ifp->if_flags |= IFF_ALLMULTI;
- for (i = 0; i < 8; i++)
- af[i] = 0xff;
- return;
- }
-
/* Just want the 6 most significant bits. */
crc = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26;
diff --git a/sys/dev/ic/i82596.c b/sys/dev/ic/i82596.c
index 6c07c66800f..c20e9f2ab65 100644
--- a/sys/dev/ic/i82596.c
+++ b/sys/dev/ic/i82596.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: i82596.c,v 1.34 2013/08/07 01:06:29 bluhm Exp $ */
+/* $OpenBSD: i82596.c,v 1.35 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: i82586.c,v 1.18 1998/08/15 04:42:42 mycroft Exp $ */
/*-
@@ -1949,10 +1949,17 @@ void
ie_mc_reset(sc)
struct ie_softc *sc;
{
+ struct arpcom *ac = &sc->sc_arpcom;
struct ether_multi *enm;
struct ether_multistep step;
int size;
+ if (ac->ac_multicnt >= IE_MAXMCAST || ac->ac_multirangecnt > 0) {
+ ac->ac_if.if_flags |= IFF_ALLMULTI;
+ i82596_ioctl(&ac->.ac_if, SIOCSIFFLAGS, (void *)0);
+ return;
+ }
+
/*
* Step through the list of addresses.
*/
@@ -1961,14 +1968,6 @@ ie_mc_reset(sc)
ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
while (enm) {
size += ETHER_ADDR_LEN;
- if (sc->mcast_count >= IE_MAXMCAST ||
- bcmp(enm->enm_addrlo, enm->enm_addrhi,
- ETHER_ADDR_LEN) != 0) {
- sc->sc_arpcom.ac_if.if_flags |= IFF_ALLMULTI;
- i82596_ioctl(&sc->sc_arpcom.ac_if,
- SIOCSIFFLAGS, (void *)0);
- return;
- }
sc->mcast_count++;
ETHER_NEXT_MULTI(step, enm);
}
diff --git a/sys/dev/ic/if_wi.c b/sys/dev/ic/if_wi.c
index ed2f248eef5..0c44fd50a47 100644
--- a/sys/dev/ic/if_wi.c
+++ b/sys/dev/ic/if_wi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_wi.c,v 1.153 2013/10/01 19:33:49 kettenis Exp $ */
+/* $OpenBSD: if_wi.c,v 1.154 2013/11/26 09:50:33 mpi Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -1394,6 +1394,7 @@ wi_alloc_nicmem_io(struct wi_softc *sc, int len, int *id)
STATIC void
wi_setmulti(struct wi_softc *sc)
{
+ struct arpcom *ac = &sc->sc_ic.ic_ac;
struct ifnet *ifp;
int i = 0;
struct wi_ltv_mcast mcast;
@@ -1407,7 +1408,9 @@ wi_setmulti(struct wi_softc *sc)
mcast.wi_type = WI_RID_MCAST_LIST;
mcast.wi_len = ((ETHER_ADDR_LEN / 2) * 16) + 1;
-allmulti:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
wi_write_record(sc, (struct wi_ltv_gen *)&mcast);
return;
@@ -1420,10 +1423,6 @@ allmulti:
break;
}
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- ifp->if_flags |= IFF_ALLMULTI;
- goto allmulti;
- }
bcopy(enm->enm_addrlo, &mcast.wi_mcast[i], ETHER_ADDR_LEN);
i++;
ETHER_NEXT_MULTI(step, enm);
diff --git a/sys/dev/ic/lance.c b/sys/dev/ic/lance.c
index 731cf8a5980..4d29cf1bd48 100644
--- a/sys/dev/ic/lance.c
+++ b/sys/dev/ic/lance.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lance.c,v 1.1 2013/09/24 20:10:58 miod Exp $ */
+/* $OpenBSD: lance.c,v 1.2 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: lance.c,v 1.46 2012/02/02 19:43:03 tls Exp $ */
/*-
@@ -603,24 +603,12 @@ lance_setladrf(struct arpcom *ac, uint16_t *af)
* the word.
*/
- if (ifp->if_flags & IFF_PROMISC)
+ if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0)
goto allmulti;
af[0] = af[1] = af[2] = af[3] = 0x0000;
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (ETHER_CMP(enm->enm_addrlo, enm->enm_addrhi)) {
- /*
- * We must listen to a range of multicast addresses.
- * For now, just accept all multicasts, rather than
- * trying to set only those filter bits needed to match
- * the range. (At this time, the only use of address
- * ranges is for IP multicast routing, for which the
- * range is big enough to require all bits set.)
- */
- goto allmulti;
- }
-
crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN);
/* Just want the 6 most significant bits. */
diff --git a/sys/dev/ic/lemac.c b/sys/dev/ic/lemac.c
index 76d5470547d..30908ff4604 100644
--- a/sys/dev/ic/lemac.c
+++ b/sys/dev/ic/lemac.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lemac.c,v 1.14 2013/08/07 01:06:30 bluhm Exp $ */
+/* $OpenBSD: lemac.c,v 1.15 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: lemac.c,v 1.20 2001/06/13 10:46:02 wiz Exp $ */
/*-
@@ -490,6 +490,7 @@ void
lemac_multicast_filter(struct lemac_softc *sc)
{
#if 0
+ struct arpcom *ac = &sc->sc_ec;
struct ether_multistep step;
struct ether_multi *enm;
#endif
@@ -499,13 +500,14 @@ lemac_multicast_filter(struct lemac_softc *sc)
lemac_multicast_op(sc->sc_mctbl, etherbroadcastaddr, 1);
#if 0
- ETHER_FIRST_MULTI(step, &sc->sc_ec, enm);
+ if (ac->ac_multirangecnt > 0) {
+ sc->sc_flags |= LEMAC_ALLMULTI;
+ sc->sc_if.if_flags |= IFF_ALLMULTI;
+ return;
+ }
+
+ ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (!LEMAC_ADDREQUAL(enm->enm_addrlo, enm->enm_addrhi)) {
- sc->sc_flags |= LEMAC_ALLMULTI;
- sc->sc_if.if_flags |= IFF_ALLMULTI;
- return;
- }
lemac_multicast_op(sc->sc_mctbl, enm->enm_addrlo, TRUE);
ETHER_NEXT_MULTI(step, enm);
}
diff --git a/sys/dev/ic/mtd8xx.c b/sys/dev/ic/mtd8xx.c
index add477fefc5..f05cd067053 100644
--- a/sys/dev/ic/mtd8xx.c
+++ b/sys/dev/ic/mtd8xx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mtd8xx.c,v 1.20 2013/08/21 05:21:43 dlg Exp $ */
+/* $OpenBSD: mtd8xx.c,v 1.21 2013/11/26 09:50:33 mpi Exp $ */
/*
* Copyright (c) 2003 Oleg Safiullin <form@pdp11.org.ru>
@@ -315,13 +315,16 @@ mtd_miibus_statchg(struct device *self)
void
mtd_setmulti(struct mtd_softc *sc)
{
+ struct arpcom *ac = &sc->sc_arpcom;
struct ifnet *ifp = &sc->sc_arpcom.ac_if;
u_int32_t rxfilt, crc, hash[2] = { 0, 0 };
struct ether_multistep step;
struct ether_multi *enm;
int mcnt = 0;
-allmulti:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
rxfilt = CSR_READ_4(MTD_TCRRCR) & ~RCR_AM;
if (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) {
rxfilt |= RCR_AM;
@@ -336,12 +339,8 @@ allmulti:
CSR_WRITE_4(MTD_MAR4, 0);
/* Now program new ones. */
- ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
+ ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- ifp->if_flags |= IFF_ALLMULTI;
- goto allmulti;
- }
crc = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26;
hash[crc >> 5] |= 1 << (crc & 0xf);
++mcnt;
diff --git a/sys/dev/ic/rtw.c b/sys/dev/ic/rtw.c
index f79999753b8..02622421ac3 100644
--- a/sys/dev/ic/rtw.c
+++ b/sys/dev/ic/rtw.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rtw.c,v 1.82 2012/12/05 23:20:19 deraadt Exp $ */
+/* $OpenBSD: rtw.c,v 1.83 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: rtw.c,v 1.29 2004/12/27 19:49:16 dyoung Exp $ */
/*-
@@ -2278,7 +2278,7 @@ rtw_pktfilt_load(struct rtw_softc *sc)
{
struct rtw_regs *regs = &sc->sc_regs;
struct ieee80211com *ic = &sc->sc_ic;
- struct arpcom *ec = &ic->ic_ac;
+ struct arpcom *ac = &ic->ic_ac;
struct ifnet *ifp = &sc->sc_ic.ic_if;
int hash;
u_int32_t hashes[2] = { 0, 0 };
@@ -2317,8 +2317,9 @@ rtw_pktfilt_load(struct rtw_softc *sc)
if ((ifp->if_flags & IFF_BROADCAST) != 0)
sc->sc_rcr |= RTW_RCR_AB; /* accept all broadcast */
- if (ifp->if_flags & IFF_PROMISC) {
- sc->sc_rcr |= RTW_RCR_AB; /* accept all broadcast */
+ if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0) {
+ if (ifp->if_flags & IFF_PROMISC)
+ sc->sc_rcr |= RTW_RCR_AB; /* accept all broadcast */
allmulti:
ifp->if_flags |= IFF_ALLMULTI;
goto setit;
@@ -2327,13 +2328,8 @@ allmulti:
/*
* Program the 64-bit multicast hash filter.
*/
- ETHER_FIRST_MULTI(step, ec, enm);
+ ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- /* XXX */
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
- ETHER_ADDR_LEN) != 0)
- goto allmulti;
-
hash = ether_crc32_be((enm->enm_addrlo),
IEEE80211_ADDR_LEN) >> 26;
hashes[hash >> 5] |= (1 << (hash & 0x1f));
diff --git a/sys/dev/ic/smc83c170.c b/sys/dev/ic/smc83c170.c
index 08eea91b7d8..befdee44846 100644
--- a/sys/dev/ic/smc83c170.c
+++ b/sys/dev/ic/smc83c170.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smc83c170.c,v 1.15 2013/08/07 01:06:31 bluhm Exp $ */
+/* $OpenBSD: smc83c170.c,v 1.16 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: smc83c170.c,v 1.59 2005/02/27 00:27:02 perry Exp $ */
/*-
@@ -1285,13 +1285,13 @@ epic_set_mchash(struct epic_softc *sc)
goto allmulti;
}
+ if (ac->ac_multirangecnt > 0)
+ goto allmulti;
+
mchash[0] = mchash[1] = mchash[2] = mchash[3] = 0;
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN))
- goto allmulti;
-
hash = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN);
hash >>= 26;
diff --git a/sys/dev/isa/if_ie.c b/sys/dev/isa/if_ie.c
index 5eca03b635c..e33529b6f3b 100644
--- a/sys/dev/isa/if_ie.c
+++ b/sys/dev/isa/if_ie.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ie.c,v 1.37 2013/08/07 01:06:32 bluhm Exp $ */
+/* $OpenBSD: if_ie.c,v 1.38 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: if_ie.c,v 1.51 1996/05/12 23:52:48 mycroft Exp $ */
/*-
@@ -2192,19 +2192,24 @@ static void
mc_reset(sc)
struct ie_softc *sc;
{
+ struct arpcom *ac = &sc->sc_arpcom;
struct ether_multi *enm;
struct ether_multistep step;
+ if (ac->ac_multirangecnt > 0) {
+ ac->ac_if.if_flags |= IFF_ALLMULTI;
+ ieioctl(&ac->ac_if, SIOCSIFFLAGS, (void *)0);
+ goto setflag;
+ }
/*
* Step through the list of addresses.
*/
sc->mcast_count = 0;
- ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
+ ETHER_FIRST_MULTI(step, ac, enm);
while (enm) {
- if (sc->mcast_count >= MAXMCAST ||
- bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
- sc->sc_arpcom.ac_if.if_flags |= IFF_ALLMULTI;
- ieioctl(&sc->sc_arpcom.ac_if, SIOCSIFFLAGS, (void *)0);
+ if (sc->mcast_count >= MAXMCAST) {
+ ac->ac_if.if_flags |= IFF_ALLMULTI;
+ ieioctl(&ac->ac_if, SIOCSIFFLAGS, (void *)0);
goto setflag;
}
diff --git a/sys/dev/pci/if_de.c b/sys/dev/pci/if_de.c
index 7178281a15e..ecaa384bb2f 100644
--- a/sys/dev/pci/if_de.c
+++ b/sys/dev/pci/if_de.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_de.c,v 1.111 2013/08/07 01:06:34 bluhm Exp $ */
+/* $OpenBSD: if_de.c,v 1.112 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: if_de.c,v 1.58 1998/01/12 09:39:58 thorpej Exp $ */
/*-
@@ -2886,6 +2886,7 @@ tulip_free_txmap(tulip_softc_t *sc, bus_dmamap_t map)
void
tulip_addr_filter(tulip_softc_t * const sc)
{
+ struct arpcom *ac = &sc->tulip_ac;
struct ether_multistep step;
struct ether_multi *enm;
@@ -2915,21 +2916,20 @@ tulip_addr_filter(tulip_softc_t * const sc)
* hash and one perfect hardware).
*/
bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata));
- ETHER_FIRST_MULTI(step, &sc->tulip_ac, enm);
- while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) == 0) {
+ if (ac->ac_multirangecnt > 0) {
+ sc->tulip_flags |= TULIP_ALLMULTI;
+ sc->tulip_flags &= ~(TULIP_WANTHASHONLY|TULIP_WANTHASHPERFECT);
+ } else {
+ ETHER_FIRST_MULTI(step, ac, enm);
+ while (enm != NULL) {
hash = tulip_mchash(enm->enm_addrlo);
#if BYTE_ORDER == BIG_ENDIAN
sp[hash >> 4] |= swap32(1 << (hash & 0xF));
#else
sp[hash >> 4] |= 1 << (hash & 0xF);
#endif
- } else {
- sc->tulip_flags |= TULIP_ALLMULTI;
- sc->tulip_flags &= ~(TULIP_WANTHASHONLY|TULIP_WANTHASHPERFECT);
- break;
- }
ETHER_NEXT_MULTI(step, enm);
+ }
}
/*
* No reason to use a hash if we are going to be
@@ -2965,13 +2965,15 @@ tulip_addr_filter(tulip_softc_t * const sc)
if ((sc->tulip_flags & (TULIP_WANTHASHPERFECT|TULIP_WANTHASHONLY)) == 0) {
u_int32_t *sp = sc->tulip_setupdata;
int idx = 0;
+ if (ac->ac_multirangecnt > 0)
+ sc->tulip_flags |= TULIP_ALLMULTI;
+
if ((sc->tulip_flags & TULIP_ALLMULTI) == 0) {
/*
* Else can get perfect filtering for 16 addresses.
*/
- ETHER_FIRST_MULTI(step, &sc->tulip_ac, enm);
+ ETHER_FIRST_MULTI(step, ac, enm);
for (; enm != NULL; idx++) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, 6) == 0) {
#if BYTE_ORDER == BIG_ENDIAN
*sp++ = ((u_int16_t *) enm->enm_addrlo)[0] << 16;
*sp++ = ((u_int16_t *) enm->enm_addrlo)[1] << 16;
@@ -2981,10 +2983,6 @@ tulip_addr_filter(tulip_softc_t * const sc)
*sp++ = ((u_int16_t *) enm->enm_addrlo)[1];
*sp++ = ((u_int16_t *) enm->enm_addrlo)[2];
#endif
- } else {
- sc->tulip_flags |= TULIP_ALLMULTI;
- break;
- }
ETHER_NEXT_MULTI(step, enm);
}
/*
diff --git a/sys/dev/pci/if_ixgb.c b/sys/dev/pci/if_ixgb.c
index 827e9da78f3..9886d39bd40 100644
--- a/sys/dev/pci/if_ixgb.c
+++ b/sys/dev/pci/if_ixgb.c
@@ -31,7 +31,7 @@ POSSIBILITY OF SUCH DAMAGE.
***************************************************************************/
-/* $OpenBSD: if_ixgb.c,v 1.59 2011/04/05 18:01:21 henning Exp $ */
+/* $OpenBSD: if_ixgb.c,v 1.60 2013/11/26 09:50:33 mpi Exp $ */
#include <dev/pci/if_ixgb.h>
@@ -753,12 +753,14 @@ ixgb_set_multi(struct ixgb_softc *sc)
IOCTL_DEBUGOUT("ixgb_set_multi: begin");
+ if (ac->ac_multirangecnt > 0) {
+ ifp->if_flags |= IFF_ALLMULTI;
+ mcnt = MAX_NUM_MULTICAST_ADDRESSES;
+ goto setit;
+ }
+
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- ifp->if_flags |= IFF_ALLMULTI;
- mcnt = MAX_NUM_MULTICAST_ADDRESSES;
- }
if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
break;
bcopy(enm->enm_addrlo, &mta[mcnt*IXGB_ETH_LENGTH_OF_ADDRESS],
@@ -767,6 +769,7 @@ ixgb_set_multi(struct ixgb_softc *sc)
ETHER_NEXT_MULTI(step, enm);
}
+setit:
if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) {
reg_rctl = IXGB_READ_REG(&sc->hw, RCTL);
reg_rctl |= IXGB_RCTL_MPE;
diff --git a/sys/dev/pci/if_lge.c b/sys/dev/pci/if_lge.c
index 19503c2edef..62c93269c68 100644
--- a/sys/dev/pci/if_lge.c
+++ b/sys/dev/pci/if_lge.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_lge.c,v 1.60 2013/10/01 20:06:01 sf Exp $ */
+/* $OpenBSD: if_lge.c,v 1.61 2013/11/26 09:50:33 mpi Exp $ */
/*
* Copyright (c) 2001 Wind River Systems
* Copyright (c) 1997, 1998, 1999, 2000, 2001
@@ -325,7 +325,9 @@ lge_setmulti(struct lge_softc *sc)
/* Make sure multicast hash table is enabled. */
CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL1|LGE_MODE1_RX_MCAST);
-allmulti:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
CSR_WRITE_4(sc, LGE_MAR0, 0xFFFFFFFF);
CSR_WRITE_4(sc, LGE_MAR1, 0xFFFFFFFF);
@@ -339,10 +341,6 @@ allmulti:
/* now program new ones */
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- ifp->if_flags |= IFF_ALLMULTI;
- goto allmulti;
- }
h = (ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26) &
0x0000003F;
if (h < 32)
diff --git a/sys/dev/pci/if_nge.c b/sys/dev/pci/if_nge.c
index c56ebee42c5..d61109555e4 100644
--- a/sys/dev/pci/if_nge.c
+++ b/sys/dev/pci/if_nge.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_nge.c,v 1.77 2013/11/18 19:43:00 brad Exp $ */
+/* $OpenBSD: if_nge.c,v 1.78 2013/11/26 09:50:33 mpi Exp $ */
/*
* Copyright (c) 2001 Wind River Systems
* Copyright (c) 1997, 1998, 1999, 2000, 2001
@@ -586,7 +586,9 @@ nge_setmulti(struct nge_softc *sc)
u_int32_t h = 0, i, filtsave;
int bit, index;
-allmulti:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
NGE_CLRBIT(sc, NGE_RXFILT_CTL,
NGE_RXFILTCTL_MCHASH|NGE_RXFILTCTL_UCHASH);
@@ -620,10 +622,6 @@ allmulti:
*/
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- ifp->if_flags |= IFF_ALLMULTI;
- goto allmulti;
- }
h = (ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 21) &
0x00000FFF;
index = (h >> 4) & 0x7F;
diff --git a/sys/dev/pci/if_pcn.c b/sys/dev/pci/if_pcn.c
index 69eca80d7cd..abaa8bdb68b 100644
--- a/sys/dev/pci/if_pcn.c
+++ b/sys/dev/pci/if_pcn.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_pcn.c,v 1.27 2013/08/07 01:06:36 bluhm Exp $ */
+/* $OpenBSD: if_pcn.c,v 1.28 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: if_pcn.c,v 1.26 2005/05/07 09:15:44 is Exp $ */
/*
@@ -1843,7 +1843,8 @@ pcn_set_filter(struct pcn_softc *sc)
* of the bits select the bit within the word.
*/
- if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC)
+ if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC ||
+ ac->ac_multirangecnt > 0)
goto allmulti;
sc->sc_initblock.init_ladrf[0] =
@@ -1853,18 +1854,6 @@ pcn_set_filter(struct pcn_softc *sc)
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- /*
- * We must listen to a range of multicast addresses.
- * For now, just accept all multicasts, rather than
- * trying to set only those filter bits needed to match
- * the range. (At this time, the only use of address
- * ranges is for IP multicast routing, for which the
- * range is big enough to require all bits set.)
- */
- goto allmulti;
- }
-
crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN);
/* Just want the 6 most significant bits. */
diff --git a/sys/dev/pci/if_tl.c b/sys/dev/pci/if_tl.c
index 1345446be8b..367112c0d88 100644
--- a/sys/dev/pci/if_tl.c
+++ b/sys/dev/pci/if_tl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_tl.c,v 1.56 2013/11/18 19:43:00 brad Exp $ */
+/* $OpenBSD: if_tl.c,v 1.57 2013/11/26 09:50:33 mpi Exp $ */
/*
* Copyright (c) 1997, 1998
@@ -815,20 +815,6 @@ tl_setmulti(struct tl_softc *sc)
tl_dio_write32(sc, TL_HASH2, 0);
ifp->if_flags &= ~IFF_ALLMULTI;
-#if 0
- ETHER_FIRST_MULTI(step, ac, enm);
- while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) == 0) {
- h = tl_calchash(enm->enm_addrlo);
- hashes[h/32] |= (1 << (h % 32));
- } else {
- hashes[0] = hashes[1] = 0xffffffff;
- ifp->if_flags |= IFF_ALLMULTI;
- break;
- }
- ETHER_NEXT_MULTI(step, enm);
- }
-#else
ETHER_FIRST_MULTI(step, ac, enm);
h = 0;
while (enm != NULL) {
@@ -840,7 +826,6 @@ tl_setmulti(struct tl_softc *sc)
ifp->if_flags |= IFF_ALLMULTI;
} else
hashes[0] = hashes[1] = 0x00000000;
-#endif
tl_dio_write32(sc, TL_HASH1, hashes[0]);
tl_dio_write32(sc, TL_HASH2, hashes[1]);
diff --git a/sys/dev/pci/if_txp.c b/sys/dev/pci/if_txp.c
index 015619de47f..c9126fa65e9 100644
--- a/sys/dev/pci/if_txp.c
+++ b/sys/dev/pci/if_txp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_txp.c,v 1.107 2013/08/07 01:06:38 bluhm Exp $ */
+/* $OpenBSD: if_txp.c,v 1.108 2013/11/26 09:50:33 mpi Exp $ */
/*
* Copyright (c) 2001
@@ -1858,7 +1858,9 @@ txp_set_filter(struct txp_softc *sc)
goto setit;
}
-again:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
filter = TXP_RXFILT_DIRECT;
if (ifp->if_flags & IFF_BROADCAST)
@@ -1871,21 +1873,6 @@ again:
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- /*
- * We must listen to a range of multicast
- * addresses. For now, just accept all
- * multicasts, rather than trying to set only
- * those filter bits needed to match the range.
- * (At this time, the only use of address
- * ranges is for IP multicast routing, for
- * which the range is big enough to require
- * all bits set.)
- */
- ifp->if_flags |= IFF_ALLMULTI;
- goto again;
- }
-
mcnt++;
hashbit = (u_int16_t)(ether_crc32_be(enm->enm_addrlo,
ETHER_ADDR_LEN) & (64 - 1));
diff --git a/sys/dev/pci/if_wb.c b/sys/dev/pci/if_wb.c
index 74ffbb3198f..70afc260646 100644
--- a/sys/dev/pci/if_wb.c
+++ b/sys/dev/pci/if_wb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_wb.c,v 1.54 2013/10/01 20:06:02 sf Exp $ */
+/* $OpenBSD: if_wb.c,v 1.55 2013/11/26 09:50:33 mpi Exp $ */
/*
* Copyright (c) 1997, 1998
@@ -537,7 +537,9 @@ void wb_setmulti(sc)
rxfilt = CSR_READ_4(sc, WB_NETCFG);
-allmulti:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
rxfilt |= WB_NETCFG_RX_MULTI;
CSR_WRITE_4(sc, WB_NETCFG, rxfilt);
@@ -553,10 +555,6 @@ allmulti:
/* now program new ones */
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- ifp->if_flags |= IFF_ALLMULTI;
- goto allmulti;
- }
h = ~(ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26);
if (h < 32)
hashes[0] |= (1 << h);
diff --git a/sys/dev/pci/if_xge.c b/sys/dev/pci/if_xge.c
index 55ba58cb87e..bd286e36740 100644
--- a/sys/dev/pci/if_xge.c
+++ b/sys/dev/pci/if_xge.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_xge.c,v 1.55 2013/08/07 01:06:39 bluhm Exp $ */
+/* $OpenBSD: if_xge.c,v 1.56 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: if_xge.c,v 1.1 2005/09/09 10:30:27 ragge Exp $ */
/*
@@ -1016,12 +1016,11 @@ xge_setmulti(struct xge_softc *sc)
int i, numaddr = 1; /* first slot used for card unicast address */
uint64_t val;
+ if (ac->ac_multirangecnt > 0)
+ goto allmulti;
+
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- /* Skip ranges */
- goto allmulti;
- }
if (numaddr == MAX_MCAST_ADDR)
goto allmulti;
for (val = 0, i = 0; i < ETHER_ADDR_LEN; i++) {
diff --git a/sys/dev/pcmcia/if_xe.c b/sys/dev/pcmcia/if_xe.c
index 6d62ac85f6a..2417b08fe16 100644
--- a/sys/dev/pcmcia/if_xe.c
+++ b/sys/dev/pcmcia/if_xe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_xe.c,v 1.42 2013/08/07 01:06:40 bluhm Exp $ */
+/* $OpenBSD: if_xe.c,v 1.43 2013/11/26 09:50:33 mpi Exp $ */
/*
* Copyright (c) 1999 Niklas Hallqvist, Brandon Creighton, Job de Haas
@@ -1273,8 +1273,11 @@ xe_set_address(sc)
sc->sc_arpcom.ac_enaddr[(sc->sc_flags & XEF_MOHAWK) ?
5 - i : i]);
}
-
- if (arp->ac_multicnt > 0) {
+
+ if (arp->ac_multirangecnt > 0) {
+ ifp->if_flags |= IFF_ALLMULTI;
+ sc->sc_all_mcasts=1;
+ } else if (arp->ac_multicnt > 0) {
if (arp->ac_multicnt > 9) {
PAGE(sc, 0x42);
bus_space_write_1(sc->sc_bst, sc->sc_bsh,
@@ -1288,18 +1291,6 @@ xe_set_address(sc)
pos = IA + 6;
for (page = 0x50, num = arp->ac_multicnt; num > 0 && enm;
num--) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
- sizeof(enm->enm_addrlo)) != 0) {
- /*
- * The multicast address is really a range;
- * it's easier just to accept all multicasts.
- * XXX should we be setting IFF_ALLMULTI here?
- */
- ifp->if_flags |= IFF_ALLMULTI;
- sc->sc_all_mcasts=1;
- break;
- }
-
for (i = 0; i < 6; i++) {
bus_space_write_1(bst, bsh, offset + pos,
enm->enm_addrlo[
diff --git a/sys/dev/sbus/be.c b/sys/dev/sbus/be.c
index 9621b7513ae..c2fc2fa53a3 100644
--- a/sys/dev/sbus/be.c
+++ b/sys/dev/sbus/be.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: be.c,v 1.25 2013/08/07 01:06:40 bluhm Exp $ */
+/* $OpenBSD: be.c,v 1.26 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: be.c,v 1.26 2001/03/20 15:39:20 pk Exp $ */
/*-
@@ -1116,6 +1116,9 @@ be_mcreset(struct be_softc *sc)
return;
}
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI) {
hash[3] = hash[2] = hash[1] = hash[0] = 0xffff;
goto chipit;
@@ -1125,22 +1128,6 @@ be_mcreset(struct be_softc *sc)
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
- /*
- * We must listen to a range of multicast
- * addresses. For now, just accept all
- * multicasts, rather than trying to set only
- * those filter bits needed to match the range.
- * (At this time, the only use of address
- * ranges is for IP multicast routing, for
- * which the range is big enough to require
- * all bits set.)
- */
- hash[3] = hash[2] = hash[1] = hash[0] = 0xffff;
- ifp->if_flags |= IFF_ALLMULTI;
- goto chipit;
- }
-
crc = 0xffffffff;
for (i = 0; i < ETHER_ADDR_LEN; i++) {
diff --git a/sys/dev/sbus/qe.c b/sys/dev/sbus/qe.c
index c988407038c..ec17c7f05f4 100644
--- a/sys/dev/sbus/qe.c
+++ b/sys/dev/sbus/qe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: qe.c,v 1.24 2013/08/07 01:06:40 bluhm Exp $ */
+/* $OpenBSD: qe.c,v 1.25 2013/11/26 09:50:33 mpi Exp $ */
/* $NetBSD: qe.c,v 1.16 2001/03/30 17:30:18 christos Exp $ */
/*-
@@ -1098,6 +1098,9 @@ qe_mcreset(sc)
return;
}
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI) {
bus_space_write_1(t, mr, QE_MRI_IAC,
QE_MR_IAC_ADDRCHG | QE_MR_IAC_LOGADDR);
@@ -1111,26 +1114,6 @@ qe_mcreset(sc)
ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
- ETHER_ADDR_LEN) != 0) {
- /*
- * We must listen to a range of multicast
- * addresses. For now, just accept all
- * multicasts, rather than trying to set only
- * those filter bits needed to match the range.
- * (At this time, the only use of address
- * ranges is for IP multicast routing, for
- * which the range is big enough to require
- * all bits set.)
- */
- bus_space_write_1(t, mr, QE_MRI_IAC,
- QE_MR_IAC_ADDRCHG | QE_MR_IAC_LOGADDR);
- bus_space_set_multi_1(t, mr, QE_MRI_LADRF, 0xff, 8);
- bus_space_write_1(t, mr, QE_MRI_IAC, 0);
- ifp->if_flags |= IFF_ALLMULTI;
- break;
- }
-
crc = 0xffffffff;
for (i = 0; i < ETHER_ADDR_LEN; i++) {