From b5e55a27a46f166f466c7996675542de645eff66 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Thu, 10 Jan 2019 12:42:47 -0800 Subject: session: generate wrong thread errors instead of crashing Change-Id: I7e59ae718d2722c49d42b22a0874e1645a191e89 Signed-off-by: Florin Coras --- src/vnet/tcp/tcp_error.def | 3 ++- src/vnet/tcp/tcp_input.c | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'src/vnet/tcp') diff --git a/src/vnet/tcp/tcp_error.def b/src/vnet/tcp/tcp_error.def index 141ca515995..0d6c44b5402 100644 --- a/src/vnet/tcp/tcp_error.def +++ b/src/vnet/tcp/tcp_error.def @@ -13,6 +13,8 @@ * limitations under the License. */ tcp_error (NONE, "no error") +tcp_error (WRONG_THREAD, "Wrong worker thread") +tcp_error (FILTERED, "Packets filtered") tcp_error (LENGTH, "inconsistent ip/tcp lengths") tcp_error (NO_LISTENER, "no listener for dst port") tcp_error (LOOKUP_DROPS, "lookup drops") @@ -40,7 +42,6 @@ tcp_error (INVALID_CONNECTION, "Invalid connection") tcp_error (CONNECTION_CLOSED, "Connection closed") tcp_error (CREATE_EXISTS, "Connection already exists") tcp_error (PUNT, "Packets punted") -tcp_error (FILTERED, "Packets filtered") tcp_error (OPTIONS, "Could not parse options") tcp_error (PAWS, "PAWS check failed") tcp_error (RCV_WND, "Segment not in receive window") diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index 4358bd30d88..82ab817430f 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -3295,7 +3295,7 @@ tcp_input_trace_frame (vlib_main_t * vm, vlib_node_runtime_t * node, static void tcp_input_set_error_next (tcp_main_t * tm, u16 * next, u32 * error, u8 is_ip4) { - if (*error == TCP_ERROR_FILTERED) + if (*error == TCP_ERROR_FILTERED || *error == TCP_ERROR_WRONG_THREAD) { *next = TCP_INPUT_NEXT_DROP; } @@ -3319,7 +3319,7 @@ tcp_input_lookup_buffer (vlib_buffer_t * b, u8 thread_index, u32 * error, int n_advance_bytes, n_data_bytes; transport_connection_t *tc; tcp_header_t *tcp; - u8 is_filtered = 0; + u8 result = 0; if (is_ip4) { @@ -3345,7 +3345,7 @@ tcp_input_lookup_buffer (vlib_buffer_t * b, u8 thread_index, u32 * error, tc = session_lookup_connection_wt4 (fib_index, &ip4->dst_address, &ip4->src_address, tcp->dst_port, tcp->src_port, TRANSPORT_PROTO_TCP, - thread_index, &is_filtered); + thread_index, &result); } else { @@ -3371,7 +3371,7 @@ tcp_input_lookup_buffer (vlib_buffer_t * b, u8 thread_index, u32 * error, tc = session_lookup_connection_wt6 (fib_index, &ip6->dst_address, &ip6->src_address, tcp->dst_port, tcp->src_port, TRANSPORT_PROTO_TCP, - thread_index, &is_filtered); + thread_index, &result); } vnet_buffer (b)->tcp.seq_number = clib_net_to_host_u32 (tcp->seq_number); @@ -3382,7 +3382,7 @@ tcp_input_lookup_buffer (vlib_buffer_t * b, u8 thread_index, u32 * error, + n_data_bytes; vnet_buffer (b)->tcp.flags = 0; - *error = is_filtered ? TCP_ERROR_FILTERED : *error; + *error = result ? TCP_ERROR_NONE + result : *error; return tcp_get_connection_from_transport (tc); } -- cgit 1.2.3-korg