On Wednesday 29 July 2009 05:51:26 Brad wrote:
> The following diff rewrites parts of the code for promiscuous mode
> and multicast handling. Please test promisc mode and multicast mode
> of operation with any fxp(4) adapters.
>
> Please provide a dmesg.
I could use one or two additional users testing this..
>
> Index: fxp.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/fxp.c,v
> retrieving revision 1.96
> diff -u -p -r1.96 fxp.c
> --- fxp.c 6 Jun 2009 02:49:39 -0000 1.96
> +++ fxp.c 29 Jul 2009 09:26:00 -0000
> @@ -1284,7 +1284,8 @@ fxp_init(void *xsc)
> cbp->mc_all = allm;
> #else
> cbp->cb_command = htole16(FXP_CB_COMMAND_CONFIG | FXP_CB_COMMAND_EL);
> - if (allm)
> +
> + if (allm && !prm)
> cbp->mc_all |= 0x08; /* accept all multicasts */
> else
> cbp->mc_all &= ~0x08; /* reject all multicasts */
> @@ -1718,44 +1719,39 @@ fxp_ioctl(struct ifnet *ifp, u_long comm
> void
> fxp_mc_setup(struct fxp_softc *sc, int doit)
> {
> - struct fxp_cb_mcs *mcsp = &sc->sc_ctrl->u.mcs;
> struct ifnet *ifp = &sc->sc_arpcom.ac_if;
> + struct arpcom *ac = &sc->sc_arpcom;
> + struct fxp_cb_mcs *mcsp = &sc->sc_ctrl->u.mcs;
> struct ether_multistep step;
> struct ether_multi *enm;
> int i, nmcasts;
>
> - /*
> - * Initialize multicast setup descriptor.
> - */
> - mcsp->cb_status = htole16(0);
> - mcsp->cb_command = htole16(FXP_CB_COMMAND_MCAS | FXP_CB_COMMAND_EL);
> - mcsp->link_addr = htole32(-1);
> -
> nmcasts = 0;
> - if (!(ifp->if_flags & IFF_ALLMULTI)) {
> + ifp->if_flags &= ~IFF_ALLMULTI;
> +
> + if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0 ||
> + ac->ac_multicnt >= MAXMCADDR)
> + ifp->if_flags |= IFF_ALLMULTI;
> + else {
> ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
> while (enm != NULL) {
> - if (nmcasts >= MAXMCADDR) {
> - ifp->if_flags |= IFF_ALLMULTI;
> - nmcasts = 0;
> - break;
> - }
> -
> - /* Punt on ranges. */
> - if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
> - sizeof(enm->enm_addrlo)) != 0) {
> - ifp->if_flags |= IFF_ALLMULTI;
> - nmcasts = 0;
> - break;
> - }
> bcopy(enm->enm_addrlo,
> (void *)&mcsp->mc_addr[nmcasts][0], ETHER_ADDR_LEN);
> nmcasts++;
> +
> ETHER_NEXT_MULTI(step, enm);
> }
> }
> +
> if (doit == 0)
> return;
> +
> + /*
> + * Initialize multicast setup descriptor.
> + */
> + mcsp->cb_status = htole16(0);
> + mcsp->cb_command = htole16(FXP_CB_COMMAND_MCAS | FXP_CB_COMMAND_EL);
> + mcsp->link_addr = htole32(-1);
> mcsp->mc_cnt = htole16(nmcasts * ETHER_ADDR_LEN);
>
> /*
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.