svn commit: r243226 - in user/andre/tcp_workqueue/sys: net netinet netinet6
Andre Oppermann
andre at FreeBSD.org
Sun Nov 18 14:00:04 UTC 2012
Author: andre
Date: Sun Nov 18 14:00:03 2012
New Revision: 243226
URL: http://svnweb.freebsd.org/changeset/base/243226
Log:
Adjustments to the various Ethernet/IP/IPv6/UDP/TCP/SCTP output
functions to correctly set and update the csum_l[2-4]hlen header
length indicators.
Modified:
user/andre/tcp_workqueue/sys/net/if_ethersubr.c
user/andre/tcp_workqueue/sys/netinet/ip_output.c
user/andre/tcp_workqueue/sys/netinet/sctp_output.c
user/andre/tcp_workqueue/sys/netinet/tcp_output.c
user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c
user/andre/tcp_workqueue/sys/netinet6/ip6_output.c
Modified: user/andre/tcp_workqueue/sys/net/if_ethersubr.c
==============================================================================
--- user/andre/tcp_workqueue/sys/net/if_ethersubr.c Sun Nov 18 12:57:58 2012 (r243225)
+++ user/andre/tcp_workqueue/sys/net/if_ethersubr.c Sun Nov 18 14:00:03 2012 (r243226)
@@ -328,6 +328,21 @@ ether_output(struct ifnet *ifp, struct m
sizeof(eh->ether_shost));
/*
+ * Fill in ethernet header length for checksum offload features.
+ * NB: The vlan header length must not be specified with hardware
+ * vlan insertion.
+ */
+ if (m->m_pkthdr.csum_flags) {
+ uint8_t ehlen;
+
+ if (eh->ether_type == ntohs(ETHERTYPE_VLAN))
+ ehlen = sizeof(struct ether_vlan_header);
+ else
+ ehlen = sizeof(struct ether_header);
+ m->m_pkthdr.csum_l2hlen += ehlen;
+ }
+
+ /*
* If a simplex interface, and the packet is being sent to our
* Ethernet address or a broadcast address, loopback a copy.
* XXX To make a simplex device behave exactly like a duplex
Modified: user/andre/tcp_workqueue/sys/netinet/ip_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/ip_output.c Sun Nov 18 12:57:58 2012 (r243225)
+++ user/andre/tcp_workqueue/sys/netinet/ip_output.c Sun Nov 18 14:00:03 2012 (r243226)
@@ -582,6 +582,7 @@ passout:
}
m->m_pkthdr.csum_flags |= CSUM_IP;
+ m->m_pkthdr.csum_l3hlen += ip_len;
if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA & ~ifp->if_hwassist) {
in_delayed_cksum(m);
m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
Modified: user/andre/tcp_workqueue/sys/netinet/sctp_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/sctp_output.c Sun Nov 18 12:57:58 2012 (r243225)
+++ user/andre/tcp_workqueue/sys/netinet/sctp_output.c Sun Nov 18 14:00:03 2012 (r243226)
@@ -4130,7 +4130,7 @@ sctp_lowlevel_chunk_output(struct sctp_i
SCTP_STAT_INCR(sctps_sendnocrc);
#else
m->m_pkthdr.csum_flags = CSUM_SCTP;
- m->m_pkthdr.csum_data = 0;
+ m->m_pkthdr.csum_l4hlen = sizeof(struct sctphdr);
SCTP_STAT_INCR(sctps_sendhwcrc);
#endif
}
@@ -4479,7 +4479,7 @@ sctp_lowlevel_chunk_output(struct sctp_i
SCTP_STAT_INCR(sctps_sendnocrc);
#else
m->m_pkthdr.csum_flags = CSUM_SCTP_IPV6;
- m->m_pkthdr.csum_data = 0;
+ m->m_pkthdr.csum_l4hlen = sizeof(struct sctphdr);
SCTP_STAT_INCR(sctps_sendhwcrc);
#endif
}
@@ -11006,7 +11006,7 @@ sctp_send_resp_msg(struct sockaddr *src,
SCTP_STAT_INCR(sctps_sendnocrc);
#else
mout->m_pkthdr.csum_flags = CSUM_SCTP;
- mout->m_pkthdr.csum_data = 0;
+ mout->m_pkthdr.csum_l4hlen = sizeof(struct sctphdr);
SCTP_STAT_INCR(sctps_sendhwcrc);
#endif
}
@@ -11036,7 +11036,7 @@ sctp_send_resp_msg(struct sockaddr *src,
SCTP_STAT_INCR(sctps_sendnocrc);
#else
mout->m_pkthdr.csum_flags = CSUM_SCTP_IPV6;
- mout->m_pkthdr.csum_data = 0;
+ mout->m_pkthdr.csum_l4hlen = sizeof(struct sctphdr);
SCTP_STAT_INCR(sctps_sendhwcrc);
#endif
}
Modified: user/andre/tcp_workqueue/sys/netinet/tcp_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/tcp_output.c Sun Nov 18 12:57:58 2012 (r243225)
+++ user/andre/tcp_workqueue/sys/netinet/tcp_output.c Sun Nov 18 14:00:03 2012 (r243226)
@@ -1078,7 +1078,7 @@ send:
* checksum extended header and data.
*/
m->m_pkthdr.len = hdrlen + len; /* in6_cksum() need this */
- m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum);
+ m->m_pkthdr.csum_l4hlen = sizeof(struct tcphdr) + optlen;
#ifdef INET6
if (isipv6) {
/*
Modified: user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c Sun Nov 18 12:57:58 2012 (r243225)
+++ user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c Sun Nov 18 14:00:03 2012 (r243226)
@@ -1227,7 +1227,7 @@ udp_output(struct inpcb *inp, struct mbu
ui->ui_sum = in_pseudo(ui->ui_src.s_addr, faddr.s_addr,
htons((u_short)len + sizeof(struct udphdr) + IPPROTO_UDP));
m->m_pkthdr.csum_flags = CSUM_UDP;
- m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);
+ m->m_pkthdr.csum_l4hlen = sizeof(struct udphdr);
} else
ui->ui_sum = 0;
((struct ip *)ui)->ip_len = htons(sizeof(struct udpiphdr) + len);
Modified: user/andre/tcp_workqueue/sys/netinet6/ip6_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet6/ip6_output.c Sun Nov 18 12:57:58 2012 (r243225)
+++ user/andre/tcp_workqueue/sys/netinet6/ip6_output.c Sun Nov 18 14:00:03 2012 (r243226)
@@ -1030,6 +1030,9 @@ passout:
ia6->ia_ifa.if_obytes += m->m_pkthdr.len;
ifa_free(&ia6->ia_ifa);
}
+ if (m->m_pkthdr.csum_flags &
+ (CSUM_UDP_IPV6|CSUM_TCP_IPV6|CSUM_SCTP_IPV6|CSUM_TSO))
+ m->m_pkthdr.csum_l3hlen += sizeof(struct ip6_hdr);
error = nd6_output(ifp, origifp, m, dst, ro->ro_rt);
goto done;
}
More information about the svn-src-user
mailing list