diff options
| author | David E. O'Brien <obrien@FreeBSD.org> | 2003-11-13 20:55:53 +0000 |
|---|---|---|
| committer | David E. O'Brien <obrien@FreeBSD.org> | 2003-11-13 20:55:53 +0000 |
| commit | aa8255025ab0924083e32a0a72457566d8d6e7da (patch) | |
| tree | 9f53fad8ba546c1e709992d118c397465dd5b01f /sys/dev/fe | |
| parent | 2e76d77fd0916092e6d3c4a78d678bd795cea12f (diff) | |
Notes
Diffstat (limited to 'sys/dev/fe')
| -rw-r--r-- | sys/dev/fe/if_fe.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/sys/dev/fe/if_fe.c b/sys/dev/fe/if_fe.c index 8e9c69ee14d1..23f132278a83 100644 --- a/sys/dev/fe/if_fe.c +++ b/sys/dev/fe/if_fe.c @@ -2046,26 +2046,24 @@ fe_write_mbufs (struct fe_softc *sc, struct mbuf *m) /* * Compute hash value for an Ethernet address */ -static int -fe_hash ( u_char * ep ) +static u_int32_t +fe_mchash (caddr_t addr) { -#define FE_HASH_MAGIC_NUMBER 0xEDB88320L +#define FE_POLY 0xEDB88320L - u_long hash = 0xFFFFFFFFL; - int i, j; - u_char b; - u_long m; + u_long carry, crc = 0xFFFFFFFFL; + int idx, bit; + u_int8_t data; - for ( i = ETHER_ADDR_LEN; --i >= 0; ) { - b = *ep++; - for ( j = 8; --j >= 0; ) { - m = hash; - hash >>= 1; - if ( ( m ^ b ) & 1 ) hash ^= FE_HASH_MAGIC_NUMBER; - b >>= 1; + for ( idx = ETHER_ADDR_LEN; --idx >= 0; ) { + for (data = *addr++, bit = 8; --bit >= 0; data >>= 1) { + carry = crc; + crc >>= 1; + if ((carry ^ data) & 1) + crc ^= FE_POLY; } } - return ( ( int )( hash >> 26 ) ); + return (crc >> 26); } /* @@ -2083,7 +2081,7 @@ fe_mcaf ( struct fe_softc *sc ) TAILQ_FOREACH(ifma, &sc->arpcom.ac_if.if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; - index = fe_hash(LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); + index = fe_mchash(LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); #ifdef FE_DEBUG printf("%s: hash(%6D) == %d\n", sc->sc_xname, enm->enm_addrlo , ":", index); |
