diff options
Diffstat (limited to 'sys/pci')
-rw-r--r-- | sys/pci/if_de.c | 110 | ||||
-rw-r--r-- | sys/pci/if_fxp.c | 20 | ||||
-rw-r--r-- | sys/pci/if_pdq.c | 48 |
3 files changed, 79 insertions, 99 deletions
diff --git a/sys/pci/if_de.c b/sys/pci/if_de.c index c5d7f5a..95bc095 100644 --- a/sys/pci/if_de.c +++ b/sys/pci/if_de.c @@ -21,7 +21,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: if_de.c,v 1.55 1996/11/10 13:36:46 davidg Exp $ + * $Id: if_de.c,v 1.56 1996/12/01 06:01:00 rgrimes Exp $ * */ @@ -3287,62 +3287,63 @@ tulip_addr_filter( tulip_softc_t * const sc) { u_int32_t *sp = sc->tulip_setupdata; - struct ether_multistep step; - struct ether_multi *enm; + struct ifmultiaddr *ifma; int i = 0; + u_char *addrp; + unsigned hash; + + ifma = sc->tulip_if.if_multiaddrs.lh_first; sc->tulip_flags &= ~TULIP_WANTHASH; sc->tulip_flags |= TULIP_WANTSETUP; sc->tulip_cmdmode &= ~TULIP_CMD_RXRUN; sc->tulip_intrmask &= ~TULIP_STS_RXSTOPPED; - if (sc->tulip_ac.ac_multicnt > 14) { - unsigned hash; - /* - * If we have more than 14 multicasts, we have - * go into hash perfect mode (512 bit multicast - * hash and one perfect hardware). - */ - bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata)); - hash = tulip_mchash(etherbroadcastaddr); - sp[hash >> 4] |= 1 << (hash & 0xF); - ETHER_FIRST_MULTI(step, &sc->tulip_ac, enm); - while (enm != NULL) { - hash = tulip_mchash(enm->enm_addrlo); - sp[hash >> 4] |= 1 << (hash & 0xF); - ETHER_NEXT_MULTI(step, enm); - } - sc->tulip_flags |= TULIP_WANTHASH; - sp[39] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[0]; - sp[40] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[1]; - sp[41] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[2]; - } else { - /* - * Else can get perfect filtering for 16 addresses. - */ - ETHER_FIRST_MULTI(step, &sc->tulip_ac, enm); - for (; enm != NULL; i++) { - *sp++ = ((u_int16_t *) enm->enm_addrlo)[0]; - *sp++ = ((u_int16_t *) enm->enm_addrlo)[1]; - *sp++ = ((u_int16_t *) enm->enm_addrlo)[2]; - ETHER_NEXT_MULTI(step, enm); - } - /* - * Add the broadcast address. - */ - i++; - *sp++ = 0xFFFF; - *sp++ = 0xFFFF; - *sp++ = 0xFFFF; - /* - * Pad the rest with our hardware address - */ - for (; i < 16; i++) { + for (ifma = sc->tulip_if.if_multiaddrs.lh_first; ifma; + ifma = ifma->ifma_link.le_next) { + if (ifma->ifma_addr->sa_family != AF_LINK) + continue; + if (i > 14) + goto musthash; + addrp = LLADDR((struct sockaddr_dl *)ifma->ifma_addr); + *sp++ = ((u_int16_t *) addrp)[0]; + *sp++ = ((u_int16_t *) addrp)[1]; + *sp++ = ((u_int16_t *) addrp)[2]; + i++; + } + /* + * Add the broadcast address. + */ + i++; + *sp++ = 0xFFFF; + *sp++ = 0xFFFF; + *sp++ = 0xFFFF; + /* + * Pad the rest with our hardware address + */ + for (; i < 16; i++) { *sp++ = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[0]; *sp++ = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[1]; *sp++ = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[2]; - } } + return; + +musthash: + bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata)); + hash = tulip_mchash(etherbroadcastaddr); + sp[hash >> 4] |= 1 << (hash & 0xF); + for (ifma = sc->tulip_if.if_multiaddrs.lh_first; ifma; + ifma = ifma->ifma_link.le_next) { + if (ifma->ifma_addr->sa_family != AF_LINK) + continue; + + hash = tulip_mchash(LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); + sp[hash >> 4] |= 1 << (hash & 0xF); + } + sc->tulip_flags |= TULIP_WANTHASH; + sp[39] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[0]; + sp[40] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[1]; + sp[41] = ((u_int16_t *) sc->tulip_ac.ac_enaddr)[2]; } /* @@ -3395,22 +3396,15 @@ tulip_ifioctl( } case SIOCADDMULTI: - case SIOCDELMULTI: { + case SIOCDELMULTI: /* * Update multicast listeners */ - if (cmd == SIOCADDMULTI) - error = ether_addmulti(ifr, &sc->tulip_ac); - else - error = ether_delmulti(ifr, &sc->tulip_ac); - - if (error == ENETRESET) { - tulip_addr_filter(sc); /* reset multicast filtering */ - tulip_init(sc); - error = 0; - } + tulip_addr_filter(sc); /* reset multicast filtering */ + tulip_init(sc); + error = 0; break; - } + #if defined(SIOCSIFMTU) #if !defined(ifr_mtu) #define ifr_mtu ifr_metric diff --git a/sys/pci/if_fxp.c b/sys/pci/if_fxp.c index 61cb065..eed4623 100644 --- a/sys/pci/if_fxp.c +++ b/sys/pci/if_fxp.c @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: if_fxp.c,v 1.22 1996/11/18 02:45:46 davidg Exp $ + * $Id: if_fxp.c,v 1.23 1996/12/10 07:29:50 davidg Exp $ */ /* @@ -1055,21 +1055,11 @@ fxp_ioctl(ifp, command, data) case SIOCADDMULTI: case SIOCDELMULTI: /* - * Update out multicast list. + * Multicast list has changed; set the hardware filter + * accordingly. */ - error = (command == SIOCADDMULTI) ? - ether_addmulti(ifr, &sc->arpcom) : - ether_delmulti(ifr, &sc->arpcom); - - if (error == ENETRESET) { - /* - * Multicast list has changed; set the hardware filter - * accordingly. - */ - fxp_init(sc); - - error = 0; - } + fxp_init(sc); + error = 0; break; default: diff --git a/sys/pci/if_pdq.c b/sys/pci/if_pdq.c index 619d22d..3fda4f9 100644 --- a/sys/pci/if_pdq.c +++ b/sys/pci/if_pdq.c @@ -21,7 +21,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: if_pdq.c,v 1.17 1996/09/06 23:08:53 phk Exp $ + * $Id: if_pdq.c,v 1.18 1996/09/10 08:31:31 bde Exp $ * */ @@ -287,17 +287,19 @@ pdq_os_addr_fill( size_t num_addrs) { pdq_softc_t *sc = (pdq_softc_t *) pdq->pdq_os_ctx; - struct ether_multistep step; - struct ether_multi *enm; - - ETHER_FIRST_MULTI(step, &sc->sc_ac, enm); - while (enm != NULL && num_addrs > 0) { - ((u_short *) addr->lanaddr_bytes)[0] = ((u_short *) enm->enm_addrlo)[0]; - ((u_short *) addr->lanaddr_bytes)[1] = ((u_short *) enm->enm_addrlo)[1]; - ((u_short *) addr->lanaddr_bytes)[2] = ((u_short *) enm->enm_addrlo)[2]; - ETHER_NEXT_MULTI(step, enm); - addr++; - num_addrs--; + struct ifmultiaddr *ifma; + + for (ifma = sc->sc_if.if_multiaddrs.lh_first; ifma && num_addrs > 0; + ifma = ifma->ifma_link.le_next) { + char *mcaddr; + if (ifma->ifma_addr->sa_family != AF_LINK) + continue; + mcaddr = LLADDR((struct sockaddr_dl *)ifma->ifma_addr); + ((u_short *) addr->lanaddr_bytes)[0] = ((u_short *) mcaddr)[0]; + ((u_short *) addr->lanaddr_bytes)[1] = ((u_short *) mcaddr)[1]; + ((u_short *) addr->lanaddr_bytes)[2] = ((u_short *) mcaddr)[2]; + addr++; + num_addrs--; } } @@ -366,22 +368,14 @@ pdq_ifioctl( } case SIOCADDMULTI: - case SIOCDELMULTI: { - /* - * Update multicast listeners - */ - if (cmd == SIOCADDMULTI) - error = ether_addmulti((struct ifreq *)data, &sc->sc_ac); - else - error = ether_delmulti((struct ifreq *)data, &sc->sc_ac); - - if (error == ENETRESET) { + case SIOCDELMULTI: + /* + * Update multicast listeners + */ if (sc->sc_if.if_flags & IFF_RUNNING) - pdq_run(sc->sc_pdq); + pdq_run(sc->sc_pdq); error = 0; - } - break; - } + break; default: { error = EINVAL; @@ -411,6 +405,8 @@ pdq_ifattach( ifp->if_ioctl = pdq_ifioctl; ifp->if_output = fddi_output; ifp->if_start = pdq_ifstart; +#warning "Implement fddi_resolvemulti!" +/* ifp->if_resolvemulti = ether_resolvemulti; XXX */ if_attach(ifp); fddi_ifattach(ifp); |