From 512f49d0550ed85febcbc53bc357720463f8bf1f Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Mon, 6 Feb 2006 04:59:31 +0000 Subject: Make sure to call bge_setmulti() as we're enabling or disabling promiscuous mode so as to receive all multicast packets too. --- sys/dev/pci/if_bge.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/sys/dev/pci/if_bge.c b/sys/dev/pci/if_bge.c index 6687efc08d1..0c933218e0e 100644 --- a/sys/dev/pci/if_bge.c +++ b/sys/dev/pci/if_bge.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_bge.c,v 1.127 2006/02/02 21:31:10 brad Exp $ */ +/* $OpenBSD: if_bge.c,v 1.128 2006/02/06 04:59:30 brad Exp $ */ /* * Copyright (c) 2001 Wind River Systems @@ -1101,8 +1101,8 @@ bge_setmulti(struct bge_softc *sc) CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), 0); /* Now program new ones. */ -allmulti: if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) { +allmulti: for (i = 0; i < 4; i++) CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), 0xFFFFFFFF); return; @@ -3138,15 +3138,14 @@ bge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) switch(command) { case SIOCSIFADDR: ifp->if_flags |= IFF_UP; + bge_init(sc); switch (ifa->ifa_addr->sa_family) { #ifdef INET case AF_INET: - bge_init(sc); arp_ifinit(&sc->arpcom, ifa); break; #endif /* INET */ default: - bge_init(sc); break; } break; @@ -3173,25 +3172,23 @@ bge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) !(sc->bge_if_flags & IFF_PROMISC)) { BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_PROMISC); + bge_setmulti(sc); } else if (ifp->if_flags & IFF_RUNNING && !(ifp->if_flags & IFF_PROMISC) && sc->bge_if_flags & IFF_PROMISC) { BGE_CLRBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_PROMISC); + bge_setmulti(sc); } else if (ifp->if_flags & IFF_RUNNING && - (ifp->if_flags ^ sc->bge_if_flags) & IFF_ALLMULTI) { + (ifp->if_flags ^ sc->bge_if_flags) & IFF_ALLMULTI) bge_setmulti(sc); - } else { - ifp->if_flags &= ~IFF_RUNNING; + else bge_init(sc); - } } else { - if (ifp->if_flags & IFF_RUNNING) { + if (ifp->if_flags & IFF_RUNNING) bge_stop(sc); - } } sc->bge_if_flags = ifp->if_flags; - error = 0; break; case SIOCADDMULTI: case SIOCDELMULTI: -- cgit v1.2.3