diff options
author | Marco Varlese <marco.varlese@suse.com> | 2018-02-14 15:38:35 +0100 |
---|---|---|
committer | Marco Varlese <marco.varlese@suse.com> | 2018-02-15 10:11:57 +0100 |
commit | fae4039ad2af251690e4cb79d5842a6e97029032 (patch) | |
tree | acfe7c76383df97a7fc7c285860d4b7338b2610c /src/vnet/sctp/sctp_output.c | |
parent | a38783e0d1ab1d4c661570a1ec90670a1fb0598d (diff) |
SCTP: fix corrupted buffers seen in output node
The issue observed in the output-node was actually
caused by one of the input-node pushing buffers to
the output node when not required. That is the case
with the parsing/handling of incoming packets like
the COOKIE_ACK, HEARTBEAT_ACK, DATA, SACK which do
not require a response to be sent to the other peer.
In all the mentioned cases the packets (buffers) need
to be consumed and dropped instead of heading to the
output-node.
Change-Id: I3dcbe5de1cedb2ab8b06fff4364749b525cc7ac6
Signed-off-by: Marco Varlese <marco.varlese@suse.com>
Diffstat (limited to 'src/vnet/sctp/sctp_output.c')
-rw-r--r-- | src/vnet/sctp/sctp_output.c | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/src/vnet/sctp/sctp_output.c b/src/vnet/sctp/sctp_output.c index bb8332f5732..6012e50b908 100644 --- a/src/vnet/sctp/sctp_output.c +++ b/src/vnet/sctp/sctp_output.c @@ -352,13 +352,6 @@ sctp_enqueue_to_output_i (vlib_main_t * vm, vlib_buffer_t * b, u32 bi, } always_inline void -sctp_enqueue_to_output (vlib_main_t * vm, vlib_buffer_t * b, u32 bi, - u8 is_ip4) -{ - sctp_enqueue_to_output_i (vm, b, bi, is_ip4, 0); -} - -always_inline void sctp_enqueue_to_output_now (vlib_main_t * vm, vlib_buffer_t * b, u32 bi, u8 is_ip4) { @@ -1007,23 +1000,19 @@ sctp_prepare_shutdown_complete_chunk (sctp_connection_t * sctp_conn, } void -sctp_send_shutdown_complete (sctp_connection_t * sctp_conn) +sctp_send_shutdown_complete (sctp_connection_t * sctp_conn, + vlib_buffer_t * b0) { - vlib_buffer_t *b; - u32 bi; - sctp_main_t *tm = vnet_get_sctp_main (); vlib_main_t *vm = vlib_get_main (); - if (PREDICT_FALSE (sctp_get_free_buffer_index (tm, &bi))) + if (sctp_check_outstanding_data_chunks (sctp_conn) > 0) return; - b = vlib_get_buffer (vm, bi); - sctp_init_buffer (vm, b); - sctp_prepare_shutdown_complete_chunk (sctp_conn, b); + sctp_reuse_buffer (vm, b0); - u8 idx = sctp_pick_conn_idx_on_chunk (SHUTDOWN_COMPLETE); - sctp_enqueue_to_output (vm, b, bi, - sctp_conn->sub_conn[idx].connection.is_ip4); + sctp_prepare_shutdown_complete_chunk (sctp_conn, b0); + + sctp_conn->state = SCTP_STATE_CLOSED; } @@ -1143,6 +1132,7 @@ sctp_push_header (transport_connection_t * trans_conn, vlib_buffer_t * b) } +#if SCTP_DEBUG_STATE_MACHINE always_inline u8 sctp_validate_output_state_machine (sctp_connection_t * sctp_conn, u8 chunk_type) @@ -1175,6 +1165,7 @@ sctp_validate_output_state_machine (sctp_connection_t * sctp_conn, } return result; } +#endif always_inline u8 sctp_is_retransmitting (sctp_connection_t * sctp_conn, u8 idx) @@ -1293,6 +1284,18 @@ sctp46_output_inline (vlib_main_t * vm, #endif } + sctp_full_hdr_t *full_hdr = (sctp_full_hdr_t *) sctp_hdr; + u8 chunk_type = vnet_sctp_get_chunk_type (&full_hdr->common_hdr); + if (chunk_type >= UNKNOWN) + { + clib_warning + ("Trying to send an unrecognized chunk... something is really bad."); + error0 = SCTP_ERROR_UNKOWN_CHUNK; + next0 = SCTP_OUTPUT_NEXT_DROP; + goto done; + } + +#if SCTP_DEBUG_STATE_MACHINE u8 is_valid = (sctp_conn->sub_conn[idx].connection.lcl_port == sctp_hdr->src_port @@ -1303,9 +1306,6 @@ sctp46_output_inline (vlib_main_t * vm, || sctp_conn->sub_conn[idx].connection.rmt_port == sctp_hdr->src_port); - sctp_full_hdr_t *full_hdr = (sctp_full_hdr_t *) sctp_hdr; - u8 chunk_type = vnet_sctp_get_chunk_type (&full_hdr->common_hdr); - if (!is_valid) { SCTP_DBG_STATE_MACHINE ("BUFFER IS INCORRECT: conn_index = %u, " @@ -1313,8 +1313,8 @@ sctp46_output_inline (vlib_main_t * vm, "chunk_type = %u [%s], " "connection.lcl_port = %u, sctp_hdr->src_port = %u, " "connection.rmt_port = %u, sctp_hdr->dst_port = %u", - sctp_conn->sub_conn - [idx].connection.c_index, packet_length, + sctp_conn->sub_conn[idx]. + connection.c_index, packet_length, chunk_type, sctp_chunk_to_string (chunk_type), sctp_conn->sub_conn[idx]. @@ -1327,7 +1327,7 @@ sctp46_output_inline (vlib_main_t * vm, next0 = SCTP_OUTPUT_NEXT_DROP; goto done; } - +#endif SCTP_DBG_STATE_MACHINE ("CONN_INDEX = %u, CURR_CONN_STATE = %u (%s), " "CHUNK_TYPE = %s, " "SRC_PORT = %u, DST_PORT = %u", |