From 596c45b22211c9af243b624dc037f58c0aa1c302 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Thu, 9 Sep 2021 12:04:17 -0700 Subject: tcp session: initialize sw_if_index at connect time Type: fix Signed-off-by: Florin Coras Change-Id: Id0e67a9ce9c5d8bca2cd7a30493f03a02a46dc46 --- src/vnet/session/transport.c | 16 ++++++++-------- src/vnet/tcp/tcp.c | 1 + src/vnet/tcp/tcp_cli.c | 5 +++-- src/vnet/tcp/tcp_input.c | 1 - src/vnet/tcp/tcp_output.c | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/vnet/session/transport.c b/src/vnet/session/transport.c index 526f1a2da15..4b263cd29b9 100644 --- a/src/vnet/session/transport.c +++ b/src/vnet/session/transport.c @@ -549,14 +549,14 @@ transport_get_interface_ip (u32 sw_if_index, u8 is_ip4, ip46_address_t * addr) } static session_error_t -transport_find_local_ip_for_remote (u32 sw_if_index, - transport_endpoint_t * rmt, - ip46_address_t * lcl_addr) +transport_find_local_ip_for_remote (u32 *sw_if_index, + transport_endpoint_t *rmt, + ip46_address_t *lcl_addr) { fib_node_index_t fei; fib_prefix_t prefix; - if (sw_if_index == ENDPOINT_INVALID_INDEX) + if (*sw_if_index == ENDPOINT_INVALID_INDEX) { /* Find a FIB path to the destination */ clib_memcpy_fast (&prefix.fp_addr, &rmt->ip, sizeof (rmt->ip)); @@ -570,13 +570,13 @@ transport_find_local_ip_for_remote (u32 sw_if_index, if (fei == FIB_NODE_INDEX_INVALID) return SESSION_E_NOROUTE; - sw_if_index = fib_entry_get_resolving_interface (fei); - if (sw_if_index == ENDPOINT_INVALID_INDEX) + *sw_if_index = fib_entry_get_resolving_interface (fei); + if (*sw_if_index == ENDPOINT_INVALID_INDEX) return SESSION_E_NOINTF; } clib_memset (lcl_addr, 0, sizeof (*lcl_addr)); - return transport_get_interface_ip (sw_if_index, rmt->is_ip4, lcl_addr); + return transport_get_interface_ip (*sw_if_index, rmt->is_ip4, lcl_addr); } int @@ -593,7 +593,7 @@ transport_alloc_local_endpoint (u8 proto, transport_endpoint_cfg_t * rmt_cfg, */ if (ip_is_zero (&rmt_cfg->peer.ip, rmt_cfg->peer.is_ip4)) { - error = transport_find_local_ip_for_remote (rmt_cfg->peer.sw_if_index, + error = transport_find_local_ip_for_remote (&rmt_cfg->peer.sw_if_index, rmt, lcl_addr); if (error) return error; diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c index 4b1dd8e5cf5..62267bbdd1f 100644 --- a/src/vnet/tcp/tcp.c +++ b/src/vnet/tcp/tcp.c @@ -831,6 +831,7 @@ tcp_session_open (transport_endpoint_cfg_t * rmt) /* The other connection vars will be initialized after SYN ACK */ tcp_connection_timers_init (tc); tc->mss = rmt->mss; + tc->sw_if_index = rmt->peer.sw_if_index; tc->next_node_index = rmt->next_node_index; tc->next_node_opaque = rmt->next_node_opaque; diff --git a/src/vnet/tcp/tcp_cli.c b/src/vnet/tcp/tcp_cli.c index e602f114a74..c7b5c0b441e 100644 --- a/src/vnet/tcp/tcp_cli.c +++ b/src/vnet/tcp/tcp_cli.c @@ -208,8 +208,9 @@ format_tcp_vars (u8 * s, va_list * args) tc->mrtt_us * 1e3, tc->rttvar / 1000.0); s = format (s, " rtt_ts %.4f rtt_seq %u\n", tc->rtt_ts, tc->rtt_seq - tc->iss); - s = format (s, " next_node %u opaque 0x%x fib_index %u\n", - tc->next_node_index, tc->next_node_opaque, tc->c_fib_index); + s = format (s, " next_node %u opaque 0x%x fib_index %u sw_if_index %d\n", + tc->next_node_index, tc->next_node_opaque, tc->c_fib_index, + tc->sw_if_index); s = format (s, " cong: %U", format_tcp_congestion, tc); if (tc->state >= TCP_STATE_ESTABLISHED) diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index 1e27b7dcb2e..3d3272c8765 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -1933,7 +1933,6 @@ tcp46_syn_sent_inline (vlib_main_t *vm, vlib_node_runtime_t *node, new_tc->rcv_nxt = vnet_buffer (b[0])->tcp.seq_end; new_tc->irs = seq; new_tc->timers[TCP_TIMER_RETRANSMIT_SYN] = TCP_TIMER_HANDLE_INVALID; - new_tc->sw_if_index = vnet_buffer (b[0])->sw_if_index[VLIB_RX]; if (tcp_opts_tstamp (&new_tc->rcv_opts)) { diff --git a/src/vnet/tcp/tcp_output.c b/src/vnet/tcp/tcp_output.c index 82694995840..7a46798e746 100644 --- a/src/vnet/tcp/tcp_output.c +++ b/src/vnet/tcp/tcp_output.c @@ -2136,7 +2136,7 @@ tcp_output_handle_packet (tcp_connection_t * tc0, vlib_buffer_t * b0, } vnet_buffer (b0)->sw_if_index[VLIB_TX] = tc0->c_fib_index; - vnet_buffer (b0)->sw_if_index[VLIB_RX] = 0; + vnet_buffer (b0)->sw_if_index[VLIB_RX] = tc0->sw_if_index; if (!is_ip4) { -- cgit 1.2.3-korg