summaryrefslogtreecommitdiffstats
path: root/sys/dev/msk
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2008-09-30 04:47:49 +0000
committeryongari <yongari@FreeBSD.org>2008-09-30 04:47:49 +0000
commitb708fede3f331ec2aef186b4eab3eb9706e90b6b (patch)
tree93b3902e13b4e5c39101b8016f54dde0c9591530 /sys/dev/msk
parent18256ca19330ee969321efe82dee16b39b623f11 (diff)
downloadFreeBSD-src-b708fede3f331ec2aef186b4eab3eb9706e90b6b.zip
FreeBSD-src-b708fede3f331ec2aef186b4eab3eb9706e90b6b.tar.gz
Always pullup mbuf prior to accessing TCP header.
This should fix occasional Tx checksum corruption issue. Reported by: Garrett Cooper < yanefbsd <at> gmail dot com > Tested by: Garrett Cooper < yanefbsd <at> gmail dot com >
Diffstat (limited to 'sys/dev/msk')
-rw-r--r--sys/dev/msk/if_msk.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/dev/msk/if_msk.c b/sys/dev/msk/if_msk.c
index 7e9d413..cd0512e 100644
--- a/sys/dev/msk/if_msk.c
+++ b/sys/dev/msk/if_msk.c
@@ -2601,6 +2601,11 @@ msk_encap(struct msk_if_softc *sc_if, struct mbuf **m_head)
(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 +
OpenPOWER on IntegriCloud