summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_lro.c
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2008-08-24 02:31:09 +0000
committerkmacy <kmacy@FreeBSD.org>2008-08-24 02:31:09 +0000
commit26b0fa62ca49fb8dd488857aea900922eeda03bc (patch)
treedde28408ebc91db91f43a40a4b117223686552dd /sys/netinet/tcp_lro.c
parent8c6bf65efbf38efe8d5cc1374c205c11c465fefd (diff)
downloadFreeBSD-src-26b0fa62ca49fb8dd488857aea900922eeda03bc.zip
FreeBSD-src-26b0fa62ca49fb8dd488857aea900922eeda03bc.tar.gz
Don't calculate checksum if it has already been validated
Obtained from: Chelsio Inc. MFC after: 3 days
Diffstat (limited to 'sys/netinet/tcp_lro.c')
-rw-r--r--sys/netinet/tcp_lro.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c
index 4f0a30e..18258a9 100644
--- a/sys/netinet/tcp_lro.c
+++ b/sys/netinet/tcp_lro.c
@@ -184,7 +184,7 @@ tcp_lro_rx(struct lro_ctrl *cntl, struct mbuf *m_head, uint32_t csum)
struct mbuf *m_nxt, *m_tail;
struct lro_entry *lro;
int hlen, ip_len, tcp_hdr_len, tcp_data_len, tot_len;
- int opt_bytes, trim;
+ int opt_bytes, trim, csum_flags;
uint32_t seq, tmp_csum, device_mtu;
@@ -204,12 +204,20 @@ tcp_lro_rx(struct lro_ctrl *cntl, struct mbuf *m_head, uint32_t csum)
return -1;
/* verify that the IP header checksum is correct */
- tmp_csum = do_csum_data((uint16_t *)ip, sizeof (*ip));
- if (__predict_false((tmp_csum ^ 0xffff) != 0)) {
- cntl->lro_bad_csum++;
- return -1;
+ csum_flags = m_head->m_pkthdr.csum_flags;
+ if (csum_flags & CSUM_IP_CHECKED) {
+ if (__predict_false((csum_flags & CSUM_IP_VALID) == 0)) {
+ cntl->lro_bad_csum++;
+ return -1;
+ }
+ } else {
+ tmp_csum = do_csum_data((uint16_t *)ip, sizeof (*ip));
+ if (__predict_false((tmp_csum ^ 0xffff) != 0)) {
+ cntl->lro_bad_csum++;
+ return -1;
+ }
}
-
+
/* find the TCP header */
tcp = (struct tcphdr *) (ip + 1);
OpenPOWER on IntegriCloud