aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/sctp/sctp_input.c
diff options
context:
space:
mode:
authorMarco Varlese <marco.varlese@suse.com>2018-03-01 11:19:59 +0100
committerDamjan Marion <dmarion.lists@gmail.com>2018-03-01 11:43:52 +0000
commit3c6a976325f32f880b7e53f50ebe86fa0e8476c9 (patch)
tree298bfe9554135f796ebcb17bd0fb586c117cf1ac /src/vnet/sctp/sctp_input.c
parentafddd83ca17484c0f26efbebb6ff7ebe47fd567f (diff)
SCTP: API to add a sub-connection
This patch adds an API to add a sub-connection following a SRC/DST IP mapping as required by the RFC4960. At the same time, it changes the way the next available sub-connection is being calculated: rather than having an index in the parent connection which is prone to many issues at run-time, the next available sub-connection is being calculated by looking at the state of the set sub-connections and if marked as DOWN it means that is an available slot to be used. Change-Id: I662be6a247bfbbe8bf9aaf3f485183c07ef862fe Signed-off-by: Marco Varlese <marco.varlese@suse.com>
Diffstat (limited to 'src/vnet/sctp/sctp_input.c')
-rw-r--r--src/vnet/sctp/sctp_input.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/vnet/sctp/sctp_input.c b/src/vnet/sctp/sctp_input.c
index 46a2100cc07..00d0a61feff 100644
--- a/src/vnet/sctp/sctp_input.c
+++ b/src/vnet/sctp/sctp_input.c
@@ -399,7 +399,10 @@ sctp_handle_init (sctp_header_t * sctp_hdr,
clib_memcpy (ip4_addr, &ipv4->address,
sizeof (ip4_address_t));
- sctp_sub_connection_add_ip4 (vlib_get_thread_index (), ipv4);
+ sctp_sub_connection_add_ip4 (vlib_get_main (),
+ &sctp_conn->sub_conn
+ [MAIN_SCTP_SUB_CONN_IDX].connection.
+ lcl_ip.ip4, &ipv4->address);
break;
}
@@ -410,7 +413,10 @@ sctp_handle_init (sctp_header_t * sctp_hdr,
clib_memcpy (ip6_addr, &ipv6->address,
sizeof (ip6_address_t));
- sctp_sub_connection_add_ip6 (vlib_get_thread_index (), ipv6);
+ sctp_sub_connection_add_ip6 (vlib_get_main (),
+ &sctp_conn->sub_conn
+ [MAIN_SCTP_SUB_CONN_IDX].connection.
+ lcl_ip.ip6, &ipv6->address);
break;
}
@@ -528,7 +534,10 @@ sctp_handle_init_ack (sctp_header_t * sctp_hdr,
sctp_ipv4_addr_param_t *ipv4 =
(sctp_ipv4_addr_param_t *) opt_params_hdr;
- sctp_sub_connection_add_ip4 (vlib_get_thread_index (), ipv4);
+ sctp_sub_connection_add_ip4 (vlib_get_main (),
+ &sctp_conn->sub_conn
+ [MAIN_SCTP_SUB_CONN_IDX].connection.
+ lcl_ip.ip4, &ipv4->address);
break;
}
@@ -537,7 +546,10 @@ sctp_handle_init_ack (sctp_header_t * sctp_hdr,
sctp_ipv6_addr_param_t *ipv6 =
(sctp_ipv6_addr_param_t *) opt_params_hdr;
- sctp_sub_connection_add_ip6 (vlib_get_thread_index (), ipv6);
+ sctp_sub_connection_add_ip6 (vlib_get_main (),
+ &sctp_conn->sub_conn
+ [MAIN_SCTP_SUB_CONN_IDX].connection.
+ lcl_ip.ip6, &ipv6->address);
break;
}
@@ -1541,16 +1553,16 @@ sctp_handle_heartbeat_ack (sctp_hb_ack_chunk_t * sctp_hb_ack_chunk,
}
always_inline void
-sctp_node_inc_counter (vlib_main_t * vm, u32 tcp4_node, u32 tcp6_node,
+sctp_node_inc_counter (vlib_main_t * vm, u32 sctp4_node, u32 sctp6_node,
u8 is_ip4, u8 evt, u8 val)
{
if (PREDICT_TRUE (!val))
return;
if (is_ip4)
- vlib_node_increment_counter (vm, tcp4_node, evt, val);
+ vlib_node_increment_counter (vm, sctp4_node, evt, val);
else
- vlib_node_increment_counter (vm, tcp6_node, evt, val);
+ vlib_node_increment_counter (vm, sctp6_node, evt, val);
}
always_inline uword
@@ -2073,7 +2085,7 @@ sctp46_input_dispatcher (vlib_main_t * vm, vlib_node_runtime_t * node,
n_left_to_next -= 1;
b0 = vlib_get_buffer (vm, bi0);
- vnet_buffer (b0)->tcp.flags = 0;
+ vnet_buffer (b0)->sctp.flags = 0;
fib_index0 = vnet_buffer (b0)->ip.fib_index;
/* Checksum computed by ipx_local no need to compute again */