diff options
author | jfv <jfv@FreeBSD.org> | 2011-04-07 21:20:26 +0000 |
---|---|---|
committer | jfv <jfv@FreeBSD.org> | 2011-04-07 21:20:26 +0000 |
commit | c71c4180a200f2b31902876626de9f1e92cd0c3a (patch) | |
tree | 44b68fb060af8e7592616f29d637235725e9ffca | |
parent | 3d0a28924c3bb0c62feba62890983a747ea66adf (diff) | |
download | FreeBSD-src-c71c4180a200f2b31902876626de9f1e92cd0c3a.zip FreeBSD-src-c71c4180a200f2b31902876626de9f1e92cd0c3a.tar.gz |
Port of the LRO fix from mxge driver to the generic
LRO code. Thanks to Andrew Gallatin for the change.
MFC after: 7 days
-rw-r--r-- | sys/netinet/tcp_lro.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c index 971473b..27384c5 100644 --- a/sys/netinet/tcp_lro.c +++ b/sys/netinet/tcp_lro.c @@ -279,8 +279,10 @@ tcp_lro_rx(struct lro_ctrl *cntl, struct mbuf *m_head, uint32_t csum) lro->dest_ip == ip->ip_dst.s_addr) { /* Try to append it */ - if (__predict_false(seq != lro->next_seq)) { - /* out of order packet */ + if (__predict_false(seq != lro->next_seq || + (tcp_data_len == 0 && + lro->ack_seq == tcp->th_ack))) { + /* out of order packet or dup ack */ SLIST_REMOVE(&cntl->lro_active, lro, lro_entry, next); tcp_lro_flush(cntl, lro); |