summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pieuchot <mpi@cvs.openbsd.org>2013-11-20 08:36:37 +0000
committerMartin Pieuchot <mpi@cvs.openbsd.org>2013-11-20 08:36:37 +0000
commitae366327ec6ff7cf7a01a2a01ca447e101e52939 (patch)
tree6ef125730f6032d32b44e5abc677f09cc3cc273e
parentedbc9f1866e33eb8fe3cf5cd705c90a73d76493f (diff)
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. Tested by naddy@
-rw-r--r--sys/dev/ic/dc.c21
1 files changed, 7 insertions, 14 deletions
diff --git a/sys/dev/ic/dc.c b/sys/dev/ic/dc.c
index 4bf3b26a21e..d441e2a7b29 100644
--- a/sys/dev/ic/dc.c
+++ b/sys/dev/ic/dc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dc.c,v 1.127 2013/08/21 05:21:43 dlg Exp $ */
+/* $OpenBSD: dc.c,v 1.128 2013/11/20 08:36:36 mpi Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -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