pool_get (tm->listener_pool, listener);
memset (listener, 0, sizeof (*listener));
- listener->sub_conn[MAIN_SCTP_SUB_CONN_IDX].parent = listener;
+ listener->sub_conn[MAIN_SCTP_SUB_CONN_IDX].subconn_idx =
+ MAIN_SCTP_SUB_CONN_IDX;
listener->sub_conn[MAIN_SCTP_SUB_CONN_IDX].c_c_index =
listener - tm->listener_pool;
listener->sub_conn[MAIN_SCTP_SUB_CONN_IDX].connection.lcl_port = tep->port;
sctp_main_t *tm = vnet_get_sctp_main ();
sctp_connection_t *sctp_conn = tm->connections[thread_index];
- sctp_conn->sub_conn[sctp_conn->next_avail_sub_conn].connection.c_index =
- sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].connection.c_index;
- sctp_conn->sub_conn[sctp_conn->next_avail_sub_conn].
- connection.thread_index = thread_index;
- sctp_conn->sub_conn[sctp_conn->next_avail_sub_conn].parent = sctp_conn;
+ u8 subconn_idx = sctp_next_avail_subconn (sctp_conn);
+
+ ASSERT (subconn_idx < MAX_SCTP_CONNECTIONS);
- sctp_conn->next_avail_sub_conn += 1;
+ sctp_conn->sub_conn[subconn_idx].connection.c_index =
+ sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].connection.c_index;
+ sctp_conn->sub_conn[subconn_idx].connection.thread_index = thread_index;
+ sctp_conn->sub_conn[subconn_idx].subconn_idx = subconn_idx;
return sctp_conn;
}
-void
-sctp_sub_connection_add_ip4 (u8 thread_index,
- sctp_ipv4_addr_param_t * ipv4_addr)
+u8
+sctp_sub_connection_add_ip4 (vlib_main_t * vm,
+ ip4_address_t * lcl_addr,
+ ip4_address_t * rmt_addr)
{
- sctp_connection_t *sctp_conn = sctp_sub_connection_add (thread_index);
+ sctp_connection_t *sctp_conn = sctp_sub_connection_add (vm->thread_index);
+
+ u8 subconn_idx = sctp_next_avail_subconn (sctp_conn);
+
+ if (subconn_idx == MAX_SCTP_CONNECTIONS)
+ return SCTP_ERROR_MAX_CONNECTIONS;
+
+ clib_memcpy (&sctp_conn->sub_conn[subconn_idx].connection.lcl_ip,
+ &lcl_addr, sizeof (lcl_addr));
+
+ clib_memcpy (&sctp_conn->sub_conn[subconn_idx].connection.rmt_ip,
+ &rmt_addr, sizeof (rmt_addr));
+
+ sctp_conn->forming_association_changed = 1;
- clib_memcpy (&sctp_conn->
- sub_conn[sctp_conn->next_avail_sub_conn].connection.lcl_ip.ip4,
- &ipv4_addr->address, sizeof (ipv4_addr->address));
+ return SCTP_ERROR_NONE;
}
-void
-sctp_sub_connection_add_ip6 (u8 thread_index,
- sctp_ipv6_addr_param_t * ipv6_addr)
+u8
+sctp_sub_connection_add_ip6 (vlib_main_t * vm,
+ ip6_address_t * lcl_addr,
+ ip6_address_t * rmt_addr)
{
- sctp_connection_t *sctp_conn = sctp_sub_connection_add (thread_index);
+ sctp_connection_t *sctp_conn = sctp_sub_connection_add (vm->thread_index);
+
+ u8 subconn_idx = sctp_next_avail_subconn (sctp_conn);
+
+ if (subconn_idx == MAX_SCTP_CONNECTIONS)
+ return SCTP_ERROR_MAX_CONNECTIONS;
+
+ clib_memcpy (&sctp_conn->sub_conn[subconn_idx].connection.lcl_ip,
+ &lcl_addr, sizeof (lcl_addr));
- clib_memcpy (&sctp_conn->
- sub_conn[sctp_conn->next_avail_sub_conn].connection.lcl_ip.ip6,
- &ipv6_addr->address, sizeof (ipv6_addr->address));
+ clib_memcpy (&sctp_conn->sub_conn[subconn_idx].connection.rmt_ip,
+ &rmt_addr, sizeof (rmt_addr));
+
+ sctp_conn->forming_association_changed = 1;
+
+ return SCTP_ERROR_NONE;
}
sctp_connection_t *
sctp_connection_new (u8 thread_index)
{
- sctp_main_t *tm = vnet_get_sctp_main ();
+ sctp_main_t *sctp_main = vnet_get_sctp_main ();
sctp_connection_t *sctp_conn;
- pool_get (tm->connections[thread_index], sctp_conn);
+ pool_get (sctp_main->connections[thread_index], sctp_conn);
memset (sctp_conn, 0, sizeof (*sctp_conn));
- sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].parent = sctp_conn;
+ sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].subconn_idx =
+ MAIN_SCTP_SUB_CONN_IDX;
sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].c_c_index =
- sctp_conn - tm->connections[thread_index];
+ sctp_conn - sctp_main->connections[thread_index];
sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].c_thread_index = thread_index;
sctp_conn->local_tag = 0;
- sctp_conn->next_avail_sub_conn = 1;
return sctp_conn;
}
memset (sctp_conn, 0, sizeof (*sctp_conn));
sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].c_c_index =
sctp_conn - tm->half_open_connections;
- sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].parent = sctp_conn;
+ sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].subconn_idx =
+ MAIN_SCTP_SUB_CONN_IDX;
return sctp_conn;
}
transport_connection_t *trans_conn = &sctp_conn->sub_conn[idx].connection;
ip_copy (&trans_conn->rmt_ip, &rmt->ip, rmt->is_ip4);
ip_copy (&trans_conn->lcl_ip, &lcl_addr, rmt->is_ip4);
- sctp_conn->sub_conn[idx].parent = sctp_conn;
+ sctp_conn->sub_conn[idx].subconn_idx = idx;
trans_conn->rmt_port = rmt->port;
trans_conn->lcl_port = clib_host_to_net_u16 (lcl_port);
trans_conn->is_ip4 = rmt->is_ip4;
&sctp_conn->sub_conn[i].connection.lcl_ip,
sctp_conn->sub_conn[i].connection.lcl_port);
- /* Check if connection is not yet fully established */
- if (sctp_conn->state == SCTP_STATE_COOKIE_WAIT)
- {
+ int thread_index =
+ sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].connection.thread_index;
- }
- else
- {
- int thread_index =
- sctp_conn->sub_conn[MAIN_SCTP_SUB_CONN_IDX].connection.thread_index;
-
- /* Make sure all timers are cleared */
- sctp_connection_timers_reset (sctp_conn);
+ /* Make sure all timers are cleared */
+ sctp_connection_timers_reset (sctp_conn);
- /* Poison the entry */
- if (CLIB_DEBUG > 0)
- memset (sctp_conn, 0xFA, sizeof (*sctp_conn));
- pool_put (tm->connections[thread_index], sctp_conn);
- }
+ /* Poison the entry */
+ if (CLIB_DEBUG > 0)
+ memset (sctp_conn, 0xFA, sizeof (*sctp_conn));
+ pool_put (tm->connections[thread_index], sctp_conn);
}
int
{
ASSERT (thread_index == 0);
- sctp_connection_t *sctp_conn;
- sctp_conn = sctp_connection_get (conn_index, thread_index);
+ sctp_connection_t *sctp_conn =
+ sctp_connection_get (conn_index, thread_index);
if (sctp_conn != NULL)
sctp_connection_close (sctp_conn);
}
void
sctp_session_cleanup (u32 conn_index, u32 thread_index)
{
- sctp_connection_t *sctp_conn;
- sctp_conn = sctp_connection_get (conn_index, thread_index);
+ sctp_connection_t *sctp_conn =
+ sctp_connection_get (conn_index, thread_index);
if (sctp_conn != NULL)
{
transport_register_protocol (TRANSPORT_PROTO_SCTP, &sctp_proto,
FIB_PROTOCOL_IP6, sctp6_output_node.index);
+ sctp_api_reference ();
+
return 0;
}