Skip to content
Snippets Groups Projects
Commit e8630ed6 authored by winckel's avatar winckel
Browse files

Modified handling of MME shutdown in S1AP to avoid stopping eNB.

!!! No recovering mechanism for this situation !!!

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4609 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 2817ad4d
No related branches found
No related tags found
No related merge requests found
...@@ -208,7 +208,7 @@ void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa ...@@ -208,7 +208,7 @@ void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa
instance, instance,
sctp_new_association_resp->ulp_cnx_id); sctp_new_association_resp->ulp_cnx_id);
s1ap_handle_s1_setup_message(s1ap_mme_data_p); s1ap_handle_s1_setup_message(s1ap_mme_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN);
return; return;
} }
......
...@@ -133,21 +133,47 @@ static const char *direction2String[] = { ...@@ -133,21 +133,47 @@ static const char *direction2String[] = {
"UnSuccessfull outcome", /* successfull outcome */ "UnSuccessfull outcome", /* successfull outcome */
}; };
void s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p) { void s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown) {
/* Check that at least one setup message is pending */ if (sctp_shutdown) {
DevCheck(mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0, mme_desc_p->s1ap_eNB_instance->instance, /* A previously connected MME has been shutdown */
mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb, 0);
/* Decrease pending messages number */ /* TODO check if it was used by some eNB and send a message to inform these eNB if there is no more associated MME */
mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb --; if (mme_desc_p->state == S1AP_ENB_STATE_CONNECTED)
{
/* If there are no more pending messages, inform eNB app */ mme_desc_p->state = S1AP_ENB_STATE_DISCONNECTED;
if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb == 0)
{ if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb > 0) {
MessageDef *message_p; /* Decrease associated MME number */
mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb --;
}
/* If there are no more associated MME, inform eNB app */
if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb == 0) {
MessageDef *message_p;
message_p = itti_alloc_new_message(TASK_S1AP, S1AP_REGISTER_ENB_CNF); message_p = itti_alloc_new_message(TASK_S1AP, S1AP_DEREGISTERED_ENB_IND);
S1AP_REGISTER_ENB_CNF(message_p).nb_mme = mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb; S1AP_DEREGISTERED_ENB_IND(message_p).nb_mme = 0;
itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p); itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p);
}
}
} else {
/* Check that at least one setup message is pending */
DevCheck(mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0, mme_desc_p->s1ap_eNB_instance->instance,
mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb, 0);
if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0) {
/* Decrease pending messages number */
mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb --;
}
/* If there are no more pending messages, inform eNB app */
if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb == 0) {
MessageDef *message_p;
message_p = itti_alloc_new_message(TASK_S1AP, S1AP_REGISTER_ENB_CNF);
S1AP_REGISTER_ENB_CNF(message_p).nb_mme = mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb;
itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p);
}
} }
} }
...@@ -209,7 +235,7 @@ int s1ap_eNB_handle_s1_setup_failure(uint32_t assoc_id, ...@@ -209,7 +235,7 @@ int s1ap_eNB_handle_s1_setup_failure(uint32_t assoc_id,
S1AP_ERROR("Received s1 setup failure for MME... please check your parameters\n"); S1AP_ERROR("Received s1 setup failure for MME... please check your parameters\n");
mme_desc_p->state = S1AP_ENB_STATE_WAITING; mme_desc_p->state = S1AP_ENB_STATE_WAITING;
s1ap_handle_s1_setup_message(mme_desc_p); s1ap_handle_s1_setup_message(mme_desc_p, 0);
return 0; return 0;
} }
...@@ -310,7 +336,7 @@ int s1ap_eNB_handle_s1_setup_response(uint32_t assoc_id, ...@@ -310,7 +336,7 @@ int s1ap_eNB_handle_s1_setup_response(uint32_t assoc_id,
*/ */
mme_desc_p->state = S1AP_ENB_STATE_CONNECTED; mme_desc_p->state = S1AP_ENB_STATE_CONNECTED;
mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb ++; mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb ++;
s1ap_handle_s1_setup_message(mme_desc_p); s1ap_handle_s1_setup_message(mme_desc_p, 0);
#if 0 #if 0
/* We call back our self /* We call back our self
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#ifndef S1AP_ENB_HANDLERS_H_ #ifndef S1AP_ENB_HANDLERS_H_
#define S1AP_ENB_HANDLERS_H_ #define S1AP_ENB_HANDLERS_H_
void s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p); void s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown);
int s1ap_eNB_handle_message(uint32_t assoc_id, int32_t stream, int s1ap_eNB_handle_message(uint32_t assoc_id, int32_t stream,
const uint8_t * const data, const uint32_t data_length); const uint8_t * const data, const uint32_t data_length);
......
...@@ -226,6 +226,13 @@ void *eNB_app_task(void *args_p) ...@@ -226,6 +226,13 @@ void *eNB_app_task(void *args_p)
} }
break; break;
case S1AP_DEREGISTERED_ENB_IND:
LOG_W(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name,
S1AP_DEREGISTERED_ENB_IND(msg_p).nb_mme);
/* TODO handle recovering of registration */
break;
case TIMER_HAS_EXPIRED: case TIMER_HAS_EXPIRED:
LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment