svn commit: r188361 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb dev/msk

Pyun YongHyeon yongari at FreeBSD.org
Sun Feb 8 18:00:44 PST 2009


Author: yongari
Date: Mon Feb  9 02:00:43 2009
New Revision: 188361
URL: http://svn.freebsd.org/changeset/base/188361

Log:
  MFC r183485-183486
   r183485:
    Always pullup mbuf prior to accessing TCP header.
    This should fix occasional Tx checksum corruption issue.
  
   r183486:
    If mbuf is not writable get a writable copy before invoking
    m_pullup(9).

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/dev/msk/if_msk.c

Modified: stable/7/sys/dev/msk/if_msk.c
==============================================================================
--- stable/7/sys/dev/msk/if_msk.c	Mon Feb  9 01:55:30 2009	(r188360)
+++ stable/7/sys/dev/msk/if_msk.c	Mon Feb  9 02:00:43 2009	(r188361)
@@ -2559,7 +2559,16 @@ msk_encap(struct msk_if_softc *sc_if, st
 		struct ip *ip;
 		struct tcphdr *tcp;
 
-		/* TODO check for M_WRITABLE(m) */
+		if (M_WRITABLE(m) == 0) {
+			/* Get a writable copy. */
+			m = m_dup(*m_head, M_DONTWAIT);
+			m_freem(*m_head);
+			if (m == NULL) {
+				*m_head = NULL;
+				return (ENOBUFS);
+			}
+			*m_head = m;
+		}
 
 		offset = sizeof(struct ether_header);
 		m = m_pullup(m, offset);
@@ -2601,6 +2610,11 @@ msk_encap(struct msk_if_softc *sc_if, st
 		    (m->m_pkthdr.csum_flags & CSUM_TCP) != 0) {
 			uint16_t csum;
 
+			m = m_pullup(m, offset + sizeof(struct tcphdr));
+			if (m == NULL) {
+				*m_head = NULL;
+				return (ENOBUFS);
+			}
 			csum = in_cksum_skip(m, ntohs(ip->ip_len) + offset -
 			    (ip->ip_hl << 2), offset);
 			*(uint16_t *)(m->m_data + offset +


More information about the svn-src-stable-7 mailing list