aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/udp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/udp')
-rw-r--r--src/vnet/udp/udp.c6
-rw-r--r--src/vnet/udp/udp.h2
2 files changed, 7 insertions, 1 deletions
diff --git a/src/vnet/udp/udp.c b/src/vnet/udp/udp.c
index ba1821a5026..3632204f863 100644
--- a/src/vnet/udp/udp.c
+++ b/src/vnet/udp/udp.c
@@ -284,7 +284,11 @@ udp_session_cleanup (u32 connection_index, u32 thread_index)
{
udp_connection_t *uc;
uc = udp_connection_get (connection_index, thread_index);
- if (uc)
+ if (!uc)
+ return;
+ if (uc->flags & UDP_CONN_F_MIGRATED)
+ udp_connection_free (uc);
+ else
udp_connection_cleanup (uc);
}
diff --git a/src/vnet/udp/udp.h b/src/vnet/udp/udp.h
index 736e3ce94f1..9e1aad6fbe5 100644
--- a/src/vnet/udp/udp.h
+++ b/src/vnet/udp/udp.h
@@ -39,6 +39,7 @@ typedef enum
_(OWNS_PORT, "OWNS_PORT") /**< port belong to conn (UDPC) */ \
_(CLOSING, "CLOSING") /**< conn closed with data */ \
_(LISTEN, "LISTEN") /**< conn is listening */ \
+ _(MIGRATED, "MIGRATED") /**< cloned to another thread */ \
enum udp_conn_flags_bits
{
@@ -258,6 +259,7 @@ udp_connection_clone_safe (u32 connection_index, u32 thread_index)
udp_pool_add_peeker (thread_index);
old_c = udp_main.connections[thread_index] + connection_index;
clib_memcpy_fast (new_c, old_c, sizeof (*new_c));
+ old_c->flags |= UDP_CONN_F_MIGRATED;
udp_pool_remove_peeker (thread_index);
new_c->c_thread_index = current_thread_index;
new_c->c_c_index = udp_connection_index (new_c);