Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Oct 2010 00:16:55 +0000 (UTC)
From:      Jack F Vogel <jfv@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r214441 - head/sys/dev/e1000
Message-ID:  <201010280016.o9S0GtHf048088@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jfv
Date: Thu Oct 28 00:16:54 2010
New Revision: 214441
URL: http://svn.freebsd.org/changeset/base/214441

Log:
  In the data setup code for doing offloads the
  ip and tcp pointers were not reset after some
  pullups. In practice this led to an NFS mount
  failure when using UDP reported by Kevin Lo,
  thanks Kevin. Fix from yongari, thank you!

Modified:
  head/sys/dev/e1000/if_em.c

Modified: head/sys/dev/e1000/if_em.c
==============================================================================
--- head/sys/dev/e1000/if_em.c	Wed Oct 27 23:55:15 2010	(r214440)
+++ head/sys/dev/e1000/if_em.c	Thu Oct 28 00:16:54 2010	(r214441)
@@ -93,7 +93,7 @@ int	em_display_debug_stats = 0;
 /*********************************************************************
  *  Driver version:
  *********************************************************************/
-char em_driver_version[] = "7.1.6";
+char em_driver_version[] = "7.1.7";
 
 /*********************************************************************
  *  PCI Device ID Table
@@ -1848,6 +1848,7 @@ em_xmit(struct tx_ring *txr, struct mbuf
 				*m_headp = NULL;
 				return (ENOBUFS);
 			}
+			ip = (struct ip *)(mtod(m_head, char *) + ip_off);
 			ip->ip_len = 0;
 			ip->ip_sum = 0;
 			/*
@@ -1856,6 +1857,7 @@ em_xmit(struct tx_ring *txr, struct mbuf
 			 * what hardware expect to see. This is adherence of
 			 * Microsoft's Large Send specification.
 			 */
+			tp = (struct tcphdr *)(mtod(m_head, char *) + poff);
 			tp->th_sum = in_pseudo(ip->ip_src.s_addr,
 			    ip->ip_dst.s_addr, htons(IPPROTO_TCP));
 		} else if (m_head->m_pkthdr.csum_flags & CSUM_TCP) {
@@ -1865,12 +1867,15 @@ em_xmit(struct tx_ring *txr, struct mbuf
 				*m_headp = NULL;
 				return (ENOBUFS);
 			}
+			ip = (struct ip *)(mtod(m_head, char *) + ip_off);
+			tp = (struct tcphdr *)(mtod(m_head, char *) + poff);
 		} else if (m_head->m_pkthdr.csum_flags & CSUM_UDP) {
 			m_head = m_pullup(m_head, poff + sizeof(struct udphdr));
 			if (m_head == NULL) {
 				*m_headp = NULL;
 				return (ENOBUFS);
 			}
+			ip = (struct ip *)(mtod(m_head, char *) + ip_off);
 		}
 		*m_headp = m_head;
 	}



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