diff --git a/lib/include/srslte/interfaces/ue_interfaces.h b/lib/include/srslte/interfaces/ue_interfaces.h index a21448305..0caa68d94 100644 --- a/lib/include/srslte/interfaces/ue_interfaces.h +++ b/lib/include/srslte/interfaces/ue_interfaces.h @@ -274,6 +274,7 @@ public: virtual void add_bearer(uint32_t lcid) = 0; virtual void add_bearer(uint32_t lcid, srslte::srslte_rlc_config_t cnfg) = 0; virtual void add_bearer_mrb(uint32_t lcid) = 0; + virtual void del_bearer(uint32_t lcid) = 0; }; // RLC interface for PDCP diff --git a/lib/include/srslte/upper/pdcp.h b/lib/include/srslte/upper/pdcp.h index 2376bd020..f1e02400a 100644 --- a/lib/include/srslte/upper/pdcp.h +++ b/lib/include/srslte/upper/pdcp.h @@ -60,6 +60,7 @@ public: void write_sdu_mch(uint32_t lcid, byte_buffer_t *sdu); void add_bearer(uint32_t lcid, srslte_pdcp_config_t cnfg = srslte_pdcp_config_t()); void add_bearer_mrb(uint32_t lcid, srslte_pdcp_config_t cnfg = srslte_pdcp_config_t()); + void del_bearer(uint32_t lcid); void config_security(uint32_t lcid, uint8_t *k_enc, uint8_t *k_int, diff --git a/lib/include/srslte/upper/rlc.h b/lib/include/srslte/upper/rlc.h index 20123da0e..a56f48eff 100644 --- a/lib/include/srslte/upper/rlc.h +++ b/lib/include/srslte/upper/rlc.h @@ -86,6 +86,7 @@ public: void add_bearer(uint32_t lcid); void add_bearer(uint32_t lcid, srslte_rlc_config_t cnfg); void add_bearer_mrb(uint32_t lcid); + void del_bearer(uint32_t lcid); private: void reset_metrics(); diff --git a/lib/src/upper/pdcp.cc b/lib/src/upper/pdcp.cc index c15fe6106..4ad9b2b16 100644 --- a/lib/src/upper/pdcp.cc +++ b/lib/src/upper/pdcp.cc @@ -137,6 +137,7 @@ void pdcp::write_sdu_mch(uint32_t lcid, byte_buffer_t *sdu) } pthread_rwlock_unlock(&rwlock); } + void pdcp::add_bearer(uint32_t lcid, srslte_pdcp_config_t cfg) { pthread_rwlock_wrlock(&rwlock); @@ -154,7 +155,6 @@ unlock_and_exit: pthread_rwlock_unlock(&rwlock); } - void pdcp::add_bearer_mrb(uint32_t lcid, srslte_pdcp_config_t cfg) { pthread_rwlock_wrlock(&rwlock); @@ -172,6 +172,21 @@ unlock_and_exit: pthread_rwlock_unlock(&rwlock); } +void pdcp::del_bearer(uint32_t lcid) +{ + pthread_rwlock_wrlock(&rwlock); + if (valid_lcid(lcid)) { + pdcp_map_t::iterator it = pdcp_array.find(lcid); + delete(it->second); + pdcp_array.erase(it); + pdcp_log->warning("Deleted PDCP bearer %s\n", rrc->get_rb_name(lcid).c_str()); + } else { + pdcp_log->warning("Can't delete bearer %s. Bearer doesn't exist.\n", rrc->get_rb_name(lcid).c_str()); + } + pthread_rwlock_unlock(&rwlock); +} + + void pdcp::config_security(uint32_t lcid, uint8_t *k_enc, uint8_t *k_int, diff --git a/lib/src/upper/rlc.cc b/lib/src/upper/rlc.cc index 31b740df4..237891430 100644 --- a/lib/src/upper/rlc.cc +++ b/lib/src/upper/rlc.cc @@ -494,6 +494,24 @@ unlock_and_exit: } +void rlc::del_bearer(uint32_t lcid) +{ + pthread_rwlock_wrlock(&rwlock); + + if (valid_lcid_mrb(lcid)) { + rlc_map_t::iterator it = rlc_array.find(lcid); + it->second->stop(); + delete(it->second); + rlc_array.erase(it); + rlc_log->warning("Deleted RLC bearer %s\n", rrc->get_rb_name(lcid).c_str()); + } else { + rlc_log->warning("Can't delete bearer %s. Bearer doesn't exist.\n", rrc->get_rb_name(lcid).c_str()); + } + + pthread_rwlock_unlock(&rwlock); +} + + /******************************************************************************* Helpers (Lock must be hold when calling those) *******************************************************************************/