aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2017-03-07 01:20:52 -0800
committerJohn Lo <loj@cisco.com>2017-03-07 21:40:24 +0000
commita0b34a74a916eff88f9a8354c78a2cf9798c8578 (patch)
tree5ef5596d68570a5fa7691071ddd39f2f3275e52b
parentf7f2a9feaa2cad8313afba53b53c32f1928f664c (diff)
Register TCP with IP only if session is enabled
Change-Id: I73154179e78aeae5f879125237bce593d0978fae Signed-off-by: Florin Coras <fcoras@cisco.com>
-rw-r--r--src/vnet/ip/ip4_forward.c3
-rw-r--r--src/vnet/session/session.c5
-rw-r--r--src/vnet/tcp/tcp.c39
-rw-r--r--src/vnet/tcp/tcp.h5
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 <vnet/dpo/load_balance.h>
#include <vnet/fib/ip4_fib.h>
#include <vnet/session/application.h>
+#include <vnet/tcp/tcp.h>
/**
* 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)
{