ue,sa: Sends PRACH and receives RAR, then Msg4, resolves contention resolution and pushes ConnectionSetup to RRC

master
Ismael Gomez 3 years ago
parent 15025f5d57
commit 3c929ed24c

@ -98,6 +98,7 @@ public:
static const uint8_t ue_con_res_id_len = 6;
typedef std::array<uint8_t, ue_con_res_id_len> ue_con_res_id_t;
ue_con_res_id_t get_ue_con_res_id_ce();
uint64_t get_ue_con_res_id_ce_packed();
// setters
void set_sdu(const uint32_t lcid_, const uint8_t* payload_, const uint32_t len_);

@ -332,6 +332,17 @@ mac_sch_subpdu_nr::ue_con_res_id_t mac_sch_subpdu_nr::get_ue_con_res_id_ce()
return id;
}
uint64_t mac_sch_subpdu_nr::get_ue_con_res_id_ce_packed()
{
if (!parent->is_ulsch() && lcid == CON_RES_ID) {
const uint8_t* payload = sdu.ptr();
return le64toh(((uint64_t)payload[5]) | (((uint64_t)payload[4]) << 8) | (((uint64_t)payload[3]) << 16) |
(((uint64_t)payload[2]) << 24) | (((uint64_t)payload[1]) << 32) | (((uint64_t)payload[0]) << 40));
} else {
return 0;
}
}
uint32_t mac_sch_subpdu_nr::sizeof_ce(uint32_t lcid, bool is_ul)
{
if (is_ul) {

@ -40,19 +40,24 @@ public:
void process_pdus(); /// Called by MAC to process received PDUs
// HARQ interface
void push_pdu(srsran::unique_byte_buffer_t pdu, uint32_t tti);
void push_pdu(srsran::unique_byte_buffer_t pdu, uint32_t tti);
void push_pdu_temp_crnti(srsran::unique_byte_buffer_t pdu, uint32_t tti);
uint64_t get_received_crueid();
private:
// internal helpers
void handle_pdu(srsran::unique_byte_buffer_t pdu);
void handle_pdu(srsran::mac_sch_pdu_nr& pdu_buffer, srsran::unique_byte_buffer_t pdu);
srslog::basic_logger& logger;
rlc_interface_mac* rlc = nullptr;
uint64_t received_crueid = 0;
///< currently only DCH PDUs supported (add BCH, PCH, etc)
srsran::block_queue<srsran::unique_byte_buffer_t> pdu_queue;
srsran::mac_sch_pdu_nr rx_pdu;
srsran::mac_sch_pdu_nr rx_pdu_tcrnti;
};
} // namespace srsue

@ -88,7 +88,7 @@ public:
void start_ra_procedure();
/// Interface for internal procedures (RA, MUX, HARQ)
uint64_t get_contention_id();
bool received_contention_id(uint64_t rx_contention_id);
uint16_t get_crnti();
uint16_t get_temp_crnti();
uint16_t get_csrnti() { return SRSRAN_INVALID_RNTI; }; // SPS not supported
@ -150,6 +150,7 @@ private:
std::atomic<bool> started = {false};
ue_rnti rntis; // thread-safe helper to store RNTIs, contention ID, etc
bool contention_res_successful;
std::array<mac_metrics_t, SRSRAN_MAX_CARRIERS> metrics = {};

@ -24,7 +24,6 @@ class mac_interface_proc_ra_nr
{
public:
// Functions for identity handling, e.g., contention id and c-rnti
virtual uint64_t get_contention_id() = 0;
virtual uint16_t get_crnti() = 0;
virtual bool set_crnti(uint16_t c_rnti) = 0;
@ -80,6 +79,9 @@ public:
// MAC also provides Temp C-RNTI (through RA proc)
virtual uint16_t get_temp_crnti() = 0;
// HARQ can query MAC for current C-RNTI
virtual bool received_contention_id(uint64_t rx_contention_id) = 0;
// MAC provides the Currently Scheduled RNTI (for SPS)
virtual uint16_t get_csrnti() = 0;
};
@ -91,7 +93,9 @@ class demux_interface_harq_nr
{
public:
/// Inform demux unit about a newly decoded TB.
virtual void push_pdu(srsran::unique_byte_buffer_t pdu, uint32_t tti) = 0;
virtual void push_pdu(srsran::unique_byte_buffer_t pdu, uint32_t tti) = 0;
virtual void push_pdu_temp_crnti(srsran::unique_byte_buffer_t pdu, uint32_t tti) = 0;
virtual uint64_t get_received_crueid() = 0;
};
} // namespace srsue

