extended mobility test

master
Francisco Paisana 5 years ago committed by Francisco Paisana
parent 427fdb83fe
commit b6b1dd1814

@ -46,11 +46,7 @@ struct rrc_cfg_sr_t {
uint32_t nof_subframes;
};
typedef enum {
RRC_CFG_CQI_MODE_PERIODIC = 0,
RRC_CFG_CQI_MODE_APERIODIC,
RRC_CFG_CQI_MODE_N_ITEMS
} rrc_cfg_cqi_mode_t;
typedef enum { RRC_CFG_CQI_MODE_PERIODIC = 0, RRC_CFG_CQI_MODE_APERIODIC, RRC_CFG_CQI_MODE_N_ITEMS } rrc_cfg_cqi_mode_t;
static const char rrc_cfg_cqi_mode_text[RRC_CFG_CQI_MODE_N_ITEMS][20] = {"periodic", "aperiodic"};
@ -61,8 +57,8 @@ typedef struct {
uint32_t period;
uint32_t m_ri;
bool simultaneousAckCQI;
rrc_cfg_cqi_mode_t mode;
} rrc_cfg_cqi_t;
rrc_cfg_cqi_mode_t mode;
} rrc_cfg_cqi_t;
typedef struct {
bool configured;
@ -97,12 +93,12 @@ struct rrc_cfg_t {
asn1::rrc::sib_info_item_c sibs[ASN1_RRC_MAX_SIB];
asn1::rrc::mac_main_cfg_s mac_cnfg;
asn1::rrc::pusch_cfg_ded_s pusch_cfg;
asn1::rrc::ant_info_ded_s antenna_info;
asn1::rrc::pdsch_cfg_ded_s::p_a_e_ pdsch_cfg;
rrc_cfg_sr_t sr_cfg;
rrc_cfg_cqi_t cqi_cfg;
rrc_cfg_qci_t qci_cfg[MAX_NOF_QCI];
asn1::rrc::pusch_cfg_ded_s pusch_cfg;
asn1::rrc::ant_info_ded_s antenna_info;
asn1::rrc::pdsch_cfg_ded_s::p_a_e_ pdsch_cfg;
rrc_cfg_sr_t sr_cfg;
rrc_cfg_cqi_t cqi_cfg;
rrc_cfg_qci_t qci_cfg[MAX_NOF_QCI];
srslte_cell_t cell;
bool enable_mbsfn;
uint32_t inactivity_timeout_ms;
@ -122,11 +118,11 @@ static const char rrc_state_text[RRC_STATE_N_ITEMS][100] = {"IDLE",
"RRC CONNECTED",
"RELEASE REQUEST"};
class rrc : public rrc_interface_pdcp,
public rrc_interface_mac,
public rrc_interface_rlc,
public rrc_interface_s1ap,
public thread
class rrc final : public rrc_interface_pdcp,
public rrc_interface_mac,
public rrc_interface_rlc,
public rrc_interface_s1ap,
public thread
{
public:
rrc();
@ -141,21 +137,21 @@ public:
gtpu_interface_rrc* gtpu,
srslte::log* log_rrc);
void stop();
void get_metrics(rrc_metrics_t &m);
void stop();
void get_metrics(rrc_metrics_t& m);
// rrc_interface_mac
void rl_failure(uint16_t rnti);
void add_user(uint16_t rnti);
void rl_failure(uint16_t rnti);
void add_user(uint16_t rnti);
void upd_user(uint16_t new_rnti, uint16_t old_rnti);
void set_activity_user(uint16_t rnti);
bool is_paging_opportunity(uint32_t tti, uint32_t *payload_len);
bool is_paging_opportunity(uint32_t tti, uint32_t* payload_len);
// rrc_interface_rlc
void read_pdu_bcch_dlsch(uint32_t sib_idx, uint8_t *payload);
void read_pdu_pcch(uint8_t *payload, uint32_t buffer_size);
void read_pdu_bcch_dlsch(uint32_t sib_idx, uint8_t* payload);
void read_pdu_pcch(uint8_t* payload, uint32_t buffer_size);
void max_retx_attempted(uint16_t rnti);
// rrc_interface_s1ap
void write_dl_info(uint16_t rnti, srslte::unique_byte_buffer_t sdu);
void release_complete(uint16_t rnti);
@ -176,22 +172,24 @@ public:
template <class T>
void log_rrc_message(const std::string& source, direction_t dir, const srslte::byte_buffer_t* pdu, const T& msg);
// Notifier for user connect
class connect_notifier {
// Notifier for user connect
class connect_notifier
{
public:
virtual void user_connected(uint16_t rnti) = 0;
};
void set_connect_notifer(connect_notifier *cnotifier);
virtual void user_connected(uint16_t rnti) = 0;
};
void set_connect_notifer(connect_notifier* cnotifier);
class activity_monitor : public thread
{
public:
activity_monitor(rrc* parent_);
void stop();
activity_monitor(rrc* parent_);
void stop();
private:
rrc* parent;
bool running;
void run_thread();
void run_thread();
};
class ue
@ -215,7 +213,7 @@ public:
void send_connection_release();
void send_connection_reest_rej();
void send_connection_reconf(srslte::unique_byte_buffer_t sdu);
void send_connection_reconf_new_bearer(LIBLTE_S1AP_E_RABTOBESETUPLISTBEARERSUREQ_STRUCT *e);
void send_connection_reconf_new_bearer(LIBLTE_S1AP_E_RABTOBESETUPLISTBEARERSUREQ_STRUCT* e);
void send_connection_reconf_upd(srslte::unique_byte_buffer_t pdu);
void send_security_mode_command();
void send_ue_cap_enquiry();
@ -229,8 +227,8 @@ public:
void handle_security_mode_failure(asn1::rrc::security_mode_fail_s* msg);
bool handle_ue_cap_info(asn1::rrc::ue_cap_info_s* msg);
void set_bitrates(LIBLTE_S1AP_UEAGGREGATEMAXIMUMBITRATE_STRUCT *rates);
void set_security_capabilities(LIBLTE_S1AP_UESECURITYCAPABILITIES_STRUCT *caps);
void set_bitrates(LIBLTE_S1AP_UEAGGREGATEMAXIMUMBITRATE_STRUCT* rates);
void set_security_capabilities(LIBLTE_S1AP_UESECURITYCAPABILITIES_STRUCT* caps);
void set_security_key(uint8_t* key, uint32_t length);
bool setup_erabs(LIBLTE_S1AP_E_RABTOBESETUPLISTCTXTSUREQ_STRUCT* e);
@ -247,7 +245,7 @@ public:
int sr_allocate(uint32_t period, uint8_t* I_sr, uint16_t* N_pucch_sr);
void sr_get(uint8_t* I_sr, uint16_t* N_pucch_sr);
int sr_free();
int sr_free();
int cqi_allocate(uint32_t period, uint16_t* pmi_idx, uint16_t* n_pucch);
void cqi_get(uint16_t* pmi_idx, uint16_t* n_pucch);
@ -276,9 +274,9 @@ public:
std::unique_ptr<rrc_mobility> mobility_handler;
// S-TMSI for this UE
bool has_tmsi;
uint32_t m_tmsi;
uint8_t mmec;
bool has_tmsi;
uint32_t m_tmsi;
uint8_t mmec;
uint32_t rlf_cnt;
uint8_t transaction_id;
@ -287,98 +285,98 @@ public:
std::map<uint32_t, asn1::rrc::srb_to_add_mod_s> srbs;
std::map<uint32_t, asn1::rrc::drb_to_add_mod_s> drbs;
uint8_t k_enb[32]; // Provided by MME
uint8_t k_rrc_enc[32];
uint8_t k_rrc_int[32];
uint8_t k_up_enc[32];
uint8_t k_up_int[32]; // Not used: only for relay nodes (3GPP 33.401 Annex A.7)
uint8_t k_enb[32]; // Provided by MME
uint8_t k_rrc_enc[32];
uint8_t k_rrc_int[32];
uint8_t k_up_enc[32];
uint8_t k_up_int[32]; // Not used: only for relay nodes (3GPP 33.401 Annex A.7)
srslte::CIPHERING_ALGORITHM_ID_ENUM cipher_algo;
srslte::INTEGRITY_ALGORITHM_ID_ENUM integ_algo;
LIBLTE_S1AP_UEAGGREGATEMAXIMUMBITRATE_STRUCT bitrates;
LIBLTE_S1AP_UESECURITYCAPABILITIES_STRUCT security_capabilities;
asn1::rrc::ue_eutra_cap_s eutra_capabilities;
LIBLTE_S1AP_UEAGGREGATEMAXIMUMBITRATE_STRUCT bitrates;
LIBLTE_S1AP_UESECURITYCAPABILITIES_STRUCT security_capabilities;
asn1::rrc::ue_eutra_cap_s eutra_capabilities;
typedef struct {
uint8_t id;
LIBLTE_S1AP_E_RABLEVELQOSPARAMETERS_STRUCT qos_params;
LIBLTE_S1AP_TRANSPORTLAYERADDRESS_STRUCT address;
uint32_t teid_out;
uint32_t teid_in;
}erab_t;
uint8_t id;
LIBLTE_S1AP_E_RABLEVELQOSPARAMETERS_STRUCT qos_params;
LIBLTE_S1AP_TRANSPORTLAYERADDRESS_STRUCT address;
uint32_t teid_out;
uint32_t teid_in;
} erab_t;
std::map<uint8_t, erab_t> erabs;
int sr_sched_sf_idx;
int sr_sched_prb_idx;
bool sr_allocated;
uint32_t sr_N_pucch;
uint32_t sr_I;
uint32_t cqi_pucch;
uint32_t cqi_idx;
bool cqi_allocated;
int cqi_sched_sf_idx;
int cqi_sched_prb_idx;
int sr_sched_sf_idx;
int sr_sched_prb_idx;
bool sr_allocated;
uint32_t sr_N_pucch;
uint32_t sr_I;
uint32_t cqi_pucch;
uint32_t cqi_idx;
bool cqi_allocated;
int cqi_sched_sf_idx;
int cqi_sched_prb_idx;
int get_drbid_config(asn1::rrc::drb_to_add_mod_s* drb, int drbid);
bool nas_pending;
srslte::byte_buffer_t erab_info;
bool nas_pending;
srslte::byte_buffer_t erab_info;
};
private:
std::map<uint16_t,ue> users;
std::map<uint16_t, ue> users;
std::map<uint32_t, LIBLTE_S1AP_UEPAGINGID_STRUCT > pending_paging;
std::map<uint32_t, LIBLTE_S1AP_UEPAGINGID_STRUCT> pending_paging;
activity_monitor act_monitor;
std::vector<srslte::unique_byte_buffer_t> sib_buffer;
// user connect notifier
connect_notifier *cnotifier;
// user connect notifier
connect_notifier* cnotifier;
void process_release_complete(uint16_t rnti);
void process_rl_failure(uint16_t rnti);
void rem_user(uint16_t rnti);
void process_release_complete(uint16_t rnti);
void process_rl_failure(uint16_t rnti);
void rem_user(uint16_t rnti);
uint32_t generate_sibs();
void configure_mbsfn_sibs(asn1::rrc::sib_type2_s* sib2, asn1::rrc::sib_type13_r9_s* sib13);
void config_mac();
void config_mac();
void parse_ul_dcch(uint16_t rnti, uint32_t lcid, srslte::unique_byte_buffer_t pdu);
void parse_ul_ccch(uint16_t rnti, srslte::unique_byte_buffer_t pdu);
void configure_security(uint16_t rnti,
uint32_t lcid,
uint8_t *k_rrc_enc,
uint8_t *k_rrc_int,
uint8_t *k_up_enc,
uint8_t *k_up_int,
srslte::CIPHERING_ALGORITHM_ID_ENUM cipher_algo,
srslte::INTEGRITY_ALGORITHM_ID_ENUM integ_algo);
void enable_integrity(uint16_t rnti, uint32_t lcid);
void enable_encryption(uint16_t rnti, uint32_t lcid);
void configure_security(uint16_t rnti,
uint32_t lcid,
uint8_t* k_rrc_enc,
uint8_t* k_rrc_int,
uint8_t* k_up_enc,
uint8_t* k_up_int,
srslte::CIPHERING_ALGORITHM_ID_ENUM cipher_algo,
srslte::INTEGRITY_ALGORITHM_ID_ENUM integ_algo);
void enable_integrity(uint16_t rnti, uint32_t lcid);
void enable_encryption(uint16_t rnti, uint32_t lcid);
srslte::byte_buffer_pool* pool;
srslte::byte_buffer_t byte_buf_paging;
phy_interface_stack_lte* phy;
mac_interface_rrc* mac;
rlc_interface_rrc* rlc;
pdcp_interface_rrc* pdcp;
gtpu_interface_rrc* gtpu;
s1ap_interface_rrc* s1ap;
srslte::log* rrc_log;
typedef struct{
uint16_t rnti;
uint32_t lcid;
mac_interface_rrc* mac;
rlc_interface_rrc* rlc;
pdcp_interface_rrc* pdcp;
gtpu_interface_rrc* gtpu;
s1ap_interface_rrc* s1ap;
srslte::log* rrc_log;
typedef struct {
uint16_t rnti;
uint32_t lcid;
srslte::unique_byte_buffer_t pdu;
}rrc_pdu;
} rrc_pdu;
const static uint32_t LCID_EXIT = 0xffff0000;
const static uint32_t LCID_REM_USER = 0xffff0001;
const static uint32_t LCID_REL_USER = 0xffff0002;
const static uint32_t LCID_RLF_USER = 0xffff0003;
const static uint32_t LCID_ACT_USER = 0xffff0004;
bool running;
static const int RRC_THREAD_PRIO = 65;
bool running;
static const int RRC_THREAD_PRIO = 65;
srslte::block_queue<rrc_pdu> rx_pdu_queue;
struct sr_sched_t {
@ -397,7 +395,7 @@ private:
class mobility_cfg;
std::unique_ptr<mobility_cfg> enb_mobility_cfg;
void run_thread();
void run_thread() override;
void rem_user_thread(uint16_t rnti);
pthread_mutex_t user_mutex;

@ -64,12 +64,12 @@ private:
class rrc::mobility_cfg
{
public:
explicit mobility_cfg(rrc* outer_rrc);
explicit mobility_cfg(const rrc_cfg_t* cfg_, srslte::log* log_);
std::shared_ptr<const var_meas_cfg_t> current_meas_cfg; ///< const to enable ptr comparison as identity comparison
private:
rrc* rrc_enb = nullptr;
const rrc_cfg_t* cfg = nullptr;
};
class rrc::ue::rrc_mobility

@ -92,7 +92,7 @@ void rrc::init(rrc_cfg_t* cfg_,
nof_si_messages = generate_sibs();
config_mac();
enb_mobility_cfg.reset(new mobility_cfg(this));
enb_mobility_cfg.reset(new mobility_cfg(&cfg, log_rrc));
pthread_mutex_init(&user_mutex, NULL);
pthread_mutex_init(&paging_mutex, NULL);

@ -76,13 +76,30 @@ std::string to_string(const cells_to_add_mod_s& obj)
//! meas field comparison based on ID solely
template <typename T>
struct field_id_cmp {
using IdType = decltype(get_id(T{}));
bool operator()(const T& lhs, const T& rhs) const { return get_id(lhs) < get_id(rhs); }
bool operator()(const T& lhs, IdType id) const { return get_id(lhs) < id; }
template <typename IdType>
bool operator()(const T& lhs, IdType id) const
{
return get_id(lhs) < id;
}
template <typename IdType>
bool operator()(IdType id, const T& rhs) const
{
return id < get_id(rhs);
}
};
using cell_id_cmp = field_id_cmp<cells_to_add_mod_s>;
using meas_obj_id_cmp = field_id_cmp<meas_obj_to_add_mod_s>;
using rep_cfg_id_cmp = field_id_cmp<report_cfg_to_add_mod_s>;
using meas_id_cmp = field_id_cmp<meas_id_to_add_mod_s>;
template <typename Container, typename IdType>
typename Container::iterator binary_find(Container& c, IdType id)
{
using item_type = decltype(*Container{}.begin());
auto it = std::lower_bound(c.begin(), c.end(), id, field_id_cmp<item_type>{});
return (it == c.end() or get_id(*it) != id) ? c.end() : it;
}
//! Find MeasObj with same earfcn
meas_obj_to_add_mod_s* find_meas_obj(meas_obj_to_add_mod_list_l& l, uint32_t earfcn)
@ -107,15 +124,15 @@ find_cell(meas_obj_to_add_mod_list_l& l, uint32_t earfcn, uint8_t cell_id)
// find meas_obj with same earfcn
meas_obj_to_add_mod_s* obj = rrc_details::find_meas_obj(l, earfcn);
if (obj == nullptr) {
return {nullptr, nullptr};
return std::make_pair(obj, (cells_to_add_mod_s*)nullptr);
}
// find cell with same id
auto& cells = obj->meas_obj.meas_obj_eutra().cells_to_add_mod_list;
auto it = std::lower_bound(cells.begin(), cells.end(), cell_id, rrc_details::cell_id_cmp{});
if (it == cells.end() or it->cell_idx != cell_id) {
return {obj, nullptr};
auto it = binary_find(cells, cell_id);
if (it == cells.end()) {
it = nullptr;
}
return {obj, it};
return std::make_pair(obj, it);
}
/**
@ -128,7 +145,7 @@ meas_obj_to_add_mod_s* meascfg_add_meas_obj(meas_cfg_s* meas_cfg, const meas_obj
meas_obj_to_add_mod_list_l& l = meas_cfg->meas_obj_to_add_mod_list;
// search for meas_obj by obj_id to ensure uniqueness (assume sorted)
auto found_it = std::lower_bound(l.begin(), l.end(), meas_obj.meas_obj_id, meas_obj_id_cmp{});
auto found_it = binary_find(l, meas_obj.meas_obj_id);
// TODO: Assert dl_earfcn is the same
if (found_it == l.end()) {
l.push_back({});
@ -196,6 +213,7 @@ private:
const_iterator src_it, src_end, target_it, target_end;
};
//! Find a Gap in Ids in a list of Meas Fields
template <typename Container, typename IdType = decltype(get_id(*Container{}.begin()))>
IdType find_id_gap(const Container& c)
{
@ -512,18 +530,18 @@ void var_meas_cfg_t::compute_diff_meas_ids(const var_meas_cfg_t& target_cfg, asn
* mobility_cfg class
************************************************************************************************/
rrc::mobility_cfg::mobility_cfg(rrc* outer_rrc) : rrc_enb(outer_rrc)
rrc::mobility_cfg::mobility_cfg(const rrc_cfg_t* cfg_, srslte::log* log_) : cfg(cfg_)
{
var_meas_cfg_t var_meas{outer_rrc->rrc_log};
var_meas_cfg_t var_meas{log_};
if (rrc_enb->cfg.meas_cfg_present) {
if (cfg->meas_cfg_present) {
// inserts all neighbor cells
for (meas_cell_cfg_t& meascell : rrc_enb->cfg.meas_cfg.meas_cells) {
for (const meas_cell_cfg_t& meascell : cfg->meas_cfg.meas_cells) {
var_meas.add_cell_cfg(meascell);
}
// insert all report cfgs
for (const report_cfg_eutra_s& reportcfg : rrc_enb->cfg.meas_cfg.meas_reports) {
for (const report_cfg_eutra_s& reportcfg : cfg->meas_cfg.meas_reports) {
var_meas.add_report_cfg(reportcfg);
}

@ -23,4 +23,4 @@ add_executable(plmn_test plmn_test.cc)
target_link_libraries(plmn_test rrc_asn1)
add_executable(rrc_mobility_test rrc_mobility_test.cc)
target_link_libraries(rrc_mobility_test srsenb_rrc rrc_asn1 srslte_common)
target_link_libraries(rrc_mobility_test srsenb_rrc rrc_asn1 srslte_common srslte_asn1)

@ -37,6 +37,22 @@ using namespace asn1::rrc;
srslte::log_filter log_h("ALL");
class mac_dummy : public mac_interface_rrc
{
public:
int cell_cfg(sched_interface::cell_cfg_t* cell_cfg) override { return 0; }
void reset() override {}
int ue_cfg(uint16_t rnti, sched_interface::ue_cfg_t* cfg) override { return 0; }
int ue_rem(uint16_t rnti) override { return 0; }
int bearer_ue_cfg(uint16_t rnti, uint32_t lc_id, sched_interface::ue_bearer_cfg_t* cfg) override { return 0; }
int bearer_ue_rem(uint16_t rnti, uint32_t lc_id) override { return 0; }
int set_dl_ant_info(uint16_t rnti, asn1::rrc::phys_cfg_ded_s::ant_info_c_* dl_ant_info) override { return 0; }
void phy_config_enabled(uint16_t rnti, bool enabled) override {}
void write_mcch(asn1::rrc::sib_type2_s* sib2, asn1::rrc::sib_type13_r9_s* sib13, asn1::rrc::mcch_msg_s* mcch) override
{
}
};
meas_cell_cfg_t generate_cell1()
{
meas_cell_cfg_t cell1{};
@ -244,10 +260,59 @@ int test_correct_meascfg_calculation()
return SRSLTE_SUCCESS;
}
int test_mobility_class()
{
rrc_cfg_t cfg;
cfg.sib1.cell_access_related_info.plmn_id_list.push_back({});
cfg.sib1.cell_access_related_info.plmn_id_list[0].plmn_id.mnc.resize(2);
cfg.sib1.cell_access_related_info.plmn_id_list[0].cell_reserved_for_oper.value =
plmn_id_info_s::cell_reserved_for_oper_opts::not_reserved;
cfg.sib1.cell_access_related_info.cell_barred.value =
sib_type1_s::cell_access_related_info_s_::cell_barred_opts::not_barred;
cfg.sib1.cell_access_related_info.intra_freq_resel.value =
sib_type1_s::cell_access_related_info_s_::intra_freq_resel_opts::allowed;
cfg.sib1.si_win_len.value = sib_type1_s::si_win_len_opts::ms5;
cfg.sib1.sched_info_list.push_back({});
cfg.sib1.sched_info_list[0].si_periodicity.value = sched_info_s::si_periodicity_opts::rf8;
auto& sib2 = cfg.sibs[1].set_sib2();
sib2.rr_cfg_common.rach_cfg_common.preamb_info.nof_ra_preambs.value =
rach_cfg_common_s::preamb_info_s_::nof_ra_preambs_opts::n4;
sib2.rr_cfg_common.rach_cfg_common.pwr_ramp_params.pwr_ramp_step.value = pwr_ramp_params_s::pwr_ramp_step_opts::db0;
sib2.rr_cfg_common.rach_cfg_common.pwr_ramp_params.preamb_init_rx_target_pwr.value =
pwr_ramp_params_s::preamb_init_rx_target_pwr_opts::dbm_minus90;
sib2.rr_cfg_common.rach_cfg_common.ra_supervision_info.preamb_trans_max.value = preamb_trans_max_opts::n4;
sib2.rr_cfg_common.rach_cfg_common.ra_supervision_info.ra_resp_win_size.value =
rach_cfg_common_s::ra_supervision_info_s_::ra_resp_win_size_opts::sf2;
sib2.rr_cfg_common.rach_cfg_common.ra_supervision_info.mac_contention_resolution_timer.value =
rach_cfg_common_s::ra_supervision_info_s_::mac_contention_resolution_timer_opts::sf8;
sib2.rr_cfg_common.bcch_cfg.mod_period_coeff.value = bcch_cfg_s::mod_period_coeff_opts::n4;
sib2.rr_cfg_common.pcch_cfg.default_paging_cycle.value = pcch_cfg_s::default_paging_cycle_opts::rf32;
sib2.rr_cfg_common.pcch_cfg.nb.value = pcch_cfg_s::nb_opts::four_t;
sib2.rr_cfg_common.pusch_cfg_common.pusch_cfg_basic.hop_mode.value =
pusch_cfg_common_s::pusch_cfg_basic_s_::hop_mode_opts::inter_sub_frame;
sib2.rr_cfg_common.pucch_cfg_common.delta_pucch_shift.value = pucch_cfg_common_s::delta_pucch_shift_opts::ds1;
sib2.rr_cfg_common.srs_ul_cfg_common.set(setup_opts::release);
sib2.rr_cfg_common.ul_pwr_ctrl_common.alpha.value = alpha_r12_opts::al0;
bzero(&sib2.rr_cfg_common.ul_pwr_ctrl_common.delta_flist_pucch,
sizeof(sib2.rr_cfg_common.ul_pwr_ctrl_common.delta_flist_pucch));
sib2.rr_cfg_common.ul_cp_len.value = ul_cp_len_opts::len1;
bzero(&sib2.ue_timers_and_consts, sizeof(sib2.ue_timers_and_consts));
sib2.time_align_timer_common.value = time_align_timer_opts::sf500;
report_cfg_eutra_s rep = generate_rep1();
cfg.meas_cfg.meas_reports.push_back(rep);
srsenb::rrc rrc;
mac_dummy mac;
rrc.init(&cfg, nullptr, &mac, nullptr, nullptr, nullptr, nullptr, &log_h);
return SRSLTE_SUCCESS;
}
int main()
{
TESTASSERT(test_correct_insertion() == 0);
TESTASSERT(test_correct_meascfg_calculation() == 0);
TESTASSERT(test_mobility_class() == 0);
printf("Success\n");

Loading…
Cancel
Save