diff --git a/executables/nr-ue.c b/executables/nr-ue.c index dd7285bc2c..dbc6a7e28f 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -147,7 +147,10 @@ void init_nrUE_standalone_thread(int ue_idx) static void *NRUE_phy_stub_standalone_pnf_task(void *arg) { - sem_t sfn_slot_semaphore; + NR_PRACH_RESOURCES_t prach_resources; + memset(&prach_resources, 0, sizeof(prach_resources)); + fapi_nr_ul_config_prach_pdu prach_pdu; + memset(&prach_pdu, 0, sizeof(prach_pdu)); int last_sfn_slot = -1; while (!oai_exit) { @@ -160,7 +163,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) int sfn_slot = current_sfn_slot; if (sfn_slot == last_sfn_slot) { - LOG_W(NR_MAC, "repeated sfn_sf = %d.%d\n", + LOG_D(NR_MAC, "repeated sfn_sf = %d.%d\n", sfn_slot >> 6, sfn_slot & 0x3F); continue; } @@ -168,15 +171,11 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) frame_t frame_tx = NFAPI_SFNSLOT2SFN(sfn_slot); int nr_slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot); - NR_PRACH_RESOURCES_t *prach_resources = NULL; - fapi_nr_ul_config_prach_pdu *prach_pdu = NULL; module_id_t mod_id = 0; int CC_id = 0; uint8_t gNB_id = 0; - LOG_I(NR_PHY, "Melissa In %s:[%d.%d] getting PRACH resources\n", __FUNCTION__, frame_tx, nr_slot_tx); - uint8_t nr_prach = nr_ue_get_rach(prach_resources, prach_pdu, mod_id, CC_id, frame_tx, gNB_id, nr_slot_tx); - LOG_I(NR_PHY, "In %s: [UE %d] This is nr_prach: %d\n", __FUNCTION__, mod_id, nr_prach); + uint8_t nr_prach = nr_ue_get_rach(&prach_resources, &prach_pdu, mod_id, CC_id, frame_tx, gNB_id, nr_slot_tx); if (nr_prach == 1) { diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 9751cde052..8969032a74 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -500,32 +500,15 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, int nr_slot_tx){ NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); - NR_CellGroupConfig_t *secondaryCellGroup = calloc(1, sizeof(*secondaryCellGroup)); - //NR_ServingCellConfigCommon_t *scc = calloc(1, sizeof(*scc)); - - prepare_scc(mac->scc); - - uint64_t ssb_bitmap; - fill_scc(mac->scc, &ssb_bitmap, 106, 106, 1, 1); - - fix_scc(mac->scc, ssb_bitmap); - - fill_default_secondaryCellGroup(mac->scc, secondaryCellGroup, 0, 1, 1, 0); - - if (mac == NULL){ - LOG_I(MAC, "Melissa mac is null\n"); - } - if (&mac->ra == NULL){ - LOG_I(MAC, "Melissa mac->ra is null\n"); - } - if (mac->scc == NULL){ - LOG_I(MAC, "Melissa scc is null\n"); + RA_config_t *ra = &mac->ra; + uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES]; + uint8_t lcid = UL_SCH_LCID_CCCH_MSG3, *payload; + uint16_t size_sdu = 0; + unsigned short post_padding; + NR_ServingCellConfigCommon_t *scc = mac->scc; + if (scc == NULL) { return 0; } - - LOG_I(MAC, "Melissa got here %s: %d\n", __FUNCTION__, __LINE__); - RA_config_t *ra = &mac->ra; - NR_ServingCellConfigCommon_t *scc = mac->scc; AssertFatal(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup != NULL, "In %s: FATAL! nr_rach_ConfigCommon is NULL...\n", __FUNCTION__); NR_RACH_ConfigCommon_t *setup = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup; AssertFatal(&setup->rach_ConfigGeneric != NULL, "In %s: FATAL! rach_ConfigGeneric is NULL...\n", __FUNCTION__); @@ -534,13 +517,8 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, uint8_t sdu_lcids[NB_RB_MAX] = {0}; uint16_t sdu_lengths[NB_RB_MAX] = {0}; + int TBS_bytes = 848, header_length_total=0, num_sdus, offset, mac_ce_len; - int mac_ce_len = 0; - unsigned short post_padding = 1; - int header_length_total = 0; - uint16_t size_sdu = 0; - int TBS_bytes = 848; - uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES]; // Delay init RA procedure to allow the convergence of the IIR filter on PRACH noise measurements at gNB side if (!prach_resources->init_msg1) { if (((MAX_FRAME_NUMBER + frame - prach_resources->sync_frame) % MAX_FRAME_NUMBER) > 150){ @@ -555,25 +533,45 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, if (ra->RA_active == 0) { /* RA not active - checking if RRC is ready to initiate the RA procedure */ - LOG_I(MAC, "RA not active. Checking for data to transmit from upper layers...\n"); + LOG_D(MAC, "RA not active. Checking for data to transmit from upper layers...\n"); - for (int i = 0; i < TBS_bytes; i++){ - mac_sdus[i] = (unsigned char) (lrand48()&0xff); + payload = (uint8_t*) &mac->CCCH_pdu.payload; + mac_ce_len = 0; + num_sdus = 1; + post_padding = 1; + + if (0){ + // initialisation by RRC + // CCCH PDU + // size_sdu = (uint16_t) mac_rrc_data_req_ue(mod_id, + // CC_id, + // frame, + // CCCH, + // 1, + // mac_sdus, + // gNB_id, + // 0); + LOG_D(MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n", mod_id, frame, size_sdu); + } else { + // fill ulsch_buffer with random data + for (int i = 0; i < TBS_bytes; i++){ + mac_sdus[i] = (unsigned char) (lrand48()&0xff); + } + //Sending SDUs with size 1 + //Initialize elements of sdu_lcids and sdu_lengths + sdu_lcids[0] = lcid; + sdu_lengths[0] = TBS_bytes - 3 - post_padding - mac_ce_len; + header_length_total += 2 + (sdu_lengths[0] >= 128); + size_sdu += sdu_lengths[0]; } - sdu_lcids[0] = UL_SCH_LCID_CCCH_MSG3; - sdu_lengths[0] = TBS_bytes - 3 - post_padding - mac_ce_len; - header_length_total += 2 + (sdu_lengths[0] >= 128); - size_sdu += sdu_lengths[0]; - if (size_sdu > 0) { - LOG_I(MAC, "[UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", mod_id, frame, nr_slot_tx); + LOG_D(MAC, "[UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", mod_id, frame, nr_slot_tx); ra->Msg3_size = size_sdu + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); init_RA(mod_id, prach_resources, setup, rach_ConfigGeneric, rach_ConfigDedicated); - uint8_t *payload = (uint8_t*) &mac->CCCH_pdu.payload; prach_resources->Msg3 = payload; nr_get_RA_window(mac); @@ -581,9 +579,9 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, if (ra->generate_nr_prach == 1) nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated); - int offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus, // sdus buffer + offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus, // sdus buffer (uint8_t *) payload, // UL MAC pdu pointer - 1, // num sdus + num_sdus, // num sdus sdu_lengths, // sdu length sdu_lcids, // sdu lcid 0, // power headroom @@ -602,7 +600,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, } } else if (ra->RA_window_cnt != -1) { // RACH is active - LOG_I(MAC, "In %s [%d.%d] RA is active: RA window count %d, RA backoff count %d\n", __FUNCTION__, frame, nr_slot_tx, ra->RA_window_cnt, ra->RA_backoff_cnt); + LOG_D(MAC, "In %s [%d.%d] RA is active: RA window count %d, RA backoff count %d\n", __FUNCTION__, frame, nr_slot_tx, ra->RA_window_cnt, ra->RA_backoff_cnt); if (ra->RA_BI_found){ prach_resources->RA_PREAMBLE_BACKOFF = prach_resources->RA_SCALING_FACTOR_BI * ra->RA_backoff_indicator; @@ -628,16 +626,21 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, // Fill in preamble and PRACH resources ra->RA_window_cnt--; nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated); + if (is_nr_UL_slot(mac->scc, nr_slot_tx)) { + nr_ue_scheduler(NULL, mac->ul_config_request); + nr_ue_prach_scheduler(mod_id, frame, nr_slot_tx, 0); + } } else if (ra->RA_backoff_cnt > 0) { - LOG_I(MAC, "[UE %d][%d.%d]: RAR not received yet (RA backoff count %d) \n", mod_id, frame, nr_slot_tx, ra->RA_backoff_cnt); + LOG_D(MAC, "[UE %d][%d.%d]: RAR not received yet (RA backoff count %d) \n", mod_id, frame, nr_slot_tx, ra->RA_backoff_cnt); ra->RA_backoff_cnt--; if ((ra->RA_backoff_cnt > 0 && ra->generate_nr_prach == 1) || ra->RA_backoff_cnt == 0){ nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated); } + } } } @@ -647,6 +650,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, } return ra->generate_nr_prach; + } void nr_get_RA_window(NR_UE_MAC_INST_t *mac){ diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index d6e1cba6df..b9d90f5dc8 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -1650,6 +1650,17 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s //fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP); fapi_nr_ul_config_request_t *ul_config = &mac->ul_config_request[0]; + #if 0 //Melissa + fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP); + fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PRACH); + if (!ul_config) { + LOG_W(MAC, "In %s: ul_config request is NULL. " + "Probably due to unexpected UL DCI in frame.slot %d.%d. Ignoring DCI!\n", + __FUNCTION__, frameP, slotP); + return; + } + #endif + fapi_nr_ul_config_prach_pdu *prach_config_pdu; fapi_nr_config_request_t *cfg = &mac->phy_config.config_req; fapi_nr_prach_config_t *prach_config = &cfg->prach_config; @@ -1682,11 +1693,12 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s format = prach_occasion_info_p->format; format0 = format & 0xff; // single PRACH format format1 = (format >> 8) & 0xff; // dual PRACH format - + #if 1 //Melissa ul_config->sfn = frameP; ul_config->slot = slotP; ul_config->ul_config_list[ul_config->number_pdus].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PRACH; + #endif prach_config_pdu = &ul_config->ul_config_list[ul_config->number_pdus].prach_config_pdu; memset(prach_config_pdu, 0, sizeof(fapi_nr_ul_config_prach_pdu)); ul_config->number_pdus += 1; diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 5d62579900..7e624f4f95 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -226,13 +226,13 @@ void *nrue_standalone_pnf_task(void *context) save_nr_measurement_info(&dl_tti_request); break; case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST: - LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST message. \n"); + LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST message. \n"); break; case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST: - LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST message. \n"); + LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST message. \n"); break; case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST: - LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST message. \n"); + LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST message. \n"); if (nfapi_nr_p7_message_unpack((void *)buffer, len, &dl_tti_request, sizeof(dl_tti_request), NULL) < 0) { diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 86bc08c592..5c356a274f 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -287,9 +287,9 @@ int8_t nr_rrc_ue_process_rrcReconfiguration(const module_id_t module_id, NR_RRCR nr_rrc_ue_process_scg_config(module_id,cellGroupConfig); }else{ // after first time, update it and free the memory after. + SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)NR_UE_rrc_inst[module_id].cell_group_config, 0); NR_UE_rrc_inst[module_id].cell_group_config = cellGroupConfig; nr_rrc_ue_process_scg_config(module_id,cellGroupConfig); - SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)NR_UE_rrc_inst[module_id].cell_group_config, 0); } } if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->measConfig != NULL){ @@ -341,6 +341,8 @@ int8_t nr_rrc_ue_process_scg_config(const module_id_t module_id, NR_CellGroupCon }else{ // maintain list if(cell_group_config->spCellConfig != NULL){ + nr_rrc_mac_config_req_ue(0, 0, 0, NULL, cell_group_config); + LOG_I(NR_RRC, "Melissa, we filled scc now \n"); if(cell_group_config->spCellConfig->spCellConfigDedicated != NULL){ // process element of list to be add by RRC message if(cell_group_config->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList != NULL){