Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Aug 2008 22:35:19 +0200
From:      Luigi Rizzo <rizzo@iet.unipi.it>
To:        gnn@freebsd.org
Cc:        net@freebsd.org
Subject:   Re: Small patch to multicast code...
Message-ID:  <20080821203519.GA51534@onelab2.iet.unipi.it>
In-Reply-To: <m27iaa6v43.wl%gnn@neville-neil.com>
References:  <m27iaa6v43.wl%gnn@neville-neil.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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 ?

(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).

	cheers
	luigi



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080821203519.GA51534>