From owner-freebsd-bugs@FreeBSD.ORG Thu Jun 3 12:10:24 2004 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id D013616A4CE for ; Thu, 3 Jun 2004 12:10:24 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id AACB843D54 for ; Thu, 3 Jun 2004 12:10:24 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) i53JAOZ5026253 for ; Thu, 3 Jun 2004 12:10:24 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.11/8.12.11/Submit) id i53JAOcE026252; Thu, 3 Jun 2004 12:10:24 -0700 (PDT) (envelope-from gnats) Resent-Date: Thu, 3 Jun 2004 12:10:24 -0700 (PDT) Resent-Message-Id: <200406031910.i53JAOcE026252@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, HASHI Hiroaki Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A2AC316A4CE for ; Thu, 3 Jun 2004 12:06:46 -0700 (PDT) Received: from tomba.cskk-sv.co.jp (usen-221x245x15x82.ap-US01.usen.ad.jp [221.245.15.82]) by mx1.FreeBSD.org (Postfix) with ESMTP id C371843D48 for ; Thu, 3 Jun 2004 12:06:45 -0700 (PDT) (envelope-from hashiz@tomba.cskk-sv.co.jp) Received: from tomba.cskk-sv.co.jp (localhost.cskk-sv.co.jp [127.0.0.1]) by tomba.cskk-sv.co.jp (8.12.11/8.12.11) with ESMTP id i53J6iik001148 for ; Fri, 4 Jun 2004 04:06:44 +0900 (JST) (envelope-from hashiz@tomba.cskk-sv.co.jp) Received: (from hashiz@localhost) by tomba.cskk-sv.co.jp (8.12.11/8.12.11/Submit) id i53J6iJi001147; Fri, 4 Jun 2004 04:06:44 +0900 (JST) (envelope-from hashiz) Message-Id: <200406031906.i53J6iJi001147@tomba.cskk-sv.co.jp> Date: Fri, 4 Jun 2004 04:06:44 +0900 (JST) From: HASHI Hiroaki To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: kern/67544: udav(4) driver does not receive multicast packets X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: HASHI Hiroaki List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Jun 2004 19:10:24 -0000 >Number: 67544 >Category: kern >Synopsis: udav(4) driver does not receive multicast packets >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu Jun 03 12:10:23 PDT 2004 >Closed-Date: >Last-Modified: >Originator: HASHI Hiroaki >Release: FreeBSD 5.2-CURRENT i386 >Organization: >Environment: System: FreeBSD tomba.cskk-sv.co.jp 5.2-CURRENT FreeBSD 5.2-CURRENT #1: Sat May 29 17:17:07 JST 2004 hashiz@tomba.cskk-sv.co.jp:/usr/obj/home/sources/src/sys/TOMBA i386 >Description: udav(4) driver does not receive multicast packets. cf. IPv6 Neighbor solicitation packet. >How-To-Repeat: Enable IPv6 stack. And assign global IPv6 Address to udav interface. Send ping6 to udav interface address from other host.(timed out) >Fix: udav driver can not receive multicast packets. reason:incollect multicast hash calcurate. `udav_ether_crc32_le' function port from NetBSD's `ether_crc32_le'. --- if_udav.c.1.4-patch-multicast begins here --- Index: if_udav.c =================================================================== RCS file: /home/ncvs/src/sys/dev/usb/if_udav.c,v retrieving revision 1.4 diff -u -r1.4 if_udav.c --- if_udav.c 30 May 2004 20:08:45 -0000 1.4 +++ if_udav.c 3 Jun 2004 17:15:25 -0000 @@ -986,27 +986,30 @@ (ether_crc32_le((addr), ETHER_ADDR_LEN) & ((1 << UDAV_BITS) - 1)) #elif defined(__FreeBSD__) +#define UDAV_CALCHASH(addr) \ + (udav_ether_crc32_le((addr), ETHER_ADDR_LEN) & ((1 << UDAV_BITS) - 1)) + Static uint32_t -udav_mchash(const uint8_t *addr) +udav_ether_crc32_le(const uint8_t *buf, size_t len) { - uint32_t crc, carry; - int idx, bit; - uint8_t data; - - /* Compute CRC for the address value. */ - crc = 0xFFFFFFFF; /* initial value */ - - 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; - if (carry) - crc = (crc ^ 0x04c11db6) | carry; - } + static const u_int32_t crctab[] = { + 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, + 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, + 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c + }; + u_int32_t crc; + size_t i; + + crc = 0xffffffffU; /* initial value */ + + for (i = 0; i < len; i++) { + crc ^= buf[i]; + crc = (crc >> 4) ^ crctab[crc & 0xf]; + crc = (crc >> 4) ^ crctab[crc & 0xf]; } - /* return the filter bit position */ - return((crc >> 26) & 0x0000003F); + return (crc); } #endif @@ -1069,8 +1072,8 @@ { if (ifma->ifma_addr->sa_family != AF_LINK) continue; - h = udav_mchash(LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); - hashes[h / 8] |= 1 << (h % 8); + h = UDAV_CALCHASH(LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); + hashes[h>>3] |= 1 << (h & 0x7); } #endif @@ -1562,6 +1565,13 @@ #endif switch (cmd) { +#if defined(__FreeBSD__) + case SIOCADDMULTI: + case SIOCDELMULTI: + udav_setmulti(sc); + error = 0; + break; +#endif case SIOCGIFMEDIA: case SIOCSIFMEDIA: mii = GET_MII(sc); --- if_udav.c.1.4-patch-multicast ends here --- >Release-Note: >Audit-Trail: >Unformatted: