ipfilter + bge strangeness

Oleg Bulyzhin oleg at freebsd.org
Tue Jan 31 01:09:30 PST 2006


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.

-------------- next part --------------
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;
 			}
 		}
 


More information about the freebsd-stable mailing list