From d24a3d1a98dea4b5357f1c9e8cc8cdaffa00c2a4 Mon Sep 17 00:00:00 2001 From: francescomani Date: Fri, 22 Sep 2023 10:37:08 +0200 Subject: [PATCH] SDAP release DRB --- openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c | 39 +++++++++++++++++++---- openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h | 3 +- openair2/RRC/NR_UE/rrc_UE.c | 5 +-- openair2/SDAP/nr_sdap/nr_sdap_entity.c | 15 +++++++++ openair2/SDAP/nr_sdap/nr_sdap_entity.h | 2 ++ 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index db57aa63f0..96444e5b10 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -1093,12 +1093,11 @@ void nr_pdcp_reconfigure_srb(ue_id_t ue_id, int srb_id, long t_Reordering) nr_pdcp_manager_unlock(nr_pdcp_ue_manager); } -void nr_pdcp_reconfigure_drb(ue_id_t ue_id, int drb_id, long t_Reordering) +void nr_pdcp_reconfigure_drb(ue_id_t ue_id, int drb_id, NR_PDCP_Config_t *pdcp_config, NR_SDAP_Config_t *sdap_config) { - /* The enabling/disabling of ciphering or integrity protection - * can be changed only by releasing and adding the DRB - * (so not by reconfiguring). - */ + // The enabling/disabling of ciphering or integrity protection + // can be changed only by releasing and adding the DRB + // (so not by reconfiguring). nr_pdcp_manager_lock(nr_pdcp_ue_manager); nr_pdcp_ue_t *ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id); nr_pdcp_entity_t *drb = nr_pdcp_get_rb(ue, drb_id, false); @@ -1107,8 +1106,33 @@ void nr_pdcp_reconfigure_drb(ue_id_t ue_id, int drb_id, long t_Reordering) nr_pdcp_manager_unlock(nr_pdcp_ue_manager); return; } - int decoded_t_reordering = decode_t_reordering(t_Reordering); - drb->t_reordering = decoded_t_reordering; + if (pdcp_config) { + if (pdcp_config->t_Reordering) + drb->t_reordering = decode_t_reordering(*pdcp_config->t_Reordering); + else + drb->t_reordering = -1; + struct NR_PDCP_Config__drb *drb_config = pdcp_config->drb; + if (drb_config) { + if (drb_config->discardTimer) + drb->discard_timer = decode_discard_timer(*drb_config->discardTimer); + bool size_set = false; + if (drb_config->pdcp_SN_SizeUL) { + drb->sn_size = decode_sn_size_ul(*drb_config->pdcp_SN_SizeUL); + size_set = true; + } + if (drb_config->pdcp_SN_SizeDL) { + int size = decode_sn_size_dl(*drb_config->pdcp_SN_SizeDL); + AssertFatal(!size_set || (size == drb->sn_size), + "SN sizes must be the same. dl=%d, ul=%d", + size, drb->sn_size); + drb->sn_size = size; + } + } + } + if (sdap_config) { + // nr_reconfigure_sdap_entity + AssertFatal(false, "Function to reconfigure SDAP entity not implemented yet\n"); + } nr_pdcp_manager_unlock(nr_pdcp_ue_manager); } @@ -1131,6 +1155,7 @@ void nr_pdcp_release_drb(ue_id_t ue_id, int drb_id) nr_pdcp_ue_t *ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id); nr_pdcp_entity_t *drb = ue->drb[drb_id - 1]; if (drb) { + nr_sdap_release_drb(ue_id, drb_id, drb->pdusession_id); drb->release_entity(drb); drb->delete_entity(drb); ue->drb[drb_id - 1] = NULL; diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h index 05e18c23c2..ea88fbfb18 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h @@ -69,10 +69,11 @@ void nr_pdcp_reestablishment(ue_id_t ue_id, int rb_id, bool srb_flag); void nr_pdcp_suspend_srb(ue_id_t ue_id, int srb_id); void nr_pdcp_suspend_drb(ue_id_t ue_id, int drb_id); void nr_pdcp_reconfigure_srb(ue_id_t ue_id, int srb_id, long t_Reordering); -void nr_pdcp_reconfigure_drb(ue_id_t ue_id, int drb_id, long t_Reordering); +void nr_pdcp_reconfigure_drb(ue_id_t ue_id, int drb_id, NR_PDCP_Config_t *pdcp_config, NR_SDAP_Config_t *sdap_config); void nr_pdcp_release_srb(ue_id_t ue_id, int srb_id); void nr_pdcp_release_drb(ue_id_t ue_id, int drb_id); + void add_srb(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_SRB_ToAddMod *s, diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index d77cfd6a47..52b963f917 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -1256,8 +1256,9 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc, if (rrcNB->status_DRBs[DRB_id] == RB_ESTABLISHED) { AssertFatal(drb->reestablishPDCP == NULL, "reestablishPDCP not yet implemented\n"); AssertFatal(drb->recoverPDCP == NULL, "recoverPDCP not yet implemented\n"); - if (drb->pdcp_Config && drb->pdcp_Config->t_Reordering) - nr_pdcp_reconfigure_drb(rnti, DRB_id, *drb->pdcp_Config->t_Reordering); + NR_SDAP_Config_t *sdap_Config = drb->cnAssociation ? drb->cnAssociation->choice.sdap_Config : NULL; + if (drb->pdcp_Config || sdap_Config) + nr_pdcp_reconfigure_drb(rnti, DRB_id, drb->pdcp_Config, sdap_Config); if (drb->cnAssociation) AssertFatal(drb->cnAssociation->choice.sdap_Config == NULL, "SDAP reconfiguration not yet implemented\n"); } else { diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c index 6fdd8eb54a..f3f8315839 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c @@ -468,6 +468,21 @@ nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id) return NULL; } +void nr_sdap_release_drb(ue_id_t ue_id, int drb_id, int pdusession_id) +{ + // remove all QoS flow to DRB mappings associated with the released DRB + nr_sdap_entity_t *sdap = nr_sdap_get_entity(ue_id, pdusession_id); + if (sdap) { + for (int i = 0; i < SDAP_MAX_QFI; i++) { + if (sdap->qfi2drb_table[i].drb_id == drb_id) + sdap->qfi2drb_table[i].drb_id = SDAP_NO_MAPPING_RULE; + } + } + else + LOG_E(SDAP, "Couldn't find a SDAP entity associated with PDU session ID %d\n", + 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; diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.h b/openair2/SDAP/nr_sdap/nr_sdap_entity.h index 41a52c083b..07d62a4746 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.h +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.h @@ -169,6 +169,8 @@ 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); +void nr_sdap_release_drb(ue_id_t ue_id, int drb_id, int pdusession_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.