Author: jfv
Date: Tue Jan 25 23:20:22 2011
New Revision: 217865
URL: http://svn.freebsd.org/changeset/base/217865

Log:
  MFC stable/8 r217711
  
        Fix for kern/152853, pullup in the wrong
        place in em_xmit causes UDP failure. Thanks
        to Petr Lampa for the patch.
  
  Approved by: re (bz)

Modified:
  releng/8.2/sys/dev/e1000/if_em.c
Directory Properties:
  releng/8.2/sys/   (props changed)
  releng/8.2/sys/amd64/include/xen/   (props changed)
  releng/8.2/sys/cddl/contrib/opensolaris/   (props changed)
  releng/8.2/sys/contrib/dev/acpica/   (props changed)
  releng/8.2/sys/contrib/pf/   (props changed)

Modified: releng/8.2/sys/dev/e1000/if_em.c
==============================================================================
--- releng/8.2/sys/dev/e1000/if_em.c    Tue Jan 25 23:04:57 2011        
(r217864)
+++ releng/8.2/sys/dev/e1000/if_em.c    Tue Jan 25 23:20:22 2011        
(r217865)
@@ -1820,12 +1820,12 @@ em_xmit(struct tx_ring *txr, struct mbuf
                }
                ip = (struct ip *)(mtod(m_head, char *) + ip_off);
                poff = ip_off + (ip->ip_hl << 2);
-               m_head = m_pullup(m_head, poff + sizeof(struct tcphdr));
-               if (m_head == NULL) {
-                       *m_headp = NULL;
-                       return (ENOBUFS);
-               }
                if (do_tso) {
+                       m_head = m_pullup(m_head, poff + sizeof(struct tcphdr));
+                       if (m_head == NULL) {
+                               *m_headp = NULL;
+                               return (ENOBUFS);
+                       }
                        tp = (struct tcphdr *)(mtod(m_head, char *) + poff);
                        /*
                         * TSO workaround:
@@ -1849,6 +1849,11 @@ em_xmit(struct tx_ring *txr, struct mbuf
                        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) {
+                       m_head = m_pullup(m_head, poff + sizeof(struct tcphdr));
+                       if (m_head == NULL) {
+                               *m_headp = NULL;
+                               return (ENOBUFS);
+                       }
                        tp = (struct tcphdr *)(mtod(m_head, char *) + poff);
                        m_head = m_pullup(m_head, poff + (tp->th_off << 2));
                        if (m_head == NULL) {
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to