Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 May 2015 09:05:14 +0000 (UTC)
From:      Andrew Rybchenko <arybchik@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r283206 - stable/10/sys/dev/sfxge
Message-ID:  <201505210905.t4L95Eiq066803@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: arybchik
Date: Thu May 21 09:05:13 2015
New Revision: 283206
URL: https://svnweb.freebsd.org/changeset/base/283206

Log:
  MFC: r282940
  
  sfxge: LRO may be done only if checksums are OK
  
  Also it is cheaper to check Rx descriptor flags than TCP protocol in IP
  header.
  
  Sponsored by:   Solarflare Communications, Inc.

Modified:
  stable/10/sys/dev/sfxge/sfxge_rx.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/sfxge/sfxge_rx.c
==============================================================================
--- stable/10/sys/dev/sfxge/sfxge_rx.c	Thu May 21 09:03:18 2015	(r283205)
+++ stable/10/sys/dev/sfxge/sfxge_rx.c	Thu May 21 09:05:13 2015	(r283206)
@@ -681,15 +681,18 @@ sfxge_lro(struct sfxge_rxq *rxq, struct 
 	 */
 	if (l3_proto == htons(ETHERTYPE_IP)) {
 		struct ip *iph = nh;
-		if ((iph->ip_p - IPPROTO_TCP) |
-		    (iph->ip_hl - (sizeof(*iph) >> 2u)) |
+
+		KASSERT(iph->ip_p == IPPROTO_TCP,
+		    ("IPv4 protocol is not TCP, but packet marker is set"));
+		if ((iph->ip_hl - (sizeof(*iph) >> 2u)) |
 		    (iph->ip_off & htons(IP_MF | IP_OFFMASK)))
 			goto deliver_now;
 		th = (struct tcphdr *)(iph + 1);
 	} else if (l3_proto == htons(ETHERTYPE_IPV6)) {
 		struct ip6_hdr *iph = nh;
-		if (iph->ip6_nxt != IPPROTO_TCP)
-			goto deliver_now;
+
+		KASSERT(iph->ip6_nxt == IPPROTO_TCP,
+		    ("IPv6 next header is not TCP, but packet marker is set"));
 		l2_id |= SFXGE_LRO_L2_ID_IPV6;
 		th = (struct tcphdr *)(iph + 1);
 	} else {
@@ -834,7 +837,9 @@ sfxge_rx_qcomplete(struct sfxge_rxq *rxq
 
 		/* Pass packet up the stack or into LRO (pipelined) */
 		if (prev != NULL) {
-			if (lro_enabled)
+			if (lro_enabled &&
+			    ((prev->flags & (EFX_PKT_TCP | EFX_CKSUM_TCPUDP)) ==
+			     (EFX_PKT_TCP | EFX_CKSUM_TCPUDP)))
 				sfxge_lro(rxq, prev);
 			else
 				sfxge_rx_deliver(sc, prev);
@@ -853,7 +858,9 @@ discard:
 
 	/* Pass last packet up the stack or into LRO */
 	if (prev != NULL) {
-		if (lro_enabled)
+		if (lro_enabled &&
+		    ((prev->flags & (EFX_PKT_TCP | EFX_CKSUM_TCPUDP)) ==
+		     (EFX_PKT_TCP | EFX_CKSUM_TCPUDP)))
 			sfxge_lro(rxq, prev);
 		else
 			sfxge_rx_deliver(sc, prev);



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