diff --git a/openair-cn/SCTP/sctp_eNB_itti_messaging.h b/openair-cn/SCTP/sctp_eNB_itti_messaging.h index e89b35932cca939d36555165a07dbc4ae5713e2a..184c1b009531b4231c30fea0851a048293830910 100644 --- a/openair-cn/SCTP/sctp_eNB_itti_messaging.h +++ b/openair-cn/SCTP/sctp_eNB_itti_messaging.h @@ -41,4 +41,5 @@ int sctp_itti_send_association_ind(task_id_t task_id, instance_t instance, int32_t assoc_id, uint16_t port, uint16_t out_streams, uint16_t in_streams); + #endif /* SCTP_ITTI_MESSAGING_H_ */ diff --git a/openair-cn/SCTP/sctp_eNB_task.c b/openair-cn/SCTP/sctp_eNB_task.c index 32e1f4e14abc480c50b5a8e0c82a1cb34a5729b6..dfbb114aebd85ed89f4ecc5401245c5633b96ec7 100644 --- a/openair-cn/SCTP/sctp_eNB_task.c +++ b/openair-cn/SCTP/sctp_eNB_task.c @@ -399,6 +399,31 @@ void sctp_send_data( sctp_cnx->assoc_id); } +static int sctp_close_association( + const instance_t instance, + const task_id_t requestor, + sctp_close_association_t *close_association_p) +{ + + struct sctp_cnx_list_elm_s *sctp_cnx = NULL; + + DevAssert(close_association_p != NULL); + sctp_cnx = sctp_get_cnx(close_association_p->assoc_id, 0); + + if (sctp_cnx == NULL) { + SCTP_ERROR("Failed to find SCTP description for assoc_id %d\n", + close_association_p->assoc_id); + /* TODO: notify upper layer */ + return -1; + } else { + close(sctp_cnx->sd); + STAILQ_REMOVE(&sctp_cnx_list, sctp_cnx, sctp_cnx_list_elm_s, entries); + SCTP_DEBUG("Removed assoc_id %u (closed socket %u)\n", + sctp_cnx->assoc_id, sctp_cnx->sd); + } + return 0; +} + static int sctp_create_new_listener( const instance_t instance, const task_id_t requestor, @@ -754,7 +779,10 @@ void *sctp_eNB_task(void *arg) } } break; case SCTP_CLOSE_ASSOCIATION: - break; + sctp_close_association(ITTI_MESSAGE_GET_INSTANCE(received_msg), + ITTI_MSG_ORIGIN_ID(received_msg), + &received_msg->ittiMsg.sctp_close_association); + break; case TERMINATE_MESSAGE: itti_exit_task();