diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netinet/tcp_input.c | 65 |
1 files changed, 30 insertions, 35 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index f2b74f845dd..67d980bf29d 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_input.c,v 1.260 2013/04/10 08:50:59 mpi Exp $ */ +/* $OpenBSD: tcp_input.c,v 1.261 2013/06/03 13:19:08 bluhm Exp $ */ /* $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $ */ /* @@ -468,23 +468,6 @@ tcp_input(struct mbuf *m, ...) /* save ip_tos before clearing it for checksum */ iptos = ip->ip_tos; #endif - /* - * Checksum extended TCP header and data. - */ - if ((m->m_pkthdr.csum_flags & M_TCP_CSUM_IN_OK) == 0) { - if (m->m_pkthdr.csum_flags & M_TCP_CSUM_IN_BAD) { - tcpstat.tcps_inhwcsum++; - tcpstat.tcps_rcvbadsum++; - goto drop; - } - if (in4_cksum(m, IPPROTO_TCP, iphlen, tlen) != 0) { - tcpstat.tcps_rcvbadsum++; - goto drop; - } - } else { - m->m_pkthdr.csum_flags &= ~M_TCP_CSUM_IN_OK; - tcpstat.tcps_inhwcsum++; - } break; #ifdef INET6 case AF_INET6: @@ -518,27 +501,39 @@ tcp_input(struct mbuf *m, ...) /* XXX stat */ goto drop; } + break; +#endif + } - /* - * Checksum extended TCP header and data. - */ - if ((m->m_pkthdr.csum_flags & M_TCP_CSUM_IN_OK) == 0) { - if (m->m_pkthdr.csum_flags & M_TCP_CSUM_IN_BAD) { - tcpstat.tcps_inhwcsum++; - tcpstat.tcps_rcvbadsum++; - goto drop; - } - if (in6_cksum(m, IPPROTO_TCP, sizeof(struct ip6_hdr), - tlen)) { - tcpstat.tcps_rcvbadsum++; - goto drop; - } - } else { - m->m_pkthdr.csum_flags &= ~M_TCP_CSUM_IN_OK; + /* + * Checksum extended TCP header and data. + */ + if ((m->m_pkthdr.csum_flags & M_TCP_CSUM_IN_OK) == 0) { + int sum; + + if (m->m_pkthdr.csum_flags & M_TCP_CSUM_IN_BAD) { tcpstat.tcps_inhwcsum++; + tcpstat.tcps_rcvbadsum++; + goto drop; } - break; + switch (af) { + case AF_INET: + sum = in4_cksum(m, IPPROTO_TCP, iphlen, tlen); + break; +#ifdef INET6 + case AF_INET6: + sum = in6_cksum(m, IPPROTO_TCP, sizeof(struct ip6_hdr), + tlen); + break; #endif + } + if (sum != 0) { + tcpstat.tcps_rcvbadsum++; + goto drop; + } + } else { + m->m_pkthdr.csum_flags &= ~M_TCP_CSUM_IN_OK; + tcpstat.tcps_inhwcsum++; } /* |