+ 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;
+
+ return SCTP_ERROR_NONE;
+}
+
+u8
+sctp_sub_connection_del_ip6 (ip6_address_t * lcl_addr,
+ ip6_address_t * rmt_addr)
+{
+ sctp_main_t *sctp_main = vnet_get_sctp_main ();
+
+ u32 thread_idx = vlib_get_thread_index ();
+ u8 i;
+
+ ASSERT (thread_idx == 0);
+
+ for (i = 0; i < MAX_SCTP_CONNECTIONS; i++)
+ {
+ sctp_connection_t *sctp_conn = sctp_main->connections[thread_idx];
+ sctp_sub_connection_t *sub_conn =
+ &sctp_main->connections[thread_idx]->sub_conn[i];
+ ip46_address_t *lcl_ip =
+ &sctp_main->connections[thread_idx]->sub_conn[i].connection.lcl_ip;
+ ip46_address_t *rmt_ip =
+ &sctp_main->connections[thread_idx]->sub_conn[i].connection.rmt_ip;
+
+ if (!sub_conn->connection.is_ip4)
+ continue;
+ if ((lcl_ip->ip6.as_u64[0] == lcl_addr->as_u64[0]
+ && lcl_ip->ip6.as_u64[1] == lcl_addr->as_u64[1])
+ && (rmt_ip->ip6.as_u64[0] == rmt_addr->as_u64[0]
+ && rmt_ip->ip6.as_u64[1] == rmt_addr->as_u64[1]))
+ {
+ sub_conn->state = SCTP_SUBCONN_STATE_DOWN;
+ sctp_conn->forming_association_changed = 1;
+ break;
+ }
+ }
+ return SCTP_ERROR_NONE;