From 0f1b5bdcab334fcd0ee0bfe0412edc09bbb5215f Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 17 Nov 2021 11:22:49 +0000 Subject: [PATCH] nr,gnb,rrc: pack nas pdu in rrc reconfiguration message --- srsgnb/hdr/stack/rrc/rrc_nr_ue.h | 18 +++++++++++------- srsgnb/src/stack/rrc/rrc_nr_ue.cc | 30 +++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/srsgnb/hdr/stack/rrc/rrc_nr_ue.h b/srsgnb/hdr/stack/rrc/rrc_nr_ue.h index 815856cff..23a316499 100644 --- a/srsgnb/hdr/stack/rrc/rrc_nr_ue.h +++ b/srsgnb/hdr/stack/rrc/rrc_nr_ue.h @@ -52,20 +52,23 @@ public: void set_activity(bool enabled = true); void activity_timer_expired(const activity_timeout_type_t type); - /* TS 38.331 - 5.3.3 RRC connection establishment */ + /** TS 38.331 - 5.3.3 RRC connection establishment */ void handle_rrc_setup_request(const asn1::rrc_nr::rrc_setup_request_s& msg); void handle_rrc_setup_complete(const asn1::rrc_nr::rrc_setup_complete_s& msg); - /* TS 38.331 - 5.3.4 Initial AS security activation */ + /** TS 38.331 - 5.3.4 Initial AS security activation */ void handle_security_mode_complete(const asn1::rrc_nr::security_mode_complete_s& msg); - /* TS 38.331 - 5.3.5 RRC reconfiguration */ + /** TS 38.331 - 5.3.5 RRC reconfiguration */ void handle_rrc_reconfiguration_complete(const asn1::rrc_nr::rrc_recfg_complete_s& msg); - /* TS 38.331 - 5.7.1 DL information transfer */ + /** TS 38.331 - 5.3.8 Connection Release */ + void send_rrc_release(); + + /** TS 38.331 - 5.7.1 DL information transfer */ void send_dl_information_transfer(srsran::unique_byte_buffer_t sdu); - /* TS 38.331 - 5.7.2 UL information transfer */ + /** TS 38.331 - 5.7.2 UL information transfer */ void handle_ul_information_transfer(const asn1::rrc_nr::ul_info_transfer_s& msg); // NGAP interface @@ -158,8 +161,9 @@ private: srsran::unique_timer activity_timer; /// for basic DL/UL activity timeout // RRC configs for UEs - asn1::rrc_nr::cell_group_cfg_s cell_group_cfg; - asn1::rrc_nr::radio_bearer_cfg_s radio_bearer_cfg, next_radio_bearer_cfg; + asn1::rrc_nr::cell_group_cfg_s cell_group_cfg; + asn1::rrc_nr::radio_bearer_cfg_s radio_bearer_cfg, next_radio_bearer_cfg; + std::vector nas_pdu_queue; // MAC controller sched_nr_interface::ue_cfg_t uecfg{}; diff --git a/srsgnb/src/stack/rrc/rrc_nr_ue.cc b/srsgnb/src/stack/rrc/rrc_nr_ue.cc index 566c4d94f..5b47d9d04 100644 --- a/srsgnb/src/stack/rrc/rrc_nr_ue.cc +++ b/srsgnb/src/stack/rrc/rrc_nr_ue.cc @@ -989,9 +989,10 @@ void rrc_nr::ue::handle_security_mode_complete(const asn1::rrc_nr::security_mode send_rrc_reconfiguration(); } +/// TS 38.331, RRCReconfiguration void rrc_nr::ue::send_rrc_reconfiguration() { - asn1::rrc_nr::dl_dcch_msg_s dl_dcch_msg; + dl_dcch_msg_s dl_dcch_msg; dl_dcch_msg.msg.set_c1().set_rrc_recfg().rrc_transaction_id = (uint8_t)((transaction_id++) % 4); rrc_recfg_ies_s& ies = dl_dcch_msg.msg.c1().rrc_recfg().crit_exts.set_rrc_recfg(); @@ -1010,12 +1011,20 @@ void rrc_nr::ue::send_rrc_reconfiguration() // Pack masterCellGroup into container srsran::unique_byte_buffer_t pdu = parent->pack_into_pdu(master_cell_group); if (pdu == nullptr) { - // TODO: Handle + send_rrc_release(); return; } ies.non_crit_ext.master_cell_group.resize(pdu->N_bytes); memcpy(ies.non_crit_ext.master_cell_group.data(), pdu->data(), pdu->N_bytes); - // TODO: pass stored NAS PDU + + // Pass stored NAS PDUs + ies.non_crit_ext.ded_nas_msg_list_present = true; + ies.non_crit_ext.ded_nas_msg_list.resize(nas_pdu_queue.size()); + for (uint32_t i = 0; i < nas_pdu_queue.size(); ++i) { + ies.non_crit_ext.ded_nas_msg_list[i].resize(nas_pdu_queue[i]->size()); + memcpy(ies.non_crit_ext.ded_nas_msg_list[i].data(), nas_pdu_queue[i]->data(), nas_pdu_queue[i]->size()); + } + nas_pdu_queue.clear(); // Update lower layers if (ies.radio_bearer_cfg_present) { @@ -1037,6 +1046,11 @@ void rrc_nr::ue::handle_rrc_reconfiguration_complete(const asn1::rrc_nr::rrc_rec radio_bearer_cfg = next_radio_bearer_cfg; } +void rrc_nr::ue::send_rrc_release() +{ + // TODO +} + void rrc_nr::ue::send_dl_information_transfer(srsran::unique_byte_buffer_t sdu) { dl_dcch_msg_s dl_dcch_msg; @@ -1058,6 +1072,16 @@ void rrc_nr::ue::handle_ul_information_transfer(const asn1::rrc_nr::ul_info_tran void rrc_nr::ue::establish_eps_bearer(uint32_t pdu_session_id, srsran::const_byte_span nas_pdu, uint32_t lcid) { + // Enqueue NAS PDU + srsran::unique_byte_buffer_t pdu = srsran::make_byte_buffer(); + if (pdu == nullptr) { + logger.error("Couldn't allocate NAS PDU in %s().", __FUNCTION__); + return; + } + pdu->resize(nas_pdu.size()); + memcpy(pdu->data(), nas_pdu.data(), nas_pdu.size()); + nas_pdu_queue.push_back(std::move(pdu)); + // Add SRB2, if not yet added if (radio_bearer_cfg.srb_to_add_mod_list.size() <= 1) { next_radio_bearer_cfg.srb_to_add_mod_list_present = true;