diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 7e36c8852b3bc1dac07646a3894086e98979c390..4402ce18ed2e94886eac9de01ffa2248802aa5db 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -936,6 +936,87 @@ void pdcp_run ( } +boolean_t pdcp_remove_UE( + const moduled_id_t enb_mod_idP, + const module_id_t ue_mod_idP, + const frame_t frameP) { + + + pdcp_t *pdcp_p = NULL; + DRB_Identity_t srb_id = 0; + DRB_Identity_t drb_id = 0; + + // check and remove SRBs first + + for (srb_id=0;srb_id<2;srb_id++) { + pdcp_p = &pdcp_array_srb_eNB[enb_mod_idP][ue_mod_idP][srb_id-1]; + if (pdcp_p->instanciated_instance == TRUE) { + pdcp_p->instanciated_instance = FALSE; + pdcp_p->lcid = 0; + pdcp_p->header_compression_profile = 0x0; + pdcp_p->cipheringAlgorithm = 0xff; + pdcp_p->integrityProtAlgorithm = 0xff; + pdcp_p->status_report = 0; + pdcp_p->rlc_mode = RLC_MODE_NONE; + pdcp_p->next_pdcp_tx_sn = 0; + pdcp_p->next_pdcp_rx_sn = 0; + pdcp_p->tx_hfn = 0; + pdcp_p->rx_hfn = 0; + pdcp_p->last_submitted_pdcp_rx_sn = 4095; + pdcp_p->seq_num_size = 0; + pdcp_p->first_missing_pdu = -1; + pdcp_p->security_activated = 0; + /* Security keys */ + if (pdcp_p->kUPenc != NULL) { + free(pdcp_p->kUPenc); + } + if (pdcp_p->kRRCint != NULL) { + free(pdcp_p->kRRCint); + } + if (pdcp_p->kRRCenc != NULL) { + free(pdcp_p->kRRCenc); + } + } + + } + + for (drb_id=0;drb_id<maxDRB;drb_id++) { + pdcp_p = &pdcp_array_drb_eNB[enb_mod_idP][ue_mod_idP][drb_id-1]; + if (pdcp_p->instanciated_instance == TRUE) { + pdcp_p->instanciated_instance = FALSE; + pdcp_p->lcid = 0; + pdcp_p->header_compression_profile = 0x0; + pdcp_p->cipheringAlgorithm = 0xff; + pdcp_p->integrityProtAlgorithm = 0xff; + pdcp_p->status_report = 0; + pdcp_p->rlc_mode = RLC_MODE_NONE; + pdcp_p->next_pdcp_tx_sn = 0; + pdcp_p->next_pdcp_rx_sn = 0; + pdcp_p->tx_hfn = 0; + pdcp_p->rx_hfn = 0; + pdcp_p->last_submitted_pdcp_rx_sn = 4095; + pdcp_p->seq_num_size = 0; + pdcp_p->first_missing_pdu = -1; + pdcp_p->security_activated = 0; + + /* Security keys */ + if (pdcp_p->kUPenc != NULL) { + free(pdcp_p->kUPenc); + } + if (pdcp_p->kRRCint != NULL) { + free(pdcp_p->kRRCint); + } + if (pdcp_p->kRRCenc != NULL) { + free(pdcp_p->kRRCenc); + } + } + + } + + return 1; +} + + boolean_t rrc_pdcp_config_asn1_req ( const module_id_t enb_mod_idP, const module_id_t ue_mod_idP, diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index 7f91e4f7bfd699e9bc07832607e65a8e4125fbad..ef6110d769af3241bf7d3c0e6d40ee57a29112a5 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -348,6 +348,20 @@ public_pdcp(boolean_t pdcp_config_req_asn1 ( uint8_t *const kRRCenc, uint8_t *const kRRCint, uint8_t *const kUPenc)); + + +/*! \fn boolean_t pdcp_remove_UE(const module_id_t enb_mod_idP,const module_id_t ue_mod_idP,const frame_t frameP) +* \brief Function for RRC to configure a Radio Bearer clear all PDCP resources for a particular UE +* \param[in] enb_mod_idP index of eNB +* \param[in] enb_mod_idP index of UE +* \param[in] frameP frame +* \return A status about the processing, OK or error code. +*/ +public_pdcp(boolean_t pdcp_remove_UE( + const module_id_t enb_mod_idP, + const module_id_t ue_mod_idP, + const frame_t frameP)); + /*! \fn void rrc_pdcp_config_release(module_id_t, rb_id_t) * \brief This functions is unused * \param[in] module_id Module ID of relevant PDCP entity diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h index 61d3a52c34973aa289fa32f0ab827da307aa1f18..1295428f14cb6d9c14b42838dd2cc4df916a4243 100755 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -369,7 +369,7 @@ public_rlc_rrc(void * \param[in] eNB_flagP Flag to indicate eNB (1) or UE (0) * \return A status about the processing, OK or error code. */ -public_rlc_rrc(rlc_op_status_t rrc_rlc_remove_ue (const module_id_t enb_mod_idP,const module_id_t ue_mod_idP,const eNB_flag_t enb_flagP,const frame_t frameP,const eNB_flag_t enb_flagP);) +public_rlc_rrc(rlc_op_status_t rrc_rlc_remove_ue (const module_id_t enb_mod_idP,const module_id_t ue_mod_idP,const frame_t frameP,const eNB_flag);) /*! \fn rlc_op_status_t rrc_rlc_remove_rlc (const module_id_t enb_mod_idP, const module_id_t ue_mod_idP, const frame_t frameP, const eNB_flag_t eNB_flagP, const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP, const rb_id_t rb_idP) diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index 1eaf0d36d6f4d8a4e770c8142275269202bfbf9a..1de068d449c1dc40512ee21857cf45f03cd110d4 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -473,7 +473,6 @@ rb_free_rlc_union (void *rlcu_pP) rlc_op_status_t rrc_rlc_remove_ue ( const module_id_t enb_mod_idP, const module_id_t ue_mod_idP, - const eNB_flag_t enb_flagP, const frame_t frameP, const eNB_flag_t enb_flagP) { //----------------------------------------------------------------------------- diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 2fad2212ca411ad59cca74c28c35022156fb220a..4a3cfe56d788daec9f7f863f323574438bea8eb1 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -543,7 +543,9 @@ void rrc_eNB_free_UE_index( eNB_rrc_inst[enb_mod_idP].Info.UE[ue_mod_idP].Status = RRC_IDLE; eNB_rrc_inst[enb_mod_idP].Info.UE_list[ue_mod_idP] = 0; - rrc_rlc_remove_rlc(enb_mod_idP, ue_mod_idP, frameP, ENB_FLAG_YES, SRB_FLAG_YES, MBMS_FLAG_NO,1); + rrc_rlc_remove_ue(enb_mod_idP, ue_mod_idP, frameP,ENB_FLAG_YES); + pdcp_remove_UE(enb_mod_idP, ue_mod_idP, frameP); + free(eNB_rrc_inst[enb_mod_idP].SRB_configList[ue_mod_idP]); }