From owner-freebsd-net@FreeBSD.ORG Thu Aug 21 21:59:51 2008 Return-Path: Delivered-To: net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 548531065673 for ; Thu, 21 Aug 2008 21:59:51 +0000 (UTC) (envelope-from gnn@neville-neil.com) Received: from proxy.meer.net (proxy.meer.net [64.13.141.13]) by mx1.freebsd.org (Postfix) with ESMTP id 1835D8FC0C for ; Thu, 21 Aug 2008 21:59:51 +0000 (UTC) (envelope-from gnn@neville-neil.com) Received: from mail.meer.net (mail.meer.net [64.13.141.3]) by proxy.meer.net (8.14.2/8.14.2) with ESMTP id m7LLxnok035076; Thu, 21 Aug 2008 14:59:50 -0700 (PDT) (envelope-from gnn@neville-neil.com) Received: from mail2.meer.net (mail2.meer.net [64.13.141.16]) by mail.meer.net (8.13.3/8.13.3/meer) with ESMTP id m7LLxdeU044518; Thu, 21 Aug 2008 14:59:39 -0700 (PDT) (envelope-from gnn@neville-neil.com) Received: from minion.local.neville-neil.com (209.249.190.254.available.above.net [209.249.190.254] (may be forged)) (authenticated bits=0) by mail2.meer.net (8.14.1/8.14.1) with ESMTP id m7LLxcT6067264; Thu, 21 Aug 2008 14:59:38 -0700 (PDT) (envelope-from gnn@neville-neil.com) Date: Thu, 21 Aug 2008 17:59:38 -0400 Message-ID: From: gnn@freebsd.org To: Luigi Rizzo In-Reply-To: <20080821203519.GA51534@onelab2.iet.unipi.it> References: <20080821203519.GA51534@onelab2.iet.unipi.it> User-Agent: Wanderlust/2.15.5 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL/10.7 Emacs/22.2.50 (i386-apple-darwin9.4.0) MULE/5.0 (SAKAKI) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII X-Canit-CHI2: 0.50 X-Bayes-Prob: 0.5 (Score 0, tokens from: ) X-Spam-Score: 0.10 () [Tag at 5.00] COMBINED_FROM X-CanItPRO-Stream: default X-Canit-Stats-ID: 1308581 - 07a3d7351bc3 X-Scanned-By: CanIt (www . roaringpenguin . com) on 64.13.141.13 Cc: net@freebsd.org Subject: Re: Small patch to multicast code... X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Aug 2008 21:59:51 -0000 At Thu, 21 Aug 2008 22:35:19 +0200, Luigi Rizzo wrote: > > On Thu, Aug 21, 2008 at 03:11:56PM -0400, gnn@freebsd.org wrote: > > Hi, > > > > Turns out there is a bug in the code that loops back multicast > > packets. If the underlying device driver supports checksum offloading > > then the packet that is looped back, when it is transmitted on the > > wire, is incorrect, due to the fact that the packet is not fully > > copied. > > > > Here is a patch. Comments welcome. > > > > Best, > > George > > > > Index: ip_output.c > > =================================================================== > > --- ip_output.c (revision 181731) > > +++ ip_output.c (working copy) > > @@ -1135,7 +1135,7 @@ > > register struct ip *ip; > > struct mbuf *copym; > > > > - copym = m_copy(m, 0, M_COPYALL); > > + copym = m_dup(m, M_DONTWAIT); > > if (copym != NULL && (copym->m_flags & M_EXT || copym->m_len < hlen)) > > copym = m_pullup(copym, hlen); > > if (copym != NULL) { > > I am slightly puzzled -- what is exactly the problem, i.e. what part > of the packet on the wire is incorrect ? The IP header is within hlen so > the m_pullup() should be enough to leave the original content intact. > > The only thing i can think of is that it's the UDP checksum, > residing beyond hlen, which is overwritten somewhere in the > call to if_simloop -- in which case perhaps a better fix is > to m_pullup() the udp header as well ? It is the checksum that gets trashed, yes. > (in any case, it is worthwhile to add a comment to explain > what should be done -- the code paths using m_*() have become > quite fragile with these hw support enhancements that now > require selective modifications on previously shared, readonly buffers). The m_*() routines actually have reasonable comments, it just seems the wrong one was used here. Best, Gerge