Commit 32af60bc authored by cig's avatar cig

UE RA procedures changes to preamble selection:

- get preamble from rach_ConfigDedicated in contention free mode
- do preamble selection only in prach slot
parent f2764943
...@@ -350,6 +350,7 @@ int nr_rrc_mac_config_req_ue( ...@@ -350,6 +350,7 @@ int nr_rrc_mac_config_req_ue(
if(spCell_ConfigP != NULL ){ if(spCell_ConfigP != NULL ){
mac->servCellIndex = *spCell_ConfigP->servCellIndex; mac->servCellIndex = *spCell_ConfigP->servCellIndex;
if (spCell_ConfigP->reconfigurationWithSync) { if (spCell_ConfigP->reconfigurationWithSync) {
mac->rach_ConfigDedicated = spCell_ConfigP->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink;
mac->scc = spCell_ConfigP->reconfigurationWithSync->spCellConfigCommon; mac->scc = spCell_ConfigP->reconfigurationWithSync->spCellConfigCommon;
config_common_ue(mac,module_id,cc_idP); config_common_ue(mac,module_id,cc_idP);
mac->crnti = spCell_ConfigP->reconfigurationWithSync->newUE_Identity; mac->crnti = spCell_ConfigP->reconfigurationWithSync->newUE_Identity;
......
...@@ -156,6 +156,7 @@ typedef struct { ...@@ -156,6 +156,7 @@ typedef struct {
NR_ServingCellConfigCommon_t *scc; NR_ServingCellConfigCommon_t *scc;
NR_ServingCellConfig_t *scd; NR_ServingCellConfig_t *scd;
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated;
int servCellIndex; int servCellIndex;
//// MAC config //// MAC config
NR_DRX_Config_t *drx_Config; NR_DRX_Config_t *drx_Config;
......
...@@ -88,6 +88,10 @@ void nr_get_prach_resources(module_id_t mod_id, ...@@ -88,6 +88,10 @@ void nr_get_prach_resources(module_id_t mod_id,
int messagePowerOffsetGroupB, messageSizeGroupA, PLThreshold, sizeOfRA_PreamblesGroupA, numberOfRA_Preambles, i, deltaPreamble_Msg3; int messagePowerOffsetGroupB, messageSizeGroupA, PLThreshold, sizeOfRA_PreamblesGroupA, numberOfRA_Preambles, i, deltaPreamble_Msg3;
uint8_t noGroupB = 0, s_id, f_id, ul_carrier_id, prach_ConfigIndex, SFN_nbr, Msg3_size; uint8_t noGroupB = 0, s_id, f_id, ul_carrier_id, prach_ConfigIndex, SFN_nbr, Msg3_size;
AssertFatal(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup != NULL, "[UE %d] FATAL nr_rach_ConfigCommon is NULL !!!\n", mod_id);
nr_rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
rach_ConfigGeneric = &nr_rach_ConfigCommon->rach_ConfigGeneric;
// NR_RSRP_Range_t rsrp_ThresholdSSB; // todo // NR_RSRP_Range_t rsrp_ThresholdSSB; // todo
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
...@@ -104,138 +108,140 @@ void nr_get_prach_resources(module_id_t mod_id, ...@@ -104,138 +108,140 @@ void nr_get_prach_resources(module_id_t mod_id,
// -- RA initiated for SI request: // -- RA initiated for SI request:
// --- SSB selection, set prach_resources->ra_PreambleIndex // --- SSB selection, set prach_resources->ra_PreambleIndex
// if (rach_ConfigDedicated) { // This is for network controlled Mobility if (rach_ConfigDedicated) {
// // operation for contention-free RA resources when: //////////* Contention free RA *//////////
// // - available SSB with SS-RSRP above rsrp-ThresholdSSB: SSB selection // - the PRACH preamble for the UE to transmit is set through RRC configuration
// // - availalbe CSI-RS with CSI-RSRP above rsrp-ThresholdCSI-RS: CSI-RS selection // - this is the default mode in current implementation!
// prach_resources->ra_PreambleIndex = rach_ConfigDedicated->ra_PreambleIndex; // Operation for contention-free RA resources when:
// } // - available SSB with SS-RSRP above rsrp-ThresholdSSB: SSB selection
// - available CSI-RS with CSI-RSRP above rsrp-ThresholdCSI-RS: CSI-RS selection
//////////* Contention-based RA preamble selection *////////// // - network controlled Mobility
// todo: uint8_t cfra_ssb_resource_idx = 0;
// - selection of SSB with SS-RSRP above rsrp-ThresholdSSB else select any SSB prach_resources->ra_PreambleIndex = rach_ConfigDedicated->cfra->resources.choice.ssb->ssb_ResourceList.list.array[cfra_ssb_resource_idx]->ra_PreambleIndex;
// - todo determine next available PRACH occasion LOG_D(MAC, "[RAPROC] - Selected RA preamble index %d for contention-free random access procedure... \n", prach_resources->ra_PreambleIndex);
} else {
// rsrp_ThresholdSSB = *nr_rach_ConfigCommon->rsrp_ThresholdSSB; //////////* Contention-based RA preamble selection *//////////
// todo:
// - selection of SSB with SS-RSRP above rsrp-ThresholdSSB else select any SSB
// - todo determine next available PRACH occasion
AssertFatal(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup != NULL, "[UE %d] FATAL nr_rach_ConfigCommon is NULL !!!\n", mod_id); // rsrp_ThresholdSSB = *nr_rach_ConfigCommon->rsrp_ThresholdSSB;
nr_rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup; Msg3_size = mac->RA_Msg3_size;
rach_ConfigGeneric = &nr_rach_ConfigCommon->rach_ConfigGeneric;
Msg3_size = mac->RA_Msg3_size; numberOfRA_Preambles = 64;
if(nr_rach_ConfigCommon->totalNumberOfRA_Preambles != NULL)
numberOfRA_Preambles = *(nr_rach_ConfigCommon->totalNumberOfRA_Preambles);
numberOfRA_Preambles = 64; if (!nr_rach_ConfigCommon->groupBconfigured) {
if(nr_rach_ConfigCommon->totalNumberOfRA_Preambles != NULL) noGroupB = 1;
numberOfRA_Preambles = *(nr_rach_ConfigCommon->totalNumberOfRA_Preambles); } else {
// RA preambles group B is configured
// - Defining the number of RA preambles in RA Preamble Group A for each SSB */
sizeOfRA_PreamblesGroupA = nr_rach_ConfigCommon->groupBconfigured->numberOfRA_PreamblesGroupA;
switch (nr_rach_ConfigCommon->groupBconfigured->ra_Msg3SizeGroupA){
/* - Threshold to determine the groups of RA preambles */
case 0:
messageSizeGroupA = 56;
break;
case 1:
messageSizeGroupA = 144;
break;
case 2:
messageSizeGroupA = 208;
break;
case 3:
messageSizeGroupA = 256;
break;
case 4:
messageSizeGroupA = 282;
break;
case 5:
messageSizeGroupA = 480;
break;
case 6:
messageSizeGroupA = 640;
break;
case 7:
messageSizeGroupA = 800;
break;
case 8:
messageSizeGroupA = 1000;
break;
case 9:
messageSizeGroupA = 72;
break;
default:
AssertFatal(1 == 0,"Unknown ra_Msg3SizeGroupA %lu\n", nr_rach_ConfigCommon->groupBconfigured->ra_Msg3SizeGroupA);
/* todo cases 10 -15*/
}
if (!nr_rach_ConfigCommon->groupBconfigured) { /* Power offset for preamble selection in dB */
noGroupB = 1; messagePowerOffsetGroupB = -9999;
} else { switch (nr_rach_ConfigCommon->groupBconfigured->messagePowerOffsetGroupB){
// RA preambles group B is configured case 0:
// - Defining the number of RA preambles in RA Preamble Group A for each SSB */ messagePowerOffsetGroupB = -9999;
sizeOfRA_PreamblesGroupA = nr_rach_ConfigCommon->groupBconfigured->numberOfRA_PreamblesGroupA; break;
switch (nr_rach_ConfigCommon->groupBconfigured->ra_Msg3SizeGroupA){ case 1:
/* - Threshold to determine the groups of RA preambles */ messagePowerOffsetGroupB = 0;
case 0: break;
messageSizeGroupA = 56; case 2:
break; messagePowerOffsetGroupB = 5;
case 1: break;
messageSizeGroupA = 144; case 3:
break; messagePowerOffsetGroupB = 8;
case 2: break;
messageSizeGroupA = 208; case 4:
break; messagePowerOffsetGroupB = 10;
case 3: break;
messageSizeGroupA = 256; case 5:
break; messagePowerOffsetGroupB = 12;
case 4: break;
messageSizeGroupA = 282; case 6:
break; messagePowerOffsetGroupB = 15;
case 5: break;
messageSizeGroupA = 480; case 7:
break; messagePowerOffsetGroupB = 18;
case 6: break;
messageSizeGroupA = 640; default:
break; AssertFatal(1 == 0,"Unknown messagePowerOffsetGroupB %lu\n", nr_rach_ConfigCommon->groupBconfigured->messagePowerOffsetGroupB);
case 7: }
messageSizeGroupA = 800;
break;
case 8:
messageSizeGroupA = 1000;
break;
case 9:
messageSizeGroupA = 72;
break;
default:
AssertFatal(1 == 0,"Unknown ra_Msg3SizeGroupA %lu\n", nr_rach_ConfigCommon->groupBconfigured->ra_Msg3SizeGroupA);
/* todo cases 10 -15*/
}
/* Power offset for preamble selection in dB */ // todo Msg3-DeltaPreamble should be provided from higher layers, otherwise is 0
messagePowerOffsetGroupB = -9999; mac->deltaPreamble_Msg3 = 0;
switch (nr_rach_ConfigCommon->groupBconfigured->messagePowerOffsetGroupB){ deltaPreamble_Msg3 = mac->deltaPreamble_Msg3;
case 0:
messagePowerOffsetGroupB = -9999;
break;
case 1:
messagePowerOffsetGroupB = 0;
break;
case 2:
messagePowerOffsetGroupB = 5;
break;
case 3:
messagePowerOffsetGroupB = 8;
break;
case 4:
messagePowerOffsetGroupB = 10;
break;
case 5:
messagePowerOffsetGroupB = 12;
break;
case 6:
messagePowerOffsetGroupB = 15;
break;
case 7:
messagePowerOffsetGroupB = 18;
break;
default:
AssertFatal(1 == 0,"Unknown messagePowerOffsetGroupB %lu\n", nr_rach_ConfigCommon->groupBconfigured->messagePowerOffsetGroupB);
} }
// todo Msg3-DeltaPreamble should be provided from higher layers, otherwise is 0 PLThreshold = prach_resources->RA_PCMAX - rach_ConfigGeneric->preambleReceivedTargetPower - deltaPreamble_Msg3 - messagePowerOffsetGroupB;
mac->deltaPreamble_Msg3 = 0;
deltaPreamble_Msg3 = mac->deltaPreamble_Msg3; /* Msg3 has not been transmitted yet */
} if (first_Msg3 == 1) {
if (noGroupB == 1) {
PLThreshold = prach_resources->RA_PCMAX - rach_ConfigGeneric->preambleReceivedTargetPower - deltaPreamble_Msg3 - messagePowerOffsetGroupB; // use Group A preamble
prach_resources->ra_PreambleIndex = (taus()) % numberOfRA_Preambles;
/* Msg3 has not been transmitted yet */ mac->RA_usedGroupA = 1;
if (first_Msg3 == 1) { } else if ((Msg3_size < messageSizeGroupA) && (get_nr_PL(mod_id, CC_id, gNB_id) > PLThreshold)) {
if (noGroupB == 1) { // Group B is configured and RA preamble Group A is used
// use Group A preamble // - todo add condition on CCCH_sdu_size for initiation by CCCH
prach_resources->ra_PreambleIndex = (taus()) % numberOfRA_Preambles; prach_resources->ra_PreambleIndex = (taus()) % sizeOfRA_PreamblesGroupA;
mac->RA_usedGroupA = 1; mac->RA_usedGroupA = 1;
} else if ((Msg3_size < messageSizeGroupA) && (get_nr_PL(mod_id, CC_id, gNB_id) > PLThreshold)) { } else {
// Group B is configured and RA preamble Group A is used // Group B preamble is configured and used
// - todo add condition on CCCH_sdu_size for initiation by CCCH // the first sizeOfRA_PreamblesGroupA RA preambles belong to RA Preambles Group A
prach_resources->ra_PreambleIndex = (taus()) % sizeOfRA_PreamblesGroupA; // the remaining belong to RA Preambles Group B
mac->RA_usedGroupA = 1; prach_resources->ra_PreambleIndex = sizeOfRA_PreamblesGroupA + (taus()) % (numberOfRA_Preambles - sizeOfRA_PreamblesGroupA);
} else { mac->RA_usedGroupA = 0;
// Group B preamble is configured and used }
// the first sizeOfRA_PreamblesGroupA RA preambles belong to RA Preambles Group A } else { // Msg3 is being retransmitted
// the remaining belong to RA Preambles Group B if (mac->RA_usedGroupA == 1 && noGroupB == 1) {
prach_resources->ra_PreambleIndex = sizeOfRA_PreamblesGroupA + (taus()) % (numberOfRA_Preambles - sizeOfRA_PreamblesGroupA); prach_resources->ra_PreambleIndex = (taus()) % numberOfRA_Preambles;
mac->RA_usedGroupA = 0; } else if (mac->RA_usedGroupA == 1 && noGroupB == 0){
} prach_resources->ra_PreambleIndex = (taus()) % sizeOfRA_PreamblesGroupA;
} else { // Msg3 is being retransmitted } else {
if (mac->RA_usedGroupA == 1 && noGroupB == 1) { prach_resources->ra_PreambleIndex = sizeOfRA_PreamblesGroupA + (taus()) % (numberOfRA_Preambles - sizeOfRA_PreamblesGroupA);
prach_resources->ra_PreambleIndex = (taus()) % numberOfRA_Preambles; }
} else if (mac->RA_usedGroupA == 1 && noGroupB == 0){
prach_resources->ra_PreambleIndex = (taus()) % sizeOfRA_PreamblesGroupA;
} else {
prach_resources->ra_PreambleIndex = sizeOfRA_PreamblesGroupA + (taus()) % (numberOfRA_Preambles - sizeOfRA_PreamblesGroupA);
} }
LOG_D(MAC, "[RAPROC] - Selected RA preamble index %d for contention-based random access procedure... \n", prach_resources->ra_PreambleIndex);
} }
// todo determine next available PRACH occasion // todo determine next available PRACH occasion
...@@ -284,7 +290,7 @@ void nr_get_prach_resources(module_id_t mod_id, ...@@ -284,7 +290,7 @@ void nr_get_prach_resources(module_id_t mod_id,
prach_resources->ra_RNTI = 1 + s_id + 14 * t_id + 1120 * f_id + 8960 * ul_carrier_id; prach_resources->ra_RNTI = 1 + s_id + 14 * t_id + 1120 * f_id + 8960 * ul_carrier_id;
mac->ra_rnti = prach_resources->ra_RNTI; mac->ra_rnti = prach_resources->ra_RNTI;
LOG_D(MAC, "Computed ra_RNTI is %d", prach_resources->ra_RNTI); LOG_D(MAC, "Computed ra_RNTI is %x \n", prach_resources->ra_RNTI);
} }
// TbD: RA_attempt_number not used // TbD: RA_attempt_number not used
...@@ -311,6 +317,7 @@ void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint ...@@ -311,6 +317,7 @@ void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
/// Handling inizialization by PDCCH order, MAC entity or RRC (TS 38.300) /// Handling inizialization by PDCCH order, MAC entity or RRC (TS 38.300)
/// Only one RA procedure is ongoing at any point in time in a MAC entity /// Only one RA procedure is ongoing at any point in time in a MAC entity
/// the RA procedure on a SCell shall only be initiated by PDCCH order /// the RA procedure on a SCell shall only be initiated by PDCCH order
/// in the current implementation, RA is contention free only
// WIP // WIP
// todo TS 38.321: // todo TS 38.321:
...@@ -324,7 +331,6 @@ void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint ...@@ -324,7 +331,6 @@ void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
// - retrieve TBS // - retrieve TBS
// - add mac_rrc_nr_data_req_ue, etc ... // - add mac_rrc_nr_data_req_ue, etc ...
// - add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) // - add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator)
void nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, void nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
module_id_t mod_id, module_id_t mod_id,
int CC_id, int CC_id,
...@@ -345,6 +351,8 @@ void nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, ...@@ -345,6 +351,8 @@ void nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
NR_RACH_ConfigCommon_t *setup = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup; NR_RACH_ConfigCommon_t *setup = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric; NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric;
NR_FrequencyInfoDL_t *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL; NR_FrequencyInfoDL_t *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL;
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated = mac->rach_ConfigDedicated;
// int32_t frame_diff = 0; // int32_t frame_diff = 0;
uint8_t sdu_lcids[NB_RB_MAX] = {0}; uint8_t sdu_lcids[NB_RB_MAX] = {0};
...@@ -485,7 +493,8 @@ void nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, ...@@ -485,7 +493,8 @@ void nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
} }
// Fill in preamble and PRACH resources // Fill in preamble and PRACH resources
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, 1, prach_resources, NULL); if (is_nr_prach_slot)
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, 1, prach_resources, rach_ConfigDedicated);
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 (uint8_t *) payload, // UL MAC pdu pointer
...@@ -601,8 +610,11 @@ void nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, ...@@ -601,8 +610,11 @@ void nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
mac->RA_tx_frame = frame; mac->RA_tx_frame = frame;
mac->RA_tx_subframe = nr_tti_tx; mac->RA_tx_subframe = nr_tti_tx;
// Fill in preamble and PRACH resources // Fill in preamble and PRACH resources
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, 0, prach_resources, NULL); if (is_nr_prach_slot)
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, 0, prach_resources, rach_ConfigDedicated);
} }
} }
} else if (UE_mode == PUSCH) { } else if (UE_mode == PUSCH) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment