Date: Sun, 18 Nov 2012 14:00:03 +0000 (UTC) From: Andre Oppermann <andre@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r243226 - in user/andre/tcp_workqueue/sys: net netinet netinet6 Message-ID: <201211181400.qAIE03A1038101@svn.freebsd.org>
index | next in thread | raw e-mail
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; }help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211181400.qAIE03A1038101>
