using the new choice set api in UE and eNB RRC

This commit is contained in:
Francisco Paisana 2019-05-07 15:15:31 +01:00 committed by Andre Puschmann
parent 14b6a1d483
commit b04cb0deb9
3 changed files with 82 additions and 172 deletions

View File

@ -608,18 +608,11 @@ int mbsfn_area_info_list_parser::parse(Setting& root)
int enb::parse_sibs(all_args_t* args, rrc_cfg_t* rrc_cfg, phy_cfg_t* phy_config_common)
{
// FIXME: Leave 0 blank for now
rrc_cfg->sibs[1].set(asn1::rrc::sys_info_r8_ies_s::sib_type_and_info_item_c_::types::sib2);
rrc_cfg->sibs[2].set(asn1::rrc::sys_info_r8_ies_s::sib_type_and_info_item_c_::types::sib3);
rrc_cfg->sibs[3].set(asn1::rrc::sys_info_r8_ies_s::sib_type_and_info_item_c_::types::sib4);
rrc_cfg->sibs[8].set(asn1::rrc::sys_info_r8_ies_s::sib_type_and_info_item_c_::types::sib9);
rrc_cfg->sibs[12].set(
asn1::rrc::sys_info_r8_ies_s::sib_type_and_info_item_c_::types::sib13_v920); // TODO: Confirm it matches with old
// LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_13
sib_type2_s* sib2 = &rrc_cfg->sibs[1].sib2();
sib_type3_s* sib3 = &rrc_cfg->sibs[2].sib3();
sib_type4_s* sib4 = &rrc_cfg->sibs[3].sib4();
sib_type9_s* sib9 = &rrc_cfg->sibs[8].sib9();
sib_type13_r9_s* sib13 = &rrc_cfg->sibs[12].sib13_v920();
sib_type2_s* sib2 = &rrc_cfg->sibs[1].set_sib2();
sib_type3_s* sib3 = &rrc_cfg->sibs[2].set_sib3();
sib_type4_s* sib4 = &rrc_cfg->sibs[3].set_sib4();
sib_type9_s* sib9 = &rrc_cfg->sibs[8].set_sib9();
sib_type13_r9_s* sib13 = &rrc_cfg->sibs[12].set_sib13_v920();
sib_type1_s* sib1 = &rrc_cfg->sib1;
if (parse_sib1(args->enb_files.sib_config, sib1)) {
@ -743,7 +736,7 @@ int enb::parse_rr(all_args_t* args, rrc_cfg_t* rrc_cfg)
rrc_cfg->antenna_info.tx_mode = (ant_info_ded_s::tx_mode_e_::options)(args->enb.transmission_mode - 1);
rrc_cfg->antenna_info.ue_tx_ant_sel.set(ant_info_ded_s::ue_tx_ant_sel_c_::types::setup);
rrc_cfg->antenna_info.ue_tx_ant_sel.set_setup();
switch (rrc_cfg->antenna_info.tx_mode) {
case ant_info_ded_s::tx_mode_e_::tm1:
case ant_info_ded_s::tx_mode_e_::tm2:
@ -754,16 +747,14 @@ int enb::parse_rr(all_args_t* args, rrc_cfg_t* rrc_cfg)
rrc_cfg->antenna_info.ue_tx_ant_sel.setup().value = ant_info_ded_s::ue_tx_ant_sel_c_::setup_e_::open_loop;
rrc_cfg->antenna_info.codebook_subset_restrict_present = true;
rrc_cfg->antenna_info.codebook_subset_restrict.set(
ant_info_ded_s::codebook_subset_restrict_c_::types::n2_tx_ant_tm3);
rrc_cfg->antenna_info.codebook_subset_restrict.set_n2_tx_ant_tm3();
rrc_cfg->antenna_info.codebook_subset_restrict.n2_tx_ant_tm3().from_number(0b11);
break;
case ant_info_ded_s::tx_mode_e_::tm4:
rrc_cfg->antenna_info.ue_tx_ant_sel.setup().value = ant_info_ded_s::ue_tx_ant_sel_c_::setup_e_::closed_loop;
rrc_cfg->antenna_info.codebook_subset_restrict_present = true;
rrc_cfg->antenna_info.codebook_subset_restrict.set(
ant_info_ded_s::codebook_subset_restrict_c_::types::n2_tx_ant_tm4);
rrc_cfg->antenna_info.codebook_subset_restrict.set_n2_tx_ant_tm4();
rrc_cfg->antenna_info.codebook_subset_restrict.n2_tx_ant_tm4().from_number(0b111111);
break;
default:
@ -849,7 +840,7 @@ int phr_cnfg_parser::parse(libconfig::Setting& root)
phr_cfg->set(mac_main_cfg_s::phr_cfg_c_::types::release);
return 0;
}
phr_cfg->set(mac_main_cfg_s::phr_cfg_c_::types::setup);
phr_cfg->set_setup();
mac_main_cfg_s::phr_cfg_c_::setup_s_& s = phr_cfg->setup();
if (not parse_enum_by_str(s.dl_pathloss_change, "dl_pathloss_change", root["phr_cnfg"])) {
@ -908,13 +899,13 @@ int field_qci::parse(libconfig::Setting& root)
// Parse RLC section
rlc_cfg_c* rlc_cfg = &cfg[qci].rlc_cfg;
if (q["rlc_config"].exists("ul_am")) {
rlc_cfg->set(rlc_cfg_c::types::am);
rlc_cfg->set_am();
} else if (q["rlc_config"].exists("ul_um") && q["rlc_config"].exists("dl_um")) {
rlc_cfg->set(rlc_cfg_c::types::um_bi_dir);
rlc_cfg->set_um_bi_dir();
} else if (q["rlc_config"].exists("ul_um") && !q["rlc_config"].exists("dl_um")) {
rlc_cfg->set(rlc_cfg_c::types::um_uni_dir_ul);
rlc_cfg->set_um_uni_dir_ul();
} else if (!q["rlc_config"].exists("ul_um") && q["rlc_config"].exists("dl_um")) {
rlc_cfg->set(rlc_cfg_c::types::um_uni_dir_dl);
rlc_cfg->set_um_uni_dir_dl();
} else {
fprintf(stderr, "Invalid combination of UL/DL UM/AM for qci=%d\n", qci);
return -1;

View File

@ -248,19 +248,17 @@ void rrc::write_pdu(uint16_t rnti, uint32_t lcid, byte_buffer_t* pdu)
void rrc::write_dl_info(uint16_t rnti, byte_buffer_t* sdu)
{
dl_dcch_msg_s dl_dcch_msg;
dl_dcch_msg.msg.set(dl_dcch_msg_type_c::types::c1);
dl_dcch_msg.msg.set_c1();
dl_dcch_msg_type_c::c1_c_* msg_c1 = &dl_dcch_msg.msg.c1();
pthread_mutex_lock(&user_mutex);
if (users.count(rnti) == 1) {
msg_c1->set(dl_dcch_msg_type_c::c1_c_::types::dl_info_transfer);
dl_info_transfer_r8_ies_s* dl_info_r8 =
&msg_c1->set_dl_info_transfer().crit_exts.set_c1().set_dl_info_transfer_r8();
// msg_c1->dl_info_transfer().rrc_transaction_id = ;
msg_c1->dl_info_transfer().crit_exts.set(dl_info_transfer_s::crit_exts_c_::types::c1);
msg_c1->dl_info_transfer().crit_exts.c1().set(dl_info_transfer_s::crit_exts_c_::c1_c_::types::dl_info_transfer_r8);
dl_info_transfer_r8_ies_s* dl_info_r8 = &msg_c1->dl_info_transfer().crit_exts.c1().dl_info_transfer_r8();
dl_info_r8->non_crit_ext_present = false;
dl_info_r8->ded_info_type.set(dl_info_transfer_r8_ies_s::ded_info_type_c_::types::ded_info_nas);
dl_info_r8->ded_info_type.set_ded_info_nas();
dl_info_r8->ded_info_type.ded_info_nas().resize(sdu->N_bytes);
memcpy(msg_c1->dl_info_transfer().crit_exts.c1().dl_info_transfer_r8().ded_info_type.ded_info_nas().data(),
sdu->msg, sdu->N_bytes);
@ -426,7 +424,7 @@ bool rrc::is_paging_opportunity(uint32_t tti, uint32_t *payload_len)
pthread_mutex_lock(&paging_mutex);
asn1::rrc::pcch_msg_s pcch_msg;
pcch_msg.msg.set(pcch_msg_type_c::types::c1);
pcch_msg.msg.set_c1();
paging_s* paging_rec = &pcch_msg.msg.c1().paging();
// Default paging cycle, should get DRX from user
@ -456,12 +454,12 @@ bool rrc::is_paging_opportunity(uint32_t tti, uint32_t *payload_len)
paging_rec->paging_record_list_present = true;
paging_record_s paging_elem;
if (u.choice_type == LIBLTE_S1AP_UEPAGINGID_CHOICE_IMSI) {
paging_elem.ue_id.set(paging_ue_id_c::types::imsi);
paging_elem.ue_id.set_imsi();
paging_elem.ue_id.imsi().resize(u.choice.iMSI.n_octets);
memcpy(paging_elem.ue_id.imsi().data(), u.choice.iMSI.buffer, u.choice.iMSI.n_octets);
rrc_log->console("Warning IMSI paging not tested\n");
} else {
paging_elem.ue_id.set(paging_ue_id_c::types::s_tmsi);
paging_elem.ue_id.set_s_tmsi();
paging_elem.ue_id.s_tmsi().mmec.from_number(u.choice.s_TMSI.mMEC.buffer[0]);
uint32_t m_tmsi = 0;
for (int i = 0; i < LIBLTE_S1AP_M_TMSI_OCTET_STRING_LEN; i++) {
@ -706,17 +704,13 @@ uint32_t rrc::generate_sibs()
asn1::dyn_array<bcch_dl_sch_msg_s> msg(nof_messages + 1);
// Copy SIB1 to first SI message
msg[0].msg.set(bcch_dl_sch_msg_type_c::types::c1);
msg[0].msg.c1().set(bcch_dl_sch_msg_type_c::c1_c_::types::sib_type1);
msg[0].msg.c1().sib_type1() = cfg.sib1;
msg[0].msg.set_c1().set_sib_type1() = cfg.sib1;
// Copy rest of SIBs
for (uint32_t sched_info_elem = 0; sched_info_elem < nof_messages - 1; sched_info_elem++) {
uint32_t msg_index = sched_info_elem + 1; // first msg is SIB1, therefore start with second
msg[msg_index].msg.set(bcch_dl_sch_msg_type_c::types::c1);
msg[msg_index].msg.c1().set(bcch_dl_sch_msg_type_c::c1_c_::types::sys_info);
msg[msg_index].msg.c1().sys_info().crit_exts.set(sys_info_s::crit_exts_c_::types::sys_info_r8);
msg[msg_index].msg.set_c1().set_sys_info().crit_exts.set_sys_info_r8();
sys_info_r8_ies_s::sib_type_and_info_l_& sib_list =
msg[msg_index].msg.c1().sys_info().crit_exts.sys_info_r8().sib_type_and_info;
@ -752,15 +746,14 @@ uint32_t rrc::generate_sibs()
void rrc::configure_mbsfn_sibs(sib_type2_s* sib2, sib_type13_r9_s* sib13)
{
// Temp assignment of MCCH, this will eventually come from a cfg file
mcch.msg.set(mcch_msg_type_c::types::c1);
mcch.msg.set_c1();
mbsfn_area_cfg_r9_s& area_cfg_r9 = mcch.msg.c1().mbsfn_area_cfg_r9();
area_cfg_r9.common_sf_alloc_period_r9 = mbsfn_area_cfg_r9_s::common_sf_alloc_period_r9_e_::rf64;
area_cfg_r9.common_sf_alloc_r9.resize(1);
mbsfn_sf_cfg_s* sf_alloc_item = &area_cfg_r9.common_sf_alloc_r9[0];
sf_alloc_item->radioframe_alloc_offset = 0;
sf_alloc_item->radioframe_alloc_period = mbsfn_sf_cfg_s::radioframe_alloc_period_e_::n1;
sf_alloc_item->sf_alloc.set(mbsfn_sf_cfg_s::sf_alloc_c_::types::one_frame);
sf_alloc_item->sf_alloc.one_frame().from_number(32 + 31);
sf_alloc_item->sf_alloc.set_one_frame().from_number(32 + 31);
area_cfg_r9.pmch_info_list_r9.resize(1);
pmch_info_r9_s* pmch_item = &area_cfg_r9.pmch_info_list_r9[0];
@ -769,7 +762,7 @@ void rrc::configure_mbsfn_sibs(sib_type2_s* sib2, sib_type13_r9_s* sib13)
pmch_item->mbms_session_info_list_r9[0].lc_ch_id_r9 = 1;
pmch_item->mbms_session_info_list_r9[0].session_id_r9_present = true;
pmch_item->mbms_session_info_list_r9[0].session_id_r9[0] = 0;
pmch_item->mbms_session_info_list_r9[0].tmgi_r9.plmn_id_r9.set(tmgi_r9_s::plmn_id_r9_c_::types::explicit_value_r9);
pmch_item->mbms_session_info_list_r9[0].tmgi_r9.plmn_id_r9.set_explicit_value_r9();
pmch_item->mbms_session_info_list_r9[0].tmgi_r9.plmn_id_r9.explicit_value_r9().mcc_present = true;
srslte::string_to_plmn_id(pmch_item->mbms_session_info_list_r9[0].tmgi_r9.plmn_id_r9.explicit_value_r9(), "00003");
uint8_t byte[] = {0x0, 0x0, 0x0};
@ -779,7 +772,7 @@ void rrc::configure_mbsfn_sibs(sib_type2_s* sib2, sib_type13_r9_s* sib13)
pmch_item->mbms_session_info_list_r9[1].lc_ch_id_r9 = 2;
pmch_item->mbms_session_info_list_r9[1].session_id_r9_present = true;
pmch_item->mbms_session_info_list_r9[1].session_id_r9[0] = 1;
pmch_item->mbms_session_info_list_r9[1].tmgi_r9.plmn_id_r9.set(tmgi_r9_s::plmn_id_r9_c_::types::explicit_value_r9);
pmch_item->mbms_session_info_list_r9[1].tmgi_r9.plmn_id_r9.set_explicit_value_r9();
srslte::string_to_plmn_id(pmch_item->mbms_session_info_list_r9[1].tmgi_r9.plmn_id_r9.explicit_value_r9(), "00003");
byte[2] = 1;
memcpy(&pmch_item->mbms_session_info_list_r9[1].tmgi_r9.service_id_r9[0], &byte[0],
@ -1388,10 +1381,7 @@ void rrc::ue::send_connection_reest_rej()
{
dl_ccch_msg_s dl_ccch_msg;
dl_ccch_msg.msg.set(dl_ccch_msg_type_c::types::c1);
dl_ccch_msg.msg.c1().set(dl_ccch_msg_type_c::c1_c_::types::rrc_conn_reest_reject);
dl_ccch_msg.msg.c1().rrc_conn_reest_reject().crit_exts.set(
rrc_conn_reest_reject_s::crit_exts_c_::types::rrc_conn_reest_reject_r8);
dl_ccch_msg.msg.set_c1().set_rrc_conn_reest_reject().crit_exts.set_rrc_conn_reest_reject_r8();
send_dl_ccch(&dl_ccch_msg);
}
@ -1400,13 +1390,7 @@ void rrc::ue::send_connection_reject()
{
dl_ccch_msg_s dl_ccch_msg;
dl_ccch_msg.msg.set(dl_ccch_msg_type_c::types::c1);
dl_ccch_msg.msg.c1().set(dl_ccch_msg_type_c::c1_c_::types::rrc_conn_reject);
dl_ccch_msg.msg.c1().rrc_conn_reject().crit_exts.set(rrc_conn_reject_s::crit_exts_c_::types::c1);
dl_ccch_msg.msg.c1().rrc_conn_reject().crit_exts.c1().set(
rrc_conn_reject_s::crit_exts_c_::c1_c_::types::rrc_conn_reject_r8);
dl_ccch_msg.msg.c1().rrc_conn_reject().crit_exts.c1().rrc_conn_reject_r8().wait_time = 10;
dl_ccch_msg.msg.set_c1().set_rrc_conn_reject().crit_exts.set_c1().set_rrc_conn_reject_r8().wait_time = 10;
send_dl_ccch(&dl_ccch_msg);
}
@ -1414,23 +1398,18 @@ void rrc::ue::send_connection_reject()
void rrc::ue::send_connection_setup(bool is_setup)
{
dl_ccch_msg_s dl_ccch_msg;
dl_ccch_msg.msg.set(dl_ccch_msg_type_c::types::c1);
dl_ccch_msg.msg.set_c1();
rr_cfg_ded_s* rr_cfg = NULL;
if (is_setup) {
dl_ccch_msg.msg.c1().set(dl_ccch_msg_type_c::c1_c_::types::rrc_conn_setup);
dl_ccch_msg.msg.c1().set_rrc_conn_setup();
dl_ccch_msg.msg.c1().rrc_conn_setup().rrc_transaction_id = (uint8_t)((transaction_id++) % 4);
dl_ccch_msg.msg.c1().rrc_conn_setup().crit_exts.set(rrc_conn_setup_s::crit_exts_c_::types::c1);
dl_ccch_msg.msg.c1().rrc_conn_setup().crit_exts.c1().set(
rrc_conn_setup_s::crit_exts_c_::c1_c_::types::rrc_conn_setup_r8);
dl_ccch_msg.msg.c1().rrc_conn_setup().crit_exts.c1().rrc_conn_setup_r8();
dl_ccch_msg.msg.c1().rrc_conn_setup().crit_exts.set_c1().set_rrc_conn_setup_r8();
rr_cfg = &dl_ccch_msg.msg.c1().rrc_conn_setup().crit_exts.c1().rrc_conn_setup_r8().rr_cfg_ded;
} else {
dl_ccch_msg.msg.c1().set(dl_ccch_msg_type_c::c1_c_::types::rrc_conn_reest);
dl_ccch_msg.msg.c1().set_rrc_conn_reest();
dl_ccch_msg.msg.c1().rrc_conn_reest().rrc_transaction_id = (uint8_t)((transaction_id++) % 4);
dl_ccch_msg.msg.c1().rrc_conn_reest().crit_exts.set(rrc_conn_reest_s::crit_exts_c_::types::c1);
dl_ccch_msg.msg.c1().rrc_conn_reest().crit_exts.c1().set(
rrc_conn_reest_s::crit_exts_c_::c1_c_::types::rrc_conn_reest_r8);
dl_ccch_msg.msg.c1().rrc_conn_reest().crit_exts.set_c1().set_rrc_conn_reest_r8();
rr_cfg = &dl_ccch_msg.msg.c1().rrc_conn_reest().crit_exts.c1().rrc_conn_reest_r8().rr_cfg_ded;
}
@ -1445,8 +1424,7 @@ void rrc::ue::send_connection_setup(bool is_setup)
// mac-MainConfig
rr_cfg->mac_main_cfg_present = true;
rr_cfg->mac_main_cfg.set(rr_cfg_ded_s::mac_main_cfg_c_::types::explicit_value);
mac_main_cfg_s* mac_cfg = &rr_cfg->mac_main_cfg.explicit_value();
mac_main_cfg_s* mac_cfg = &rr_cfg->mac_main_cfg.set_explicit_value();
mac_cfg->ul_sch_cfg_present = true;
mac_cfg->ul_sch_cfg = parent->cfg.mac_cnfg.ul_sch_cfg;
mac_cfg->phr_cfg_present = true;
@ -1459,12 +1437,12 @@ void rrc::ue::send_connection_setup(bool is_setup)
phy_cfg->pusch_cfg_ded_present = true;
phy_cfg->pusch_cfg_ded = parent->cfg.pusch_cfg;
phy_cfg->sched_request_cfg_present = true;
phy_cfg->sched_request_cfg.set(sched_request_cfg_c::types::setup);
phy_cfg->sched_request_cfg.set_setup();
phy_cfg->sched_request_cfg.setup().dsr_trans_max = parent->cfg.sr_cfg.dsr_max;
// set default antenna config
phy_cfg->ant_info_present = true;
phy_cfg->ant_info.set(phys_cfg_ded_s::ant_info_c_::types::explicit_value);
phy_cfg->ant_info.set_explicit_value();
if (parent->cfg.cell.nof_ports == 1) {
phy_cfg->ant_info.explicit_value().tx_mode.value = ant_info_ded_s::tx_mode_e_::tm1;
} else {
@ -1503,7 +1481,7 @@ void rrc::ue::send_connection_setup(bool is_setup)
phy_cfg->cqi_report_cfg.cqi_report_mode_aperiodic = cqi_report_mode_aperiodic_e::rm30;
} else {
phy_cfg->cqi_report_cfg.cqi_report_periodic_present = true;
phy_cfg->cqi_report_cfg.cqi_report_periodic.set(setup_e::setup);
phy_cfg->cqi_report_cfg.cqi_report_periodic.set_setup();
phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().cqi_format_ind_periodic.set(
cqi_report_periodic_c::setup_s_::cqi_format_ind_periodic_c_::types::wideband_cqi);
phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().simul_ack_nack_and_cqi = false;
@ -1579,12 +1557,9 @@ void rrc::ue::send_connection_reest()
void rrc::ue::send_connection_release()
{
dl_dcch_msg_s dl_dcch_msg;
dl_dcch_msg.msg.set(dl_dcch_msg_type_c::types::c1);
dl_dcch_msg.msg.c1().set(dl_dcch_msg_type_c::c1_c_::types::rrc_conn_release);
dl_dcch_msg.msg.set_c1().set_rrc_conn_release();
dl_dcch_msg.msg.c1().rrc_conn_release().rrc_transaction_id = (uint8_t)((transaction_id++) % 4);
dl_dcch_msg.msg.c1().rrc_conn_release().crit_exts.set(rrc_conn_release_s::crit_exts_c_::types::c1);
dl_dcch_msg.msg.c1().rrc_conn_release().crit_exts.c1().set(
rrc_conn_release_s::crit_exts_c_::c1_c_::types::rrc_conn_release_r8);
dl_dcch_msg.msg.c1().rrc_conn_release().crit_exts.set_c1().set_rrc_conn_release_r8();
dl_dcch_msg.msg.c1().rrc_conn_release().crit_exts.c1().rrc_conn_release_r8().release_cause = release_cause_e::other;
send_dl_dcch(&dl_dcch_msg);
@ -1630,12 +1605,9 @@ int rrc::ue::get_drbid_config(drb_to_add_mod_s* drb, int drb_id)
void rrc::ue::send_connection_reconf_upd(srslte::byte_buffer_t *pdu)
{
dl_dcch_msg_s dl_dcch_msg;
dl_dcch_msg.msg.set(dl_dcch_msg_type_c::types::c1);
dl_dcch_msg.msg.c1().set(dl_dcch_msg_type_c::c1_c_::types::rrc_conn_recfg);
rrc_conn_recfg_s* rrc_conn_recfg = &dl_dcch_msg.msg.c1().rrc_conn_recfg();
rrc_conn_recfg_s* rrc_conn_recfg = &dl_dcch_msg.msg.set_c1().set_rrc_conn_recfg();
rrc_conn_recfg->rrc_transaction_id = (uint8_t)((transaction_id++) % 4);
rrc_conn_recfg->crit_exts.set(rrc_conn_recfg_s::crit_exts_c_::types::c1);
rrc_conn_recfg->crit_exts.c1().set(rrc_conn_recfg_s::crit_exts_c_::c1_c_::types::rrc_conn_recfg_r8);
rrc_conn_recfg->crit_exts.set_c1().set_rrc_conn_recfg_r8();
rrc_conn_recfg->crit_exts.c1().rrc_conn_recfg_r8().rr_cfg_ded_present = true;
rr_cfg_ded_s* rr_cfg = &rrc_conn_recfg->crit_exts.c1().rrc_conn_recfg_r8().rr_cfg_ded;
@ -1643,14 +1615,13 @@ void rrc::ue::send_connection_reconf_upd(srslte::byte_buffer_t *pdu)
rr_cfg->phys_cfg_ded_present = true;
phys_cfg_ded_s* phy_cfg = &rr_cfg->phys_cfg_ded;
phy_cfg->sched_request_cfg_present = true;
phy_cfg->sched_request_cfg.set(sched_request_cfg_c::types::setup);
phy_cfg->sched_request_cfg.set_setup();
phy_cfg->sched_request_cfg.setup().dsr_trans_max = parent->cfg.sr_cfg.dsr_max;
phy_cfg->cqi_report_cfg_present = true;
if (cqi_allocated) {
phy_cfg->cqi_report_cfg.cqi_report_periodic_present = true;
phy_cfg->cqi_report_cfg.cqi_report_periodic.set(cqi_report_periodic_c::types::setup);
phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().cqi_format_ind_periodic.set(
phy_cfg->cqi_report_cfg.cqi_report_periodic.set_setup().cqi_format_ind_periodic.set(
cqi_report_periodic_c::setup_s_::cqi_format_ind_periodic_c_::types::wideband_cqi);
cqi_get(&phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().cqi_pmi_cfg_idx,
&phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().cqi_pucch_res_idx);
@ -1685,12 +1656,8 @@ void rrc::ue::send_connection_reconf_upd(srslte::byte_buffer_t *pdu)
void rrc::ue::send_connection_reconf(srslte::byte_buffer_t *pdu)
{
dl_dcch_msg_s dl_dcch_msg;
dl_dcch_msg.msg.set(dl_dcch_msg_type_c::types::c1);
dl_dcch_msg.msg.c1().set(dl_dcch_msg_type_c::c1_c_::types::rrc_conn_recfg);
dl_dcch_msg.msg.set_c1().set_rrc_conn_recfg().crit_exts.set_c1().set_rrc_conn_recfg_r8();
dl_dcch_msg.msg.c1().rrc_conn_recfg().rrc_transaction_id = (uint8_t)((transaction_id++) % 4);
dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.set(rrc_conn_recfg_s::crit_exts_c_::types::c1);
dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().set(
rrc_conn_recfg_s::crit_exts_c_::c1_c_::types::rrc_conn_recfg_r8);
rrc_conn_recfg_r8_ies_s* conn_reconf = &dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8();
conn_reconf->rr_cfg_ded_present = true;
@ -1714,7 +1681,7 @@ void rrc::ue::send_connection_reconf(srslte::byte_buffer_t *pdu)
}
} else {
phy_cfg->cqi_report_cfg.cqi_report_periodic_present = true;
phy_cfg->cqi_report_cfg.cqi_report_periodic.set(cqi_report_periodic_c::types::setup);
phy_cfg->cqi_report_cfg.cqi_report_periodic.set_setup();
cqi_get(&phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().cqi_pmi_cfg_idx,
&phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().cqi_pucch_res_idx);
phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().cqi_format_ind_periodic.set(
@ -1723,7 +1690,7 @@ void rrc::ue::send_connection_reconf(srslte::byte_buffer_t *pdu)
if (phy_cfg->ant_info_present and
((phy_cfg->ant_info.explicit_value().tx_mode == ant_info_ded_s::tx_mode_e_::tm3) ||
(phy_cfg->ant_info.explicit_value().tx_mode == ant_info_ded_s::tx_mode_e_::tm4))) {
phy_cfg->cqi_report_cfg.cqi_report_periodic.set(cqi_report_periodic_c::types::setup);
phy_cfg->cqi_report_cfg.cqi_report_periodic.set_setup();
phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().ri_cfg_idx_present = true;
phy_cfg->cqi_report_cfg.cqi_report_periodic.setup().ri_cfg_idx = 483;
parent->rrc_log->console("\nWarning: Only 1 user is supported in TM3 and TM4\n\n");
@ -1824,13 +1791,8 @@ void rrc::ue::send_connection_reconf_new_bearer(LIBLTE_S1AP_E_RABTOBESETUPLISTBE
srslte::byte_buffer_t *pdu = pool_allocate;
dl_dcch_msg_s dl_dcch_msg;
dl_dcch_msg.msg.set(dl_dcch_msg_type_c::types::c1);
dl_dcch_msg.msg.c1().set(dl_dcch_msg_type_c::c1_c_::types::rrc_conn_recfg);
dl_dcch_msg.msg.set_c1().set_rrc_conn_recfg().crit_exts.set_c1().set_rrc_conn_recfg_r8();
dl_dcch_msg.msg.c1().rrc_conn_recfg().rrc_transaction_id = (uint8_t)((transaction_id++) % 4);
dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.set(rrc_conn_recfg_s::crit_exts_c_::types::c1);
dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().set(
rrc_conn_recfg_s::crit_exts_c_::c1_c_::types::rrc_conn_recfg_r8);
rrc_conn_recfg_r8_ies_s* conn_reconf = &dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8();
for(uint32_t i=0; i<e->len; i++) {
@ -1879,15 +1841,11 @@ void rrc::ue::send_connection_reconf_new_bearer(LIBLTE_S1AP_E_RABTOBESETUPLISTBE
void rrc::ue::send_security_mode_command()
{
dl_dcch_msg_s dl_dcch_msg;
dl_dcch_msg.msg.set(dl_dcch_msg_type_c::types::c1);
dl_dcch_msg.msg.c1().set(dl_dcch_msg_type_c::c1_c_::types::security_mode_cmd);
security_mode_cmd_s* comm = &dl_dcch_msg.msg.c1().security_mode_cmd();
security_mode_cmd_s* comm = &dl_dcch_msg.msg.set_c1().set_security_mode_cmd();
comm->rrc_transaction_id = (uint8_t)((transaction_id++) % 4);
// TODO: select these based on UE capabilities and preference order
comm->crit_exts.set(security_mode_cmd_s::crit_exts_c_::types::c1);
comm->crit_exts.c1().set(security_mode_cmd_s::crit_exts_c_::c1_c_::types::security_mode_cmd_r8);
comm->crit_exts.set_c1().set_security_mode_cmd_r8();
comm->crit_exts.c1().security_mode_cmd_r8().security_cfg_smc.security_algorithm_cfg.ciphering_algorithm =
(ciphering_algorithm_r12_e::options)cipher_algo;
comm->crit_exts.c1().security_mode_cmd_r8().security_cfg_smc.security_algorithm_cfg.integrity_prot_algorithm =
@ -1899,14 +1857,11 @@ void rrc::ue::send_security_mode_command()
void rrc::ue::send_ue_cap_enquiry()
{
dl_dcch_msg_s dl_dcch_msg;
dl_dcch_msg.msg.set(dl_dcch_msg_type_c::types::c1);
dl_dcch_msg.msg.c1().set(dl_dcch_msg_type_c::c1_c_::types::ue_cap_enquiry);
dl_dcch_msg.msg.set_c1().set_ue_cap_enquiry().crit_exts.set_c1().set_ue_cap_enquiry_r8();
ue_cap_enquiry_s* enq = &dl_dcch_msg.msg.c1().ue_cap_enquiry();
enq->rrc_transaction_id = (uint8_t)((transaction_id++) % 4);
enq->crit_exts.set(ue_cap_enquiry_s::crit_exts_c_::types::c1);
enq->crit_exts.c1().set(ue_cap_enquiry_s::crit_exts_c_::c1_c_::types::ue_cap_enquiry_r8);
enq->crit_exts.c1().ue_cap_enquiry_r8().ue_cap_request.resize(1);
enq->crit_exts.c1().ue_cap_enquiry_r8().ue_cap_request[0].value = rat_type_e::eutra;
@ -1968,7 +1923,7 @@ bool rrc::ue::select_security_algorithms()
enc_algo_found = false;
break;
}
if (enc_algo_found == true) {
if (enc_algo_found) {
break;
}
}
@ -2004,12 +1959,12 @@ bool rrc::ue::select_security_algorithms()
break;
}
if (integ_algo_found == true) {
if (integ_algo_found) {
break;
}
}
if (integ_algo_found == false || enc_algo_found == false) {
if (not integ_algo_found || not enc_algo_found) {
// TODO: if no security algorithm found abort radio connection and issue
// encryption-and-or-integrity-protection-algorithms-not-supported message
parent->rrc_log->error("Did not find a matching integrity or encryption algorithm with the UE\n");

View File

@ -1291,17 +1291,14 @@ void rrc::send_con_request(asn1::rrc::establishment_cause_e cause)
// Prepare ConnectionRequest packet
ul_ccch_msg_s ul_ccch_msg;
ul_ccch_msg.msg.set(asn1::rrc::ul_ccch_msg_type_c::types::c1);
ul_ccch_msg.msg.c1().set(asn1::rrc::ul_ccch_msg_type_c::c1_c_::types::rrc_conn_request);
ul_ccch_msg.msg.c1().rrc_conn_request().crit_exts.set(
asn1::rrc::rrc_conn_request_s::crit_exts_c_::types::rrc_conn_request_r8);
rrc_conn_request_r8_ies_s* rrc_conn_req = &ul_ccch_msg.msg.c1().rrc_conn_request().crit_exts.rrc_conn_request_r8();
rrc_conn_request_r8_ies_s* rrc_conn_req =
&ul_ccch_msg.msg.set_c1().set_rrc_conn_request().crit_exts.set_rrc_conn_request_r8();
if (ue_identity_configured) {
rrc_conn_req->ue_id.set(asn1::rrc::init_ue_id_c::types::s_tmsi);
rrc_conn_req->ue_id.set_s_tmsi();
rrc_conn_req->ue_id.s_tmsi() = ue_identity;
} else {
rrc_conn_req->ue_id.set(asn1::rrc::init_ue_id_c::types::random_value);
rrc_conn_req->ue_id.set_random_value();
// TODO use proper RNG
uint64_t random_id = 0;
for (uint i = 0; i < 5; i++) { // fill random ID bytewise, 40 bits = 5 bytes
@ -1377,12 +1374,8 @@ void rrc::send_con_restablish_request(asn1::rrc::reest_cause_e cause)
// Prepare ConnectionRestalishmentRequest packet
asn1::rrc::ul_ccch_msg_s ul_ccch_msg;
ul_ccch_msg.msg.set(asn1::rrc::ul_ccch_msg_type_c::types::c1);
ul_ccch_msg.msg.c1().set(asn1::rrc::ul_ccch_msg_type_c::c1_c_::types::rrc_conn_reest_request);
ul_ccch_msg.msg.c1().rrc_conn_reest_request().crit_exts.set(
asn1::rrc::rrc_conn_reest_request_s::crit_exts_c_::types::rrc_conn_reest_request_r8);
rrc_conn_reest_request_r8_ies_s* rrc_conn_reest_req =
&ul_ccch_msg.msg.c1().rrc_conn_reest_request().crit_exts.rrc_conn_reest_request_r8();
&ul_ccch_msg.msg.set_c1().set_rrc_conn_reest_request().crit_exts.set_rrc_conn_reest_request_r8();
rrc_conn_reest_req->ue_id.c_rnti.from_number(crnti);
rrc_conn_reest_req->ue_id.pci = pci;
@ -1434,11 +1427,7 @@ void rrc::send_con_restablish_complete() {
// Prepare ConnectionSetupComplete packet
asn1::rrc::ul_dcch_msg_s ul_dcch_msg;
ul_dcch_msg.msg.set(asn1::rrc::ul_dcch_msg_type_c::types::c1);
ul_dcch_msg.msg.c1().set(asn1::rrc::ul_dcch_msg_type_c::c1_c_::types::rrc_conn_reest_complete);
ul_dcch_msg.msg.c1().rrc_conn_reest_complete().crit_exts.set(
asn1::rrc::rrc_conn_reest_complete_s::crit_exts_c_::types::rrc_conn_reest_complete_r8);
ul_dcch_msg.msg.set_c1().set_rrc_conn_reest_complete().crit_exts.set_rrc_conn_reest_complete_r8();
ul_dcch_msg.msg.c1().rrc_conn_reest_complete().rrc_transaction_id = transaction_id;
send_ul_dcch_msg(RB_ID_SRB1, ul_dcch_msg);
@ -1449,14 +1438,8 @@ void rrc::send_con_setup_complete(byte_buffer_t *nas_msg) {
// Prepare ConnectionSetupComplete packet
asn1::rrc::ul_dcch_msg_s ul_dcch_msg;
ul_dcch_msg.msg.set(asn1::rrc::ul_dcch_msg_type_c::types::c1);
ul_dcch_msg.msg.c1().set(asn1::rrc::ul_dcch_msg_type_c::c1_c_::types::rrc_conn_setup_complete);
ul_dcch_msg.msg.c1().rrc_conn_setup_complete().crit_exts.set(
asn1::rrc::rrc_conn_setup_complete_s::crit_exts_c_::types::c1);
ul_dcch_msg.msg.c1().rrc_conn_setup_complete().crit_exts.c1().set(
asn1::rrc::rrc_conn_setup_complete_s::crit_exts_c_::c1_c_::types::rrc_conn_setup_complete_r8);
rrc_conn_setup_complete_r8_ies_s* rrc_conn_setup_complete =
&ul_dcch_msg.msg.c1().rrc_conn_setup_complete().crit_exts.c1().rrc_conn_setup_complete_r8();
&ul_dcch_msg.msg.set_c1().set_rrc_conn_setup_complete().crit_exts.set_c1().set_rrc_conn_setup_complete_r8();
ul_dcch_msg.msg.c1().rrc_conn_setup_complete().rrc_transaction_id = transaction_id;
@ -1474,15 +1457,10 @@ void rrc::send_ul_info_transfer(byte_buffer_t* nas_msg)
// Prepare UL INFO packet
asn1::rrc::ul_dcch_msg_s ul_dcch_msg;
ul_dcch_msg.msg.set(asn1::rrc::ul_dcch_msg_type_c::types::c1);
ul_dcch_msg.msg.c1().set(asn1::rrc::ul_dcch_msg_type_c::c1_c_::types::ul_info_transfer);
ul_dcch_msg.msg.c1().ul_info_transfer().crit_exts.set(asn1::rrc::ul_info_transfer_s::crit_exts_c_::types::c1);
ul_dcch_msg.msg.c1().ul_info_transfer().crit_exts.c1().set(
asn1::rrc::ul_info_transfer_s::crit_exts_c_::c1_c_::types::ul_info_transfer_r8);
ul_info_transfer_r8_ies_s* rrc_ul_info_transfer =
&ul_dcch_msg.msg.c1().ul_info_transfer().crit_exts.c1().ul_info_transfer_r8();
&ul_dcch_msg.msg.set_c1().set_ul_info_transfer().crit_exts.set_c1().set_ul_info_transfer_r8();
rrc_ul_info_transfer->ded_info_type.set(asn1::rrc::ul_info_transfer_r8_ies_s::ded_info_type_c_::types::ded_info_nas);
rrc_ul_info_transfer->ded_info_type.set_ded_info_nas();
rrc_ul_info_transfer->ded_info_type.ded_info_nas().resize(nas_msg->N_bytes);
memcpy(rrc_ul_info_transfer->ded_info_type.ded_info_nas().data(), nas_msg->msg, nas_msg->N_bytes); // TODO Check!
@ -1496,11 +1474,7 @@ void rrc::send_security_mode_complete() {
// Prepare Security Mode Command Complete
asn1::rrc::ul_dcch_msg_s ul_dcch_msg;
ul_dcch_msg.msg.set(asn1::rrc::ul_dcch_msg_type_c::types::c1);
ul_dcch_msg.msg.c1().set(asn1::rrc::ul_dcch_msg_type_c::c1_c_::types::security_mode_complete);
ul_dcch_msg.msg.c1().security_mode_complete().crit_exts.set(
asn1::rrc::security_mode_complete_s::crit_exts_c_::types::security_mode_complete_r8);
ul_dcch_msg.msg.set_c1().set_security_mode_complete().crit_exts.set_security_mode_complete_r8();
ul_dcch_msg.msg.c1().security_mode_complete().rrc_transaction_id = transaction_id;
send_ul_dcch_msg(RB_ID_SRB1, ul_dcch_msg);
@ -1510,11 +1484,7 @@ void rrc::send_rrc_con_reconfig_complete() {
rrc_log->debug("Preparing RRC Connection Reconfig Complete\n");
asn1::rrc::ul_dcch_msg_s ul_dcch_msg;
ul_dcch_msg.msg.set(asn1::rrc::ul_dcch_msg_type_c::types::c1);
ul_dcch_msg.msg.c1().set(asn1::rrc::ul_dcch_msg_type_c::c1_c_::types::rrc_conn_recfg_complete);
ul_dcch_msg.msg.c1().rrc_conn_recfg_complete().crit_exts.set(
asn1::rrc::rrc_conn_recfg_complete_s::crit_exts_c_::types::rrc_conn_recfg_complete_r8);
ul_dcch_msg.msg.set_c1().set_rrc_conn_recfg_complete().crit_exts.set_rrc_conn_recfg_complete_r8();
ul_dcch_msg.msg.c1().rrc_conn_recfg_complete().rrc_transaction_id = transaction_id;
send_ul_dcch_msg(RB_ID_SRB1, ul_dcch_msg);
@ -2323,13 +2293,9 @@ void rrc::send_rrc_ue_cap_info()
rrc_log->debug("Preparing UE Capability Info\n");
asn1::rrc::ul_dcch_msg_s ul_dcch_msg;
ul_dcch_msg.msg.set(ul_dcch_msg_type_c::types::c1);
ul_dcch_msg.msg.c1().set(ul_dcch_msg_type_c::c1_c_::types::ue_cap_info);
ue_cap_info_r8_ies_s* info = &ul_dcch_msg.msg.set_c1().set_ue_cap_info().crit_exts.set_c1().set_ue_cap_info_r8();
ul_dcch_msg.msg.c1().ue_cap_info().rrc_transaction_id = transaction_id;
ul_dcch_msg.msg.c1().ue_cap_info().crit_exts.set(ue_cap_info_s::crit_exts_c_::types::c1);
ul_dcch_msg.msg.c1().ue_cap_info().crit_exts.c1().set(ue_cap_info_s::crit_exts_c_::c1_c_::types::ue_cap_info_r8);
ue_cap_info_r8_ies_s* info = &ul_dcch_msg.msg.c1().ue_cap_info().crit_exts.c1().ue_cap_info_r8();
info->ue_cap_rat_container_list.resize(1);
info->ue_cap_rat_container_list[0].rat_type = rat_type_e::eutra;
@ -2670,7 +2636,7 @@ void rrc::set_phy_config_dedicated_default()
current_cfg->srs_ul_cfg_ded.set(setup_e::release);
current_cfg->ant_info_present = true;
current_cfg->ant_info.set(phys_cfg_ded_s::ant_info_c_::types::explicit_value);
current_cfg->ant_info.set_explicit_value();
current_cfg->ant_info.explicit_value().tx_mode = ant_info_ded_s::tx_mode_e_::tm1;
current_cfg->ant_info.explicit_value().codebook_subset_restrict_present = false;
current_cfg->ant_info.explicit_value().ue_tx_ant_sel.set(setup_e::release);
@ -3214,10 +3180,7 @@ bool rrc::rrc_meas::find_earfcn_cell(uint32_t earfcn, uint32_t pci, meas_obj_t *
void rrc::rrc_meas::generate_report(uint32_t meas_id)
{
asn1::rrc::ul_dcch_msg_s ul_dcch_msg;
ul_dcch_msg.msg.set(ul_dcch_msg_type_c::types::c1);
ul_dcch_msg.msg.c1().set(ul_dcch_msg_type_c::c1_c_::types::meas_report);
ul_dcch_msg.msg.c1().meas_report().crit_exts.set(meas_report_s::crit_exts_c_::types::c1);
ul_dcch_msg.msg.c1().meas_report().crit_exts.c1().set(meas_report_s::crit_exts_c_::c1_c_::types::meas_report_r8);
ul_dcch_msg.msg.set_c1().set_meas_report().crit_exts.set_c1().set_meas_report_r8();
meas_results_s* report = &ul_dcch_msg.msg.c1().meas_report().crit_exts.c1().meas_report_r8().meas_results;
meas_t *m = &active[meas_id];
@ -3230,22 +3193,23 @@ void rrc::rrc_meas::generate_report(uint32_t meas_id)
log_h->info("MEAS: Generate report MeasId=%d, nof_reports_send=%d, Pcell rsrp=%f rsrq=%f\n",
report->meas_id, m->nof_reports_sent, pcell_measurement.ms[RSRP], pcell_measurement.ms[RSRQ]);
report->meas_result_neigh_cells.set(meas_results_s::meas_result_neigh_cells_c_::types::meas_result_list_eutra);
meas_result_list_eutra_l& neigh_list = report->meas_result_neigh_cells.meas_result_list_eutra();
meas_result_list_eutra_l& neigh_list = report->meas_result_neigh_cells.set_meas_result_list_eutra();
// TODO: report up to 8 best cells
for (std::map<uint32_t, meas_value_t>::iterator cell = m->cell_values.begin(); cell != m->cell_values.end(); ++cell)
{
if (cell->second.triggered and neigh_list.size() <= 8) {
for (const auto& cell : m->cell_values) {
if (cell.second.triggered and neigh_list.size() <= 8) {
meas_result_eutra_s rc;
rc.pci = (uint16_t)cell->first;
rc.pci = (uint16_t)cell.first;
rc.meas_result.rsrp_result_present = cfg->report_quantity == RSRP || cfg->report_quantity == BOTH;
rc.meas_result.rsrq_result_present = cfg->report_quantity == RSRQ || cfg->report_quantity == BOTH;
rc.meas_result.rsrp_result = value_to_range(RSRP, cell->second.ms[RSRP]);
rc.meas_result.rsrq_result = value_to_range(RSRQ, cell->second.ms[RSRQ]);
rc.meas_result.rsrp_result = value_to_range(RSRP, cell.second.ms[RSRP]);
rc.meas_result.rsrq_result = value_to_range(RSRQ, cell.second.ms[RSRQ]);
log_h->info("MEAS: Adding to report neighbour=%d, pci=%d, rsrp=%f, rsrq=%f\n", neigh_list.size(), rc.pci,
cell->second.ms[RSRP], cell->second.ms[RSRQ]);
log_h->info("MEAS: Adding to report neighbour=%d, pci=%d, rsrp=%f, rsrq=%f\n",
neigh_list.size(),
rc.pci,
cell.second.ms[RSRP],
cell.second.ms[RSRQ]);
neigh_list.push_back(rc);
}
@ -3695,13 +3659,13 @@ bool rrc::rrc_meas::parse_meas_config(meas_cfg_s* cfg)
void rrc::rrc_meas::update_phy()
{
phy->meas_reset();
for(std::map<uint32_t, meas_obj_t>::iterator iter=objects.begin(); iter!=objects.end(); ++iter) {
meas_obj_t o = iter->second;
for (const auto& obj : objects) {
meas_obj_t o = obj.second;
// Instruct PHY to look for neighbour cells on this frequency
phy->meas_start(o.earfcn);
for(std::map<uint32_t, meas_cell_t>::iterator iter=o.meas_cells.begin(); iter!=o.meas_cells.end(); ++iter) {
for (const auto& cell : o.meas_cells) {
// Instruct PHY to look for cells IDs on this frequency
phy->meas_start(o.earfcn, iter->second.pci);
phy->meas_start(o.earfcn, cell.second.pci);
}
}
}