X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp.c;h=1d030c9ce71bf1761591943b3c7fe5e11f65cb37;hb=46ec6e018e95a10d46d018dbc15d90c309b5dccc;hp=6ef03dc093d58fdbef44b5c08f4e03140c9fd97f;hpb=be237bf02382854118986e8ea84c7544e42023f2;p=vpp.git diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c index 6ef03dc093d..1d030c9ce71 100644 --- a/src/vnet/tcp/tcp.c +++ b/src/vnet/tcp/tcp.c @@ -271,7 +271,7 @@ tcp_connection_cleanup (tcp_connection_t * tc) vec_free (tc->rcv_opts.sacks); pool_free (tc->sack_sb.holes); - if (tc->flags & TCP_CONN_RATE_SAMPLE) + if (tc->cfg_flags & TCP_CFG_F_RATE_SAMPLE) tcp_bt_cleanup (tc); /* Poison the entry */ @@ -737,9 +737,12 @@ tcp_connection_init_vars (tcp_connection_t * tc) || tcp_cfg.enable_tx_pacing) tcp_enable_pacing (tc); - if (tc->flags & TCP_CONN_RATE_SAMPLE) + if (tc->cfg_flags & TCP_CFG_F_RATE_SAMPLE) tcp_bt_init (tc); + if (!tcp_cfg.allow_tso) + tc->cfg_flags |= TCP_CFG_F_NO_TSO; + tc->start_ts = tcp_time_now_us (tc->c_thread_index); } @@ -839,6 +842,31 @@ format_tcp_state (u8 * s, va_list * args) return s; } +const char *tcp_cfg_flags_str[] = { +#define _(sym, str) str, + foreach_tcp_cfg_flag +#undef _ +}; + +static u8 * +format_tcp_cfg_flags (u8 * s, va_list * args) +{ + tcp_connection_t *tc = va_arg (*args, tcp_connection_t *); + int i, last = -1; + + for (i = 0; i < TCP_CFG_N_FLAG_BITS; i++) + if (tc->cfg_flags & (1 << i)) + last = i; + for (i = 0; i < last; i++) + { + if (tc->cfg_flags & (1 << i)) + s = format (s, "%s, ", tcp_cfg_flags_str[i]); + } + if (last >= 0) + s = format (s, "%s", tcp_cfg_flags_str[last]); + return s; +} + const char *tcp_connection_flags_str[] = { #define _(sym, str) str, foreach_tcp_connection_flag @@ -963,8 +991,9 @@ static u8 * format_tcp_vars (u8 * s, va_list * args) { tcp_connection_t *tc = va_arg (*args, tcp_connection_t *); - s = format (s, " index: %u flags: %U timers: %U\n", tc->c_c_index, - format_tcp_connection_flags, tc, format_tcp_timers, tc); + s = format (s, " index: %u cfg: %U flags: %U timers: %U\n", tc->c_c_index, + format_tcp_cfg_flags, tc, format_tcp_connection_flags, tc, + format_tcp_timers, tc); s = format (s, " snd_una %u snd_nxt %u snd_una_max %u", tc->snd_una - tc->iss, tc->snd_nxt - tc->iss, tc->snd_una_max - tc->iss); @@ -1219,10 +1248,8 @@ tcp_session_send_mss (transport_connection_t * trans_conn) * the current state of the connection. */ tcp_update_burst_snd_vars (tc); - if (PREDICT_FALSE (tc->is_tso)) - { - return tcp_session_cal_goal_size (tc); - } + if (PREDICT_FALSE (tc->cfg_flags & TCP_CFG_F_TSO)) + return tcp_session_cal_goal_size (tc); return tc->snd_mss; } @@ -1621,6 +1648,7 @@ tcp_configuration_init (void) tcp_cfg.default_mtu = 1500; tcp_cfg.initial_cwnd_multiplier = 0; tcp_cfg.enable_tx_pacing = 1; + tcp_cfg.allow_tso = 0; tcp_cfg.cc_algo = TCP_CC_NEWRENO; tcp_cfg.rwnd_min_update_ack = 1; @@ -1730,10 +1758,26 @@ tcp_config_fn (vlib_main_t * vm, unformat_input_t * input) ; else if (unformat (input, "max-rx-fifo %U", unformat_memory_size, &memory_size)) - tcp_cfg.max_rx_fifo = memory_size; + { + if (memory_size >= 0x100000000) + { + return clib_error_return + (0, "max-rx-fifo %llu (0x%llx) too large", memory_size, + memory_size); + } + tcp_cfg.max_rx_fifo = memory_size; + } else if (unformat (input, "min-rx-fifo %U", unformat_memory_size, &memory_size)) - tcp_cfg.min_rx_fifo = memory_size; + { + if (memory_size >= 0x100000000) + { + return clib_error_return + (0, "min-rx-fifo %llu (0x%llx) too large", memory_size, + memory_size); + } + tcp_cfg.min_rx_fifo = memory_size; + } else if (unformat (input, "mtu %u", &tcp_cfg.default_mtu)) ; else if (unformat (input, "rwnd-min-update-ack %d", @@ -1744,6 +1788,8 @@ tcp_config_fn (vlib_main_t * vm, unformat_input_t * input) tcp_cfg.initial_cwnd_multiplier = cwnd_multiplier; else if (unformat (input, "no-tx-pacing")) tcp_cfg.enable_tx_pacing = 0; + else if (unformat (input, "tso")) + tcp_cfg.allow_tso = 1; else if (unformat (input, "cc-algo %U", unformat_tcp_cc_algo, &tcp_cfg.cc_algo)) ;