nr,gnb,rrc: pack nas pdu in rrc reconfiguration message

This commit is contained in:
Francisco 2021-11-17 11:22:49 +00:00 committed by Francisco Paisana
parent 35507850d3
commit 0f1b5bdcab
2 changed files with 38 additions and 10 deletions

View File

@ -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<srsran::unique_byte_buffer_t> nas_pdu_queue;
// MAC controller
sched_nr_interface::ue_cfg_t uecfg{};

View File

@ -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;