FlexRAN: Enable MME adding/removing
This commit is contained in:
@@ -3634,6 +3634,97 @@ int flexran_get_s1ap_mme_conf(mid_t mod_id, mid_t mme_index, Protocol__FlexS1apM
|
||||
return 0;
|
||||
}
|
||||
|
||||
int flexran_add_s1ap_mme(mid_t mod_id, size_t n_mme, char **mme_ipv4) {
|
||||
s1ap_eNB_instance_t *s1ap = s1ap_eNB_get_instance(mod_id);
|
||||
if (!s1ap) return -1;
|
||||
if (!rrc_is_present(mod_id)) return -2;
|
||||
|
||||
/* Reconstruct S1AP_REGISTER_ENB_REQ */
|
||||
MessageDef *m = itti_alloc_new_message(TASK_FLEXRAN_AGENT, S1AP_REGISTER_ENB_REQ);
|
||||
RCconfig_S1(m, mod_id);
|
||||
|
||||
const int CC_id = 0;
|
||||
eNB_RRC_INST *rrc = RC.rrc[CC_id];
|
||||
RrcConfigurationReq *conf = &rrc->configuration;
|
||||
S1AP_REGISTER_ENB_REQ(m).num_plmn = conf->num_plmn;
|
||||
for (int i = 0; i < conf->num_plmn; ++i) {
|
||||
S1AP_REGISTER_ENB_REQ(m).mcc[i] = conf->mcc[i];
|
||||
S1AP_REGISTER_ENB_REQ(m).mnc[i] = conf->mnc[i];
|
||||
S1AP_REGISTER_ENB_REQ(m).mnc_digit_length[i] = conf->mnc_digit_length[i];
|
||||
}
|
||||
|
||||
/* reconstruct MME list, it might have been updated since initial
|
||||
* configuration */
|
||||
S1AP_REGISTER_ENB_REQ(m).nb_mme = 0;
|
||||
struct s1ap_eNB_mme_data_s *mme = NULL;
|
||||
RB_FOREACH(mme, s1ap_mme_map, &s1ap->s1ap_mme_head) {
|
||||
const int n = S1AP_REGISTER_ENB_REQ(m).nb_mme;
|
||||
S1AP_REGISTER_ENB_REQ(m).mme_ip_address[n].ipv4 = mme->mme_s1_ip.ipv4;
|
||||
strcpy(S1AP_REGISTER_ENB_REQ(m).mme_ip_address[n].ipv4_address, mme->mme_s1_ip.ipv4_address);
|
||||
S1AP_REGISTER_ENB_REQ(m).mme_ip_address[n].ipv6 = mme->mme_s1_ip.ipv6;
|
||||
strcpy(S1AP_REGISTER_ENB_REQ(m).mme_ip_address[n].ipv6_address, mme->mme_s1_ip.ipv6_address);
|
||||
S1AP_REGISTER_ENB_REQ(m).broadcast_plmn_num[n] = mme->broadcast_plmn_num;
|
||||
for (int i = 0; i < mme->broadcast_plmn_num; ++i)
|
||||
S1AP_REGISTER_ENB_REQ(m).broadcast_plmn_index[n][i] = mme->broadcast_plmn_index[i];
|
||||
S1AP_REGISTER_ENB_REQ(m).nb_mme += 1;
|
||||
}
|
||||
|
||||
if (S1AP_REGISTER_ENB_REQ(m).nb_mme + n_mme > S1AP_MAX_NB_MME_IP_ADDRESS)
|
||||
return -1;
|
||||
|
||||
for (int i = 0; i < n_mme; ++i) {
|
||||
const int n = S1AP_REGISTER_ENB_REQ(m).nb_mme;
|
||||
strcpy(S1AP_REGISTER_ENB_REQ(m).mme_ip_address[n].ipv4_address, mme_ipv4[0]);
|
||||
S1AP_REGISTER_ENB_REQ(m).mme_ip_address[n].ipv4 = 1;
|
||||
S1AP_REGISTER_ENB_REQ(m).mme_ip_address[n].ipv6 = 0;
|
||||
S1AP_REGISTER_ENB_REQ(m).broadcast_plmn_num[n] = S1AP_REGISTER_ENB_REQ(m).num_plmn;
|
||||
for (int i = 0; i < S1AP_REGISTER_ENB_REQ(m).num_plmn; ++i)
|
||||
S1AP_REGISTER_ENB_REQ(m).broadcast_plmn_index[n][i] = i;
|
||||
S1AP_REGISTER_ENB_REQ(m).nb_mme += 1;
|
||||
}
|
||||
|
||||
itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(mod_id), m);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int flexran_remove_s1ap_mme(mid_t mod_id, size_t n_mme, char **mme_ipv4) {
|
||||
s1ap_eNB_instance_t *s1ap = s1ap_eNB_get_instance(mod_id);
|
||||
if (!s1ap) return -1;
|
||||
struct s1ap_eNB_mme_data_s *mme = NULL;
|
||||
RB_FOREACH(mme, s1ap_mme_map, &s1ap->s1ap_mme_head) {
|
||||
if (mme->mme_s1_ip.ipv4
|
||||
&& strncmp(mme->mme_s1_ip.ipv4_address, mme_ipv4[0], 16) == 0)
|
||||
break;
|
||||
}
|
||||
if (!mme)
|
||||
return -2;
|
||||
|
||||
MessageDef *m = itti_alloc_new_message(TASK_FLEXRAN_AGENT, SCTP_CLOSE_ASSOCIATION);
|
||||
SCTP_CLOSE_ASSOCIATION(m).assoc_id = mme->assoc_id;
|
||||
itti_send_msg_to_task (TASK_SCTP, ENB_MODULE_ID_TO_INSTANCE(mod_id), m);
|
||||
|
||||
switch (mme->state) {
|
||||
case S1AP_ENB_STATE_WAITING:
|
||||
s1ap->s1ap_mme_nb -= 1;
|
||||
if (s1ap->s1ap_mme_pending_nb > 0)
|
||||
s1ap->s1ap_mme_pending_nb -= 1;
|
||||
break;
|
||||
case S1AP_ENB_STATE_CONNECTED:
|
||||
case S1AP_ENB_OVERLOAD: /* I am not sure the decrements are right here */
|
||||
s1ap->s1ap_mme_nb -= 1;
|
||||
s1ap->s1ap_mme_associated_nb -= 1;
|
||||
break;
|
||||
case S1AP_ENB_STATE_DISCONNECTED:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
RB_REMOVE(s1ap_mme_map, &s1ap->s1ap_mme_head, mme);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int flexran_get_s1ap_ue(mid_t mod_id, rnti_t rnti, Protocol__FlexS1apUe * ue_conf){
|
||||
if (!rrc_is_present(mod_id)) return -1;
|
||||
s1ap_eNB_instance_t *s1ap = s1ap_eNB_get_instance(mod_id);
|
||||
|
||||
Reference in New Issue
Block a user