mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-11-07 04:36:52 -10:00
TCP RACK: fix RSM computation for TCP fast open
When spitting an RSM containing the SYN and data, honor the sequence number used by the SYN flag when computing the offset in the socket buffer. PR: 297006 Reviewed by: rrs, Peter Lei MFC after: 3 days MFC to: stable/15 Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D61149
This commit is contained in:
1 parent
4ca9291004
commit
ff066579fd
1 file changed
+13
-2
@@ -6892,7 +6892,7 @@ static void
|
||||
rack_setup_offset_for_rsm(struct tcp_rack *rack, struct rack_sendmap *src_rsm, struct rack_sendmap *rsm)
|
||||
{
|
||||
struct mbuf *m;
|
||||
uint32_t soff;
|
||||
uint32_t soff, start;
|
||||
|
||||
if (src_rsm->m &&
|
||||
((src_rsm->orig_m_len != src_rsm->m->m_len) ||
|
||||
@@ -6901,7 +6901,10 @@ rack_setup_offset_for_rsm(struct tcp_rack *rack, struct rack_sendmap *src_rsm, s
|
||||
rack_adjust_orig_mlen(src_rsm);
|
||||
}
|
||||
m = src_rsm->m;
|
||||
soff = src_rsm->soff + (src_rsm->r_end - src_rsm->r_start);
|
||||
start = src_rsm->r_start;
|
||||
if ((src_rsm->r_flags & RACK_HAS_SYN) != 0)
|
||||
start++;
|
||||
soff = src_rsm->soff + (src_rsm->r_end - start);
|
||||
while (soff >= m->m_len) {
|
||||
/* Move out past this mbuf */
|
||||
soff -= m->m_len;
|
||||
@@ -6924,6 +6927,14 @@ rack_setup_offset_for_rsm(struct tcp_rack *rack, struct rack_sendmap *src_rsm, s
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((src_rsm->r_flags & RACK_HAS_SYN) != 0 &&
|
||||
src_rsm->r_end == src_rsm->r_start + 1) {
|
||||
/* src_rsm is a SYN segment without data */
|
||||
src_rsm->m = NULL;
|
||||
src_rsm->soff = 0;
|
||||
src_rsm->orig_m_len = 0;
|
||||
src_rsm->orig_t_space = 0;
|
||||
}
|
||||
rsm->m = m;
|
||||
rsm->soff = soff;
|
||||
rsm->orig_m_len = m->m_len;
|
||||
|
||||
Reference in new issue
Block a user