Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
tcp: timestamp adjustment
[vpp.git]
/
src
/
vnet
/
tcp
/
tcp_input.c
diff --git
a/src/vnet/tcp/tcp_input.c
b/src/vnet/tcp/tcp_input.c
index
23030ee
..
1b4e8a6
100644
(file)
--- a/
src/vnet/tcp/tcp_input.c
+++ b/
src/vnet/tcp/tcp_input.c
@@
-508,7
+508,7
@@
tcp_update_rtt (tcp_connection_t * tc, u32 ack)
* seq_lt (tc->snd_una, ack). This is a condition for calling update_rtt */
else if (tcp_opts_tstamp (&tc->rcv_opts) && tc->rcv_opts.tsecr)
{
* seq_lt (tc->snd_una, ack). This is a condition for calling update_rtt */
else if (tcp_opts_tstamp (&tc->rcv_opts) && tc->rcv_opts.tsecr)
{
- u32 now = tcp_t
ime_now_w_thread (tc->c_thread_index
);
+ u32 now = tcp_t
stamp (tc
);
mrtt = clib_max (now - tc->rcv_opts.tsecr, 1);
}
mrtt = clib_max (now - tc->rcv_opts.tsecr, 1);
}
@@
-1185,12
+1185,10
@@
tcp_cc_recovery_exit (tcp_connection_t * tc)
#ifndef CLIB_MARCH_VARIANT
void
#ifndef CLIB_MARCH_VARIANT
void
-tcp_cc_fastrecovery_
exit
(tcp_connection_t * tc)
+tcp_cc_fastrecovery_
clear
(tcp_connection_t * tc)
{
{
- tc->cc_algo->recovered (tc);
tc->snd_rxt_bytes = 0;
tc->rcv_dupacks = 0;
tc->snd_rxt_bytes = 0;
tc->rcv_dupacks = 0;
- tc->snd_rxt_bytes = 0;
tc->rtt_ts = 0;
tcp_fastrecovery_off (tc);
tc->rtt_ts = 0;
tcp_fastrecovery_off (tc);
@@
-1213,8
+1211,9
@@
tcp_cc_congestion_undo (tcp_connection_t * tc)
}
else if (tcp_in_fastrecovery (tc))
{
}
else if (tcp_in_fastrecovery (tc))
{
- tcp_cc_fastrecovery_
exit
(tc);
+ tcp_cc_fastrecovery_
clear
(tc);
}
}
+ tcp_cc_undo_recovery (tc);
ASSERT (tc->rto_boff == 0);
TCP_EVT_DBG (TCP_EVT_CC_EVT, tc, 5);
}
ASSERT (tc->rto_boff == 0);
TCP_EVT_DBG (TCP_EVT_CC_EVT, tc, 5);
}
@@
-1255,7
+1254,10
@@
tcp_cc_recover (tcp_connection_t * tc)
if (tcp_in_recovery (tc))
tcp_cc_recovery_exit (tc);
else if (tcp_in_fastrecovery (tc))
if (tcp_in_recovery (tc))
tcp_cc_recovery_exit (tc);
else if (tcp_in_fastrecovery (tc))
- tcp_cc_fastrecovery_exit (tc);
+ {
+ tcp_cc_recovered (tc);
+ tcp_cc_fastrecovery_clear (tc);
+ }
ASSERT (tc->rto_boff == 0);
ASSERT (!tcp_in_cong_recovery (tc));
ASSERT (tc->rto_boff == 0);
ASSERT (!tcp_in_cong_recovery (tc));
@@
-1698,6
+1700,10
@@
static void
tcp_rcv_fin (tcp_worker_ctx_t * wrk, tcp_connection_t * tc, vlib_buffer_t * b,
u32 * error)
{
tcp_rcv_fin (tcp_worker_ctx_t * wrk, tcp_connection_t * tc, vlib_buffer_t * b,
u32 * error)
{
+ /* Reject out-of-order fins */
+ if (vnet_buffer (b)->tcp.seq_end != tc->rcv_nxt)
+ return;
+
/* Account for the FIN and send ack */
tc->rcv_nxt += 1;
tcp_program_ack (wrk, tc);
/* Account for the FIN and send ack */
tc->rcv_nxt += 1;
tcp_program_ack (wrk, tc);