Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Jan 2006 12:09:13 +0300
From:      Oleg Bulyzhin <oleg@freebsd.org>
To:        Koen Martens <fbsd@metro.cx>
Cc:        darrenr@freebsd.org, glebius@freebsd.org, freebsd-stable@freebsd.org
Subject:   Re: ipfilter + bge strangeness
Message-ID:  <20060131090912.GA88914@lath.rinet.ru>
In-Reply-To: <43DCCAA8.4050600@metro.cx>
References:  <43DB8EA6.7070503@metro.cx> <20060128211710.GA29790@lath.rinet.ru> <43DBED3F.3000408@metro.cx> <20060128230015.GC29790@lath.rinet.ru> <43DCCAA8.4050600@metro.cx>

next in thread | previous in thread | raw e-mail | index | archive | help

--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Sun, Jan 29, 2006 at 03:01:12PM +0100, Koen Martens wrote:
> Oleg Bulyzhin wrote:
> > On Sat, Jan 28, 2006 at 11:16:31PM +0100, Koen Martens wrote:
> >>Sure thing, although it happens with other kinds of traffic too (in
> >>the dump, there's some NTP for example). Here's the netstat output
> >>before:
> > ....
> >
> > Btw, until recent changes bge had txcsum (not rxcsum) only.
> > 
> > As i can see there is no problem with checksum's at all (at least inside
> > bge driver). tcpdump reports bad checksum on outgoing packets due to
> > nature of tx checksum offloading: packet will get it's checksum calculated
> > right before it goes on wire (If you want to check tx checksum offloading
> > you should look on incoming packets on other end of wire).
> > 
> > Looks like something is wrong inside ipfilter. Can you test with ipfilter
> > turned off (ipf -D or, if you using module, kld_unload ipl.ko)?
> 
> With ipfilter disabled and rxcsum enabled all is well (also, with
> ipfilter and rxcsum enabled but just two rules to allow anything
> in/out it works fine too).
> 
> The tcpdump output looks the same (see below).
> 
> It is not a purely ipfilter thing i guess, since on an em interface
> on another box with txcsum/rxcsum on, there is no problem. It is
> something in the combination of bge and ipfilter, although that is
> as far as my speculation goes right now..

Could you please test attached patch?

Root of the problem is inside ipfilter - if driver use 'partial' (i.e. without
pseudo header) rx checksum offloading ipfilter fails to calculate checksum
correctly (it's using ip packet length (ip_fil_freebsd.c:1561) instead of
tcp/udp length).
This patch enables 'full' rxcsum offloading so ipfilter's bug should not be
triggered.

-- 
Oleg.


--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="bge_rxcsum.diff"

Index: if_bge.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/bge/if_bge.c,v
retrieving revision 1.118
diff -u -r1.118 if_bge.c
--- if_bge.c	30 Jan 2006 13:45:55 -0000	1.118
+++ if_bge.c	31 Jan 2006 08:53:00 -0000
@@ -1099,7 +1099,7 @@
 	 */
 	CSR_WRITE_4(sc, BGE_MODE_CTL, BGE_DMA_SWAP_OPTIONS|
 	    BGE_MODECTL_MAC_ATTN_INTR|BGE_MODECTL_HOST_SEND_BDS|
-	    BGE_MODECTL_TX_NO_PHDR_CSUM|BGE_MODECTL_RX_NO_PHDR_CSUM);
+	    BGE_MODECTL_TX_NO_PHDR_CSUM);
 
 	/*
 	 * Disable memory write invalidate.  Apparently it is not supported
@@ -2631,7 +2631,8 @@
 			    m->m_pkthdr.len >= ETHER_MIN_NOPAD) {
 				m->m_pkthdr.csum_data =
 				    cur_rx->bge_tcp_udp_csum;
-				m->m_pkthdr.csum_flags |= CSUM_DATA_VALID;
+				m->m_pkthdr.csum_flags |=
+				    CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
 			}
 		}
 

--lrZ03NoBR/3+SXJZ--



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