From aa8255025ab0924083e32a0a72457566d8d6e7da Mon Sep 17 00:00:00 2001 From: "David E. O'Brien" Date: Thu, 13 Nov 2003 20:55:53 +0000 Subject: Try to create some sort of consistency in how the routings to find the multicast hash are written. There are still two distinct algorithms used, and there actually isn't any reason each driver should have its own copy of this function as they could all share one copy of it (if it grew an additional argument). --- sys/dev/my/if_my.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'sys/dev/my') diff --git a/sys/dev/my/if_my.c b/sys/dev/my/if_my.c index d580e9c4adb0..b1dffa8fa6ad 100644 --- a/sys/dev/my/if_my.c +++ b/sys/dev/my/if_my.c @@ -142,7 +142,7 @@ static void my_autoneg_mii(struct my_softc *, int, int); static void my_setmode_mii(struct my_softc *, int); static void my_getmode_mii(struct my_softc *); static void my_setcfg(struct my_softc *, int); -static u_int8_t my_calchash(caddr_t); +static u_int32_t my_mchash(caddr_t); static void my_setmulti(struct my_softc *); static void my_reset(struct my_softc *); static int my_list_rx_init(struct my_softc *); @@ -313,22 +313,20 @@ my_phy_writereg(struct my_softc * sc, int reg, int data) return; } -static u_int8_t -my_calchash(caddr_t addr) +static u_int32_t +my_mchash(caddr_t addr) { u_int32_t crc, carry; - int i, j; - u_int8_t c; + int idx, bit; + u_int8_t data; /* Compute CRC for the address value. */ crc = 0xFFFFFFFF; /* initial value */ - for (i = 0; i < 6; i++) { - c = *(addr + i); - for (j = 0; j < 8; j++) { - carry = ((crc & 0x80000000) ? 1 : 0) ^ (c & 0x01); + for (idx = 0; idx < 6; idx++) { + for (data = *addr++, bit = 0; bit < 8; bit++, data >>= 1) { + carry = ((crc & 0x80000000) ? 1 : 0) ^ (data & 0x01); crc <<= 1; - c >>= 1; if (carry) crc = (crc ^ 0x04c11db6) | carry; } @@ -381,7 +379,7 @@ my_setmulti(struct my_softc * sc) TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; - h = my_calchash(LLADDR((struct sockaddr_dl *) ifma->ifma_addr)); + h = my_mchash(LLADDR((struct sockaddr_dl *) ifma->ifma_addr)); if (h < 32) hashes[0] |= (1 << h); else -- cgit v1.3