From owner-freebsd-net@FreeBSD.ORG Fri Mar 20 11:39:20 2009 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C1E8A1065673; Fri, 20 Mar 2009 11:39:20 +0000 (UTC) (envelope-from pyunyh@gmail.com) Received: from rv-out-0506.google.com (rv-out-0506.google.com [209.85.198.238]) by mx1.freebsd.org (Postfix) with ESMTP id 7463A8FC26; Fri, 20 Mar 2009 11:39:20 +0000 (UTC) (envelope-from pyunyh@gmail.com) Received: by rv-out-0506.google.com with SMTP id l9so1038011rvb.43 for ; Fri, 20 Mar 2009 04:39:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:received:from:date:to:cc :subject:message-id:reply-to:references:mime-version:content-type :content-disposition:in-reply-to:user-agent; bh=psynSIooG2jYNbO/G3jM2mnDe/lrR7f+gTCTWY0wy7A=; b=vRNTDdgA1SPn98xjoAW0t1xFXKdokbVqXbPSUEbTMlZt7JXOR/PyjhT6BWrYLOEVD0 K57k7dwsQ0vHHH84bJ8rJMUQ4KRqzxusYlFu1C6dkyKTYGXrULbEWbZfucvRkgjdgZ/x jDXNM6gHIzRAoD8zMo5GK/dL/bclcfEkO00H8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:date:to:cc:subject:message-id:reply-to:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; b=GMAZXTwiD5q4r8ziUPjKGzF1kLiLZI8igUiUMaxTR0ML7Ty4jT0NehxNrtWdmkzmnM 4Jf/RT+uQkrxRc2S7mIZUR7rPAk18MfR1oEABeETOwbjM0egizEJHFxDSHdIi2/E50Xt oAkE3fyQC3KB15H31AcjVOm7PCB0xL3zg7MSU= Received: by 10.141.33.19 with SMTP id l19mr1329838rvj.91.1237549160127; Fri, 20 Mar 2009 04:39:20 -0700 (PDT) Received: from michelle.cdnetworks.co.kr ([114.111.62.249]) by mx.google.com with ESMTPS id f42sm4629922rvb.11.2009.03.20.04.39.17 (version=SSLv3 cipher=RC4-MD5); Fri, 20 Mar 2009 04:39:18 -0700 (PDT) Received: by michelle.cdnetworks.co.kr (sSMTP sendmail emulation); Fri, 20 Mar 2009 20:39:54 +0900 From: Pyun YongHyeon Date: Fri, 20 Mar 2009 20:39:54 +0900 To: 4pr@legis.krsn.ru Message-ID: <20090320113954.GF50100@michelle.cdnetworks.co.kr> References: <49C2853A.9090602@incunabulum.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="7JfCtLOvnd9MIVvH" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.3i Cc: jfv@FreeBSD.org, freebsd-net@freebsd.org, bms@freebsd.org, bug-followup@freebsd.org Subject: Re: kern/122839: [multicast] FreeBSD 7 multicast routing problem X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: pyunyh@gmail.com List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Mar 2009 11:39:21 -0000 --7JfCtLOvnd9MIVvH Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, Mar 20, 2009 at 05:56:11PM +0700, 4pr@legis.krsn.ru wrote: > Hi, > > As i wrote before, based on the patch, suggested by Tomas Svensson, we > have made our version of that patch. And about > a year already we using it on a production inside core router without any > problems. Also we patched if_msk.c, and it also > working just fine same amount of time on the same router. Both our patches > for if_em.c and if_msk.c i have posted to the list. > So i did not chased the em or msk patch upstream. > Would you try attached msk(4) patch? I think em(4) patch you posted looks right. Jack may handle this(CCed). --7JfCtLOvnd9MIVvH Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="msk.allmulti.patch" Index: sys/dev/msk/if_msk.c =================================================================== --- sys/dev/msk/if_msk.c (revision 190121) +++ sys/dev/msk/if_msk.c (working copy) @@ -287,9 +287,8 @@ static void msk_miibus_statchg(device_t); static void msk_link_task(void *, int); -static void msk_setmulti(struct msk_if_softc *); +static void msk_rxfilter(struct msk_if_softc *); static void msk_setvlan(struct msk_if_softc *, struct ifnet *); -static void msk_setpromisc(struct msk_if_softc *); static void msk_stats_clear(struct msk_if_softc *); static void msk_stats_update(struct msk_if_softc *); @@ -560,7 +559,7 @@ } static void -msk_setmulti(struct msk_if_softc *sc_if) +msk_rxfilter(struct msk_if_softc *sc_if) { struct msk_softc *sc; struct ifnet *ifp; @@ -577,15 +576,14 @@ bzero(mchash, sizeof(mchash)); mode = GMAC_READ_2(sc, sc_if->msk_port, GM_RX_CTRL); - mode |= GM_RXCR_UCF_ENA; - if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0) { - if ((ifp->if_flags & IFF_PROMISC) != 0) - mode &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA); - else if ((ifp->if_flags & IFF_ALLMULTI) != 0) { - mchash[0] = 0xffff; - mchash[1] = 0xffff; - } + if ((ifp->if_flags & IFF_PROMISC) != 0) + mode &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA); + else if ((ifp->if_flags & IFF_ALLMULTI) != 0) { + mode |= GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA; + mchash[0] = 0xffff; + mchash[1] = 0xffff; } else { + mode |= GM_RXCR_UCF_ENA; IF_ADDR_LOCK(ifp); TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) @@ -598,7 +596,8 @@ mchash[crc >> 5] |= 1 << (crc & 0x1f); } IF_ADDR_UNLOCK(ifp); - mode |= GM_RXCR_MCF_ENA; + if (mchash[0] != 0 || mchash[1] != 0) + mode |= GM_RXCR_MCF_ENA; } GMAC_WRITE_2(sc, sc_if->msk_port, GM_MC_ADDR_H1, @@ -631,26 +630,6 @@ } } -static void -msk_setpromisc(struct msk_if_softc *sc_if) -{ - struct msk_softc *sc; - struct ifnet *ifp; - uint16_t mode; - - MSK_IF_LOCK_ASSERT(sc_if); - - sc = sc_if->msk_softc; - ifp = sc_if->msk_ifp; - - mode = GMAC_READ_2(sc, sc_if->msk_port, GM_RX_CTRL); - if (ifp->if_flags & IFF_PROMISC) - mode &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA); - else - mode |= (GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA); - GMAC_WRITE_2(sc, sc_if->msk_port, GM_RX_CTRL, mode); -} - static int msk_init_rx_ring(struct msk_if_softc *sc_if) { @@ -954,10 +933,8 @@ if ((ifp->if_flags & IFF_UP) != 0) { if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { if (((ifp->if_flags ^ sc_if->msk_if_flags) - & IFF_PROMISC) != 0) { - msk_setpromisc(sc_if); - msk_setmulti(sc_if); - } + & (IFF_PROMISC | IFF_ALLMULTI)) != 0) + msk_rxfilter(sc_if); } else { if (sc_if->msk_detach == 0) msk_init_locked(sc_if); @@ -973,7 +950,7 @@ case SIOCDELMULTI: MSK_IF_LOCK(sc_if); if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) - msk_setmulti(sc_if); + msk_rxfilter(sc_if); MSK_IF_UNLOCK(sc_if); break; case SIOCGIFMEDIA: @@ -3594,12 +3571,9 @@ CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T), GMF_OPER_ON | GMF_RX_F_FL_ON); - /* Set promiscuous mode. */ - msk_setpromisc(sc_if); + /* Set receive filter. */ + msk_rxfilter(sc_if); - /* Set multicast filter. */ - msk_setmulti(sc_if); - /* Flush Rx MAC FIFO on any flow control or error. */ CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR); --7JfCtLOvnd9MIVvH--