From: Florin Coras Date: Tue, 10 Jun 2025 21:53:47 +0000 (-0400) Subject: udp: regrab connected session after transport clone X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F39%2F43139%2F5;p=vpp.git udp: regrab connected session after transport clone Type: fix Change-Id: Id8a23a14f9086a68bb235fec4e190a19447c109e Signed-off-by: Florin Coras Signed-off-by: Matus Fabian --- diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index 27a4177b4c5..043ad43f5dd 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -852,8 +852,8 @@ app_closed: * Move dgram session to the right thread */ int -session_dgram_connect_notify (transport_connection_t * tc, - u32 old_thread_index, session_t ** new_session) +session_dgram_connect_notify (transport_connection_t *tc, + session_handle_tu_t osh, session_t **new_session) { session_t *new_s; session_switch_pool_args_t *rpc_args; @@ -863,7 +863,7 @@ session_dgram_connect_notify (transport_connection_t * tc, /* * Clone half-open session to the right thread. */ - new_s = session_clone_safe (tc->s_index, old_thread_index); + new_s = session_clone_safe (tc->s_index, osh.thread_index); new_s->connection_index = tc->c_index; session_set_state (new_s, SESSION_STATE_READY); new_s->flags |= SESSION_F_IS_MIGRATING; @@ -888,7 +888,7 @@ session_dgram_connect_notify (transport_connection_t * tc, rpc_args->new_session_index = new_s->session_index; rpc_args->new_thread_index = new_s->thread_index; rpc_args->session_index = tc->s_index; - rpc_args->thread_index = old_thread_index; + rpc_args->thread_index = osh.thread_index; session_send_rpc_evt_to_thread (rpc_args->thread_index, session_switch_pool, rpc_args); diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index 744955deec3..59771548938 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -591,9 +591,9 @@ transport_cleanup_cb (void *cb_fn, transport_connection_t *tc) int session_stream_connect_notify (transport_connection_t * tc, session_error_t err); -int session_dgram_connect_notify (transport_connection_t * tc, - u32 old_thread_index, - session_t ** new_session); +int session_dgram_connect_notify (transport_connection_t *tc, + session_handle_tu_t osh, + session_t **new_session); int session_stream_accept_notify (transport_connection_t * tc); void session_transport_closing_notify (transport_connection_t * tc); void session_transport_delete_notify (transport_connection_t * tc); diff --git a/src/vnet/udp/udp_input.c b/src/vnet/udp/udp_input.c index ea53db5baf9..e982895d2d6 100644 --- a/src/vnet/udp/udp_input.c +++ b/src/vnet/udp/udp_input.c @@ -294,19 +294,19 @@ udp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, error0 = UDP_ERROR_CONNECTED; if (s0->thread_index != thread_index) { + /* uc0 clone may allow owner of s0 to grow its pool */ + session_handle_t osh = session_handle (s0); /* * Clone the transport. It will be cleaned up with the * session once we notify the session layer. */ uc0 = udp_connection_clone_safe (s0->connection_index, s0->thread_index); - ASSERT (s0->session_index == uc0->c_s_index); - + ASSERT (session_index_from_handle (osh) == uc0->c_s_index); /* * Ask session layer for a new session. */ - session_dgram_connect_notify (&uc0->connection, - s0->thread_index, &s0); + session_dgram_connect_notify (&uc0->connection, osh, &s0); queue_event = 0; } else