Merge remote-tracking branch 'origin/develop-SRS' into integration_2022_wk06_a
This commit is contained in:
@@ -417,6 +417,7 @@ typedef struct NRRrcConfigurationReq_s {
|
||||
int pusch_AntennaPorts;
|
||||
int minRXTXTIME;
|
||||
int do_CSIRS;
|
||||
int do_SRS;
|
||||
int pusch_TargetSNRx10;
|
||||
int pucch_TargetSNRx10;
|
||||
} gNB_RrcConfigurationReq;
|
||||
|
||||
@@ -1166,6 +1166,8 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
|
||||
NRRRC_CONFIGURATION_REQ (msg_p).sib1_tda = *GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr;
|
||||
printf("Do CSI-RS %d\n",*GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr);
|
||||
NRRRC_CONFIGURATION_REQ (msg_p).do_CSIRS = *GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr;
|
||||
printf("Do SRS %d\n",*GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr);
|
||||
NRRRC_CONFIGURATION_REQ (msg_p).do_SRS = *GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr;
|
||||
NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
|
||||
NRRRC_CONFIGURATION_REQ (msg_p).scd = scd;
|
||||
|
||||
|
||||
@@ -118,6 +118,7 @@ typedef enum {
|
||||
#define GNB_CONFIG_STRING_PUSCHANTENNAPORTS "pusch_AntennaPorts"
|
||||
#define GNB_CONFIG_STRING_SIB1TDA "sib1_tda"
|
||||
#define GNB_CONFIG_STRING_DOCSIRS "do_CSIRS"
|
||||
#define GNB_CONFIG_STRING_DOSRS "do_SRS"
|
||||
#define GNB_CONFIG_STRING_NRCELLID "nr_cellid"
|
||||
#define GNB_CONFIG_STRING_MINRXTXTIME "min_rxtxtime"
|
||||
#define GNB_CONFIG_STRING_ULPRBBLACKLIST "ul_prbblacklist"
|
||||
@@ -147,6 +148,7 @@ typedef enum {
|
||||
{GNB_CONFIG_STRING_PUSCHANTENNAPORTS, NULL, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
|
||||
{GNB_CONFIG_STRING_SIB1TDA, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
||||
{GNB_CONFIG_STRING_DOCSIRS, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
||||
{GNB_CONFIG_STRING_DOSRS, NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
||||
{GNB_CONFIG_STRING_NRCELLID, NULL, 0, u64ptr:NULL, defint64val:1, TYPE_UINT64, 0}, \
|
||||
{GNB_CONFIG_STRING_MINRXTXTIME, NULL, 0, iptr:NULL, defintval:2, TYPE_INT, 0}, \
|
||||
{GNB_CONFIG_STRING_ULPRBBLACKLIST, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0} \
|
||||
@@ -171,9 +173,10 @@ typedef enum {
|
||||
#define GNB_PUSCH_ANTENNAPORTS_IDX 16
|
||||
#define GNB_SIB1_TDA_IDX 17
|
||||
#define GNB_DO_CSIRS_IDX 18
|
||||
#define GNB_NRCELLID_IDX 19
|
||||
#define GNB_MINRXTXTIME_IDX 20
|
||||
#define GNB_ULPRBBLACKLIST_IDX 21
|
||||
#define GNB_DO_SRS_IDX 19
|
||||
#define GNB_NRCELLID_IDX 20
|
||||
#define GNB_MINRXTXTIME_IDX 21
|
||||
#define GNB_ULPRBBLACKLIST_IDX 22
|
||||
|
||||
#define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
|
||||
#define GNBPARAMS_CHECK { \
|
||||
|
||||
@@ -2495,6 +2495,61 @@ uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
*
|
||||
* NAME : get_nr_srs_offset
|
||||
*
|
||||
* PARAMETERS : periodicityAndOffset for SRS
|
||||
*
|
||||
* RETURN : the offset parameter for SRS
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset) {
|
||||
|
||||
switch(periodicityAndOffset.present) {
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl1:
|
||||
return periodicityAndOffset.choice.sl1;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl2:
|
||||
return periodicityAndOffset.choice.sl2;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl4:
|
||||
return periodicityAndOffset.choice.sl4;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl5:
|
||||
return periodicityAndOffset.choice.sl5;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl8:
|
||||
return periodicityAndOffset.choice.sl8;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl10:
|
||||
return periodicityAndOffset.choice.sl10;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl16:
|
||||
return periodicityAndOffset.choice.sl16;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl20:
|
||||
return periodicityAndOffset.choice.sl20;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl32:
|
||||
return periodicityAndOffset.choice.sl32;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl40:
|
||||
return periodicityAndOffset.choice.sl40;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl64:
|
||||
return periodicityAndOffset.choice.sl64;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl80:
|
||||
return periodicityAndOffset.choice.sl80;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl160:
|
||||
return periodicityAndOffset.choice.sl160;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl320:
|
||||
return periodicityAndOffset.choice.sl320;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl640:
|
||||
return periodicityAndOffset.choice.sl640;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl1280:
|
||||
return periodicityAndOffset.choice.sl1280;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_sl2560:
|
||||
return periodicityAndOffset.choice.sl2560;
|
||||
case NR_SRS_PeriodicityAndOffset_PR_NOTHING:
|
||||
LOG_W(NR_MAC,"NR_SRS_PeriodicityAndOffset_PR_NOTHING\n");
|
||||
return 0;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Set the transform precoding status according to 6.1.3 of 3GPP TS 38.214 version 16.3.0 Release 16:
|
||||
// - "UE procedure for applying transform precoding on PUSCH"
|
||||
uint8_t get_transformPrecoding(const NR_BWP_UplinkCommon_t *initialUplinkBWP,
|
||||
|
||||
@@ -119,6 +119,8 @@ int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmr
|
||||
uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint8_t mcs_table);
|
||||
uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB);
|
||||
|
||||
uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset);
|
||||
|
||||
void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
|
||||
frame_t frameP,
|
||||
NR_MIB_t *mib,
|
||||
|
||||
@@ -57,6 +57,8 @@
|
||||
|
||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
||||
|
||||
//#define SRS_DEBUG
|
||||
|
||||
static prach_association_pattern_t prach_assoc_pattern;
|
||||
static ssb_list_info_t ssb_list;
|
||||
|
||||
@@ -894,6 +896,133 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
||||
|
||||
}
|
||||
|
||||
// Periodic SRS scheduling
|
||||
bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slot) {
|
||||
|
||||
bool srs_scheduled = false;
|
||||
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||
|
||||
NR_SRS_Config_t *srs_config = NULL;
|
||||
if (mac->cg &&
|
||||
mac->cg->spCellConfig &&
|
||||
mac->cg->spCellConfig->spCellConfigDedicated &&
|
||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
||||
srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int rs = 0; rs < srs_config->srs_ResourceSetToAddModList->list.count; rs++) {
|
||||
|
||||
// Find periodic resource set
|
||||
NR_SRS_ResourceSet_t *srs_resource_set = srs_config->srs_ResourceSetToAddModList->list.array[rs];
|
||||
if(srs_resource_set->resourceType.present != NR_SRS_ResourceSet__resourceType_PR_periodic) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Find the corresponding srs resource
|
||||
NR_SRS_Resource_t *srs_resource = NULL;
|
||||
for(int r1 = 0; r1 < srs_resource_set->srs_ResourceIdList->list.count; r1++) {
|
||||
for (int r2 = 0; r2 < srs_config->srs_ResourceToAddModList->list.count; r2++) {
|
||||
if ((*srs_resource_set->srs_ResourceIdList->list.array[r1] == srs_config->srs_ResourceToAddModList->list.array[r2]->srs_ResourceId) &&
|
||||
(srs_config->srs_ResourceToAddModList->list.array[r2]->resourceType.present == NR_SRS_Resource__resourceType_PR_periodic)) {
|
||||
srs_resource = srs_config->srs_ResourceToAddModList->list.array[r2];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(srs_resource == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
NR_BWP_t ubwp = mac->ULbwp[0] ?
|
||||
mac->ULbwp[0]->bwp_Common->genericParameters :
|
||||
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters;
|
||||
|
||||
uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present];
|
||||
uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
|
||||
|
||||
int n_slots_frame = nr_slots_per_frame[ubwp.subcarrierSpacing];
|
||||
|
||||
// Check if UE should transmit the SRS
|
||||
if((frame*n_slots_frame+slot-offset)%period == 0) {
|
||||
|
||||
fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slot);
|
||||
fapi_nr_ul_config_srs_pdu *srs_config_pdu = &ul_config->ul_config_list[ul_config->number_pdus].srs_config_pdu;
|
||||
|
||||
srs_config_pdu->rnti = mac->crnti;
|
||||
srs_config_pdu->handle = 0;
|
||||
srs_config_pdu->bwp_size = NRRIV2BW(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
|
||||
srs_config_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
|
||||
srs_config_pdu->subcarrier_spacing = ubwp.subcarrierSpacing;
|
||||
srs_config_pdu->cyclic_prefix = 0;
|
||||
srs_config_pdu->num_ant_ports = srs_resource->nrofSRS_Ports;
|
||||
srs_config_pdu->num_symbols = srs_resource->resourceMapping.nrofSymbols;
|
||||
srs_config_pdu->num_repetitions = srs_resource->resourceMapping.repetitionFactor;
|
||||
srs_config_pdu->time_start_position = srs_resource->resourceMapping.startPosition;
|
||||
srs_config_pdu->config_index = srs_resource->freqHopping.c_SRS;
|
||||
srs_config_pdu->sequence_id = srs_resource->sequenceId;
|
||||
srs_config_pdu->bandwidth_index = srs_resource->freqHopping.b_SRS;
|
||||
srs_config_pdu->comb_size = srs_resource->transmissionComb.present - 1;
|
||||
|
||||
switch(srs_resource->transmissionComb.present) {
|
||||
case NR_SRS_Resource__transmissionComb_PR_n2:
|
||||
srs_config_pdu->comb_offset = srs_resource->transmissionComb.choice.n2->combOffset_n2;
|
||||
srs_config_pdu->cyclic_shift = srs_resource->transmissionComb.choice.n2->cyclicShift_n2;
|
||||
break;
|
||||
case NR_SRS_Resource__transmissionComb_PR_n4:
|
||||
srs_config_pdu->comb_offset = srs_resource->transmissionComb.choice.n4->combOffset_n4;
|
||||
srs_config_pdu->cyclic_shift = srs_resource->transmissionComb.choice.n4->cyclicShift_n4;
|
||||
break;
|
||||
default:
|
||||
LOG_W(NR_MAC, "Invalid or not implemented comb_size!\n");
|
||||
}
|
||||
|
||||
srs_config_pdu->frequency_position = srs_resource->freqDomainPosition;
|
||||
srs_config_pdu->frequency_shift = srs_resource->freqDomainShift;
|
||||
srs_config_pdu->frequency_hopping = srs_resource->freqHopping.b_hop;
|
||||
srs_config_pdu->group_or_sequence_hopping = srs_resource->groupOrSequenceHopping;
|
||||
srs_config_pdu->resource_type = srs_resource->resourceType.present - 1;
|
||||
srs_config_pdu->t_srs = period;
|
||||
srs_config_pdu->t_offset = offset;
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_MAC,"Frame = %i, slot = %i\n", frame, slot);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->rnti = 0x%04x\n", srs_config_pdu->rnti);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->handle = %u\n", srs_config_pdu->handle);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->bwp_size = %u\n", srs_config_pdu->bwp_size);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->bwp_start = %u\n", srs_config_pdu->bwp_start);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->subcarrier_spacing = %u\n", srs_config_pdu->subcarrier_spacing);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->cyclic_prefix = %u (0: Normal; 1: Extended)\n", srs_config_pdu->cyclic_prefix);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->num_ant_ports = %u (0 = 1 port, 1 = 2 ports, 2 = 4 ports)\n", srs_config_pdu->num_ant_ports);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->num_symbols = %u (0 = 1 symbol, 1 = 2 symbols, 2 = 4 symbols)\n", srs_config_pdu->num_symbols);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->num_repetitions = %u (0 = 1, 1 = 2, 2 = 4)\n", srs_config_pdu->num_repetitions);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->time_start_position = %u\n", srs_config_pdu->time_start_position);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->config_index = %u\n", srs_config_pdu->config_index);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->sequence_id = %u\n", srs_config_pdu->sequence_id);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->bandwidth_index = %u\n", srs_config_pdu->bandwidth_index);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->comb_size = %u (0 = comb size 2, 1 = comb size 4, 2 = comb size 8)\n", srs_config_pdu->comb_size);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->comb_offset = %u\n", srs_config_pdu->comb_offset);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->cyclic_shift = %u\n", srs_config_pdu->cyclic_shift);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->frequency_position = %u\n", srs_config_pdu->frequency_position);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->frequency_shift = %u\n", srs_config_pdu->frequency_shift);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->frequency_hopping = %u\n", srs_config_pdu->frequency_hopping);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->group_or_sequence_hopping = %u (0 = No hopping, 1 = Group hopping groupOrSequenceHopping, 2 = Sequence hopping)\n", srs_config_pdu->group_or_sequence_hopping);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->resource_type = %u (0: aperiodic, 1: semi-persistent, 2: periodic)\n", srs_config_pdu->resource_type);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->t_srs = %u\n", srs_config_pdu->t_srs);
|
||||
LOG_I(NR_MAC,"srs_config_pdu->t_offset = %u\n", srs_config_pdu->t_offset);
|
||||
#endif
|
||||
|
||||
fill_ul_config(ul_config, frame, slot, FAPI_NR_UL_CONFIG_TYPE_SRS);
|
||||
srs_scheduled = true;
|
||||
}
|
||||
}
|
||||
return srs_scheduled;
|
||||
}
|
||||
|
||||
// Performs :
|
||||
// 1. TODO: Call RRC for link status return to PHY
|
||||
// 2. TODO: Perform SR/BSR procedures for scheduling feedback
|
||||
@@ -962,6 +1091,10 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
if (!ul_config) {
|
||||
LOG_E(NR_MAC, "mac->ul_config is null!\n");
|
||||
}
|
||||
|
||||
// Periodic SRS scheduling
|
||||
nr_ue_periodic_srs_scheduling(mod_id, frame_tx, slot_tx);
|
||||
|
||||
// Schedule ULSCH only if the current frame and slot match those in ul_config_req
|
||||
// AND if a UL grant (UL DCI or Msg3) has been received (as indicated by num_pdus)
|
||||
if (ul_config){
|
||||
@@ -1052,7 +1185,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
}
|
||||
|
||||
if (dl_info) {
|
||||
return (CONNECTION_OK);
|
||||
return (UE_CONNECTION_OK);
|
||||
}
|
||||
module_id_t mod_id = ul_info->module_id;
|
||||
frame_t txFrameP = ul_info->frame_tx;
|
||||
|
||||
@@ -379,6 +379,10 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
||||
if (slot == 0)
|
||||
nr_csi_meas_reporting(module_idP, frame, slot);
|
||||
|
||||
// Schedule SRS: check in slot 0 for the whole frame
|
||||
if (slot == 0)
|
||||
nr_schedule_srs(module_idP, frame);
|
||||
|
||||
// This schedule RA procedure if not in phy_test mode
|
||||
// Otherwise already consider 5G already connected
|
||||
if (get_softmodem_params()->phy_test == 0) {
|
||||
|
||||
@@ -2038,6 +2038,11 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
|
||||
sched_ctrl->pucch_consecutive_dtx_cnt = 0;
|
||||
sched_ctrl->pusch_consecutive_dtx_cnt = 0;
|
||||
sched_ctrl->ul_failure = 0;
|
||||
|
||||
sched_ctrl->sched_srs.frame = -1;
|
||||
sched_ctrl->sched_srs.slot = -1;
|
||||
sched_ctrl->sched_srs.srs_scheduled = false;
|
||||
|
||||
/* set illegal time domain allocation to force recomputation of all fields */
|
||||
sched_ctrl->pdsch_semi_static.time_domain_allocation = -1;
|
||||
sched_ctrl->pusch_semi_static.time_domain_allocation = -1;
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file gNB_scheduler_srs.c
|
||||
* \brief MAC procedures related to SRS
|
||||
* \date 2021
|
||||
* \version 1.0
|
||||
*/
|
||||
|
||||
#include <softmodem-common.h>
|
||||
#include "NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#include "NR_MAC_COMMON/nr_mac_extern.h"
|
||||
#include "NR_MAC_gNB/mac_proto.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
|
||||
extern RAN_CONTEXT_t RC;
|
||||
|
||||
void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int UE_id, NR_SRS_Resource_t *srs_resource) {
|
||||
|
||||
gNB_MAC_INST *nrmac = RC.nrmac[module_id];
|
||||
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
|
||||
NR_UE_info_t *UE_info = &nrmac->UE_info;
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||
|
||||
NR_BWP_t ubwp = sched_ctrl->active_ubwp ?
|
||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters :
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
||||
|
||||
srs_pdu->rnti = UE_info->rnti[UE_id];
|
||||
srs_pdu->handle = 0;
|
||||
srs_pdu->bwp_size = NRRIV2BW(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
|
||||
srs_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
|
||||
srs_pdu->subcarrier_spacing = ubwp.subcarrierSpacing;
|
||||
srs_pdu->cyclic_prefix = 0;
|
||||
srs_pdu->num_ant_ports = srs_resource->nrofSRS_Ports;
|
||||
srs_pdu->num_symbols = srs_resource->resourceMapping.nrofSymbols;
|
||||
srs_pdu->num_repetitions = srs_resource->resourceMapping.repetitionFactor;
|
||||
srs_pdu->time_start_position = srs_resource->resourceMapping.startPosition;
|
||||
srs_pdu->config_index = srs_resource->freqHopping.c_SRS;
|
||||
srs_pdu->sequence_id = srs_resource->sequenceId;
|
||||
srs_pdu->bandwidth_index = srs_resource->freqHopping.b_SRS;
|
||||
srs_pdu->comb_size = srs_resource->transmissionComb.present - 1;
|
||||
|
||||
switch(srs_resource->transmissionComb.present) {
|
||||
case NR_SRS_Resource__transmissionComb_PR_n2:
|
||||
srs_pdu->comb_offset = srs_resource->transmissionComb.choice.n2->combOffset_n2;
|
||||
srs_pdu->cyclic_shift = srs_resource->transmissionComb.choice.n2->cyclicShift_n2;
|
||||
break;
|
||||
case NR_SRS_Resource__transmissionComb_PR_n4:
|
||||
srs_pdu->comb_offset = srs_resource->transmissionComb.choice.n4->combOffset_n4;
|
||||
srs_pdu->cyclic_shift = srs_resource->transmissionComb.choice.n4->cyclicShift_n4;
|
||||
break;
|
||||
default:
|
||||
LOG_W(NR_MAC, "Invalid or not implemented comb_size!\n");
|
||||
}
|
||||
|
||||
srs_pdu->frequency_position = srs_resource->freqDomainPosition;
|
||||
srs_pdu->frequency_shift = srs_resource->freqDomainShift;
|
||||
srs_pdu->frequency_hopping = srs_resource->freqHopping.b_hop;
|
||||
srs_pdu->group_or_sequence_hopping = srs_resource->groupOrSequenceHopping;
|
||||
srs_pdu->resource_type = srs_resource->resourceType.present - 1;
|
||||
srs_pdu->t_srs = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present];
|
||||
srs_pdu->t_offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
|
||||
}
|
||||
|
||||
void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) {
|
||||
|
||||
nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][slot];
|
||||
|
||||
future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE;
|
||||
future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_srs_pdu_t);
|
||||
nfapi_nr_srs_pdu_t *srs_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].srs_pdu;
|
||||
memset(srs_pdu, 0, sizeof(nfapi_nr_srs_pdu_t));
|
||||
future_ul_tti_req->n_pdus += 1;
|
||||
|
||||
nr_configure_srs(srs_pdu, module_id, CC_id, UE_id, srs_resource);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
*
|
||||
* NAME : nr_schedule_srs
|
||||
*
|
||||
* PARAMETERS : module id
|
||||
* frame number for possible SRS reception
|
||||
*
|
||||
* DESCRIPTION : It informs the PHY layer that has an SRS to receive.
|
||||
* Only for periodic scheduling yet.
|
||||
*
|
||||
*********************************************************************/
|
||||
void nr_schedule_srs(int module_id, frame_t frame) {
|
||||
|
||||
gNB_MAC_INST *nrmac = RC.nrmac[module_id];
|
||||
NR_UE_info_t *UE_info = &nrmac->UE_info;
|
||||
const NR_list_t *UE_list = &UE_info->list;
|
||||
|
||||
for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
|
||||
|
||||
const int CC_id = 0;
|
||||
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[CC_id].ServingCellConfigCommon;
|
||||
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||
|
||||
sched_ctrl->sched_srs.frame = -1;
|
||||
sched_ctrl->sched_srs.slot = -1;
|
||||
sched_ctrl->sched_srs.srs_scheduled = false;
|
||||
|
||||
if(!UE_info->Msg4_ACKed[UE_id]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
NR_SRS_Config_t *srs_config = NULL;
|
||||
if (cg &&
|
||||
cg->spCellConfig &&
|
||||
cg->spCellConfig->spCellConfigDedicated &&
|
||||
cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
||||
srs_config = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
for(int rs = 0; rs < srs_config->srs_ResourceSetToAddModList->list.count; rs++) {
|
||||
|
||||
// Find periodic resource set
|
||||
NR_SRS_ResourceSet_t *srs_resource_set = srs_config->srs_ResourceSetToAddModList->list.array[rs];
|
||||
if (srs_resource_set->resourceType.present != NR_SRS_ResourceSet__resourceType_PR_periodic) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Find the corresponding srs resource
|
||||
NR_SRS_Resource_t *srs_resource = NULL;
|
||||
for (int r1 = 0; r1 < srs_resource_set->srs_ResourceIdList->list.count; r1++) {
|
||||
for (int r2 = 0; r2 < srs_config->srs_ResourceToAddModList->list.count; r2++) {
|
||||
if ((*srs_resource_set->srs_ResourceIdList->list.array[r1] ==
|
||||
srs_config->srs_ResourceToAddModList->list.array[r2]->srs_ResourceId) &&
|
||||
(srs_config->srs_ResourceToAddModList->list.array[r2]->resourceType.present ==
|
||||
NR_SRS_Resource__resourceType_PR_periodic)) {
|
||||
srs_resource = srs_config->srs_ResourceToAddModList->list.array[r2];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (srs_resource == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
NR_BWP_t ubwp = sched_ctrl->active_ubwp ?
|
||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters :
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
||||
|
||||
uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present];
|
||||
uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
|
||||
|
||||
int n_slots_frame = nr_slots_per_frame[ubwp.subcarrierSpacing];
|
||||
|
||||
// Check if UE will transmit the SRS in this frame
|
||||
if ( ((frame - offset/n_slots_frame)*n_slots_frame)%period == 0) {
|
||||
LOG_D(NR_MAC,"Scheduling SRS reception for %d.%d\n", frame, offset%n_slots_frame);
|
||||
nr_fill_nfapi_srs(module_id, CC_id, UE_id, offset%n_slots_frame, srs_resource);
|
||||
sched_ctrl->sched_srs.frame = frame;
|
||||
sched_ctrl->sched_srs.slot = offset%n_slots_frame;
|
||||
sched_ctrl->sched_srs.srs_scheduled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1408,6 +1408,15 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
|
||||
if (sched_ctrl->active_ubwp==NULL && is_mixed_slot)
|
||||
return false;
|
||||
|
||||
// Avoid slots with the SRS
|
||||
const NR_list_t *UE_list = &UE_info->list;
|
||||
for (int UE_idx = UE_list->head; UE_idx >= 0; UE_idx = UE_list->next[UE_idx]) {
|
||||
NR_sched_srs_t sched_srs = UE_info->UE_sched_ctrl[UE_idx].sched_srs;
|
||||
if(sched_srs.srs_scheduled && sched_srs.frame==sched_frame && sched_srs.slot==sched_slot) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
sched_ctrl->sched_pusch.slot = sched_slot;
|
||||
sched_ctrl->sched_pusch.frame = sched_frame;
|
||||
for (UE_id = UE_info->list.next[UE_id]; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
|
||||
@@ -1649,7 +1658,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
|
||||
memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
|
||||
future_ul_tti_req->n_pdus += 1;
|
||||
|
||||
LOG_D(NR_MAC, "%4d.%2d Scheduling UE specific PUSCH for sched %d.%d, ul_tto_req %d.%d\n", frame, slot,
|
||||
LOG_D(NR_MAC, "%4d.%2d Scheduling UE specific PUSCH for sched %d.%d, ul_tti_req %d.%d\n", frame, slot,
|
||||
sched_pusch->frame,sched_pusch->slot,future_ul_tti_req->SFN,future_ul_tti_req->Slot);
|
||||
|
||||
pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
|
||||
|
||||
@@ -190,6 +190,8 @@ void nr_schedule_pucch(int Mod_idP,
|
||||
frame_t frameP,
|
||||
sub_frame_t slotP);
|
||||
|
||||
void nr_schedule_srs(int module_id, frame_t frame);
|
||||
|
||||
void nr_csirs_scheduling(int Mod_idP,
|
||||
frame_t frame,
|
||||
sub_frame_t slot,
|
||||
|
||||
@@ -378,6 +378,12 @@ typedef struct NR_sched_pusch {
|
||||
int time_domain_allocation;
|
||||
} NR_sched_pusch_t;
|
||||
|
||||
typedef struct NR_sched_srs {
|
||||
int frame;
|
||||
int slot;
|
||||
bool srs_scheduled;
|
||||
} NR_sched_srs_t;
|
||||
|
||||
/* PDSCH semi-static configuratio: as long as the TDA/DMRS/mcsTable remains the
|
||||
* same, there is no need to recalculate all S/L or DMRS-related parameters
|
||||
* over and over again. Hence, we store them in this struct for easy
|
||||
@@ -565,9 +571,12 @@ typedef struct {
|
||||
|
||||
/// PUSCH semi-static configuration: is not cleared across TTIs
|
||||
NR_pusch_semi_static_t pusch_semi_static;
|
||||
/// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI
|
||||
/// Sched PUSCH: scheduling decisions, copied into HARQ and cleared every TTI
|
||||
NR_sched_pusch_t sched_pusch;
|
||||
|
||||
/// Sched SRS: scheduling decisions
|
||||
NR_sched_srs_t sched_srs;
|
||||
|
||||
/// uplink bytes that are currently scheduled
|
||||
int sched_ul_bytes;
|
||||
/// estimation of the UL buffer size
|
||||
|
||||
@@ -4293,7 +4293,7 @@ ssize_t do_nrMeasurementReport(uint8_t *buffer,
|
||||
LTE_MeasResultListEUTRA_t *measResultListEUTRA2=&measResultNeighCells->choice.measResultListEUTRA;
|
||||
asn1cSequenceAdd(measResultListEUTRA2->list, struct LTE_MeasResultEUTRA, measresulteutra_list);
|
||||
measresulteutra_list->physCellId = phy_id;
|
||||
asn1cCalloc(measresulteutra_list->cgi_Info, measresult_cgi2);
|
||||
//asn1cCalloc(measresulteutra_list->cgi_Info, measresult_cgi2);
|
||||
//measresult_cgi2->cellGlobalId= {0};
|
||||
//measresult_cgi2->trackingAreaCode= {0};
|
||||
struct LTE_MeasResultEUTRA__measResult* measResult= &measresulteutra_list->measResult;
|
||||
|
||||
@@ -325,7 +325,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
|
||||
NR_ServingCellConfigCommon_t *scc=RC.nrrrc[module_idP]->carrier.servingcellconfigcommon;
|
||||
memset(&cellGroupConfig,0,sizeof(cellGroupConfig));
|
||||
|
||||
fill_initial_cellGroupConfig(rntiP,&cellGroupConfig,scc,&RC.nrrrc[module_idP]->carrier);
|
||||
fill_initial_cellGroupConfig(rntiP,-1,&cellGroupConfig,scc,&RC.nrrrc[module_idP]->carrier);
|
||||
MessageDef* tmp=itti_alloc_new_message_sized(TASK_RRC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE, sizeof(f1ap_initial_ul_rrc_message_t) + sdu_lenP);
|
||||
f1ap_initial_ul_rrc_message_t *msg = &F1AP_INITIAL_UL_RRC_MESSAGE(tmp);
|
||||
|
||||
@@ -346,14 +346,14 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
|
||||
memcpy(msg->rrc_container, sduP, sdu_lenP);
|
||||
msg->rrc_container_length=sdu_lenP;
|
||||
itti_send_msg_to_task(TASK_DU_F1, 0, tmp);
|
||||
|
||||
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[module_idP]);
|
||||
ue_context_p->ue_id_rnti = rntiP;
|
||||
ue_context_p->ue_context.rnti = rntiP;
|
||||
ue_context_p->ue_context.random_ue_identity = rntiP;
|
||||
ue_context_p->ue_context.Srb0.Active = 1;
|
||||
RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[module_idP]->rrc_ue_head, ue_context_p);
|
||||
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <asn_application.h>
|
||||
#include <asn_internal.h> /* for _ASN_DEFAULT_STACK_MAX */
|
||||
#include <per_encoder.h>
|
||||
#include <nr/nr_common.h>
|
||||
|
||||
#include "asn1_msg.h"
|
||||
#include "../nr_rrc_proto.h"
|
||||
@@ -976,10 +977,42 @@ uint8_t do_RRCReject(uint8_t Mod_id,
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
|
||||
// TODO: Implement to b_SRS = 1 and b_SRS = 2
|
||||
long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS) {
|
||||
|
||||
if(b_SRS>0) {
|
||||
LOG_E(NR_RRC,"rrc_get_max_nr_csrs(): Not implemented yet for b_SRS>0\n");
|
||||
return 0; // This c_srs is always valid
|
||||
}
|
||||
|
||||
const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 48, 52, 56, 60, 64, 72, 72, 76, 80, 88,
|
||||
96, 96, 104, 112, 120, 120, 120, 128, 128, 128, 132, 136, 144, 144, 144, 144, 152, 160,
|
||||
160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256,
|
||||
256, 264, 272, 272, 272 };
|
||||
|
||||
long c_srs = 0;
|
||||
uint16_t m = 4;
|
||||
for(int c = 1; c<64; c++) {
|
||||
if(m_SRS[c]>m && m_SRS[c]<max_rbs) {
|
||||
c_srs = c;
|
||||
m = m_SRS[c];
|
||||
}
|
||||
}
|
||||
|
||||
return c_srs;
|
||||
}
|
||||
|
||||
void fill_initial_SpCellConfig(rnti_t rnti,
|
||||
int uid,
|
||||
NR_SpCellConfig_t *SpCellConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
rrc_gNB_carrier_data_t *carrier) {
|
||||
|
||||
// This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4.
|
||||
// However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources,
|
||||
// where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
|
||||
AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n");
|
||||
|
||||
int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
|
||||
SpCellConfig->servCellIndex = NULL;
|
||||
SpCellConfig->reconfigurationWithSync = NULL;
|
||||
@@ -1058,7 +1091,7 @@ void fill_initial_SpCellConfig(rnti_t rnti,
|
||||
pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList));
|
||||
NR_PUSCH_PathlossReferenceRS_t *plrefRS = calloc(1,sizeof(*plrefRS));
|
||||
plrefRS->pusch_PathlossReferenceRS_Id=0;
|
||||
plrefRS->referenceSignal.present = NR_PathlossReferenceRS_Config_PR_ssb_Index;
|
||||
plrefRS->referenceSignal.present = NR_PUSCH_PathlossReferenceRS__referenceSignal_PR_ssb_Index;
|
||||
plrefRS->referenceSignal.choice.ssb_Index = 0;
|
||||
ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList->list,plrefRS);
|
||||
pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
|
||||
@@ -1105,13 +1138,21 @@ void fill_initial_SpCellConfig(rnti_t rnti,
|
||||
*srs_resset0_id=0;
|
||||
ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
|
||||
srs_Config->srs_ResourceToReleaseList=NULL;
|
||||
srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic;
|
||||
srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
|
||||
srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
|
||||
srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
|
||||
srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
|
||||
*srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
|
||||
srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
|
||||
|
||||
if(carrier->do_SRS) {
|
||||
srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_periodic;
|
||||
srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic));
|
||||
srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL;
|
||||
} else {
|
||||
srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic;
|
||||
srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
|
||||
srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
|
||||
srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
|
||||
srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
|
||||
*srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
|
||||
srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
|
||||
}
|
||||
|
||||
srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
|
||||
srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
|
||||
*srs_resset0->alpha = NR_Alpha_alpha1;
|
||||
@@ -1130,17 +1171,28 @@ void fill_initial_SpCellConfig(rnti_t rnti,
|
||||
srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
|
||||
srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
|
||||
srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
|
||||
srs_res0->resourceMapping.startPosition=2;
|
||||
srs_res0->resourceMapping.startPosition = 2 + uid%2;
|
||||
srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
|
||||
srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
|
||||
srs_res0->freqDomainPosition=0;
|
||||
srs_res0->freqDomainShift=0;
|
||||
srs_res0->freqHopping.c_SRS = 0;
|
||||
srs_res0->freqHopping.b_SRS=0;
|
||||
srs_res0->freqHopping.b_hop=0;
|
||||
srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
|
||||
NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
|
||||
srs_res0->freqHopping.b_SRS);
|
||||
srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
|
||||
srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
|
||||
srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
|
||||
|
||||
if(carrier->do_SRS) {
|
||||
srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic;
|
||||
srs_res0->resourceType.choice.periodic=calloc(1,sizeof(*srs_res0->resourceType.choice.periodic));
|
||||
srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160;
|
||||
srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots
|
||||
} else {
|
||||
srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
|
||||
srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
|
||||
}
|
||||
|
||||
srs_res0->sequenceId=40;
|
||||
srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
|
||||
srs_res0->spatialRelationInfo->servingCellId=NULL;
|
||||
@@ -1397,6 +1449,7 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr
|
||||
}
|
||||
|
||||
void fill_initial_cellGroupConfig(rnti_t rnti,
|
||||
int uid,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
rrc_gNB_carrier_data_t *carrier) {
|
||||
@@ -1490,7 +1543,7 @@ void fill_initial_cellGroupConfig(rnti_t rnti,
|
||||
|
||||
cellGroupConfig->spCellConfig = calloc(1,sizeof(*cellGroupConfig->spCellConfig));
|
||||
|
||||
fill_initial_SpCellConfig(rnti,cellGroupConfig->spCellConfig,scc,carrier);
|
||||
fill_initial_SpCellConfig(rnti,uid,cellGroupConfig->spCellConfig,scc,carrier);
|
||||
|
||||
cellGroupConfig->sCellToAddModList = NULL;
|
||||
cellGroupConfig->sCellToReleaseList = NULL;
|
||||
@@ -1569,7 +1622,7 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
}
|
||||
else {
|
||||
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
|
||||
fill_initial_cellGroupConfig(ue_context_pP->ue_context.rnti,cellGroupConfig,scc,carrier);
|
||||
fill_initial_cellGroupConfig(ue_context_pP->ue_context.rnti,ue_context_pP->local_uid,cellGroupConfig,scc,carrier);
|
||||
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
|
||||
NULL,
|
||||
|
||||
@@ -101,13 +101,15 @@ uint8_t do_RRCReject(uint8_t Mod_id,
|
||||
uint8_t *const buffer);
|
||||
|
||||
void fill_initial_SpCellConfig(rnti_t rnti,
|
||||
NR_SpCellConfig_t *SpCellConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
int uid,
|
||||
NR_SpCellConfig_t *SpCellConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
rrc_gNB_carrier_data_t *carrier);
|
||||
|
||||
void fill_initial_cellGroupConfig(rnti_t rnti,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
int uid,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
rrc_gNB_carrier_data_t *carrier);
|
||||
|
||||
void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup);
|
||||
|
||||
@@ -451,6 +451,7 @@ typedef struct {
|
||||
int pusch_AntennaPorts;
|
||||
int minRXTXTIME;
|
||||
int do_CSIRS;
|
||||
int do_SRS;
|
||||
NR_BCCH_DL_SCH_Message_t *siblock1;
|
||||
NR_ServingCellConfigCommon_t *servingcellconfigcommon;
|
||||
NR_PDCCH_ConfigSIB1_t *pdcch_ConfigSIB1;
|
||||
|
||||
@@ -81,6 +81,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
||||
int dl_antenna_ports,
|
||||
int minRXTXTIMEpdsch,
|
||||
int do_csirs,
|
||||
int do_srs,
|
||||
int initial_csi_index,
|
||||
int uid);
|
||||
|
||||
@@ -93,6 +94,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
|
||||
int dl_antenna_ports,
|
||||
int minRXTXTIMEpdsch,
|
||||
int do_csirs,
|
||||
int do_srs,
|
||||
int initial_csi_index,
|
||||
int uid);
|
||||
|
||||
|
||||
@@ -239,6 +239,7 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
|
||||
rrc->carrier.minRXTXTIME = configuration->minRXTXTIME;
|
||||
rrc->carrier.sib1_tda = configuration->sib1_tda;
|
||||
rrc->carrier.do_CSIRS = configuration->do_CSIRS;
|
||||
rrc->carrier.do_SRS = configuration->do_SRS;
|
||||
nr_rrc_config_ul_tda(configuration->scc,configuration->minRXTXTIME);
|
||||
/// System Information INIT
|
||||
pthread_mutex_init(&rrc->cell_info_mutex,NULL);
|
||||
|
||||
@@ -263,24 +263,26 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
||||
}
|
||||
if (ue_context_p->ue_context.spCellConfig) {
|
||||
fill_default_reconfig(carrier->servingcellconfigcommon,
|
||||
ue_context_p->ue_context.spCellConfig->spCellConfigDedicated,
|
||||
reconfig_ies,
|
||||
ue_context_p->ue_context.secondaryCellGroup,
|
||||
carrier->pdsch_AntennaPorts,
|
||||
carrier->minRXTXTIME,
|
||||
carrier->do_CSIRS,
|
||||
carrier->initial_csi_index[ue_context_p->local_uid + 1],
|
||||
ue_context_p->local_uid);
|
||||
ue_context_p->ue_context.spCellConfig->spCellConfigDedicated,
|
||||
reconfig_ies,
|
||||
ue_context_p->ue_context.secondaryCellGroup,
|
||||
carrier->pdsch_AntennaPorts,
|
||||
carrier->minRXTXTIME,
|
||||
carrier->do_CSIRS,
|
||||
carrier->do_SRS,
|
||||
carrier->initial_csi_index[ue_context_p->local_uid + 1],
|
||||
ue_context_p->local_uid);
|
||||
} else {
|
||||
fill_default_reconfig(carrier->servingcellconfigcommon,
|
||||
NULL,
|
||||
reconfig_ies,
|
||||
ue_context_p->ue_context.secondaryCellGroup,
|
||||
carrier->pdsch_AntennaPorts,
|
||||
carrier->minRXTXTIME,
|
||||
carrier->do_CSIRS,
|
||||
carrier->initial_csi_index[ue_context_p->local_uid + 1],
|
||||
ue_context_p->local_uid);
|
||||
NULL,
|
||||
reconfig_ies,
|
||||
ue_context_p->ue_context.secondaryCellGroup,
|
||||
carrier->pdsch_AntennaPorts,
|
||||
carrier->minRXTXTIME,
|
||||
carrier->do_CSIRS,
|
||||
carrier->do_SRS,
|
||||
carrier->initial_csi_index[ue_context_p->local_uid + 1],
|
||||
ue_context_p->local_uid);
|
||||
}
|
||||
ue_context_p->ue_id_rnti = ue_context_p->ue_context.secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity;
|
||||
NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
|
||||
|
||||
@@ -57,11 +57,17 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
||||
int dl_antenna_ports,
|
||||
int minRXTXTIME,
|
||||
int do_csirs,
|
||||
int do_srs,
|
||||
int initial_csi_index,
|
||||
int uid) {
|
||||
AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n");
|
||||
AssertFatal(secondaryCellGroup!=NULL,"secondaryCellGroup is null\n");
|
||||
|
||||
// This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4.
|
||||
// However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources,
|
||||
// where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
|
||||
AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n");
|
||||
|
||||
uint64_t bitmap=0;
|
||||
switch (servingcellconfigcommon->ssb_PositionsInBurst->present) {
|
||||
case 1 :
|
||||
@@ -797,13 +803,21 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
||||
*srs_resset0_id=0;
|
||||
ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
|
||||
srs_Config->srs_ResourceToReleaseList=NULL;
|
||||
srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic;
|
||||
srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
|
||||
srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
|
||||
srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
|
||||
srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
|
||||
*srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
|
||||
srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
|
||||
|
||||
if(do_srs) {
|
||||
srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_periodic;
|
||||
srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic));
|
||||
srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL;
|
||||
} else {
|
||||
srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic;
|
||||
srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
|
||||
srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
|
||||
srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
|
||||
srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
|
||||
*srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
|
||||
srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
|
||||
}
|
||||
|
||||
srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
|
||||
srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
|
||||
*srs_resset0->alpha = NR_Alpha_alpha1;
|
||||
@@ -822,17 +836,28 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
||||
srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
|
||||
srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
|
||||
srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
|
||||
srs_res0->resourceMapping.startPosition=2;
|
||||
srs_res0->resourceMapping.startPosition = 2 + uid%2;
|
||||
srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
|
||||
srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
|
||||
srs_res0->freqDomainPosition=0;
|
||||
srs_res0->freqDomainShift=0;
|
||||
srs_res0->freqHopping.c_SRS = 0;
|
||||
srs_res0->freqHopping.b_SRS=0;
|
||||
srs_res0->freqHopping.b_hop=0;
|
||||
srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
|
||||
NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
|
||||
srs_res0->freqHopping.b_SRS);
|
||||
srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
|
||||
srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
|
||||
srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
|
||||
|
||||
if(do_srs) {
|
||||
srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic;
|
||||
srs_res0->resourceType.choice.periodic=calloc(1,sizeof(*srs_res0->resourceType.choice.periodic));
|
||||
srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160;
|
||||
srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots
|
||||
} else {
|
||||
srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
|
||||
srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
|
||||
}
|
||||
|
||||
srs_res0->sequenceId=40;
|
||||
srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
|
||||
srs_res0->spatialRelationInfo->servingCellId=NULL;
|
||||
@@ -1351,6 +1376,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
|
||||
int dl_antenna_ports,
|
||||
int minRXTXTIME,
|
||||
int do_csirs,
|
||||
int do_srs,
|
||||
int initial_csi_index,
|
||||
int uid) {
|
||||
AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n");
|
||||
@@ -1367,6 +1393,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
|
||||
dl_antenna_ports,
|
||||
minRXTXTIME,
|
||||
do_csirs,
|
||||
do_srs,
|
||||
initial_csi_index,
|
||||
uid);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user