Diff below converts the remaining drivers in our tree that still compare
the low and high value of their Ethernet multicast ranges to set the
IFF_ALLMULTI flag to use "ac->ac_multirangecnt" instead. This should
not change the behavior of any driver.
The goal if this diff is to stop using the ``enm_addrhi'' field of
the ether_multi structure to be able to modify our multicast address
representation in a backward compatible way (without modifying more
drivers than that!).
As I (obviously) don't have access to all the hardware to fully test
this diff, I appreciate test and/or oks on a per driver basis.
I did compile this diff on amd64 and macppc.
Index: dev/ic/aic6915.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/aic6915.c,v
retrieving revision 1.10
diff -u -p -r1.10 aic6915.c
--- dev/ic/aic6915.c 7 Aug 2013 01:06:27 -0000 1.10
+++ dev/ic/aic6915.c 16 Oct 2013 13:27:25 -0000
@@ -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);
}
Index: dev/ic/ath.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/ath.c,v
retrieving revision 1.96
diff -u -p -r1.96 ath.c
--- dev/ic/ath.c 17 Oct 2012 00:59:57 -0000 1.96
+++ dev/ic/ath.c 16 Oct 2013 13:27:25 -0000
@@ -1148,18 +1148,20 @@ ath_mcastfilter_accum(caddr_t dl, u_int3
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);
}
Index: dev/ic/athn.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/athn.c,v
retrieving revision 1.76
diff -u -p -r1.76 athn.c
--- dev/ic/athn.c 7 Aug 2013 01:06:28 -0000 1.76
+++ dev/ic/athn.c 16 Oct 2013 13:27:25 -0000
@@ -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;
Index: dev/ic/atw.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/atw.c,v
retrieving revision 1.76
diff -u -p -r1.76 atw.c
--- dev/ic/atw.c 5 Apr 2011 19:54:35 -0000 1.76
+++ dev/ic/atw.c 16 Oct 2013 13:27:25 -0000
@@ -2028,7 +2028,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];
@@ -2056,15 +2056,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);
Index: dev/ic/dc.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/dc.c,v
retrieving revision 1.127
diff -u -p -r1.127 dc.c
--- dev/ic/dc.c 21 Aug 2013 05:21:43 -0000 1.127
+++ dev/ic/dc.c 16 Oct 2013 13:27:25 -0000
@@ -918,7 +918,9 @@ dc_setfilt_21143(struct dc_softc *sc)
else
DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_PROMISC);
-allmulti:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI)
DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
else {
@@ -926,12 +928,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 = dc_crc_le(sc, enm->enm_addrlo);
sp[h >> 4] |= htole32(1 << (h & 0xF));
ETHER_NEXT_MULTI(step, enm);
@@ -996,7 +992,9 @@ dc_setfilt_admtek(struct dc_softc *sc)
else
DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_PROMISC);
-allmulti:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI)
DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
else
@@ -1016,11 +1014,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;
- }
-
if (DC_IS_CENTAUR(sc))
h = dc_crc_le(sc, enm->enm_addrlo);
else
Index: dev/ic/dp8390.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/dp8390.c,v
retrieving revision 1.45
diff -u -p -r1.45 dp8390.c
--- dev/ic/dp8390.c 7 Aug 2013 01:06:29 -0000 1.45
+++ dev/ic/dp8390.c 16 Oct 2013 13:27:25 -0000
@@ -923,7 +923,7 @@ dp8390_getmcaf(struct arpcom *ac, u_int8
* 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
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;
Index: dev/ic/i82596.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/i82596.c,v
retrieving revision 1.34
diff -u -p -r1.34 i82596.c
--- dev/ic/i82596.c 7 Aug 2013 01:06:29 -0000 1.34
+++ dev/ic/i82596.c 16 Oct 2013 13:27:25 -0000
@@ -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);
}
Index: dev/ic/if_wi.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/if_wi.c,v
retrieving revision 1.153
diff -u -p -r1.153 if_wi.c
--- dev/ic/if_wi.c 1 Oct 2013 19:33:49 -0000 1.153
+++ dev/ic/if_wi.c 16 Oct 2013 13:27:25 -0000
@@ -1394,6 +1394,7 @@ wi_alloc_nicmem_io(struct wi_softc *sc,
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);
Index: dev/ic/lance.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/lance.c,v
retrieving revision 1.1
diff -u -p -r1.1 lance.c
--- dev/ic/lance.c 24 Sep 2013 20:10:58 -0000 1.1
+++ dev/ic/lance.c 16 Oct 2013 13:27:25 -0000
@@ -603,24 +603,12 @@ lance_setladrf(struct arpcom *ac, uint16
* 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. */
Index: dev/ic/lemac.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/lemac.c,v
retrieving revision 1.14
diff -u -p -r1.14 lemac.c
--- dev/ic/lemac.c 7 Aug 2013 01:06:30 -0000 1.14
+++ dev/ic/lemac.c 16 Oct 2013 13:27:25 -0000
@@ -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_soft
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);
}
Index: dev/ic/mtd8xx.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/mtd8xx.c,v
retrieving revision 1.20
diff -u -p -r1.20 mtd8xx.c
--- dev/ic/mtd8xx.c 21 Aug 2013 05:21:43 -0000 1.20
+++ dev/ic/mtd8xx.c 16 Oct 2013 13:27:25 -0000
@@ -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;
Index: dev/ic/rtw.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/rtw.c,v
retrieving revision 1.82
diff -u -p -r1.82 rtw.c
--- dev/ic/rtw.c 5 Dec 2012 23:20:19 -0000 1.82
+++ dev/ic/rtw.c 16 Oct 2013 13:27:25 -0000
@@ -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));
Index: dev/ic/smc83c170.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ic/smc83c170.c,v
retrieving revision 1.15
diff -u -p -r1.15 smc83c170.c
--- dev/ic/smc83c170.c 7 Aug 2013 01:06:31 -0000 1.15
+++ dev/ic/smc83c170.c 16 Oct 2013 13:27:25 -0000
@@ -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;
Index: dev/isa/if_ie.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/isa/if_ie.c,v
retrieving revision 1.37
diff -u -p -r1.37 if_ie.c
--- dev/isa/if_ie.c 7 Aug 2013 01:06:32 -0000 1.37
+++ dev/isa/if_ie.c 16 Oct 2013 13:27:25 -0000
@@ -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;
}
Index: dev/pci/if_de.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_de.c,v
retrieving revision 1.111
diff -u -p -r1.111 if_de.c
--- dev/pci/if_de.c 7 Aug 2013 01:06:34 -0000 1.111
+++ dev/pci/if_de.c 16 Oct 2013 13:27:25 -0000
@@ -2886,6 +2886,7 @@ tulip_free_txmap(tulip_softc_t *sc, bus_
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
* 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
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
*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);
}
/*
Index: dev/pci/if_ixgb.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_ixgb.c,v
retrieving revision 1.59
diff -u -p -r1.59 if_ixgb.c
--- dev/pci/if_ixgb.c 5 Apr 2011 18:01:21 -0000 1.59
+++ dev/pci/if_ixgb.c 16 Oct 2013 13:27:25 -0000
@@ -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;
Index: dev/pci/if_lge.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_lge.c,v
retrieving revision 1.60
diff -u -p -r1.60 if_lge.c
--- dev/pci/if_lge.c 1 Oct 2013 20:06:01 -0000 1.60
+++ dev/pci/if_lge.c 16 Oct 2013 13:27:25 -0000
@@ -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)
Index: dev/pci/if_nge.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_nge.c,v
retrieving revision 1.76
diff -u -p -r1.76 if_nge.c
--- dev/pci/if_nge.c 1 Oct 2013 20:06:01 -0000 1.76
+++ dev/pci/if_nge.c 16 Oct 2013 13:27:25 -0000
@@ -612,7 +612,9 @@ nge_setmulti(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);
@@ -646,10 +648,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;
Index: dev/pci/if_pcn.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_pcn.c,v
retrieving revision 1.27
diff -u -p -r1.27 if_pcn.c
--- dev/pci/if_pcn.c 7 Aug 2013 01:06:36 -0000 1.27
+++ dev/pci/if_pcn.c 16 Oct 2013 13:27:25 -0000
@@ -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. */
Index: dev/pci/if_tl.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_tl.c,v
retrieving revision 1.55
diff -u -p -r1.55 if_tl.c
--- dev/pci/if_tl.c 1 Oct 2013 20:06:01 -0000 1.55
+++ dev/pci/if_tl.c 16 Oct 2013 13:27:25 -0000
@@ -873,20 +873,6 @@ void tl_setmulti(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) {
@@ -899,7 +885,6 @@ void tl_setmulti(sc)
} else {
hashes[0] = hashes[1] = 0x00000000;
}
-#endif
tl_dio_write32(sc, TL_HASH1, hashes[0]);
tl_dio_write32(sc, TL_HASH2, hashes[1]);
Index: dev/pci/if_txp.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_txp.c,v
retrieving revision 1.107
diff -u -p -r1.107 if_txp.c
--- dev/pci/if_txp.c 7 Aug 2013 01:06:38 -0000 1.107
+++ dev/pci/if_txp.c 16 Oct 2013 13:27:25 -0000
@@ -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));
Index: dev/pci/if_wb.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_wb.c,v
retrieving revision 1.54
diff -u -p -r1.54 if_wb.c
--- dev/pci/if_wb.c 1 Oct 2013 20:06:02 -0000 1.54
+++ dev/pci/if_wb.c 16 Oct 2013 13:27:25 -0000
@@ -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);
Index: dev/pci/if_xge.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/if_xge.c,v
retrieving revision 1.55
diff -u -p -r1.55 if_xge.c
--- dev/pci/if_xge.c 7 Aug 2013 01:06:39 -0000 1.55
+++ dev/pci/if_xge.c 16 Oct 2013 13:27:25 -0000
@@ -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++) {
Index: dev/pcmcia/if_xe.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pcmcia/if_xe.c,v
retrieving revision 1.42
diff -u -p -r1.42 if_xe.c
--- dev/pcmcia/if_xe.c 7 Aug 2013 01:06:40 -0000 1.42
+++ dev/pcmcia/if_xe.c 16 Oct 2013 13:27:25 -0000
@@ -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[
Index: dev/sbus/be.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/sbus/be.c,v
retrieving revision 1.25
diff -u -p -r1.25 be.c
--- dev/sbus/be.c 7 Aug 2013 01:06:40 -0000 1.25
+++ dev/sbus/be.c 16 Oct 2013 13:27:25 -0000
@@ -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++) {
Index: dev/sbus/qe.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/sbus/qe.c,v
retrieving revision 1.24
diff -u -p -r1.24 qe.c
--- dev/sbus/qe.c 7 Aug 2013 01:06:40 -0000 1.24
+++ dev/sbus/qe.c 16 Oct 2013 13:27:25 -0000
@@ -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++) {
Index: dev/usb/if_aue.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/if_aue.c,v
retrieving revision 1.88
diff -u -p -r1.88 if_aue.c
--- dev/usb/if_aue.c 7 Aug 2013 01:06:41 -0000 1.88
+++ dev/usb/if_aue.c 16 Oct 2013 13:27:25 -0000
@@ -585,6 +585,7 @@ aue_crc(caddr_t addr)
void
aue_setmulti(struct aue_softc *sc)
{
+ struct arpcom *ac = &sc->arpcom;
struct ifnet *ifp;
struct ether_multi *enm;
struct ether_multistep step;
@@ -594,8 +595,7 @@ aue_setmulti(struct aue_softc *sc)
ifp = GET_IFP(sc);
- if (ifp->if_flags & IFF_PROMISC) {
-allmulti:
+ if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0) {
ifp->if_flags |= IFF_ALLMULTI;
AUE_SETBIT(sc, AUE_CTL0, AUE_CTL0_ALLMULTI);
return;
@@ -608,12 +608,8 @@ allmulti:
aue_csr_write_1(sc, AUE_MAR0 + i, 0);
/* now program new ones */
- ETHER_FIRST_MULTI(step, &sc->arpcom, enm);
+ ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo,
- enm->enm_addrhi, ETHER_ADDR_LEN) != 0)
- goto allmulti;
-
h = aue_crc(enm->enm_addrlo);
AUE_SETBIT(sc, AUE_MAR + (h >> 3), 1 << (h & 0x7));
ETHER_NEXT_MULTI(step, enm);
Index: dev/usb/if_cue.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/if_cue.c,v
retrieving revision 1.62
diff -u -p -r1.62 if_cue.c
--- dev/usb/if_cue.c 7 Aug 2013 01:06:41 -0000 1.62
+++ dev/usb/if_cue.c 16 Oct 2013 13:27:25 -0000
@@ -342,6 +342,7 @@ cue_getmac(struct cue_softc *sc, void *b
void
cue_setmulti(struct cue_softc *sc)
{
+ struct arpcom *ac = &sc->arpcom;
struct ifnet *ifp;
struct ether_multi *enm;
struct ether_multistep step;
@@ -352,8 +353,7 @@ cue_setmulti(struct cue_softc *sc)
DPRINTFN(2,("%s: cue_setmulti if_flags=0x%x\n",
sc->cue_dev.dv_xname, ifp->if_flags));
- if (ifp->if_flags & IFF_PROMISC) {
-allmulti:
+ if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0) {
ifp->if_flags |= IFF_ALLMULTI;
for (i = 0; i < CUE_MCAST_TABLE_LEN; i++)
sc->cue_mctab[i] = 0xFF;
@@ -367,12 +367,8 @@ allmulti:
sc->cue_mctab[i] = 0;
/* now program new ones */
- ETHER_FIRST_MULTI(step, &sc->arpcom, enm);
+ ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo,
- enm->enm_addrhi, ETHER_ADDR_LEN) != 0)
- goto allmulti;
-
h = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN) &
((1 << CUE_BITS) - 1);
sc->cue_mctab[h >> 3] |= 1 << (h & 0x7);
Index: dev/usb/if_kue.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/if_kue.c,v
retrieving revision 1.68
diff -u -p -r1.68 if_kue.c
--- dev/usb/if_kue.c 7 Aug 2013 01:06:41 -0000 1.68
+++ dev/usb/if_kue.c 16 Oct 2013 13:27:25 -0000
@@ -333,6 +333,7 @@ kue_load_fw(struct kue_softc *sc)
void
kue_setmulti(struct kue_softc *sc)
{
+ struct arpcom *ac = &sc->arpcom;
struct ifnet *ifp = GET_IFP(sc);
struct ether_multi *enm;
struct ether_multistep step;
@@ -340,7 +341,7 @@ kue_setmulti(struct kue_softc *sc)
DPRINTFN(5,("%s: %s: enter\n", sc->kue_dev.dv_xname, __func__));
- if (ifp->if_flags & IFF_PROMISC) {
+ if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0) {
allmulti:
ifp->if_flags |= IFF_ALLMULTI;
sc->kue_rxfilt |= KUE_RXFILT_ALLMULTI;
@@ -352,11 +353,9 @@ allmulti:
sc->kue_rxfilt &= ~KUE_RXFILT_ALLMULTI;
i = 0;
- ETHER_FIRST_MULTI(step, &sc->arpcom, enm);
+ ETHER_FIRST_MULTI(step, ac, enm);
while (enm != NULL) {
- if (i == KUE_MCFILTCNT(sc) ||
- memcmp(enm->enm_addrlo, enm->enm_addrhi,
- ETHER_ADDR_LEN) != 0)
+ if (i == KUE_MCFILTCNT(sc))
goto allmulti;
memcpy(KUE_MCFILT(sc, i), enm->enm_addrlo, ETHER_ADDR_LEN);
Index: dev/usb/if_otus.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/if_otus.c,v
retrieving revision 1.35
diff -u -p -r1.35 if_otus.c
--- dev/usb/if_otus.c 7 Aug 2013 01:06:41 -0000 1.35
+++ dev/usb/if_otus.c 16 Oct 2013 13:27:25 -0000
@@ -1579,6 +1579,9 @@ otus_set_multi(struct otus_softc *sc)
uint32_t 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;
@@ -1586,11 +1589,6 @@ otus_set_multi(struct otus_softc *sc)
lo = hi = 0;
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;
- lo = hi = 0xffffffff;
- goto done;
- }
bit = enm->enm_addrlo[5] >> 2;
if (bit < 32)
lo |= 1 << bit;
Index: dev/usb/if_zyd.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/if_zyd.c,v
retrieving revision 1.91
diff -u -p -r1.91 if_zyd.c
--- dev/usb/if_zyd.c 7 Aug 2013 01:06:43 -0000 1.91
+++ dev/usb/if_zyd.c 16 Oct 2013 13:27:25 -0000
@@ -1642,6 +1642,9 @@ zyd_set_multi(struct zyd_softc *sc)
uint32_t 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;
@@ -1649,11 +1652,6 @@ zyd_set_multi(struct zyd_softc *sc)
lo = hi = 0;
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;
- lo = hi = 0xffffffff;
- goto done;
- }
bit = enm->enm_addrlo[5] >> 2;
if (bit < 32)
lo |= 1 << bit;
Index: arch/macppc/dev/if_bm.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/macppc/dev/if_bm.c,v
retrieving revision 1.27
diff -u -p -r1.27 if_bm.c
--- arch/macppc/dev/if_bm.c 25 Aug 2009 20:39:36 -0000 1.27
+++ arch/macppc/dev/if_bm.c 16 Oct 2013 13:27:25 -0000
@@ -847,6 +847,7 @@ bmac_mediastatus(struct ifnet *ifp, stru
void
bmac_setladrf(struct bmac_softc *sc)
{
+ struct arpcom *ac = &sc->arpcom;
struct ifnet *ifp = &sc->arpcom.ac_if;
struct ether_multi *enm;
struct ether_multistep step;
@@ -867,28 +868,17 @@ bmac_setladrf(struct bmac_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;
}
hash[3] = hash[2] = hash[1] = hash[0] = 0;
- ETHER_FIRST_MULTI(step, &sc->arpcom, enm);
+ 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 = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN);
/* Just want the 6 most significant bits. */
Index: arch/macppc/dev/if_mc.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/macppc/dev/if_mc.c,v
retrieving revision 1.15
diff -u -p -r1.15 if_mc.c
--- arch/macppc/dev/if_mc.c 7 Aug 2013 22:22:42 -0000 1.15
+++ arch/macppc/dev/if_mc.c 16 Oct 2013 13:27:25 -0000
@@ -1121,21 +1121,12 @@ mace_calcladrf(struct mc_softc *sc, u_in
* the word.
*/
+ if (ac->ac_multirangecnt > 0)
+ goto allmulti;
+
*((u_int32_t *)af) = *((u_int32_t *)af + 1) = 0;
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.)
- */
- goto allmulti;
- }
-
crc = ether_crc32_le(enm->enm_addrlo, sizeof(enm->enm_addrlo));
/* Just want the 6 most significant bits. */
Index: arch/mvme68k/dev/if_ie.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/mvme68k/dev/if_ie.c,v
retrieving revision 1.41
diff -u -p -r1.41 if_ie.c
--- arch/mvme68k/dev/if_ie.c 5 Sep 2013 20:55:57 -0000 1.41
+++ arch/mvme68k/dev/if_ie.c 16 Oct 2013 13:27:25 -0000
@@ -1870,19 +1870,25 @@ 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;
}
Index: arch/mvme88k/dev/if_ie.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/mvme88k/dev/if_ie.c,v
retrieving revision 1.46
diff -u -p -r1.46 if_ie.c
--- arch/mvme88k/dev/if_ie.c 5 Sep 2013 20:55:57 -0000 1.46
+++ arch/mvme88k/dev/if_ie.c 16 Oct 2013 13:27:26 -0000
@@ -1857,19 +1857,25 @@ 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;
}
Index: arch/octeon/dev/cn30xxgmx.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/octeon/dev/cn30xxgmx.c,v
retrieving revision 1.7
diff -u -p -r1.7 cn30xxgmx.c
--- arch/octeon/dev/cn30xxgmx.c 19 Sep 2013 00:15:59 -0000 1.7
+++ arch/octeon/dev/cn30xxgmx.c 16 Oct 2013 13:27:26 -0000
@@ -1120,15 +1120,11 @@ cn30xxgmx_rgmii_set_filter(struct cn30xx
while (enm != NULL) {
int i;
- dprintf("%d: lo(%02x:%02x:%02x:%02x:%02x:%02x) - "
- "hi(%02x:%02x:%02x:%02x:%02x:%02x)\n",
+ dprintf("%d: %02x:%02x:%02x:%02x:%02x:%02x\n"
multi + 1,
enm->enm_addrlo[0], enm->enm_addrlo[1],
enm->enm_addrlo[2], enm->enm_addrlo[3],
- enm->enm_addrlo[4], enm->enm_addrlo[5],
- enm->enm_addrhi[0], enm->enm_addrhi[1],
- enm->enm_addrhi[2], enm->enm_addrhi[3],
- enm->enm_addrhi[4], enm->enm_addrhi[5]);
+ enm->enm_addrlo[4], enm->enm_addrlo[5]);
multi++;
SET(cam_en, 1ULL << multi); /* XXX */
Index: arch/sparc/dev/be.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/sparc/dev/be.c,v
retrieving revision 1.44
diff -u -p -r1.44 be.c
--- arch/sparc/dev/be.c 5 Sep 2013 20:55:58 -0000 1.44
+++ arch/sparc/dev/be.c 16 Oct 2013 13:27:26 -0000
@@ -1158,6 +1158,9 @@ be_mcreset(sc)
else
br->rx_cfg &= ~BE_BR_RXCFG_PMISC;
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI) {
br->htable3 = 0xffff;
br->htable2 = 0xffff;
@@ -1170,25 +1173,6 @@ be_mcreset(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.)
- */
- br->htable3 = 0xffff;
- br->htable2 = 0xffff;
- br->htable1 = 0xffff;
- br->htable0 = 0xffff;
- ifp->if_flags |= IFF_ALLMULTI;
- return;
- }
-
crc = 0xffffffff;
for (i = 0; i < ETHER_ADDR_LEN; i++) {
Index: arch/sparc/dev/if_ie.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/sparc/dev/if_ie.c,v
retrieving revision 1.43
diff -u -p -r1.43 if_ie.c
--- arch/sparc/dev/if_ie.c 5 Sep 2013 20:55:58 -0000 1.43
+++ arch/sparc/dev/if_ie.c 16 Oct 2013 13:27:26 -0000
@@ -2017,19 +2017,25 @@ 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;
}
Index: arch/sparc/dev/qe.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/sparc/dev/qe.c,v
retrieving revision 1.34
diff -u -p -r1.34 qe.c
--- arch/sparc/dev/qe.c 5 Sep 2013 20:55:58 -0000 1.34
+++ arch/sparc/dev/qe.c 16 Oct 2013 13:27:26 -0000
@@ -805,7 +805,9 @@ qe_mcreset(sc)
u_int8_t octet, *ladrp = (u_int8_t *)&hash[0];
int i, j;
-allmulti:
+ if (ac->ac_multirangecnt > 0)
+ ifp->if_flags |= IFF_ALLMULTI;
+
if (ifp->if_flags & IFF_ALLMULTI) {
mr->iac = QE_MR_IAC_ADDRCHG | QE_MR_IAC_LOGADDR;
for (i = 100; i > 0; i--) {
@@ -822,22 +824,6 @@ allmulti:
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 allmulti;
- }
-
crc = 0xffffffff;
for (i = 0; i < ETHER_ADDR_LEN; i++) {
Index: arch/vax/if/if_qe.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/vax/if/if_qe.c,v
retrieving revision 1.25
diff -u -p -r1.25 if_qe.c
--- arch/vax/if/if_qe.c 20 Sep 2010 06:33:47 -0000 1.25
+++ arch/vax/if/if_qe.c 16 Oct 2013 13:27:26 -0000
@@ -770,12 +770,14 @@ qe_setup(struct qe_softc *sc)
*/
j = 3; k = 0;
ifp->if_flags &= ~IFF_ALLMULTI;
+
+ if (ac->ac_multirangecnt > 0) {
+ ifp->if_flags |= IFF_ALLMULTI;
+ goto setit;
+ }
+
ETHER_FIRST_MULTI(step, &sc->sc_ac, enm);
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6)) {
- ifp->if_flags |= IFF_ALLMULTI;
- break;
- }
for (i = 0; i < ETHER_ADDR_LEN; i++)
qc->qc_setup[i * 8 + j + k] = enm->enm_addrlo[i];
j++;
@@ -788,6 +790,8 @@ qe_setup(struct qe_softc *sc)
}
ETHER_NEXT_MULTI(step, enm);
}
+
+setit:
idx = sc->sc_nexttx;
qc->qc_xmit[idx].qe_buf_len = -64;
Index: arch/vax/if/sgec.c
===================================================================
RCS file: /home/ncvs/src/sys/arch/vax/if/sgec.c,v
retrieving revision 1.20
diff -u -p -r1.20 sgec.c
--- arch/vax/if/sgec.c 26 Sep 2011 21:44:04 -0000 1.20
+++ arch/vax/if/sgec.c 16 Oct 2013 13:27:26 -0000
@@ -790,12 +790,14 @@ ze_setup(sc)
*/
j = 16;
ifp->if_flags &= ~IFF_ALLMULTI;
+
+ if (ac->ac_multirangecnt > 0) {
+ ifp->if_flags |= IFF_ALLMULTI;
+ goto setit;
+ }
+
ETHER_FIRST_MULTI(step, &sc->sc_ac, enm);
while (enm != NULL) {
- if (bcmp(enm->enm_addrlo, enm->enm_addrhi, 6)) {
- ifp->if_flags |= IFF_ALLMULTI;
- break;
- }
bcopy(enm->enm_addrlo, &zc->zc_setup[j], ETHER_ADDR_LEN);
j += 8;
ETHER_NEXT_MULTI(step, enm);
@@ -805,6 +807,7 @@ ze_setup(sc)
}
}
+setit:
/*
* Fiddle with the receive logic.
*/