mirror of https://github.com/pvnis/srsRAN_4G.git
Add RLF-Reportv9 to srsUE
parent
a366982e06
commit
7839ab09dc
@ -0,0 +1,58 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2021 Software Radio Systems Limited
|
||||||
|
*
|
||||||
|
* By using this file, you agree to the terms and conditions set
|
||||||
|
* forth in the LICENSE file which can be found at the top level of
|
||||||
|
* the distribution.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SRSRAN_RRC_RLF_REPORT_H_
|
||||||
|
#define SRSRAN_RRC_RLF_REPORT_H_
|
||||||
|
|
||||||
|
#include "rrc_cell.h"
|
||||||
|
#include "srsran/asn1/rrc.h"
|
||||||
|
#include "srsran/common/common.h"
|
||||||
|
|
||||||
|
namespace srsue {
|
||||||
|
|
||||||
|
using namespace asn1::rrc;
|
||||||
|
|
||||||
|
// RRC RLF-Report class
|
||||||
|
class rrc_rlf_report
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum failure_type_t { rlf, hof };
|
||||||
|
|
||||||
|
void init(srsran::task_sched_handle task_sched);
|
||||||
|
|
||||||
|
// Returns true if VarRLF-Report structure has info available
|
||||||
|
bool has_info();
|
||||||
|
|
||||||
|
// Called upon T304 expiry (type == hof) or Detection of radio link failure (type == rlf)
|
||||||
|
void set_failure(meas_cell_list<meas_cell_eutra>& meas_cells, failure_type_t type);
|
||||||
|
|
||||||
|
// Called upon transmission of ReestablishmentRequest message
|
||||||
|
void set_reest_gci(const asn1::fixed_bitstring<28>& gci, const asn1::rrc::plmn_id_s& plmn_id);
|
||||||
|
|
||||||
|
// Called upon initiation of RadioReconfiguration message including MobilityInfo IE
|
||||||
|
void received_ho_command(const asn1::fixed_bitstring<28>& current_gci);
|
||||||
|
|
||||||
|
// Returns a copy of the rlf_report_r9 ASN1 struct
|
||||||
|
rlf_report_r9_s get_report();
|
||||||
|
|
||||||
|
// Clears VarRLF-Report contents
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
private:
|
||||||
|
asn1::fixed_bitstring<28> ho_gci;
|
||||||
|
|
||||||
|
bool has_event = false;
|
||||||
|
rlf_report_r9_s rlf_report = {};
|
||||||
|
srsran::timer_handler::unique_timer timer_conn_failure = {};
|
||||||
|
};
|
||||||
|
} // namespace srsue
|
||||||
|
|
||||||
|
#endif // SRSRAN_RRC_RLF_REPORT_H_
|
@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2021 Software Radio Systems Limited
|
||||||
|
*
|
||||||
|
* By using this file, you agree to the terms and conditions set
|
||||||
|
* forth in the LICENSE file which can be found at the top level of
|
||||||
|
* the distribution.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "srsue/hdr/stack/rrc/rrc_common.h"
|
||||||
|
|
||||||
|
namespace srsue {
|
||||||
|
|
||||||
|
uint8_t rrc_value_to_range(quant_s quant, const float value)
|
||||||
|
{
|
||||||
|
uint8_t range = 0;
|
||||||
|
if (quant == quant_rsrp) {
|
||||||
|
if (value < -140) {
|
||||||
|
range = 0;
|
||||||
|
} else if (value < -44) {
|
||||||
|
range = 1u + (uint8_t)(value + 140);
|
||||||
|
} else {
|
||||||
|
range = 97;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (value < -19.5) {
|
||||||
|
range = 0;
|
||||||
|
} else if (value < -3) {
|
||||||
|
range = 1u + (uint8_t)(2 * (value + 19.5));
|
||||||
|
} else {
|
||||||
|
range = 34;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
float rrc_range_to_value(quant_s quant, const uint8_t range)
|
||||||
|
{
|
||||||
|
float val = 0;
|
||||||
|
if (quant == quant_rsrp) {
|
||||||
|
val = -140 + (float)range;
|
||||||
|
} else {
|
||||||
|
val = -19.5f + (float)range / 2;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace srsue
|
@ -0,0 +1,136 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2021 Software Radio Systems Limited
|
||||||
|
*
|
||||||
|
* By using this file, you agree to the terms and conditions set
|
||||||
|
* forth in the LICENSE file which can be found at the top level of
|
||||||
|
* the distribution.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "srsue/hdr/stack/rrc/rrc_rlf_report.h"
|
||||||
|
#include "srsue/hdr/stack/rrc/rrc_common.h"
|
||||||
|
|
||||||
|
namespace srsue {
|
||||||
|
|
||||||
|
void rrc_rlf_report::init(srsran::task_sched_handle task_sched)
|
||||||
|
{
|
||||||
|
timer_conn_failure = task_sched.get_unique_timer();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if VarRLF-Report structure has info available
|
||||||
|
bool rrc_rlf_report::has_info()
|
||||||
|
{
|
||||||
|
return has_event;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called upon T304 expiry (type == hof) or Detection of radio link failure (type == rlf)
|
||||||
|
void rrc_rlf_report::set_failure(meas_cell_list<meas_cell_eutra>& meas_cells, failure_type_t type)
|
||||||
|
{
|
||||||
|
has_event = true;
|
||||||
|
|
||||||
|
// clear the information included in VarRLF-Report, if any
|
||||||
|
rlf_report = {};
|
||||||
|
|
||||||
|
// set the plmn-Identity to the RPLMN
|
||||||
|
|
||||||
|
// set the measResultLastServCell to include the RSRP and RSRQ, if available, of the PCell based on
|
||||||
|
// measurements collected up to the moment the UE detected radio link failure
|
||||||
|
rlf_report.meas_result_last_serv_cell_r9.rsrp_result_r9 =
|
||||||
|
rrc_value_to_range(quant_rsrp, meas_cells.serving_cell().get_rsrp());
|
||||||
|
rlf_report.meas_result_last_serv_cell_r9.rsrq_result_r9 =
|
||||||
|
rrc_value_to_range(quant_rsrq, meas_cells.serving_cell().get_rsrq());
|
||||||
|
rlf_report.meas_result_last_serv_cell_r9.rsrq_result_r9_present = true;
|
||||||
|
|
||||||
|
// set the measResultNeighCells to include the best measured cells, other than the PCell, ordered such that
|
||||||
|
// the best cell is listed first, and based on measurements collected up to the moment the UE detected radio
|
||||||
|
// link failure
|
||||||
|
if (meas_cells.nof_neighbours() > 0) {
|
||||||
|
rlf_report.meas_result_neigh_cells_r9_present = true;
|
||||||
|
rlf_report.meas_result_neigh_cells_r9.meas_result_list_eutra_r9_present = true;
|
||||||
|
rlf_report.meas_result_neigh_cells_r9.meas_result_list_eutra_r9.clear();
|
||||||
|
meas_cells.sort_neighbour_cells();
|
||||||
|
// It is not clear how the sorting and grouping of cells per frequency must be done.
|
||||||
|
// We use a separate MeasResultList2EUTRA-r9 struct for each pci/frequency pair
|
||||||
|
for (const auto& f : meas_cells) {
|
||||||
|
meas_result2_eutra_r9_s meas2 = {};
|
||||||
|
meas2.carrier_freq_r9 = f->get_earfcn();
|
||||||
|
meas_result_eutra_s meas = {};
|
||||||
|
meas.pci = f->get_pci();
|
||||||
|
meas.meas_result.rsrp_result_present = true;
|
||||||
|
meas.meas_result.rsrq_result_present = true;
|
||||||
|
meas.meas_result.rsrp_result = rrc_value_to_range(quant_rsrp, f->get_rsrp());
|
||||||
|
meas.meas_result.rsrq_result = rrc_value_to_range(quant_rsrq, f->get_rsrq());
|
||||||
|
meas2.meas_result_list_r9.push_back(meas);
|
||||||
|
rlf_report.meas_result_neigh_cells_r9.meas_result_list_eutra_r9.push_back(meas2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the failedPCellId to the global cell identity, if available, and otherwise to the physical cell identity and
|
||||||
|
// carrier frequency of the PCell where radio link failure is detected;
|
||||||
|
rlf_report.failed_pcell_id_r10.set_present(true);
|
||||||
|
if (meas_cells.serving_cell().has_sib1()) {
|
||||||
|
rlf_report.failed_pcell_id_r10->set_cell_global_id_r10().cell_id = meas_cells.serving_cell().get_cell_id_bit();
|
||||||
|
rlf_report.failed_pcell_id_r10->cell_global_id_r10().plmn_id = meas_cells.serving_cell().get_plmn_asn1(0);
|
||||||
|
} else {
|
||||||
|
rlf_report.failed_pcell_id_r10->set_pci_arfcn_r10();
|
||||||
|
rlf_report.failed_pcell_id_r10->pci_arfcn_r10().pci_r10 = meas_cells.serving_cell().get_pci();
|
||||||
|
rlf_report.failed_pcell_id_r10->pci_arfcn_r10().carrier_freq_r10 = meas_cells.serving_cell().get_earfcn();
|
||||||
|
}
|
||||||
|
|
||||||
|
// if an RRCConnectionReconfiguration message including the mobilityControlInfo was received before the
|
||||||
|
// connection failure
|
||||||
|
if (timer_conn_failure.is_running()) {
|
||||||
|
timer_conn_failure.stop();
|
||||||
|
|
||||||
|
// include previousPCellId and set it to the global cell identity of the PCell where the last
|
||||||
|
// RRCConnectionReconfiguration including the mobilityControlInfo message was received;
|
||||||
|
rlf_report.prev_pcell_id_r10.set_present(true);
|
||||||
|
rlf_report.prev_pcell_id_r10->cell_id = ho_gci;
|
||||||
|
rlf_report.prev_pcell_id_r10->plmn_id = meas_cells.serving_cell().get_plmn_asn1(0);
|
||||||
|
|
||||||
|
// set the timeConnFailure to the elapsed time since reception of the last
|
||||||
|
// RRCConnectionReconfiguration message including the mobilityControlInfo;
|
||||||
|
rlf_report.time_conn_fail_r10_present = true;
|
||||||
|
rlf_report.time_conn_fail_r10 = timer_conn_failure.time_elapsed() / 100; // 1 unit = 100 ms
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the connectionFailureType
|
||||||
|
rlf_report.conn_fail_type_r10_present = true;
|
||||||
|
rlf_report.conn_fail_type_r10 =
|
||||||
|
type == rlf ? rlf_report_r9_s::conn_fail_type_r10_opts::rlf : rlf_report_r9_s::conn_fail_type_r10_opts::hof;
|
||||||
|
|
||||||
|
rlf_report.ext = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rrc_rlf_report::set_reest_gci(const asn1::fixed_bitstring<28>& gci, const asn1::rrc::plmn_id_s& plmn_id)
|
||||||
|
{
|
||||||
|
rlf_report.reest_cell_id_r10.set_present(true);
|
||||||
|
rlf_report.reest_cell_id_r10->cell_id = gci;
|
||||||
|
rlf_report.reest_cell_id_r10->plmn_id = plmn_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rrc_rlf_report::received_ho_command(const asn1::fixed_bitstring<28>& current_gci)
|
||||||
|
{
|
||||||
|
if (timer_conn_failure.is_valid()) {
|
||||||
|
timer_conn_failure.stop();
|
||||||
|
timer_conn_failure.run();
|
||||||
|
ho_gci = current_gci;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rlf_report_r9_s rrc_rlf_report::get_report()
|
||||||
|
{
|
||||||
|
return rlf_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clears VarRLF-Report contents
|
||||||
|
void rrc_rlf_report::clear()
|
||||||
|
{
|
||||||
|
has_event = false;
|
||||||
|
rlf_report = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace srsue
|
@ -0,0 +1,196 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2021 Software Radio Systems Limited
|
||||||
|
*
|
||||||
|
* By using this file, you agree to the terms and conditions set
|
||||||
|
* forth in the LICENSE file which can be found at the top level of
|
||||||
|
* the distribution.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "srsran/common/test_common.h"
|
||||||
|
#include "srsue/hdr/stack/rrc/rrc_cell.h"
|
||||||
|
#include "srsue/hdr/stack/rrc/rrc_rlf_report.h"
|
||||||
|
|
||||||
|
using namespace srsue;
|
||||||
|
|
||||||
|
int test_single()
|
||||||
|
{
|
||||||
|
srsran::task_scheduler task_sched;
|
||||||
|
rrc_rlf_report rlf_report;
|
||||||
|
meas_cell_list<meas_cell_eutra> list{&task_sched};
|
||||||
|
|
||||||
|
phy_meas_t pmeas;
|
||||||
|
pmeas.rsrp = -20;
|
||||||
|
pmeas.pci = 1;
|
||||||
|
pmeas.earfcn = 3400;
|
||||||
|
pmeas.rsrq = -10;
|
||||||
|
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
list.set_serving_cell(phy_cell_t{1, 3400}, false);
|
||||||
|
|
||||||
|
rlf_report.set_failure(list, rrc_rlf_report::rlf);
|
||||||
|
|
||||||
|
asn1::json_writer jw;
|
||||||
|
asn1::rrc::rlf_report_r9_s out = rlf_report.get_report();
|
||||||
|
out.to_json(jw);
|
||||||
|
printf("test_single: %s\n", jw.to_string().c_str());
|
||||||
|
|
||||||
|
TESTASSERT(!out.meas_result_neigh_cells_r9_present);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9.size() == 0);
|
||||||
|
TESTASSERT(out.failed_pcell_id_r10.is_present());
|
||||||
|
TESTASSERT(out.failed_pcell_id_r10->pci_arfcn_r10().pci_r10 == 1);
|
||||||
|
TESTASSERT(out.failed_pcell_id_r10->pci_arfcn_r10().carrier_freq_r10 = 3400);
|
||||||
|
TESTASSERT(out.conn_fail_type_r10_present);
|
||||||
|
TESTASSERT(out.conn_fail_type_r10.value == asn1::rrc::rlf_report_r9_s::conn_fail_type_r10_e_::rlf);
|
||||||
|
|
||||||
|
return SRSRAN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_neighbours()
|
||||||
|
{
|
||||||
|
srsran::task_scheduler task_sched;
|
||||||
|
rrc_rlf_report rlf_report;
|
||||||
|
meas_cell_list<meas_cell_eutra> list{&task_sched};
|
||||||
|
|
||||||
|
phy_meas_t pmeas;
|
||||||
|
pmeas.rsrp = -20;
|
||||||
|
pmeas.pci = 1;
|
||||||
|
pmeas.earfcn = 3400;
|
||||||
|
pmeas.rsrq = -10;
|
||||||
|
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
pmeas.pci = 4;
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
pmeas.pci = 6;
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
list.set_serving_cell(phy_cell_t{4, 3400}, false);
|
||||||
|
|
||||||
|
TESTASSERT(!rlf_report.has_info());
|
||||||
|
|
||||||
|
rlf_report.set_failure(list, rrc_rlf_report::hof);
|
||||||
|
|
||||||
|
asn1::json_writer jw;
|
||||||
|
asn1::rrc::rlf_report_r9_s out = rlf_report.get_report();
|
||||||
|
out.to_json(jw);
|
||||||
|
printf("test_neighbours: %s\n", jw.to_string().c_str());
|
||||||
|
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9_present);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9_present);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9.size() == 2);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9[0].carrier_freq_r9 = 3400);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9[0].meas_result_list_r9[0].pci == 1);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9[1].carrier_freq_r9 = 3400);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9[1].meas_result_list_r9[0].pci == 6);
|
||||||
|
TESTASSERT(out.failed_pcell_id_r10.is_present());
|
||||||
|
TESTASSERT(out.failed_pcell_id_r10->pci_arfcn_r10().pci_r10 == 4);
|
||||||
|
TESTASSERT(out.failed_pcell_id_r10->pci_arfcn_r10().carrier_freq_r10 = 3400);
|
||||||
|
TESTASSERT(out.conn_fail_type_r10_present);
|
||||||
|
TESTASSERT(out.conn_fail_type_r10.value == asn1::rrc::rlf_report_r9_s::conn_fail_type_r10_e_::hof);
|
||||||
|
|
||||||
|
TESTASSERT(rlf_report.has_info());
|
||||||
|
|
||||||
|
return SRSRAN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_reest()
|
||||||
|
{
|
||||||
|
srsran::task_scheduler task_sched;
|
||||||
|
rrc_rlf_report rlf_report;
|
||||||
|
meas_cell_list<meas_cell_eutra> list{&task_sched};
|
||||||
|
|
||||||
|
phy_meas_t pmeas;
|
||||||
|
pmeas.rsrp = -20;
|
||||||
|
pmeas.pci = 1;
|
||||||
|
pmeas.earfcn = 3400;
|
||||||
|
pmeas.rsrq = -10;
|
||||||
|
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
pmeas.pci = 4;
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
pmeas.pci = 6;
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
list.set_serving_cell(phy_cell_t{4, 3400}, false);
|
||||||
|
|
||||||
|
TESTASSERT(!rlf_report.has_info());
|
||||||
|
|
||||||
|
rlf_report.set_failure(list, rrc_rlf_report::hof);
|
||||||
|
rlf_report.set_reest_gci(list.serving_cell().get_cell_id_bit(), list.serving_cell().get_plmn_asn1(0));
|
||||||
|
|
||||||
|
asn1::json_writer jw;
|
||||||
|
asn1::rrc::rlf_report_r9_s out = rlf_report.get_report();
|
||||||
|
out.to_json(jw);
|
||||||
|
printf("test_reest: %s\n", jw.to_string().c_str());
|
||||||
|
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9_present);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9_present);
|
||||||
|
TESTASSERT(out.failed_pcell_id_r10.is_present());
|
||||||
|
TESTASSERT(out.conn_fail_type_r10_present);
|
||||||
|
TESTASSERT(out.conn_fail_type_r10.value == asn1::rrc::rlf_report_r9_s::conn_fail_type_r10_e_::hof);
|
||||||
|
TESTASSERT(out.reest_cell_id_r10.is_present());
|
||||||
|
|
||||||
|
TESTASSERT(rlf_report.has_info());
|
||||||
|
|
||||||
|
return SRSRAN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_ho()
|
||||||
|
{
|
||||||
|
srsran::task_scheduler task_sched;
|
||||||
|
rrc_rlf_report rlf_report;
|
||||||
|
meas_cell_list<meas_cell_eutra> list{&task_sched};
|
||||||
|
|
||||||
|
rlf_report.init(&task_sched);
|
||||||
|
|
||||||
|
phy_meas_t pmeas;
|
||||||
|
pmeas.rsrp = -20;
|
||||||
|
pmeas.pci = 1;
|
||||||
|
pmeas.earfcn = 3400;
|
||||||
|
pmeas.rsrq = -10;
|
||||||
|
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
pmeas.pci = 4;
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
pmeas.pci = 6;
|
||||||
|
list.add_meas_cell(pmeas);
|
||||||
|
list.set_serving_cell(phy_cell_t{4, 3400}, false);
|
||||||
|
|
||||||
|
TESTASSERT(!rlf_report.has_info());
|
||||||
|
|
||||||
|
rlf_report.received_ho_command(list.serving_cell().get_cell_id_bit());
|
||||||
|
for (int i = 0; i < 1000; i++) {
|
||||||
|
task_sched.tic();
|
||||||
|
task_sched.run_pending_tasks();
|
||||||
|
}
|
||||||
|
rlf_report.set_failure(list, rrc_rlf_report::hof);
|
||||||
|
rlf_report.set_reest_gci(list.serving_cell().get_cell_id_bit(), list.serving_cell().get_plmn_asn1(0));
|
||||||
|
|
||||||
|
asn1::json_writer jw;
|
||||||
|
asn1::rrc::rlf_report_r9_s out = rlf_report.get_report();
|
||||||
|
out.to_json(jw);
|
||||||
|
printf("test_ho: %s\n", jw.to_string().c_str());
|
||||||
|
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9_present);
|
||||||
|
TESTASSERT(out.meas_result_neigh_cells_r9.meas_result_list_eutra_r9_present);
|
||||||
|
TESTASSERT(out.failed_pcell_id_r10.is_present());
|
||||||
|
TESTASSERT(out.conn_fail_type_r10_present);
|
||||||
|
TESTASSERT(out.conn_fail_type_r10.value == asn1::rrc::rlf_report_r9_s::conn_fail_type_r10_e_::hof);
|
||||||
|
TESTASSERT(out.reest_cell_id_r10.is_present());
|
||||||
|
|
||||||
|
TESTASSERT(rlf_report.has_info());
|
||||||
|
|
||||||
|
return SRSRAN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
TESTASSERT(test_single() == SRSRAN_SUCCESS);
|
||||||
|
TESTASSERT(test_neighbours() == SRSRAN_SUCCESS);
|
||||||
|
TESTASSERT(test_reest() == SRSRAN_SUCCESS);
|
||||||
|
TESTASSERT(test_ho() == SRSRAN_SUCCESS);
|
||||||
|
printf("Success\n");
|
||||||
|
|
||||||
|
return SRSRAN_SUCCESS;
|
||||||
|
}
|
Loading…
Reference in New Issue