@ -40,6 +40,7 @@ public:
uint16_t get_rar_rnti();
bool has_temp_crnti();
uint16_t get_temp_crnti();
void received_contention_resolution(bool is_successful);
// PHY interfaces
void prach_sent(uint32_t tti, uint32_t s_id, uint32_t t_id, uint32_t f_id, uint32_t ul_carrier_id);
@ -64,6 +65,7 @@ private:
int ra_window_length = -1, ra_window_start = -1;
uint16_t rar_rnti = SRSRAN_INVALID_RNTI;
uint16_t temp_crnti = SRSRAN_INVALID_RNTI;
uint16_t transmitted_crnti = SRSRAN_INVALID_RNTI;
std::mutex mutex;
srsran::rach_nr_cfg_t rach_cfg = {};
@ -110,8 +112,7 @@ private:
void ra_resource_selection();
void ra_preamble_transmission();
void ra_response_reception(const mac_interface_phy_nr::tb_action_dl_result_t& tb);
void ra_contention_resolution();
void ra_contention_resolution(uint64_t rx_contention_id);
void ra_contention_resolution(bool received_con_res_matches_ue_id);
void ra_completion();
void ra_error();
};

@ -225,8 +225,6 @@ void sync_sa::run_state_cell_select()
void sync_sa::run_state_cell_camping()
{
last_rx_time.add(FDD_HARQ_DELAY_DL_MS * 1e-3);
nr::sf_worker* nr_worker = nullptr;
nr_worker = workers.wait_worker(tti);
if (nr_worker == nullptr) {
@ -242,12 +240,11 @@ void sync_sa::run_state_cell_camping()
logger.error("SYNC: receiving from radio\n");
}
printf("sync_tti=%d, power=%f\n", tti, srsran_vec_avg_power_cf(rf_buffer.get(0), 11520));
srsran::phy_common_interface::worker_context_t context;
context.sf_idx = tti;
context.worker_ptr = nr_worker;
context.last = true; // Set last if standalone
last_rx_time.add(FDD_HARQ_DELAY_DL_MS * 1e-3);
context.tx_time.copy(last_rx_time);
nr_worker->set_context(context);
@ -302,9 +299,7 @@ void sync_sa::worker_end(const srsran::phy_common_interface::worker_context_t& w
// Check if any worker had a transmission
if (tx_enable) {
// Actual baseband transmission
#ifdef useradio
radio->tx(tx_buffer, tx_time);
#endif
} else {
if (radio->is_continuous_tx()) {
if (is_pending_tx_end) {

@ -27,41 +27,61 @@ int32_t demux_nr::init(rlc_interface_mac* rlc_)
return SRSRAN_SUCCESS;
}
uint64_t demux_nr::get_received_crueid()
{
return received_crueid;
}
// Enqueues PDU and returns quickly
void demux_nr::push_pdu(srsran::unique_byte_buffer_t pdu, uint32_t tti)
{
pdu_queue.push(std::move(pdu));
}
/* Demultiplexing of MAC PDU associated with a Temporal C-RNTI. The PDU will
* remain in buffer until demultiplex_pending_pdu() is called.
* This features is provided to enable the Random Access Procedure to decide
* whether the PDU shall pass to upper layers or not, which depends on the
* Contention Resolution result.
*
* Warning: this function does some processing here assuming ACK deadline is not an
* issue here because Temp C-RNTI messages have small payloads
*/
void demux_nr::push_pdu_temp_crnti(srsran::unique_byte_buffer_t pdu, uint32_t tti)
{
received_crueid = 0;
handle_pdu(rx_pdu_tcrnti, std::move(pdu));
}
void demux_nr::process_pdus()
{
while (not pdu_queue.empty()) {
srsran::unique_byte_buffer_t pdu = pdu_queue.wait_pop();
handle_pdu(std::move(pdu));
handle_pdu(rx_pdu, std::move(pdu));
}
}
/// Handling of DLSCH PDUs only
void demux_nr::handle_pdu(srsran::unique_byte_buffer_t pdu)
void demux_nr::handle_pdu(srsran::mac_sch_pdu_nr& pdu_buffer, srsran::unique_byte_buffer_t pdu)
{
logger.debug(pdu->msg, pdu->N_bytes, "Handling MAC PDU (%d B)", pdu->N_bytes);
rx_pdu.init_rx();
if (rx_pdu.unpack(pdu->msg, pdu->N_bytes) != SRSRAN_SUCCESS) {
pdu_buffer.init_rx();
if (pdu_buffer.unpack(pdu->msg, pdu->N_bytes) != SRSRAN_SUCCESS) {
return;
}
if (logger.info.enabled()) {
fmt::memory_buffer str_buffer;
rx_pdu.to_string(str_buffer);
pdu_buffer.to_string(str_buffer);
logger.info("%s", srsran::to_c_str(str_buffer));
}
for (uint32_t i = 0; i < rx_pdu.get_num_subpdus(); ++i) {
srsran::mac_sch_subpdu_nr subpdu = rx_pdu.get_subpdu(i);
for (uint32_t i = 0; i < pdu_buffer.get_num_subpdus(); ++i) {
srsran::mac_sch_subpdu_nr subpdu = pdu_buffer.get_subpdu(i);
logger.debug("Handling subPDU %d/%d: rnti=0x%x lcid=%d, sdu_len=%d",
i + 1,
rx_pdu.get_num_subpdus(),
pdu_buffer.get_num_subpdus(),
subpdu.get_c_rnti(),
subpdu.get_lcid(),
subpdu.get_sdu_length());
@ -75,7 +95,8 @@ void demux_nr::handle_pdu(srsran::unique_byte_buffer_t pdu)
logger.info("Timing Advance CE not implemented.");
break;
case srsran::mac_sch_subpdu_nr::nr_lcid_sch_t::CON_RES_ID:
logger.info("Contention Resolution CE not implemented.");
received_crueid = subpdu.get_ue_con_res_id_ce_packed();
logger.info("Received Contention Resolution ID 0x%lx\n", subpdu.get_ue_con_res_id_ce_packed());
break;
default:
if (subpdu.is_sdu()) {

@ -225,6 +225,8 @@ void dl_harq_entity_nr::dl_harq_process_nr::tb_decoded(const mac_nr_grant_dl_t&
if (grant.rnti == harq_entity->mac->get_temp_crnti()) {
logger.debug("Delivering PDU=%d bytes to Dissassemble and Demux unit (Temporal C-RNTI) not implemented",
grant.tbs);
harq_entity->demux_unit->push_pdu_temp_crnti(std::move(result.payload), grant.tti);
result.ack = harq_entity->mac->received_contention_id(harq_entity->demux_unit->get_received_crueid());
} else {
logger.debug("Delivering PDU=%d bytes to Dissassemble and Demux unit", grant.tbs);
harq_entity->demux_unit->push_pdu(std::move(result.payload), grant.tti);

@ -321,6 +321,11 @@ void mac_nr::tb_decoded(const uint32_t cc_idx, const mac_nr_grant_dl_t& grant, t
dl_harq.at(cc_idx)->tb_decoded(grant, std::move(result));
}
// If proc ra is in contention resolution (RA connection request procedure)
if (proc_ra.is_contention_resolution() && grant.rnti == get_temp_crnti()) {
proc_ra.received_contention_resolution(contention_res_successful);
}
}
void mac_nr::new_grant_ul(const uint32_t cc_idx, const mac_nr_grant_ul_t& grant, tb_action_ul_t* action)
@ -338,7 +343,7 @@ void mac_nr::new_grant_ul(const uint32_t cc_idx, const mac_nr_grant_ul_t& grant,
// Clear UL action
*action = {};
// if proc ra is in contention resolution and c_rnti == grant.c_rnti resolve contention resolution
// if proc ra is in contention resolution and c_rnti == grant.c_rnti (RA connection resume procedure)
if (proc_ra.is_contention_resolution() && grant.rnti == get_crnti()) {
proc_ra.pdcch_to_crnti();
}
@ -525,9 +530,10 @@ void mac_nr::process_pdus()
demux.process_pdus();
}
uint64_t mac_nr::get_contention_id()
bool mac_nr::received_contention_id(uint64_t rx_contention_id)
{
return 0xdeadbeef; // TODO when rebased on PR
contention_res_successful = rntis.get_contention_id() == rx_contention_id;
return contention_res_successful;
}
// TODO same function as for mac_eutra

@ -68,59 +68,60 @@ srsran::unique_byte_buffer_t mux_nr::get_pdu(uint32_t max_pdu_len)
logger.debug("Building new MAC PDU (%d B)", max_pdu_len);
tx_pdu.init_tx(phy_tx_pdu.get(), max_pdu_len, true);
if (msg3_is_pending()) {
// only C-RNTI or CCCH SDU can be transmitted in Msg3
if (mac.has_crnti()) {
tx_pdu.add_crnti_ce(mac.get_crnti());
}
// TODO: add CCCH check
if (msg3_is_pending() && mac.has_crnti()) {
msg3_transmitted();
} else {
// Pack normal UL data PDU
int32_t remaining_len = tx_pdu.get_remaing_len(); // local variable to reserve space for CEs
if (add_bsr_ce == sbsr_ce) {
// reserve space for SBSR
remaining_len -= 2;
}
// First add MAC SDUs
for (const auto& lc : logical_channels) {
// TODO: Add proper priority handling
logger.debug("Adding SDUs for LCID=%d (max %d B)", lc.lcid, remaining_len);
while (remaining_len >= MIN_RLC_PDU_LEN) {
// read RLC PDU
rlc_buff->clear();
uint8_t* rd = rlc_buff->msg;
}
// Determine space for RLC
int32_t subpdu_header_len = (remaining_len >= srsran::mac_sch_subpdu_nr::MAC_SUBHEADER_LEN_THRESHOLD ? 3 : 2);
// Pack normal UL data PDU
int32_t remaining_len = tx_pdu.get_remaing_len(); // local variable to reserve space for CEs
// Read PDU from RLC (account for subPDU header)
int pdu_len = rlc->read_pdu(lc.lcid, rd, remaining_len - subpdu_header_len);
if (add_bsr_ce == sbsr_ce) {
// reserve space for SBSR
remaining_len -= 2;
}
if (pdu_len > remaining_len) {
logger.error("Can't add SDU of %d B. Available space %d B", pdu_len, remaining_len);
break;
} else {
// Add SDU if RLC has something to tx
if (pdu_len > 0) {
rlc_buff->N_bytes = pdu_len;
logger.debug(rlc_buff->msg, rlc_buff->N_bytes, "Read %d B from RLC", rlc_buff->N_bytes);
// add to MAC PDU and pack
if (tx_pdu.add_sdu(lc.lcid, rlc_buff->msg, rlc_buff->N_bytes) != SRSRAN_SUCCESS) {
logger.error("Error packing MAC PDU");
break;
}
} else {
// couldn't read PDU from RLC
// First add MAC SDUs
for (const auto& lc : logical_channels) {
// TODO: Add proper priority handling
logger.debug("Adding SDUs for LCID=%d (max %d B)", lc.lcid, remaining_len);
while (remaining_len >= MIN_RLC_PDU_LEN) {
// read RLC PDU
rlc_buff->clear();
uint8_t* rd = rlc_buff->msg;
// Determine space for RLC
int32_t subpdu_header_len = (remaining_len >= srsran::mac_sch_subpdu_nr::MAC_SUBHEADER_LEN_THRESHOLD ? 3 : 2);
// Read PDU from RLC (account for subPDU header)
int pdu_len = rlc->read_pdu(lc.lcid, rd, remaining_len - subpdu_header_len);
if (pdu_len > remaining_len) {
logger.error("Can't add SDU of %d B. Available space %d B", pdu_len, remaining_len);
break;
} else {
// Add SDU if RLC has something to tx
if (pdu_len > 0) {
rlc_buff->N_bytes = pdu_len;
logger.debug(rlc_buff->msg, rlc_buff->N_bytes, "Read %d B from RLC", rlc_buff->N_bytes);
// add to MAC PDU and pack
if (tx_pdu.add_sdu(lc.lcid, rlc_buff->msg, rlc_buff->N_bytes) != SRSRAN_SUCCESS) {
logger.error("Error packing MAC PDU");
break;
}
remaining_len -= (pdu_len + subpdu_header_len);
logger.debug("%d B remaining PDU", remaining_len);
if (lc.lcid == 0 && msg3_is_pending()) {
// TODO:
msg3_transmitted();
}
} else {
// couldn't read PDU from RLC
break;
}
remaining_len -= (pdu_len + subpdu_header_len);
logger.debug("%d B remaining PDU", remaining_len);
}
}
}

@ -127,6 +127,12 @@ uint16_t proc_ra_nr::get_temp_crnti()
return temp_crnti;
}
void proc_ra_nr::received_contention_resolution(bool is_successful)
{
std::lock_guard<std::mutex> lock(mutex);
ra_contention_resolution(is_successful);
}
void proc_ra_nr::timer_expired(uint32_t timer_id)
{
if (prach_send_timer.id() == timer_id) {
@ -212,6 +218,9 @@ void proc_ra_nr::ra_response_reception(const mac_interface_phy_nr::tb_action_dl_
logger.debug("PROC RA NR: Setting UL grant and prepare Msg3");
temp_crnti = subpdu.get_temp_crnti();
// Save transmitted C-RNTI (if any)
transmitted_crnti = mac.get_crnti();
// Set Temporary-C-RNTI if provided, otherwise C-RNTI is ok
phy->set_rar_grant(tb.rx_slot_idx, subpdu.get_ul_grant(), temp_crnti, srsran_rnti_type_ra);
@ -237,7 +246,7 @@ void proc_ra_nr::ra_response_reception(const mac_interface_phy_nr::tb_action_dl_
// TS 38.321 Section 5.1.5 2 ways to resolve contention resolution
// if the C-RNTI MAC CE was included in Msg3: (only this one is implemented)
void proc_ra_nr::ra_contention_resolution()
void proc_ra_nr::ra_contention_resolution(bool received_con_res_matches_ue_id)
{
if (state != WAITING_FOR_CONTENTION_RESOLUTION) {
logger.warning(
@ -246,8 +255,12 @@ void proc_ra_nr::ra_contention_resolution()
srsran::enum_to_text(state_str_nr, (uint32_t)ra_state_t::MAX_RA_STATES, WAITING_FOR_CONTENTION_RESOLUTION));
return;
}
if (started_by == initiators_t::RRC || started_by == initiators_t::MAC) {
logger.info("PDCCH to C-RNTI received with a new UL grant of transmission");
if (started_by == initiators_t::RRC || started_by == initiators_t::MAC || received_con_res_matches_ue_id) {
if (received_con_res_matches_ue_id) {
logger.info("Received CONRES ID matches transmitted UE ID\n");
} else {
logger.info("PDCCH to C-RNTI received with a new UL grant of transmission");
}
contention_resolution_timer.stop();
state = WAITING_FOR_COMPLETION;
ra_completion();
@ -256,22 +269,8 @@ void proc_ra_nr::ra_contention_resolution()
}
}
// or else if the CCCH SDU was included in Msg3 and the PDCCH transmission is addressed to its TEMPORARY_C-RNTI:
void proc_ra_nr::ra_contention_resolution(uint64_t rx_contention_id)
{
if (state != WAITING_FOR_CONTENTION_RESOLUTION) {
logger.warning(
"Wrong state for ra contention resolution by phy %s (expected state %s)",
srsran::enum_to_text(state_str_nr, (uint32_t)ra_state_t::MAX_RA_STATES, state),
srsran::enum_to_text(state_str_nr, (uint32_t)ra_state_t::MAX_RA_STATES, WAITING_FOR_CONTENTION_RESOLUTION));
return;
}
// TODO
}
void proc_ra_nr::ra_completion()
{
std::lock_guard<std::mutex> lock(mutex);
if (state != WAITING_FOR_COMPLETION) {
logger.warning("Wrong state for ra completion by phy %s (expected state %s)",
srsran::enum_to_text(state_str_nr, (uint32_t)ra_state_t::MAX_RA_STATES, state),
@ -280,6 +279,9 @@ void proc_ra_nr::ra_completion()
}
srsran::console("Random Access Complete. c-rnti=0x%x, ta=%d\n", mac.get_crnti(), current_ta);
logger.info("Random Access Complete. c-rnti=0x%x, ta=%d", mac.get_crnti(), current_ta);
if (!transmitted_crnti) {
mac.set_crnti(temp_crnti);
}
temp_crnti = SRSRAN_INVALID_RNTI;
mac.rrc_ra_completed();
reset();
@ -372,7 +374,7 @@ void proc_ra_nr::handle_rar_pdu(mac_interface_phy_nr::tb_action_dl_result_t& res
// Called from PHY thread, defer actions therefore.
void proc_ra_nr::pdcch_to_crnti()
{
task_queue.push([this]() { ra_contention_resolution(); });
task_queue.push([this]() { ra_contention_resolution(false); });
}
bool proc_ra_nr::is_contention_resolution()
@ -387,6 +389,7 @@ void proc_ra_nr::reset()
prach_send_timer.stop();
rar_timeout_timer.stop();
contention_resolution_timer.stop();
transmitted_crnti = SRSRAN_INVALID_RNTI;
}
} // namespace srsue

@ -206,7 +206,10 @@ void rrc_nr::out_of_sync() {}
void rrc_nr::run_tti(uint32_t tti) {}
// PDCP interface
void rrc_nr::write_pdu(uint32_t lcid, srsran::unique_byte_buffer_t pdu) {}
void rrc_nr::write_pdu(uint32_t lcid, srsran::unique_byte_buffer_t pdu)
{
printf("RRC received PDU\n");
}
void rrc_nr::write_pdu_bcch_bch(srsran::unique_byte_buffer_t pdu) {}
void rrc_nr::write_pdu_bcch_dlsch(srsran::unique_byte_buffer_t pdu) {}
void rrc_nr::write_pdu_pcch(srsran::unique_byte_buffer_t pdu) {}
@ -238,11 +241,86 @@ int rrc_nr::connection_request(srsran::nr_establishment_cause_t cause, srsran::u
cfg.duplex = srsran::phy_cfg_nr_default_t::reference_cfg_t::R_DUPLEX_FDD;
phy_cfg = srsran::phy_cfg_nr_default_t{srsran::phy_cfg_nr_default_t::reference_cfg_t{cfg}};
// Carrier configuration
phy_cfg.ssb.periodicity_ms = 10;
phy_cfg.carrier.ssb_center_freq_hz = 1842.05e6;
phy_cfg.carrier.dl_center_frequency_hz = 1842.5e6;
phy_cfg.carrier.ul_center_frequency_hz = 1747.5e6;
// PRACH configuration
phy_cfg.prach.num_ra_preambles = 8;
phy_cfg.prach.config_idx = 0;
phy_cfg.prach.root_seq_idx = 1;
phy_cfg.prach.zero_corr_zone = 0;
phy_cfg.prach.is_nr = true;
phy_cfg.prach.freq_offset = 1;
srsran::rach_nr_cfg_t rach_cfg = {};
rach_cfg.prach_ConfigurationIndex = 0;
rach_cfg.preambleTransMax = 7;
rach_cfg.ra_responseWindow = 10;
rach_cfg.ra_ContentionResolutionTimer = 64;
mac->set_config(rach_cfg);
srsran::dl_harq_cfg_nr_t harq_cfg = {};
harq_cfg.nof_procs = 8;
mac->set_config(harq_cfg);
// Setup SRB0, 1 and 2
for (int i = 0; i < 3; i++) {
logical_channel_config_t lch = {};
lch.lcid = i;
lch.priority = i + 1;
mac->setup_lcid(lch);
}
// Coreset0 configuration
// Get pointA and SSB absolute frequencies
double pointA_abs_freq_Hz = phy_cfg.carrier.dl_center_frequency_hz -
phy_cfg.carrier.nof_prb * SRSRAN_NRE * SRSRAN_SUBC_SPACING_NR(phy_cfg.carrier.scs) / 2;
double ssb_abs_freq_Hz = phy_cfg.carrier.ssb_center_freq_hz;
// Calculate integer SSB to pointA frequency offset in Hz
uint32_t ssb_pointA_freq_offset_Hz =
(ssb_abs_freq_Hz > pointA_abs_freq_Hz) ? (uint32_t)(ssb_abs_freq_Hz - pointA_abs_freq_Hz) : 0;
if (srsran_coreset_zero(phy_cfg.carrier.pci,
ssb_pointA_freq_offset_Hz,
phy_cfg.ssb.scs,
phy_cfg.carrier.scs,
6,
&phy_cfg.pdcch.coreset[0])) {
fprintf(stderr, "Error generating coreset0\n");
}
phy_cfg.pdcch.coreset_present[0] = true;
// RAR SS
phy_cfg.pdcch.ra_search_space_present = true;
phy_cfg.pdcch.ra_search_space.coreset_id = 0;
phy_cfg.pdcch.ra_search_space.duration = 1;
phy_cfg.pdcch.ra_search_space.type = srsran_search_space_type_common_1;
phy_cfg.pdcch.ra_search_space.nof_formats = 1;
phy_cfg.pdcch.ra_search_space.formats[1] = srsran_dci_format_nr_1_0;
phy_cfg.pdcch.ra_search_space.nof_candidates[0] = 0;
phy_cfg.pdcch.ra_search_space.nof_candidates[1] = 0;
phy_cfg.pdcch.ra_search_space.nof_candidates[2] = 1;
phy_cfg.pdcch.ra_search_space.nof_candidates[3] = 0;
phy_cfg.pdcch.ra_search_space.nof_candidates[4] = 0;
// common1 SS
phy_cfg.pdcch.search_space_present[0] = true;
phy_cfg.pdcch.search_space[0].coreset_id = 0;
phy_cfg.pdcch.search_space[0].duration = 1;
phy_cfg.pdcch.search_space[0].nof_candidates[0] = 0;
phy_cfg.pdcch.search_space[0].nof_candidates[1] = 0;
phy_cfg.pdcch.search_space[0].nof_candidates[2] = 1;
phy_cfg.pdcch.search_space[0].nof_candidates[3] = 0;
phy_cfg.pdcch.search_space[0].nof_candidates[4] = 0;
phy_cfg.pdcch.search_space[0].type = srsran_search_space_type_common_1;
phy_cfg.pdcch.search_space[0].nof_formats = 2;
phy_cfg.pdcch.search_space[0].formats[0] = srsran_dci_format_nr_0_0;
phy_cfg.pdcch.search_space[0].formats[1] = srsran_dci_format_nr_1_0;
phy_cfg.pdcch.search_space_present[1] = false;
if (not setup_req_proc.launch(cause, std::move(dedicated_info_nas_))) {
logger.error("Failed to initiate setup request procedure");
return SRSRAN_ERROR;
@ -1627,9 +1705,7 @@ void rrc_nr::protocol_failure() {}
// MAC interface
void rrc_nr::ra_completed()
{
logger.info("RA completed. Applying remaining CSI configuration.");
phy->set_config(phy_cfg);
phy_cfg_state = PHY_CFG_STATE_RA_COMPLETED;
logger.info("RA completed");
}
void rrc_nr::ra_problem()

@ -213,9 +213,6 @@ proc_outcome_t rrc_nr::setup_request_proc::step()
if (state == state_t::config_serving_cell) {
// TODO: start serving cell config and start T300
srsran::rach_nr_cfg_t rach_cfg = {};
rrc_handle.mac->set_config(rach_cfg);
rrc_handle.phy_cfg_state = PHY_CFG_STATE_APPLY_SP_CELL;
rrc_handle.phy->set_config(rrc_handle.phy_cfg);
@ -317,18 +314,18 @@ proc_outcome_t rrc_nr::cell_selection_proc::init()
{
init_serv_cell = meas_cells.serving_cell().phy_cell;
// Skip cell selection if serving cell is suitable and there are no stronger neighbours in same earfcn
if (is_serv_cell_suitable()) {
Debug("Skipping cell selection procedure as there are no stronger neighbours in same EARFCN.");
return set_proc_complete();
}
// TODO: add full cell selection
phy_interface_rrc_nr::cell_select_args_t cell_cfg = {};
cell_cfg.carrier = rrc_handle.phy_cfg.carrier;
cell_cfg.ssb_cfg = rrc_handle.phy_cfg.get_ssb_cfg();
rrc_handle.phy->start_cell_select(cell_cfg);
// Skip cell selection if serving cell is suitable and there are no stronger neighbours in same earfcn
if (is_serv_cell_suitable()) {
Debug("Skipping cell selection procedure as there are no stronger neighbours in same EARFCN.");
return set_proc_complete();
}
return set_proc_complete();
}

Loading…
Cancel
Save