From a0b34a74a916eff88f9a8354c78a2cf9798c8578 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Tue, 7 Mar 2017 01:20:52 -0800 Subject: [PATCH] Register TCP with IP only if session is enabled Change-Id: I73154179e78aeae5f879125237bce593d0978fae Signed-off-by: Florin Coras --- src/vnet/ip/ip4_forward.c | 3 ++- src/vnet/session/session.c | 5 ++++- src/vnet/tcp/tcp.c | 39 +++++++++++++++++++++++++++++++++------ src/vnet/tcp/tcp.h | 5 +++++ 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/vnet/ip/ip4_forward.c b/src/vnet/ip/ip4_forward.c index 31b687d7347..5472428fcfd 100644 --- a/src/vnet/ip/ip4_forward.c +++ b/src/vnet/ip/ip4_forward.c @@ -1706,10 +1706,11 @@ ip4_local_inline (vlib_main_t * vm, ip1->dst_address.as_u32 != 0xFFFFFFFF) ? IP4_ERROR_SRC_LOOKUP_MISS : error1); + skip_checks: + next0 = lm->local_next_by_ip_protocol[proto0]; next1 = lm->local_next_by_ip_protocol[proto1]; - skip_checks: next0 = error0 != IP4_ERROR_UNKNOWN_PROTOCOL ? IP_LOCAL_NEXT_DROP : next0; next1 = diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index 422527e0d4c..b5a168ca26c 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -22,6 +22,7 @@ #include #include #include +#include /** * Per-type vector of transport protocol virtual function tables @@ -1287,6 +1288,9 @@ session_manager_main_enable (vlib_main_t * vm) smm->is_enabled = 1; + /* Enable TCP transport */ + vnet_tcp_enable_disable (vm, 1); + return 0; } @@ -1313,7 +1317,6 @@ vnet_session_enable_disable (vlib_main_t * vm, u8 is_en) return 0; } - clib_error_t * session_manager_main_init (vlib_main_t * vm) { diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c index e5feaeb1e03..69433e26a8c 100644 --- a/src/vnet/tcp/tcp.c +++ b/src/vnet/tcp/tcp.c @@ -633,18 +633,15 @@ tcp_initialize_timer_wheels (tcp_main_t * tm) } clib_error_t * -tcp_init (vlib_main_t * vm) +tcp_main_enable (vlib_main_t * vm) { - ip_main_t *im = &ip_main; - ip_protocol_info_t *pi; tcp_main_t *tm = vnet_get_tcp_main (); + ip_protocol_info_t *pi; + ip_main_t *im = &ip_main; vlib_thread_main_t *vtm = vlib_get_thread_main (); clib_error_t *error = 0; u32 num_threads; - tm->vlib_main = vm; - tm->vnet_main = vnet_get_main (); - if ((error = vlib_call_init_function (vm, ip_main_init))) return error; if ((error = vlib_call_init_function (vm, ip4_lookup_init))) @@ -697,6 +694,36 @@ tcp_init (vlib_main_t * vm) return error; } +clib_error_t * +vnet_tcp_enable_disable (vlib_main_t * vm, u8 is_en) +{ + if (is_en) + { + if (tcp_main.is_enabled) + return 0; + + return tcp_main_enable (vm); + } + else + { + tcp_main.is_enabled = 0; + } + + return 0; +} + +clib_error_t * +tcp_init (vlib_main_t * vm) +{ + tcp_main_t *tm = vnet_get_tcp_main (); + + tm->vlib_main = vm; + tm->vnet_main = vnet_get_main (); + tm->is_enabled = 0; + + return 0; +} + VLIB_INIT_FUNCTION (tcp_init); /* diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h index 3560509d090..7d443433fa2 100644 --- a/src/vnet/tcp/tcp.h +++ b/src/vnet/tcp/tcp.h @@ -304,6 +304,9 @@ typedef struct _tcp_main /* Congestion control algorithms registered */ tcp_cc_algorithm_t *cc_algos; + /* Flag that indicates if stack is on or off */ + u8 is_enabled; + /* convenience */ vlib_main_t *vlib_main; vnet_main_t *vnet_main; @@ -323,6 +326,8 @@ vnet_get_tcp_main () return &tcp_main; } +clib_error_t *vnet_tcp_enable_disable (vlib_main_t * vm, u8 is_en); + always_inline tcp_connection_t * tcp_connection_get (u32 conn_index, u32 thread_index) { -- 2.16.6