From 57a3f9fe2f56b97d471217a010f06f5b9dc83dc6 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 3 Jul 2023 07:48:03 +0100 Subject: [PATCH 1/3] Bugfix when deleting a SDAP entity that is not the first one on the list and prevents segfault when removing the last one on the list Fix delete entity function, a SDAP entity is a combination of a UE and PDUSession, we cannot just simply delete the first entity for a UE --- openair2/SDAP/nr_sdap/nr_sdap_entity.c | 28 ++++++++++++-------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c index e81490630c..a0c8f10ada 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c @@ -468,23 +468,21 @@ nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id) return NULL; } -void delete_nr_sdap_entity(ue_id_t ue_id) +int nr_sdap_delete_entity(ue_id_t ue_id, int pdusession_id) { - nr_sdap_entity_t *entityPtr, *entityPrev = NULL; - entityPtr = sdap_info.sdap_entity_llist; - - if (entityPtr->ue_id == ue_id) { - sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; - free(entityPtr); - } else { - while (entityPtr->ue_id != ue_id && entityPtr->next_entity != NULL) { - entityPrev = entityPtr; - entityPtr = entityPtr->next_entity; - } - - if (entityPtr->ue_id != ue_id) { - entityPrev->next_entity = entityPtr->next_entity; + nr_sdap_entity_t *entityPtr = sdap_info.sdap_entity_llist; + int pos = 0; + while (entityPtr != NULL) { + if (entityPtr->ue_id == ue_id && entityPtr->pdusession_id == pdusession_id) { + if (pos == 0) { + sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; + } + LOG_I(SDAP, "Deleting SDAP entity for UE %lx and PDU Session id %d\n", ue_id, entityPtr->pdusession_id); free(entityPtr); + return 1; } + entityPtr = entityPtr->next_entity; + pos++; } + return 0; } From 62d33ce523a7a1ae837078d4a3ef648fc68b5199 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 3 Jul 2023 09:40:34 +0100 Subject: [PATCH 2/3] Add function to remove all SDAP entities for a UE --- openair2/SDAP/nr_sdap/nr_sdap_entity.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c index a0c8f10ada..bc3ea0ad9d 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c @@ -486,3 +486,23 @@ int nr_sdap_delete_entity(ue_id_t ue_id, int pdusession_id) } return 0; } + +void nr_sdap_delete_ue_entities(ue_id_t ue_id) +{ + nr_sdap_entity_t *entityPtr = sdap_info.sdap_entity_llist; + int pos = 0; + while (entityPtr != NULL) { + if (entityPtr->ue_id == ue_id) { + if (pos == 0) { + sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; + } + LOG_I(SDAP, "Deleting SDAP entity for UE %lx and PDU Session id %d\n", ue_id, entityPtr->pdusession_id); + nr_sdap_entity_t *entityPrev = entityPtr; + free(entityPtr); + entityPtr = entityPrev->next_entity; + } else { + entityPtr = entityPtr->next_entity; + } + pos++; + } +} From 7a2790ba68e8577c6ba3962217e8ed576e82be25 Mon Sep 17 00:00:00 2001 From: Angelo Athanassopoulos Date: Wed, 5 Jul 2023 23:28:45 +0200 Subject: [PATCH 3/3] NR SDAP - Bugfix for entity deletion This commit fixes the implementation for removing either a single SDAP entity or all the SDAP entities of a UE. --- openair2/SDAP/nr_sdap/nr_sdap_entity.c | 85 ++++++++++++++++++-------- openair2/SDAP/nr_sdap/nr_sdap_entity.h | 20 +++++- 2 files changed, 77 insertions(+), 28 deletions(-) diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c index bc3ea0ad9d..25254e0905 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c @@ -468,41 +468,74 @@ nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id) return NULL; } -int nr_sdap_delete_entity(ue_id_t ue_id, int pdusession_id) +bool nr_sdap_delete_entity(ue_id_t ue_id, int pdusession_id) { nr_sdap_entity_t *entityPtr = sdap_info.sdap_entity_llist; - int pos = 0; - while (entityPtr != NULL) { - if (entityPtr->ue_id == ue_id && entityPtr->pdusession_id == pdusession_id) { - if (pos == 0) { - sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; - } - LOG_I(SDAP, "Deleting SDAP entity for UE %lx and PDU Session id %d\n", ue_id, entityPtr->pdusession_id); - free(entityPtr); - return 1; - } - entityPtr = entityPtr->next_entity; - pos++; + nr_sdap_entity_t *entityPrev = NULL; + bool ret = false; + int upperBound = 0; + + if (entityPtr == NULL && (pdusession_id) * (pdusession_id - NGAP_MAX_PDU_SESSION) > 0) { + LOG_W(SDAP, "SDAP entities not established or Invalid range of pdusession_id [0, 256].\n"); + return ret; } - return 0; + LOG_D(SDAP, "Deleting SDAP entity for UE %lx and PDU Session id %d\n", ue_id, entityPtr->pdusession_id); + + if (entityPtr->ue_id == ue_id && entityPtr->pdusession_id == pdusession_id) { + sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; + free(entityPtr); + LOG_D(SDAP, "Successfully deleted Entity.\n"); + ret = true; + } else { + while ((entityPtr->ue_id != ue_id || entityPtr->pdusession_id != pdusession_id) && entityPtr->next_entity != NULL + && upperBound < SDAP_MAX_NUM_OF_ENTITIES) { + entityPrev = entityPtr; + entityPtr = entityPtr->next_entity; + upperBound++; + } + + if (entityPtr->ue_id == ue_id && entityPtr->pdusession_id == pdusession_id) { + entityPrev->next_entity = entityPtr->next_entity; + free(entityPtr); + LOG_D(SDAP, "Successfully deleted Entity.\n"); + ret = true; + } + } + LOG_W(SDAP, "Entity does not exist or it was not found.\n"); + return ret; } -void nr_sdap_delete_ue_entities(ue_id_t ue_id) +bool nr_sdap_delete_ue_entities(ue_id_t ue_id) { nr_sdap_entity_t *entityPtr = sdap_info.sdap_entity_llist; - int pos = 0; - while (entityPtr != NULL) { - if (entityPtr->ue_id == ue_id) { - if (pos == 0) { - sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; - } - LOG_I(SDAP, "Deleting SDAP entity for UE %lx and PDU Session id %d\n", ue_id, entityPtr->pdusession_id); - nr_sdap_entity_t *entityPrev = entityPtr; + nr_sdap_entity_t *entityPrev = NULL; + int upperBound = 0; + bool ret = false; + + if (entityPtr == NULL && (ue_id) * (ue_id - SDAP_MAX_UE_ID) > 0) { + LOG_W(SDAP, "SDAP entities not established or Invalid range of ue_id [0, 65536]\n"); + return ret; + } + + /* Handle scenario where ue_id matches the head of the list */ + while (entityPtr != NULL && entityPtr->ue_id == ue_id && upperBound < NGAP_MAX_DRBS_PER_UE) { + sdap_info.sdap_entity_llist = entityPtr->next_entity; + free(entityPtr); + entityPtr = sdap_info.sdap_entity_llist; + ret = true; + } + + while (entityPtr != NULL && upperBound < SDAP_MAX_NUM_OF_ENTITIES) { + if (entityPtr->ue_id != ue_id) { + entityPrev = entityPtr; + entityPtr = entityPtr->next_entity; + } else { + entityPrev->next_entity = entityPtr->next_entity; free(entityPtr); entityPtr = entityPrev->next_entity; - } else { - entityPtr = entityPtr->next_entity; + LOG_D(SDAP, "Successfully deleted Entity.\n"); + ret = true; } - pos++; } + return ret; } diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.h b/openair2/SDAP/nr_sdap/nr_sdap_entity.h index 4b5303a5b6..b90da9d380 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.h +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.h @@ -44,6 +44,8 @@ #define SDAP_CTRL_PDU_MAP_DEF_DRB (0) #define SDAP_CTRL_PDU_MAP_RULE_DRB (1) #define SDAP_MAX_PDU (9000) +#define SDAP_MAX_NUM_OF_ENTITIES (NGAP_MAX_DRBS_PER_UE * MAX_MOBILES_PER_ENB) +#define SDAP_MAX_UE_ID (65536) /* * The values of QoS Flow ID (QFI) and Reflective QoS Indication, @@ -167,7 +169,21 @@ nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap /* Entity Handling Related Functions */ nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id); -/* Entity Handling Related Functions */ -void delete_nr_sdap_entity(ue_id_t ue_id); +/** + * @brief Function to delete a single SDAP Entity based on the ue_id and pdusession_id. + * @note 1. SDAP entities may have the same ue_id. + * @note 2. SDAP entities may have the same pdusession_id, but not with the same ue_id. + * @note 3. The combination of ue_id and pdusession_id, is unique for each SDAP entity. + * @param[in] ue_id Unique identifier for the User Equipment. ID Range [0, 65536]. + * @param[in] pdusession_id Unique identifier for the Packet Data Unit Session. ID Range [0, 256]. + * @return True, if successfully deleted entity, false otherwise. + */ +bool nr_sdap_delete_entity(ue_id_t ue_id, int pdusession_id); +/** + * @brief Function to delete all SDAP Entities based on the ue_id. + * @param[in] ue_id Unique identifier for the User Equipment. ID Range [0, 65536]. + * @return True, it deleted at least one entity, false otherwise. + */ +bool nr_sdap_delete_ue_entities(ue_id_t ue_id); #endif