Commit f0ab2683 authored by Robert Schmidt's avatar Robert Schmidt

Revert "F1AP IDs: Allow AddMod, fix concurrency bug"

This reverts commit 6d5e29f5.
parent 6d5e29f5
......@@ -60,14 +60,14 @@ void cu_init_f1_ue_data(void)
pthread_mutex_unlock(&cu2du_mutex);
}
bool cu_addmod_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
bool cu_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
{
pthread_mutex_lock(&cu2du_mutex);
DevAssert(cu2du_ue_mapping != NULL);
uint64_t key = ue_id;
if (hashtable_is_key_exists(cu2du_ue_mapping, key) == HASH_TABLE_OK) {
hashtable_rc_t ret = hashtable_remove(cu2du_ue_mapping, key);
DevAssert(ret == HASH_TABLE_OK);
pthread_mutex_unlock(&cu2du_mutex);
return false;
}
bool ret = add_hashtable_data(cu2du_ue_mapping, key, data);
pthread_mutex_unlock(&cu2du_mutex);
......@@ -116,14 +116,14 @@ void du_init_f1_ue_data(void)
pthread_mutex_unlock(&du2cu_mutex);
}
bool du_addmod_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
bool du_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
{
pthread_mutex_lock(&du2cu_mutex);
DevAssert(du2cu_ue_mapping != NULL);
uint64_t key = ue_id;
if (hashtable_is_key_exists(du2cu_ue_mapping, key) == HASH_TABLE_OK) {
hashtable_rc_t ret = hashtable_remove(du2cu_ue_mapping, key);
DevAssert(ret == HASH_TABLE_OK);
pthread_mutex_unlock(&du2cu_mutex);
return false;
}
bool ret = add_hashtable_data(du2cu_ue_mapping, key, data);
pthread_mutex_unlock(&du2cu_mutex);
......
......@@ -38,13 +38,13 @@ typedef struct f1_ue_data_t {
} f1_ue_data_t;
void cu_init_f1_ue_data(void);
bool cu_addmod_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data);
bool cu_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data);
bool cu_exists_f1_ue_data(uint32_t ue_id);
f1_ue_data_t cu_get_f1_ue_data(uint32_t ue_id);
bool cu_remove_f1_ue_data(uint32_t ue_id);
void du_init_f1_ue_data(void);
bool du_addmod_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data);
bool du_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data);
bool du_exists_f1_ue_data(uint32_t ue_id);
f1_ue_data_t du_get_f1_ue_data(uint32_t ue_id);
bool du_remove_f1_ue_data(uint32_t ue_id);
......
......@@ -30,11 +30,10 @@ void du_data_test()
du_init_f1_ue_data();
int rnti = 13;
f1_ue_data_t data = {.secondary_ue = 1};
bool ret = du_addmod_f1_ue_data(rnti, &data);
DevAssert(ret);
// we can overwrite, no problem
ret = du_addmod_f1_ue_data(rnti, &data);
bool ret = du_add_f1_ue_data(rnti, &data);
DevAssert(ret);
ret = du_add_f1_ue_data(rnti, &data);
DevAssert(!ret);
bool exists = du_exists_f1_ue_data(rnti);
DevAssert(exists);
f1_ue_data_t rdata = du_get_f1_ue_data(rnti);
......@@ -46,25 +45,14 @@ void cu_data_test()
cu_init_f1_ue_data();
int ue_id = 13;
f1_ue_data_t data = {.secondary_ue = 1};
bool ret = cu_addmod_f1_ue_data(ue_id, &data);
DevAssert(ret);
// we can overwrite, no problem
data.secondary_ue = 2;
ret = cu_addmod_f1_ue_data(ue_id, &data);
bool ret = cu_add_f1_ue_data(ue_id, &data);
DevAssert(ret);
ret = cu_add_f1_ue_data(ue_id, &data);
DevAssert(!ret);
bool exists = cu_exists_f1_ue_data(ue_id);
DevAssert(exists);
f1_ue_data_t rdata = cu_get_f1_ue_data(ue_id);
DevAssert(rdata.secondary_ue == data.secondary_ue);
rdata.secondary_ue = 3;
// overwrite once more
ret = cu_addmod_f1_ue_data(ue_id, &rdata);
DevAssert(ret);
exists = cu_exists_f1_ue_data(ue_id);
DevAssert(exists);
f1_ue_data_t r2data = cu_get_f1_ue_data(ue_id);
DevAssert(r2data.secondary_ue == rdata.secondary_ue);
}
int main()
......
......@@ -482,7 +482,7 @@ static NR_UE_info_t *create_new_UE(gNB_MAC_INST *mac, uint32_t cu_id)
return NULL;
f1_ue_data_t new_ue_data = {.secondary_ue = cu_id};
du_addmod_f1_ue_data(rnti, &new_ue_data);
du_add_f1_ue_data(rnti, &new_ue_data);
const NR_ServingCellConfigCommon_t *scc = mac->common_channels[CC_id].ServingCellConfigCommon;
const NR_ServingCellConfig_t *sccd = mac->common_channels[CC_id].pre_ServingCellConfig;
......@@ -826,7 +826,7 @@ void dl_rrc_message_transfer(const f1ap_dl_rrc_message_t *dl_rrc)
if (!du_exists_f1_ue_data(dl_rrc->gNB_DU_ue_id)) {
LOG_D(NR_MAC, "No CU UE ID stored for UE RNTI %04x, adding CU UE ID %d\n", dl_rrc->gNB_DU_ue_id, dl_rrc->gNB_CU_ue_id);
f1_ue_data_t new_ue_data = {.secondary_ue = dl_rrc->gNB_CU_ue_id};
du_addmod_f1_ue_data(dl_rrc->gNB_DU_ue_id, &new_ue_data);
du_add_f1_ue_data(dl_rrc->gNB_DU_ue_id, &new_ue_data);
}
if (UE->expect_reconfiguration && dl_rrc->srb_id == 1) {
......
......@@ -150,7 +150,7 @@ void e1_bearer_context_setup(const e1ap_bearer_setup_req_t *req)
uint32_t cu_up_ue_id = req->gNB_cu_cp_ue_id;
f1_ue_data_t ued = {.secondary_ue = req->gNB_cu_cp_ue_id};
if (need_ue_id_mgmt) {
cu_addmod_f1_ue_data(cu_up_ue_id, &ued);
cu_add_f1_ue_data(cu_up_ue_id, &ued);
LOG_I(E1AP, "adding UE with CU-CP UE ID %d and CU-UP UE ID %d\n", req->gNB_cu_cp_ue_id, cu_up_ue_id);
}
......
......@@ -1181,7 +1181,8 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
/* update to old DU assoc id -- RNTI + secondary DU UE ID further below */
f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
ue_data.du_assoc_id = source_ctx->du->assoc_id;
cu_addmod_f1_ue_data(UE->rrc_ue_id, &ue_data);
cu_remove_f1_ue_data(UE->rrc_ue_id);
cu_add_f1_ue_data(UE->rrc_ue_id, &ue_data);
nr_rrc_finalize_ho(UE);
} else if (physCellId != cell_info->nr_pci) {
/* UE was moving from previous cell so quickly that RRCReestablishment for previous cell was received in this cell */
......@@ -1211,7 +1212,8 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
UE->nr_cellid = msg->nr_cellid;
f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
ue_data.secondary_ue = msg->gNB_DU_ue_id;
cu_addmod_f1_ue_data(UE->rrc_ue_id, &ue_data);
cu_remove_f1_ue_data(UE->rrc_ue_id);
cu_add_f1_ue_data(UE->rrc_ue_id, &ue_data);
rrc_gNB_generate_RRCReestablishment(ue_context_p, msg->du2cu_rrc_container, old_rnti, du);
return;
......@@ -2123,7 +2125,8 @@ static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, i
f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
ue_data.secondary_ue = target_ctx->du_ue_id;
ue_data.du_assoc_id = target_ctx->du->assoc_id;
cu_addmod_f1_ue_data(UE->rrc_ue_id, &ue_data);
cu_remove_f1_ue_data(UE->rrc_ue_id);
cu_add_f1_ue_data(UE->rrc_ue_id, &ue_data);
LOG_I(NR_RRC, "UE %d handover: update RNTI from %04x to %04x\n", UE->rrc_ue_id, UE->rnti, target_ctx->new_rnti);
nr_ho_source_cu_t *source_ctx = UE->ho_context->source;
DevAssert(source_ctx->old_rnti == UE->rnti);
......
......@@ -204,7 +204,7 @@ rrc_gNB_ue_context_t *rrc_gNB_create_ue_context(sctp_assoc_t assoc_id,
AssertFatal(!cu_exists_f1_ue_data(ue->rrc_ue_id),
"UE F1 Context for ID %d already exists, logic bug\n",
ue->rrc_ue_id);
cu_addmod_f1_ue_data(ue->rrc_ue_id, &ue_data);
cu_add_f1_ue_data(ue->rrc_ue_id, &ue_data);
RB_INSERT(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_p);
LOG_UE_EVENT(ue,
......
......@@ -132,7 +132,8 @@ sctp_assoc_t get_new_cuup_for_ue(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue
/* update the association for the UE so it will be picked up later */
ue_data.e1_assoc_id = selected->assoc_id;
cu_addmod_f1_ue_data(ue->rrc_ue_id, &ue_data);
cu_remove_f1_ue_data(ue->rrc_ue_id);
cu_add_f1_ue_data(ue->rrc_ue_id, &ue_data);
LOG_I(RRC, "UE %d associating to CU-UP assoc_id %d out of %ld CU-UPs\n", ue->rrc_ue_id, ue_data.e1_assoc_id, rrc->num_cuups);
return ue_data.e1_assoc_id;
......
......@@ -426,8 +426,9 @@ static int invalidate_du_connections(gNB_RRC_INST *rrc, sctp_assoc_t assoc_id)
if (ue_data.du_assoc_id == assoc_id) {
/* this UE belongs to the DU that disconnected, set du_assoc_id to 0,
* meaning DU is offline, then trigger release request */
cu_remove_f1_ue_data(ue_id);
ue_data.du_assoc_id = 0;
cu_addmod_f1_ue_data(ue_id, &ue_data);
cu_add_f1_ue_data(ue_id, &ue_data);
rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0,
ue_context_p,
NGAP_CAUSE_RADIO_NETWORK,
......
......@@ -355,9 +355,9 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a
uint32_t du_ue_id = ue_context_p->ue_context.rnti;
uint32_t rrc_ue_id = ue_context_p->ue_context.rrc_ue_id;
f1_ue_data_t du_ue_data = {.secondary_ue = rrc_ue_id};
du_addmod_f1_ue_data(du_ue_id, &du_ue_data);
du_add_f1_ue_data(du_ue_id, &du_ue_data);
f1_ue_data_t cu_ue_data = {.secondary_ue = du_ue_id};
cu_addmod_f1_ue_data(rrc_ue_id, &cu_ue_data);
cu_add_f1_ue_data(rrc_ue_id, &cu_ue_data);
LOG_I(RRC, "Assign CU UE ID %d and DU UE ID %d to UE RNTI %04x\n", rrc_ue_id, du_ue_id, ue_context_p->ue_context.rnti);
// configure MAC and RLC
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment