svn commit: r265691 - head/sys/netinet
Michael Tuexen
tuexen at FreeBSD.org
Thu May 8 17:27:46 UTC 2014
Author: tuexen
Date: Thu May 8 17:27:46 2014
New Revision: 265691
URL: http://svnweb.freebsd.org/changeset/base/265691
Log:
For some UDP packets (for example with 200 byte payload) and IP options,
the IP header and the UDP header are not in the same mbuf.
Add code to in_delayed_cksum() to deal with this case.
MFC after: 3 days
Modified:
head/sys/netinet/ip_output.c
Modified: head/sys/netinet/ip_output.c
==============================================================================
--- head/sys/netinet/ip_output.c Thu May 8 17:20:45 2014 (r265690)
+++ head/sys/netinet/ip_output.c Thu May 8 17:27:46 2014 (r265691)
@@ -887,15 +887,23 @@ in_delayed_cksum(struct mbuf *m)
csum = 0xffff;
offset += m->m_pkthdr.csum_data; /* checksum offset */
+ /* find the mbuf in the chain where the checksum starts*/
+ while ((m != NULL) && (offset >= m->m_len)) {
+ offset -= m->m_len;
+ m = m->m_next;
+ }
+ if (m == NULL) {
+ /* This should not happen. */
+ printf("in_delayed_cksum(): checksum outside mbuf chain.\n");
+ return;
+ }
if (offset + sizeof(u_short) > m->m_len) {
- printf("delayed m_pullup, m->len: %d off: %d p: %d\n",
- m->m_len, offset, ip->ip_p);
/*
* XXX
- * this shouldn't happen, but if it does, the
- * correct behavior may be to insert the checksum
- * in the appropriate next mbuf in the chain.
+ * This should not happen, but if it does, it might make more
+ * sense to fix the caller than to add code to split it here.
*/
+ printf("in_delayed_cksum(): checksum split between mbufs.\n");
return;
}
*(u_short *)(m->m_data + offset) = csum;
More information about the svn-src-head
mailing list