F1AP IDs: Allow AddMod, fix concurrency bug

Modify xu_add_f1_ue_data() to be xu_addmod_f1_ue_data(), i.e., "addmod"
behavior in which it is possible to also update f1_ue_data. I do it this
way since an xu_updade_f1_ue_data() function would be almost the same as
the add function (only deleting existing data, whereas the original
add() was asserting in that case).

Modify tests to test for this behavior.

This fixes a concurrency bug. For instance, during reestablishment, the
CU needs to update the DU UE ID under which the UE is identified in the
DU. Previously, the CU would remove, then add the DU UE ID info.
At the same time, the PDCP thread might look up the information. This
can lead to asserts. Use the above addmod functionality to do the
remove-add under a mutex.
This commit is contained in:
Robert Schmidt
2025-01-16 16:50:58 +01:00
parent c7dc71e66d
commit 6d5e29f5ae
10 changed files with 37 additions and 30 deletions
+18 -6
View File
@@ -30,10 +30,11 @@ void du_data_test()
du_init_f1_ue_data();
int rnti = 13;
f1_ue_data_t data = {.secondary_ue = 1};
bool ret = du_add_f1_ue_data(rnti, &data);
bool ret = du_addmod_f1_ue_data(rnti, &data);
DevAssert(ret);
// we can overwrite, no problem
ret = du_addmod_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);
@@ -45,14 +46,25 @@ void cu_data_test()
cu_init_f1_ue_data();
int ue_id = 13;
f1_ue_data_t data = {.secondary_ue = 1};
bool ret = cu_add_f1_ue_data(ue_id, &data);
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);
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()