|
|
@ -503,6 +503,10 @@ uint16_t rrc::enb_mobility_handler::start_ho_ue_resource_alloc(
|
|
|
|
|
|
|
|
|
|
|
|
// Register new user in RRC
|
|
|
|
// Register new user in RRC
|
|
|
|
rrc_ptr->add_user(rnti, ue_cfg);
|
|
|
|
rrc_ptr->add_user(rnti, ue_cfg);
|
|
|
|
|
|
|
|
auto it = rrc_ptr->users.find(rnti);
|
|
|
|
|
|
|
|
ue* ue_ptr = it->second.get();
|
|
|
|
|
|
|
|
// Reset activity timer (Response is not expected)
|
|
|
|
|
|
|
|
ue_ptr->set_activity_timeout(ue::UE_INACTIVITY_TIMEOUT);
|
|
|
|
|
|
|
|
|
|
|
|
// /* Setup e-RABs & DRBs / establish an UL/DL S1 bearer to the S-GW */
|
|
|
|
// /* Setup e-RABs & DRBs / establish an UL/DL S1 bearer to the S-GW */
|
|
|
|
// if (not setup_ue_erabs(rnti, msg)) {
|
|
|
|
// if (not setup_ue_erabs(rnti, msg)) {
|
|
|
@ -511,12 +515,6 @@ uint16_t rrc::enb_mobility_handler::start_ho_ue_resource_alloc(
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: KeNB derivations
|
|
|
|
// TODO: KeNB derivations
|
|
|
|
|
|
|
|
|
|
|
|
auto it = rrc_ptr->users.find(rnti);
|
|
|
|
|
|
|
|
if (it == rrc_ptr->users.end()) {
|
|
|
|
|
|
|
|
rrc_ptr->rrc_log->error("Did not find rnti=0x%x in ue_db\n", rnti);
|
|
|
|
|
|
|
|
return SRSLTE_INVALID_RNTI;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ue* ue_ptr = it->second.get();
|
|
|
|
|
|
|
|
if (not ue_ptr->mobility_handler->start_s1_tenb_ho(msg, container, ho_cmd, admitted_erabs)) {
|
|
|
|
if (not ue_ptr->mobility_handler->start_s1_tenb_ho(msg, container, ho_cmd, admitted_erabs)) {
|
|
|
|
return SRSLTE_INVALID_RNTI;
|
|
|
|
return SRSLTE_INVALID_RNTI;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -684,45 +682,15 @@ bool rrc::ue::rrc_mobility::start_ho_preparation(uint32_t target_eci,
|
|
|
|
// obj->meas_obj.meas_obj_eutra().cells_to_add_mod_list.resize(0);
|
|
|
|
// obj->meas_obj.meas_obj_eutra().cells_to_add_mod_list.resize(0);
|
|
|
|
empty_meascfg.compute_diff_meas_cfg(target_var_meas, &hoprep_r8.as_cfg.source_meas_cfg);
|
|
|
|
empty_meascfg.compute_diff_meas_cfg(target_var_meas, &hoprep_r8.as_cfg.source_meas_cfg);
|
|
|
|
// - fill source RR Config
|
|
|
|
// - fill source RR Config
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.sps_cfg_present = false; // TODO: CHECK
|
|
|
|
rrc_ue->fill_rrc_setup_rr_config_dedicated(&hoprep_r8.as_cfg.source_rr_cfg);
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.mac_main_cfg_present =
|
|
|
|
// Add already established SRBs to the message
|
|
|
|
rrc_ue->last_rrc_conn_recfg.crit_exts.c1().rrc_conn_recfg_r8().rr_cfg_ded.mac_main_cfg_present;
|
|
|
|
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.mac_main_cfg =
|
|
|
|
|
|
|
|
rrc_ue->last_rrc_conn_recfg.crit_exts.c1().rrc_conn_recfg_r8().rr_cfg_ded.mac_main_cfg;
|
|
|
|
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.phys_cfg_ded_present =
|
|
|
|
|
|
|
|
rrc_ue->last_rrc_conn_recfg.crit_exts.c1().rrc_conn_recfg_r8().rr_cfg_ded.phys_cfg_ded_present;
|
|
|
|
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.phys_cfg_ded =
|
|
|
|
|
|
|
|
rrc_ue->last_rrc_conn_recfg.crit_exts.c1().rrc_conn_recfg_r8().rr_cfg_ded.phys_cfg_ded;
|
|
|
|
|
|
|
|
// Add SRBs to the message
|
|
|
|
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.srb_to_add_mod_list_present = true;
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.srb_to_add_mod_list_present = true;
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.srb_to_add_mod_list = rrc_ue->bearer_list.get_established_srbs();
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.srb_to_add_mod_list = rrc_ue->bearer_list.get_established_srbs();
|
|
|
|
// hoprep_r8.as_cfg.source_rr_cfg.srb_to_add_mod_list_present = true;
|
|
|
|
// Get DRBs configuration
|
|
|
|
// asn1::rrc::srb_to_add_mod_list_l& srb_list = hoprep_r8.as_cfg.source_rr_cfg.srb_to_add_mod_list;
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.drb_to_add_mod_list = rrc_ue->bearer_list.get_established_drbs();
|
|
|
|
// srb_list.resize(1);
|
|
|
|
|
|
|
|
// srb_list[0].srb_id = 2;
|
|
|
|
|
|
|
|
// srb_list[0].lc_ch_cfg_present = true;
|
|
|
|
|
|
|
|
// srb_list[0].lc_ch_cfg.set(asn1::rrc::srb_to_add_mod_s::lc_ch_cfg_c_::types::default_value);
|
|
|
|
|
|
|
|
// srb_list[0].rlc_cfg_present = true;
|
|
|
|
|
|
|
|
// srb_list[0].rlc_cfg.set_explicit_value();
|
|
|
|
|
|
|
|
// auto& am = srb_list[0].rlc_cfg.explicit_value().set_am(); // TODO: Which rlc cfg??? I took from a pcap for now
|
|
|
|
|
|
|
|
// am.ul_am_rlc.t_poll_retx = asn1::rrc::t_poll_retx_e::ms60;
|
|
|
|
|
|
|
|
// am.ul_am_rlc.poll_pdu = asn1::rrc::poll_pdu_e::p_infinity;
|
|
|
|
|
|
|
|
// am.ul_am_rlc.poll_byte.value = asn1::rrc::poll_byte_e::kbinfinity;
|
|
|
|
|
|
|
|
// am.ul_am_rlc.max_retx_thres.value = asn1::rrc::ul_am_rlc_s::max_retx_thres_e_::t32;
|
|
|
|
|
|
|
|
// am.dl_am_rlc.t_reordering.value = asn1::rrc::t_reordering_e::ms45;
|
|
|
|
|
|
|
|
// am.dl_am_rlc.t_status_prohibit.value = asn1::rrc::t_status_prohibit_e::ms0;
|
|
|
|
|
|
|
|
// Get DRB1 configuration
|
|
|
|
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.drb_to_add_mod_list_present =
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.drb_to_add_mod_list_present =
|
|
|
|
rrc_ue->last_rrc_conn_recfg.crit_exts.c1().rrc_conn_recfg_r8().rr_cfg_ded.drb_to_add_mod_list_present;
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.drb_to_add_mod_list.size() > 0;
|
|
|
|
hoprep_r8.as_cfg.source_rr_cfg.drb_to_add_mod_list =
|
|
|
|
// Get security cfg
|
|
|
|
rrc_ue->last_rrc_conn_recfg.crit_exts.c1().rrc_conn_recfg_r8().rr_cfg_ded.drb_to_add_mod_list;
|
|
|
|
|
|
|
|
// hoprep_r8.as_cfg.source_rr_cfg.drb_to_add_mod_list_present = true;
|
|
|
|
|
|
|
|
// asn1::rrc::drb_to_add_mod_list_l& drb_list = hoprep_r8.as_cfg.source_rr_cfg.drb_to_add_mod_list;
|
|
|
|
|
|
|
|
// drb_list.resize(1);
|
|
|
|
|
|
|
|
// rrc_ue->get_drbid_config(&hoprep_r8.as_cfg.source_rr_cfg.drb_to_add_mod_list[0], 1);
|
|
|
|
|
|
|
|
// hoprep_r8.as_cfg.source_rr_cfg.drb_to_release_list_present = true;
|
|
|
|
|
|
|
|
// hoprep_r8.as_cfg.source_rr_cfg.drb_to_release_list.resize(1);
|
|
|
|
|
|
|
|
// hoprep_r8.as_cfg.source_rr_cfg.drb_to_release_list[0] = 1;
|
|
|
|
|
|
|
|
hoprep_r8.as_cfg.source_security_algorithm_cfg = rrc_ue->ue_security_cfg.get_security_algorithm_cfg();
|
|
|
|
hoprep_r8.as_cfg.source_security_algorithm_cfg = rrc_ue->ue_security_cfg.get_security_algorithm_cfg();
|
|
|
|
hoprep_r8.as_cfg.source_ue_id.from_number(rrc_ue->rnti);
|
|
|
|
hoprep_r8.as_cfg.source_ue_id.from_number(rrc_ue->rnti);
|
|
|
|
asn1::number_to_enum(hoprep_r8.as_cfg.source_mib.dl_bw, rrc_enb->cfg.cell.nof_prb);
|
|
|
|
asn1::number_to_enum(hoprep_r8.as_cfg.source_mib.dl_bw, rrc_enb->cfg.cell.nof_prb);
|
|
|
@ -1111,15 +1079,18 @@ void rrc::ue::rrc_mobility::s1_target_ho_st::enter(rrc_mobility* f, const ho_req
|
|
|
|
if (erab.ext) {
|
|
|
|
if (erab.ext) {
|
|
|
|
f->log_h->warning("Not handling E-RABToBeSetupList extensions\n");
|
|
|
|
f->log_h->warning("Not handling E-RABToBeSetupList extensions\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (erab.ie_exts_present) {
|
|
|
|
|
|
|
|
f->log_h->warning("Not handling E-RABToBeSetupList extensions\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (erab.transport_layer_address.length() > 32) {
|
|
|
|
if (erab.transport_layer_address.length() > 32) {
|
|
|
|
f->log_h->error("IPv6 addresses not currently supported\n");
|
|
|
|
f->log_h->error("IPv6 addresses not currently supported\n");
|
|
|
|
f->trigger(srslte::failure_ev{});
|
|
|
|
f->trigger(srslte::failure_ev{});
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (not erab.ie_exts_present or not erab.ie_exts.data_forwarding_not_possible_present or
|
|
|
|
|
|
|
|
erab.ie_exts.data_forwarding_not_possible.ext.value !=
|
|
|
|
|
|
|
|
asn1::s1ap::data_forwarding_not_possible_opts::data_forwarding_not_possible) {
|
|
|
|
|
|
|
|
f->log_h->warning("Data Forwarding of E-RABs not supported\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t teid_out;
|
|
|
|
uint32_t teid_out;
|
|
|
|
srslte::uint8_to_uint32(erab.gtp_teid.data(), &teid_out);
|
|
|
|
srslte::uint8_to_uint32(erab.gtp_teid.data(), &teid_out);
|
|
|
|
f->rrc_ue->bearer_list.add_erab(
|
|
|
|
f->rrc_ue->bearer_list.add_erab(
|
|
|
|