diff options
author | Marco Varlese <marco.varlese@suse.com> | 2018-03-01 11:19:59 +0100 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2018-03-01 11:43:52 +0000 |
commit | 3c6a976325f32f880b7e53f50ebe86fa0e8476c9 (patch) | |
tree | 298bfe9554135f796ebcb17bd0fb586c117cf1ac /src/vnet/sctp/sctp_input.c | |
parent | afddd83ca17484c0f26efbebb6ff7ebe47fd567f (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.c | 28 |
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 */ |