X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp_input.c;h=21e5f3cdabaeb1d9ba4256473368acf86633870e;hb=776f3d85ebd4edfb70b0f748890f1efd98d8474c;hp=154b9ac836382c46c366757571de1d39f6a445a3;hpb=e55a6d7a97044c2f4fd0231242e062924d75c7b6;p=vpp.git diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index 154b9ac8363..21e5f3cdaba 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -258,7 +258,7 @@ tcp_update_timestamp (tcp_connection_t * tc, u32 seq, u32 seq_end) { ASSERT (timestamp_leq (tc->tsval_recent, tc->rcv_opts.tsval)); tc->tsval_recent = tc->rcv_opts.tsval; - tc->tsval_recent_age = tcp_time_now (); + tc->tsval_recent_age = tcp_time_now_w_thread (tc->c_thread_index); } } @@ -308,7 +308,7 @@ tcp_segment_validate (vlib_main_t * vm, tcp_connection_t * tc0, /* If it just so happens that a segment updates tsval_recent for a * segment over 24 days old, invalidate tsval_recent. */ if (timestamp_lt (tc0->tsval_recent_age + TCP_PAWS_IDLE, - tcp_time_now ())) + tcp_time_now_w_thread (tc0->c_thread_index))) { /* Age isn't reset until we get a valid tsval (bsd inspired) */ tc0->tsval_recent = 0; @@ -470,7 +470,8 @@ 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) { - mrtt = clib_max (tcp_time_now () - tc->rcv_opts.tsecr, 1); + u32 now = tcp_time_now_w_thread (tc->c_thread_index); + mrtt = clib_max (now - tc->rcv_opts.tsecr, 1); } /* Ignore dubious measurements */ @@ -1084,10 +1085,6 @@ tcp_cc_fastrecovery_exit (tcp_connection_t * tc) tcp_fastrecovery_1_smss_off (tc); tcp_fastrecovery_first_off (tc); - /* Update pacer because our cwnd changed. Also makes sure - * that we recompute the max burst size */ - tcp_update_pacer (tc); - TCP_EVT_DBG (TCP_EVT_CC_EVT, tc, 3); } @@ -1185,9 +1182,8 @@ tcp_should_fastrecover (tcp_connection_t * tc) } void -tcp_program_fastretransmit (tcp_connection_t * tc) +tcp_program_fastretransmit (tcp_worker_ctx_t * wrk, tcp_connection_t * tc) { - tcp_worker_ctx_t *wrk = &tcp_main.wrk_ctx[tc->c_thread_index]; if (!(tc->flags & TCP_CONN_FRXT_PENDING)) { vec_add1 (wrk->pending_fast_rxt, tc->c_c_index); @@ -1196,11 +1192,10 @@ tcp_program_fastretransmit (tcp_connection_t * tc) } void -tcp_do_fastretransmits (u32 thread_index) +tcp_do_fastretransmits (tcp_worker_ctx_t * wrk) { - tcp_worker_ctx_t *wrk = &tcp_main.wrk_ctx[thread_index]; + u32 *ongoing_fast_rxt, burst_bytes, sent_bytes, thread_index; u32 max_burst_size, burst_size, n_segs = 0, n_segs_now; - u32 *ongoing_fast_rxt, burst_bytes, sent_bytes; tcp_connection_t *tc; u64 last_cpu_time; int i; @@ -1209,6 +1204,7 @@ tcp_do_fastretransmits (u32 thread_index) && vec_len (wrk->postponed_fast_rxt) == 0) return; + thread_index = wrk->vm->thread_index; last_cpu_time = wrk->vm->clib_time.last_cpu_time; ongoing_fast_rxt = wrk->ongoing_fast_rxt; vec_append (ongoing_fast_rxt, wrk->postponed_fast_rxt); @@ -1217,7 +1213,7 @@ tcp_do_fastretransmits (u32 thread_index) _vec_len (wrk->postponed_fast_rxt) = 0; _vec_len (wrk->pending_fast_rxt) = 0; - max_burst_size = VLIB_FRAME_SIZE / vec_len (wrk->ongoing_fast_rxt); + max_burst_size = VLIB_FRAME_SIZE / vec_len (ongoing_fast_rxt); max_burst_size = clib_max (max_burst_size, 1); for (i = 0; i < vec_len (ongoing_fast_rxt); i++) @@ -1240,15 +1236,14 @@ tcp_do_fastretransmits (u32 thread_index) burst_size = clib_min (burst_size, burst_bytes / tc->snd_mss); if (!burst_size) { - tcp_program_fastretransmit (tc); + tcp_program_fastretransmit (wrk, tc); continue; } - n_segs_now = tcp_fast_retransmit (tc, burst_size); + n_segs_now = tcp_fast_retransmit (wrk, tc, burst_size); sent_bytes = clib_min (n_segs_now * tc->snd_mss, burst_bytes); transport_connection_tx_pacer_update_bytes (&tc->connection, sent_bytes); - n_segs += n_segs_now; } _vec_len (ongoing_fast_rxt) = 0; @@ -1267,7 +1262,7 @@ tcp_cc_handle_event (tcp_connection_t * tc, u32 is_dack) { if (tc->bytes_acked) goto partial_ack; - tcp_program_fastretransmit (tc); + tcp_program_fastretransmit (tcp_get_worker (tc->c_thread_index), tc); return; } /* @@ -1291,7 +1286,8 @@ tcp_cc_handle_event (tcp_connection_t * tc, u32 is_dack) } else if (tcp_should_fastrecover (tc)) { - u32 byte_rate; + u32 pacer_wnd; + ASSERT (!tcp_in_fastrecovery (tc)); /* Heuristic to catch potential late dupacks @@ -1320,9 +1316,11 @@ tcp_cc_handle_event (tcp_connection_t * tc, u32 is_dack) tc->cwnd = tc->ssthresh + 3 * tc->snd_mss; } - byte_rate = (0.3 * tc->cwnd) / ((f64) TCP_TICK * tc->srtt); - transport_connection_tx_pacer_init (&tc->connection, byte_rate, 0); - tcp_program_fastretransmit (tc); + pacer_wnd = clib_max (0.1 * tc->cwnd, 2 * tc->snd_mss); + tcp_connection_tx_pacer_reset (tc, pacer_wnd, + 0 /* start bucket */ ); + tcp_program_fastretransmit (tcp_get_worker (tc->c_thread_index), + tc); return; } else if (!tc->bytes_acked @@ -1439,7 +1437,7 @@ partial_ack: /* * Since this was a partial ack, try to retransmit some more data */ - tcp_program_fastretransmit (tc); + tcp_program_fastretransmit (tcp_get_worker (tc->c_thread_index), tc); } /** @@ -2102,7 +2100,7 @@ tcp46_established_inline (vlib_main_t * vm, vlib_node_runtime_t * node, thread_index); err_counters[TCP_ERROR_EVENT_FIFO_FULL] = errors; tcp_store_err_counters (established, err_counters); - tcp_flush_frame_to_output (vm, thread_index, is_ip4); + tcp_flush_frame_to_output (tcp_get_worker (thread_index), is_ip4); return frame->n_vectors; } @@ -3393,7 +3391,7 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b; u16 nexts[VLIB_FRAME_SIZE], *next; - tcp_set_time_now (thread_index); + tcp_set_time_now (tcp_get_worker (thread_index)); from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors;