Commit 3eeb20be authored by Vijay C's avatar Vijay C

Dynamic CC management

parent 25bff614
...@@ -205,10 +205,15 @@ extern uint16_t slot_ahead; ...@@ -205,10 +205,15 @@ extern uint16_t slot_ahead;
void oai_create_enb(void) { void oai_create_enb(void) {
int bodge_counter=0; int bodge_counter=0;
int FAPI_configured_for_a_CC = 0;
/* MultiCell: Function modify for Multiple CC */ /* MultiCell: Function modify for Multiple CC */
for (int CC_id=0; CC_id<RC.nb_CC[0]; CC_id++) { for (int CC_id=0; CC_id<RC.nb_CC[0]; CC_id++) {
PHY_VARS_eNB *eNB = RC.eNB[0][CC_id]; PHY_VARS_eNB *eNB = RC.eNB[0][CC_id];
if (eNB == NULL)
{
printf("CC_id %d is NUll eNB ptr\n",CC_id);
continue ;
}
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] RC.eNB[0][0]. Mod_id:%d CC_id:%d nb_CC[0]:%d abstraction_flag:%d single_thread_flag:%d if_inst:%p\n", eNB->Mod_id, eNB->CC_id, RC.nb_CC[0], eNB->abstraction_flag, NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] RC.eNB[0][0]. Mod_id:%d CC_id:%d nb_CC[0]:%d abstraction_flag:%d single_thread_flag:%d if_inst:%p\n", eNB->Mod_id, eNB->CC_id, RC.nb_CC[0], eNB->abstraction_flag,
eNB->single_thread_flag, eNB->if_inst); eNB->single_thread_flag, eNB->if_inst);
eNB->Mod_id = bodge_counter; eNB->Mod_id = bodge_counter;
...@@ -230,8 +235,9 @@ void oai_create_enb(void) { ...@@ -230,8 +235,9 @@ void oai_create_enb(void) {
do { do {
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Waiting for eNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__); NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Waiting for eNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__);
usleep(50000); usleep(50000);
} while(eNB->configured != 1); } while(eNB->configured != 1 && !FAPI_configured_for_a_CC);
//Set if the 1 CC is configured
FAPI_configured_for_a_CC = 1;
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() eNB Cell %d is now configured\n", __FUNCTION__,CC_id); NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() eNB Cell %d is now configured\n", __FUNCTION__,CC_id);
} }
} }
...@@ -1851,7 +1857,7 @@ void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port) { ...@@ -1851,7 +1857,7 @@ void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
config->deallocate_p4_p5_vendor_ext = &vnf_deallocate_p4_p5_vendor_ext; config->deallocate_p4_p5_vendor_ext = &vnf_deallocate_p4_p5_vendor_ext;
config->codec_config.allocate = &vnf_allocate; config->codec_config.allocate = &vnf_allocate;
config->codec_config.deallocate = &vnf_deallocate; config->codec_config.deallocate = &vnf_deallocate;
memset(&UL_RCC_INFO,0,sizeof(UL_RCC_IND_t)); memset(&UL_RCC_INFO,0,sizeof(UL_RCC_INFO));
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__); NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__);
pthread_create(&vnf_start_pthread, NULL, (void *)&vnf_nr_start_thread, config); pthread_create(&vnf_start_pthread, NULL, (void *)&vnf_nr_start_thread, config);
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Created VNF NFAPI start thread %s\n", __FUNCTION__); NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Created VNF NFAPI start thread %s\n", __FUNCTION__);
...@@ -1901,7 +1907,7 @@ void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) { ...@@ -1901,7 +1907,7 @@ void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
config->deallocate_p4_p5_vendor_ext = &vnf_deallocate_p4_p5_vendor_ext; config->deallocate_p4_p5_vendor_ext = &vnf_deallocate_p4_p5_vendor_ext;
config->codec_config.allocate = &vnf_allocate; config->codec_config.allocate = &vnf_allocate;
config->codec_config.deallocate = &vnf_deallocate; config->codec_config.deallocate = &vnf_deallocate;
memset(&UL_RCC_INFO,0,sizeof(UL_RCC_IND_t)); memset(&UL_RCC_INFO,0,sizeof(UL_RCC_INFO));
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__); NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__);
pthread_create(&vnf_start_pthread, NULL, (void *)&vnf_start_thread, config); pthread_create(&vnf_start_pthread, NULL, (void *)&vnf_start_thread, config);
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Created VNF NFAPI start thread %s\n", __FUNCTION__); NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Created VNF NFAPI start thread %s\n", __FUNCTION__);
......
...@@ -42,7 +42,7 @@ char* namepointer_log2; ...@@ -42,7 +42,7 @@ char* namepointer_log2;
PHY_VARS_UE ***PHY_vars_UE_g; PHY_VARS_UE ***PHY_vars_UE_g;
UL_RCC_IND_t UL_RCC_INFO; UL_RCC_IND_t UL_RCC_INFO[MAX_NUM_CCs];
NR_UL_IND_t UL_INFO; NR_UL_IND_t UL_INFO;
unsigned short rev[2048],rev_times4[8192],rev_half[1024]; unsigned short rev[2048],rev_times4[8192],rev_half[1024];
......
...@@ -192,7 +192,7 @@ void RCconfig_L1(void) { ...@@ -192,7 +192,7 @@ void RCconfig_L1(void) {
memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB***)); memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB***));
} }
for (i=0; i<RC.nb_L1_CC[j]; i++) { for (i=0; i<MAX_NUM_CCs/*RC.nb_L1_CC[j]*/; i++) {
if (RC.eNB[j][i] == NULL) { if (RC.eNB[j][i] == NULL) {
RC.eNB[j][i] = (PHY_VARS_eNB *)malloc(sizeof(PHY_VARS_eNB)); RC.eNB[j][i] = (PHY_VARS_eNB *)malloc(sizeof(PHY_VARS_eNB));
memset((void *)RC.eNB[j][i],0,sizeof(PHY_VARS_eNB)); memset((void *)RC.eNB[j][i],0,sizeof(PHY_VARS_eNB));
......
...@@ -95,7 +95,7 @@ void schedule_SRS(module_id_t module_idP, ...@@ -95,7 +95,7 @@ void schedule_SRS(module_id_t module_idP,
LTE_SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon = NULL; LTE_SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon = NULL;
struct LTE_SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated = NULL; struct LTE_SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated = NULL;
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
soundingRS_UL_ConfigCommon = &(cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon); soundingRS_UL_ConfigCommon = &(cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon);
/* Check if SRS is enabled in this frame/subframe */ /* Check if SRS is enabled in this frame/subframe */
...@@ -200,7 +200,7 @@ void schedule_CSI(module_id_t module_idP, ...@@ -200,7 +200,7 @@ void schedule_CSI(module_id_t module_idP,
nfapi_ul_config_request_body_t *ul_req = NULL; nfapi_ul_config_request_body_t *ul_req = NULL;
UE_sched_ctrl_t *UE_scheduling_control = NULL; UE_sched_ctrl_t *UE_scheduling_control = NULL;
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
cc = &eNB->common_channels[CC_id]; cc = &eNB->common_channels[CC_id];
for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
...@@ -315,7 +315,7 @@ schedule_SR (module_id_t module_idP, ...@@ -315,7 +315,7 @@ schedule_SR (module_id_t module_idP,
nfapi_ul_config_sr_information sr; nfapi_ul_config_sr_information sr;
memset(&sr, 0, sizeof(sr)); memset(&sr, 0, sizeof(sr));
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (int CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
eNB->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; eNB->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP;
for (int UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { for (int UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
...@@ -537,7 +537,7 @@ copy_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { ...@@ -537,7 +537,7 @@ copy_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {
int CC_id; int CC_id;
eNB_MAC_INST *mac = RC.mac[module_idP]; eNB_MAC_INST *mac = RC.mac[module_idP];
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
nfapi_ul_config_request_t *ul_req_tmp = &mac->UL_req_tmp[CC_id][subframeP]; nfapi_ul_config_request_t *ul_req_tmp = &mac->UL_req_tmp[CC_id][subframeP];
nfapi_ul_config_request_t *ul_req = &mac->UL_req[CC_id]; nfapi_ul_config_request_t *ul_req = &mac->UL_req[CC_id];
nfapi_ul_config_request_pdu_t *ul_req_pdu = ul_req->ul_config_request_body.ul_config_pdu_list; nfapi_ul_config_request_pdu_t *ul_req_pdu = ul_req->ul_config_request_body.ul_config_pdu_list;
...@@ -598,7 +598,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -598,7 +598,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
eNB->frame = frameP; eNB->frame = frameP;
eNB->subframe = subframeP; eNB->subframe = subframeP;
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
mbsfn_status[CC_id] = 0; mbsfn_status[CC_id] = 0;
/* Clear vrb_maps */ /* Clear vrb_maps */
memset(cc[CC_id].vrb_map, 0, 100); memset(cc[CC_id].vrb_map, 0, 100);
...@@ -624,7 +624,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -624,7 +624,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
} }
} }
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
/* Refresh UE list based on UEs dropped by PHY in previous subframe */ /* Refresh UE list based on UEs dropped by PHY in previous subframe */
for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
if (UE_info->active[CC_id][UE_id]) { if (UE_info->active[CC_id][UE_id]) {
...@@ -992,7 +992,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -992,7 +992,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
} }
int do_fembms_si=0; int do_fembms_si=0;
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
if (cc[CC_id].MBMS_flag > 0) { if (cc[CC_id].MBMS_flag > 0) {
start_meas(&RC.mac[module_idP]->schedule_mch); start_meas(&RC.mac[module_idP]->schedule_mch);
int(*schedule_mch)(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_frame_t subframe) = NULL; int(*schedule_mch)(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_frame_t subframe) = NULL;
...@@ -1082,7 +1082,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -1082,7 +1082,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
} }
/* Allocate CCEs for good after scheduling is done */ /* Allocate CCEs for good after scheduling is done */
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
if (cc[CC_id].tdd_Config == NULL || !(is_UL_sf(&cc[CC_id],subframeP))) { if (cc[CC_id].tdd_Config == NULL || !(is_UL_sf(&cc[CC_id],subframeP))) {
int rc = allocate_CCEs(module_idP, CC_id, frameP, subframeP, 2); int rc = allocate_CCEs(module_idP, CC_id, frameP, subframeP, 2);
if (rc < 0) if (rc < 0)
......
...@@ -1283,7 +1283,7 @@ schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { ...@@ -1283,7 +1283,7 @@ schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {
uint8_t i; uint8_t i;
start_meas(&mac->schedule_ra); start_meas(&mac->schedule_ra);
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
// skip UL component carriers if TDD // skip UL component carriers if TDD
if (is_UL_sf(&cc[CC_id], subframeP) == 1) if (is_UL_sf(&cc[CC_id], subframeP) == 1)
continue; continue;
......
...@@ -95,7 +95,7 @@ schedule_SIB1_MBMS(module_id_t module_idP, ...@@ -95,7 +95,7 @@ schedule_SIB1_MBMS(module_id_t module_idP,
int k = 0, rvidx; int k = 0, rvidx;
uint16_t sfn_sf = frameP<<4|subframeP; uint16_t sfn_sf = frameP<<4|subframeP;
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
cc = &eNB->common_channels[CC_id]; cc = &eNB->common_channels[CC_id];
vrb_map = (void *) &cc->vrb_map; vrb_map = (void *) &cc->vrb_map;
N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth);
...@@ -327,7 +327,7 @@ schedule_SIB1_BR(module_id_t module_idP, ...@@ -327,7 +327,7 @@ schedule_SIB1_BR(module_id_t module_idP,
int k = 0, rvidx; int k = 0, rvidx;
uint16_t sfn_sf = frameP<<4|subframeP; uint16_t sfn_sf = frameP<<4|subframeP;
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
cc = &eNB->common_channels[CC_id]; cc = &eNB->common_channels[CC_id];
vrb_map = (void *) &cc->vrb_map; vrb_map = (void *) &cc->vrb_map;
N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth);
...@@ -558,7 +558,7 @@ schedule_SI_BR(module_id_t module_idP, frame_t frameP, ...@@ -558,7 +558,7 @@ schedule_SI_BR(module_id_t module_idP, frame_t frameP,
int rvidx; int rvidx;
int absSF = (frameP*10)+subframeP; int absSF = (frameP*10)+subframeP;
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { for (CC_id=0; CC_id<RC.nb_CC[module_idP]; CC_id++) {
cc = &eNB->common_channels[CC_id]; cc = &eNB->common_channels[CC_id];
vrb_map = (void *)&cc->vrb_map; vrb_map = (void *)&cc->vrb_map;
N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth);
...@@ -753,7 +753,7 @@ schedule_SI_MBMS(module_id_t module_idP, frame_t frameP, ...@@ -753,7 +753,7 @@ schedule_SI_MBMS(module_id_t module_idP, frame_t frameP,
// Only schedule LTE System Information in subframe 0 // Only schedule LTE System Information in subframe 0
if (subframeP == 0) { if (subframeP == 0) {
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
cc = &eNB->common_channels[CC_id]; cc = &eNB->common_channels[CC_id];
//printf("*cc->sib1_MBMS->si_WindowLength_r14 %d \n", *cc->sib1_MBMS->si_WindowLength_r14); //printf("*cc->sib1_MBMS->si_WindowLength_r14 %d \n", *cc->sib1_MBMS->si_WindowLength_r14);
vrb_map = (void *) &cc->vrb_map; vrb_map = (void *) &cc->vrb_map;
...@@ -950,7 +950,7 @@ schedule_fembms_mib(module_id_t module_idP, frame_t frameP, sub_frame_t subframe ...@@ -950,7 +950,7 @@ schedule_fembms_mib(module_id_t module_idP, frame_t frameP, sub_frame_t subframe
AssertFatal(subframeP == 0, "Subframe must be 0\n"); AssertFatal(subframeP == 0, "Subframe must be 0\n");
AssertFatal((frameP & 15) == 0, "Frame must be a multiple of 16\n"); AssertFatal((frameP & 15) == 0, "Frame must be a multiple of 16\n");
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
dl_config_request = &eNB->DL_req[CC_id]; dl_config_request = &eNB->DL_req[CC_id];
dl_req = &dl_config_request->dl_config_request_body; dl_req = &dl_config_request->dl_config_request_body;
cc = &eNB->common_channels[CC_id]; cc = &eNB->common_channels[CC_id];
...@@ -1009,7 +1009,7 @@ schedule_mib(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { ...@@ -1009,7 +1009,7 @@ schedule_mib(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {
AssertFatal(subframeP == 0, "Subframe must be 0\n"); AssertFatal(subframeP == 0, "Subframe must be 0\n");
AssertFatal((frameP & 3) == 0, "Frame must be a multiple of 4\n"); AssertFatal((frameP & 3) == 0, "Frame must be a multiple of 4\n");
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
dl_config_request = &eNB->DL_req[CC_id]; dl_config_request = &eNB->DL_req[CC_id];
dl_req = &dl_config_request->dl_config_request_body; dl_req = &dl_config_request->dl_config_request_body;
cc = &eNB->common_channels[CC_id]; cc = &eNB->common_channels[CC_id];
...@@ -1077,7 +1077,7 @@ schedule_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) ...@@ -1077,7 +1077,7 @@ schedule_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
// Only schedule LTE System Information in subframe 5 // Only schedule LTE System Information in subframe 5
if (subframeP == 5) { if (subframeP == 5) {
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[module_idP]; CC_id++) {
cc = &eNB->common_channels[CC_id]; cc = &eNB->common_channels[CC_id];
vrb_map = (void *) &cc->vrb_map; vrb_map = (void *) &cc->vrb_map;
N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth);
......
...@@ -722,7 +722,7 @@ void UL_indication(UL_IND_t *UL_info, void *proc) { ...@@ -722,7 +722,7 @@ void UL_indication(UL_IND_t *UL_info, void *proc) {
if (NFAPI_MODE != NFAPI_MODE_PNF) { if (NFAPI_MODE != NFAPI_MODE_PNF) {
/* MultiCell: Condition modified for Multiple CC */ /* MultiCell: Condition modified for Multiple CC */
if (ifi->CC_mask < ((1<<MAX_NUM_CCs)-1)) { if (ifi->CC_mask < ((1<<RC.nb_CC[module_id])-1)) {
ifi->current_frame = UL_info->frame; ifi->current_frame = UL_info->frame;
ifi->current_subframe = UL_info->subframe; ifi->current_subframe = UL_info->subframe;
} else { } else {
...@@ -752,11 +752,11 @@ void UL_indication(UL_IND_t *UL_info, void *proc) { ...@@ -752,11 +752,11 @@ void UL_indication(UL_IND_t *UL_info, void *proc) {
if (NFAPI_MODE != NFAPI_MODE_PNF) { if (NFAPI_MODE != NFAPI_MODE_PNF) {
/* MultiCell: Condition modified for Multiple CC */ /* MultiCell: Condition modified for Multiple CC */
if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) { if (ifi->CC_mask == ((1<<RC.nb_CC[module_id])-1)) {
eNB_dlsch_ulsch_scheduler(module_id, eNB_dlsch_ulsch_scheduler(module_id,
(UL_info->frame+((UL_info->subframe>(9-sf_ahead))?1:0)) % 1024, (UL_info->frame+((UL_info->subframe>(9-sf_ahead))?1:0)) % 1024,
(UL_info->subframe+sf_ahead)%10); (UL_info->subframe+sf_ahead)%10);
for (int CC_Id=0; CC_Id<MAX_NUM_CCs; CC_Id++) { for (int CC_Id=0; CC_Id<RC.nb_CC[module_id]; CC_Id++) {
ifi->CC_mask = 0; ifi->CC_mask = 0;
sched_info->module_id = module_id; sched_info->module_id = module_id;
sched_info->CC_id = CC_Id; sched_info->CC_id = CC_Id;
......
...@@ -143,7 +143,85 @@ rrc_init_global_param( ...@@ -143,7 +143,85 @@ rrc_init_global_param(
} }
return 0; return 0;
} }
/*
* Function : rrc_init_global_cc_context
* Description: Helper funtion to initilize the RB_Config for a
* CC in the SS_SOFTMODEM mode to enable the dynmaic activation
* of the CC. It is similar to the legacy rrc_init_global_context
* function to initilize each CC.ge to accept the configuration.
* In :
* CC_id - Componer Carrier indext to be initilized
* module_id - The eNB index for which the rrc context
* to be initilized
*/
//-----------------------------------------------------------------------------
void rrc_init_global_cc_context(int CC_id, module_id_t module_id)
{
for(int i=0;i<MAX_RBS;i++)
{
{
RC.RB_Config[CC_id][i].isRBConfigValid = FALSE;
memset(&RC.RB_Config[CC_id][i],0,sizeof(RBConfig));
}
/*SRB1 Default Config for RLC and MAC*/
RC.RB_Config[CC_id][1].RlcCfg.present = 1;
RC.RB_Config[CC_id][1].RlcCfg.choice.am.ul_AM_RLC.t_PollRetransmit = 15;
RC.RB_Config[CC_id][1].RlcCfg.choice.am.ul_AM_RLC.pollPDU = 0;
RC.RB_Config[CC_id][1].RlcCfg.choice.am.ul_AM_RLC.pollByte = 14;
RC.RB_Config[CC_id][1].RlcCfg.choice.am.ul_AM_RLC.maxRetxThreshold = 3;
RC.RB_Config[CC_id][1].RlcCfg.choice.am.dl_AM_RLC.t_Reordering = 7;
RC.RB_Config[CC_id][1].RlcCfg.choice.am.dl_AM_RLC.t_StatusProhibit = 0;
RC.RB_Config[CC_id][1].Mac.ul_SpecificParameters = CALLOC(1, sizeof(struct LTE_LogicalChannelConfig__ul_SpecificParameters));
RC.RB_Config[CC_id][1].Mac.ul_SpecificParameters->priority = 1;
RC.RB_Config[CC_id][1].Mac.ul_SpecificParameters->prioritisedBitRate = 7;
/*SRB2 Default Config for RLC and MAC*/
RC.RB_Config[CC_id][2].RlcCfg.present = LTE_RLC_Config_PR_am;
RC.RB_Config[CC_id][2].RlcCfg.choice.am.ul_AM_RLC.t_PollRetransmit = LTE_T_PollRetransmit_ms15;
RC.RB_Config[CC_id][2].RlcCfg.choice.am.ul_AM_RLC.pollPDU = LTE_PollPDU_p8;
RC.RB_Config[CC_id][2].RlcCfg.choice.am.ul_AM_RLC.pollByte = LTE_PollByte_kB1000;
RC.RB_Config[CC_id][2].RlcCfg.choice.am.ul_AM_RLC.maxRetxThreshold = LTE_UL_AM_RLC__maxRetxThreshold_t32;
RC.RB_Config[CC_id][2].RlcCfg.choice.am.dl_AM_RLC.t_Reordering = LTE_T_Reordering_ms35;
RC.RB_Config[CC_id][2].RlcCfg.choice.am.dl_AM_RLC.t_StatusProhibit = LTE_T_StatusProhibit_ms10;
RC.RB_Config[CC_id][2].Mac.ul_SpecificParameters = CALLOC(1, sizeof(struct LTE_LogicalChannelConfig__ul_SpecificParameters));
RC.RB_Config[CC_id][2].Mac.ul_SpecificParameters->priority = 3;
RC.RB_Config[CC_id][2].Mac.ul_SpecificParameters->prioritisedBitRate = LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
/*DRB Default Config for PDCP,RLC(AM) and MAC*/
RC.RB_Config[CC_id][3].RlcCfg.present = LTE_RLC_Config_PR_am;
RC.RB_Config[CC_id][3].RlcCfg.choice.am.ul_AM_RLC.t_PollRetransmit = LTE_T_PollRetransmit_ms50;
RC.RB_Config[CC_id][3].RlcCfg.choice.am.ul_AM_RLC.pollPDU = LTE_PollPDU_p16;
RC.RB_Config[CC_id][3].RlcCfg.choice.am.ul_AM_RLC.pollByte = LTE_PollByte_kBinfinity;
RC.RB_Config[CC_id][3].RlcCfg.choice.am.ul_AM_RLC.maxRetxThreshold = LTE_UL_AM_RLC__maxRetxThreshold_t8;
RC.RB_Config[CC_id][3].RlcCfg.choice.am.dl_AM_RLC.t_Reordering = LTE_T_Reordering_ms35;
RC.RB_Config[CC_id][3].RlcCfg.choice.am.dl_AM_RLC.t_StatusProhibit = LTE_T_StatusProhibit_ms25;
RC.RB_Config[CC_id][3].PdcpCfg.rlc_AM = CALLOC(1, sizeof(struct LTE_PDCP_Config__rlc_AM));
RC.RB_Config[CC_id][3].PdcpCfg.rlc_AM->statusReportRequired = FALSE;
RC.RB_Config[CC_id][3].PdcpCfg.headerCompression.present = LTE_PDCP_Config__headerCompression_PR_notUsed;
RC.RB_Config[CC_id][3].Mac.ul_SpecificParameters = CALLOC(1, sizeof(struct LTE_LogicalChannelConfig__ul_SpecificParameters));
RC.RB_Config[CC_id][3].Mac.ul_SpecificParameters->priority = 12;
RC.RB_Config[CC_id][3].Mac.ul_SpecificParameters->prioritisedBitRate = LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
RC.RB_Config[CC_id][3].PdcpCfg.discardTimer = CALLOC(1, sizeof(long));
*(RC.RB_Config[CC_id][3].PdcpCfg.discardTimer) = LTE_PDCP_Config__discardTimer_infinity;
/*DRB Default Config for PDCP,RLC(UM) and MAC*/
RC.RB_Config[CC_id][4].RlcCfg.present = LTE_RLC_Config_PR_um_Bi_Directional;
RC.RB_Config[CC_id][4].RlcCfg.choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = LTE_SN_FieldLength_size10;
RC.RB_Config[CC_id][4].RlcCfg.choice.um_Bi_Directional.dl_UM_RLC.sn_FieldLength = LTE_SN_FieldLength_size10;
RC.RB_Config[CC_id][4].RlcCfg.choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = LTE_T_Reordering_ms35;
RC.RB_Config[CC_id][4].PdcpCfg.rlc_UM = CALLOC(1, sizeof(struct LTE_PDCP_Config__rlc_UM));
RC.RB_Config[CC_id][4].PdcpCfg.rlc_UM->pdcp_SN_Size = LTE_PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits;
RC.RB_Config[CC_id][4].PdcpCfg.headerCompression.present = LTE_PDCP_Config__headerCompression_PR_notUsed;
RC.RB_Config[CC_id][4].Mac.ul_SpecificParameters = CALLOC(1, sizeof(struct LTE_LogicalChannelConfig__ul_SpecificParameters));
RC.RB_Config[CC_id][4].Mac.ul_SpecificParameters->priority = 12;
RC.RB_Config[CC_id][4].Mac.ul_SpecificParameters->prioritisedBitRate = LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
RC.RB_Config[CC_id][4].PdcpCfg.discardTimer = CALLOC(1, sizeof(long));
*(RC.RB_Config[CC_id][4].PdcpCfg.discardTimer) = LTE_PDCP_Config__discardTimer_infinity;
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
rrc_config_buffer( rrc_config_buffer(
......
...@@ -884,7 +884,59 @@ static void init_MBMS( ...@@ -884,7 +884,59 @@ static void init_MBMS(
//rrc_mac_config_req(); //rrc_mac_config_req();
} }
} }
/*
* Function : rrc_init_cell_context
* Description: Helper funtion to initilize the rrc for each
* CC in the SS_SOFTMODEM mode to enable the dynmaic activation
* of the CC. It is similar to the legacy rrc_init_context
* function to initilize each CC.ge to accept the configuration.
* In :
* CC_id - Componer Carrier indext to be initilized
* module_id - The eNB index for which the rrc context
* to be initilized
*/
void rrc_init_cell_context(int CC_id, module_id_t module_id)
{
rrc_init_global_cc_context(CC_id, module_id);
switch (RC.rrc[module_id]->carrier[CC_id].MBMS_flag)
{
case 1:
case 2:
case 3:
//LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " Configuring 1 MBSFN sync area\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt));
RC.rrc[module_id]->carrier[CC_id].num_mbsfn_sync_area = 1;
break;
case 4:
// LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT " Configuring 2 MBSFN sync area\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt));
RC.rrc[module_id]->carrier[CC_id].num_mbsfn_sync_area = 2;
break;
default:
RC.rrc[module_id]->carrier[CC_id].num_mbsfn_sync_area = 0;
break;
}
// if we are here the RC.rrc[enb_mod_idP]->MBMS_flag > 0,
/// MCCH INIT
if (RC.rrc[module_id]->carrier[CC_id].MBMS_flag > 0)
{
init_MCCH(module_id, CC_id);
/// MTCH data bearer init
init_MBMS(module_id, CC_id, 0);
}
openair_rrc_top_init_eNB(CC_id, RC.rrc[module_id]->carrier[CC_id].MBMS_flag, 0);
rrc_config_buffer (&RC.rrc[module_id]->carrier[CC_id].SI, BCCH, 1);
RC.rrc[module_id]->carrier[CC_id].SI.Active = 1;
for (int ue_id = 0; ue_id < MAX_MOBILES_PER_ENB; ue_id++)
{
RC.rrc[module_id]->carrier[CC_id].sizeof_paging[ue_id] = 0;
RC.rrc[module_id]->carrier[CC_id].paging[ue_id] = (uint8_t *)malloc16(256);
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
uint8_t uint8_t
rrc_eNB_get_next_transaction_identifier( rrc_eNB_get_next_transaction_identifier(
...@@ -1288,7 +1340,7 @@ void release_UE_in_freeList(module_id_t mod_id) { ...@@ -1288,7 +1340,7 @@ void release_UE_in_freeList(module_id_t mod_id) {
remove_UEContext = eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].removeContextFlg; remove_UEContext = eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].removeContextFlg;
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, rnti, 0, 0,mod_id); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, rnti, 0, 0,mod_id);
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[0]; CC_id++) {
eNB_PHY = RC.eNB[mod_id][CC_id]; eNB_PHY = RC.eNB[mod_id][CC_id];
int id; int id;
// clean ULSCH entries for rnti // clean ULSCH entries for rnti
...@@ -5353,7 +5405,7 @@ void rrc_eNB_process_x2_setup_request(int mod_id, x2ap_setup_req_t *m) { ...@@ -5353,7 +5405,7 @@ void rrc_eNB_process_x2_setup_request(int mod_id, x2ap_setup_req_t *m) {
return; return;
} }
if (m->num_cc > MAX_NUM_CCs) { if (m->num_cc > RC.nb_CC[0]) {
LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n"); LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n");
return; return;
} }
...@@ -5372,7 +5424,7 @@ void rrc_eNB_process_x2_setup_response(int mod_id, x2ap_setup_resp_t *m) { ...@@ -5372,7 +5424,7 @@ void rrc_eNB_process_x2_setup_response(int mod_id, x2ap_setup_resp_t *m) {
return; return;
} }
if (m->num_cc > MAX_NUM_CCs) { if (m->num_cc > RC.nb_CC[0]) {
LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n"); LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n");
return; return;
} }
...@@ -7527,7 +7579,7 @@ char openair_rrc_eNB_configuration( ...@@ -7527,7 +7579,7 @@ char openair_rrc_eNB_configuration(
RC.rrc[ctxt.module_id]->carrier[0].MBMS_flag); RC.rrc[ctxt.module_id]->carrier[0].MBMS_flag);
} }
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[0]; CC_id++) {
if(need_init) { if(need_init) {
for (int ue_id = 0; ue_id < MAX_MOBILES_PER_ENB; ue_id++) { for (int ue_id = 0; ue_id < MAX_MOBILES_PER_ENB; ue_id++) {
RC.rrc[ctxt.module_id]->carrier[CC_id].sizeof_paging[ue_id] = 0; RC.rrc[ctxt.module_id]->carrier[CC_id].sizeof_paging[ue_id] = 0;
...@@ -7536,14 +7588,14 @@ char openair_rrc_eNB_configuration( ...@@ -7536,14 +7588,14 @@ char openair_rrc_eNB_configuration(
} }
} }
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[0]; CC_id++) {
init_SI(&ctxt, CC_id, configuration); init_SI(&ctxt, CC_id, configuration);
} }
if(need_init) { if(need_init) {
rrc_init_global_param(); rrc_init_global_param();
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < RC.nb_CC[0]; CC_id++) {
switch (RC.rrc[ctxt.module_id]->carrier[CC_id].MBMS_flag) { switch (RC.rrc[ctxt.module_id]->carrier[CC_id].MBMS_flag) {
case 1: case 1:
case 2: case 2:
...@@ -7576,9 +7628,22 @@ char openair_rrc_eNB_configuration( ...@@ -7576,9 +7628,22 @@ char openair_rrc_eNB_configuration(
RC.rrc[ctxt.module_id]->nr_scg_ssb_freq = configuration->nr_scg_ssb_freq; RC.rrc[ctxt.module_id]->nr_scg_ssb_freq = configuration->nr_scg_ssb_freq;
if(need_init) {openair_rrc_on(&ctxt);} if (RC.ss.mode >= SS_SOFTMODEM)
{
for (CC_id = 0; CC_id < RC.nb_CC[0]; CC_id++) {
//The CC are getting conifigured dynamically
if(RC.ss.CC_conf_flag[CC_id])
{
rrc_init_cell_context(CC_id,ctxt.module_id);
RC.ss.CC_conf_flag[CC_id] = 0;
}
}
}
else {
openair_rrc_on(&ctxt);
}
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++){ for (CC_id = 0; CC_id < RC.nb_CC[0]; CC_id++){
if(configuration->ActiveParamPresent[CC_id] == true) if(configuration->ActiveParamPresent[CC_id] == true)
{ {
RRCConnSetup_PDU_Present[CC_id] = configuration->RlcPduCCCH_Present[CC_id]; RRCConnSetup_PDU_Present[CC_id] = configuration->RlcPduCCCH_Present[CC_id];
...@@ -9552,7 +9617,7 @@ void handle_f1_setup_req(f1ap_setup_req_t *f1_setup_req) { ...@@ -9552,7 +9617,7 @@ void handle_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
for (int j=0; j<RC.nb_inst; j++) { for (int j=0; j<RC.nb_inst; j++) {
eNB_RRC_INST *rrc = RC.rrc[j]; eNB_RRC_INST *rrc = RC.rrc[j];
for(int CC_id=0;CC_id < MAX_NUM_CCs; CC_id++){ for(int CC_id=0;CC_id < RC.nb_CC[0]; CC_id++){
if (rrc->configuration.mcc[CC_id][0] == f1_setup_req->cell[i].mcc && if (rrc->configuration.mcc[CC_id][0] == f1_setup_req->cell[i].mcc &&
rrc->configuration.mnc[CC_id][0] == f1_setup_req->cell[i].mnc && rrc->configuration.mnc[CC_id][0] == f1_setup_req->cell[i].mnc &&
rrc->nr_cellid == f1_setup_req->cell[i].nr_cellid) { rrc->nr_cellid == f1_setup_req->cell[i].nr_cellid) {
...@@ -10080,7 +10145,7 @@ void rrc_eNB_process_ENDC_x2_setup_request(int mod_id, x2ap_ENDC_setup_req_t *m) ...@@ -10080,7 +10145,7 @@ void rrc_eNB_process_ENDC_x2_setup_request(int mod_id, x2ap_ENDC_setup_req_t *m)
return; return;
} }
if (m->num_cc > MAX_NUM_CCs) { if (m->num_cc > RC.nb_CC[0]) {
LOG_E(RRC, "Error: number of gNB cells carriers is exceeded \n"); LOG_E(RRC, "Error: number of gNB cells carriers is exceeded \n");
return; return;
} }
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
//main.c //main.c
int rrc_init_global_param(void); int rrc_init_global_param(void);
void rrc_init_global_cc_context(int CC_id, module_id_t module_id);
int L3_xface_init(void); int L3_xface_init(void);
void openair_rrc_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,uint8_t HO_enabled); void openair_rrc_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,uint8_t HO_enabled);
......
This diff is collapsed.
...@@ -22,11 +22,14 @@ ...@@ -22,11 +22,14 @@
#ifndef MULTICELL_HELPER_H #ifndef MULTICELL_HELPER_H
#define MULTICELL_HELPER_H #define MULTICELL_HELPER_H
#include "common/ran_context.h"
#include "ss_eNB_context.h" #include "ss_eNB_context.h"
int get_cell_index(uint16_t, SS_Cell_Context_t[]); int get_cell_index(uint16_t, SS_Cell_Context_t[]);
int get_cell_index_pci(uint16_t physCellId, SS_Cell_Context_t SSCell_list[]); int get_cell_index_pci(uint16_t physCellId, SS_Cell_Context_t SSCell_list[]);
void init_ss_context(SS_Cell_Context_t SSCell_list[]);
void init_cell_context(int cell_index, int enb_id,MessageDef *msg_p) ;
#endif #endif
...@@ -296,12 +296,15 @@ int sys_add_reconfig_cell(struct CellConfigInfo_Type *AddOrReconfigure) ...@@ -296,12 +296,15 @@ int sys_add_reconfig_cell(struct CellConfigInfo_Type *AddOrReconfigure)
for (int enb_id = 0; enb_id < RC.nb_inst; enb_id++) for (int enb_id = 0; enb_id < RC.nb_inst; enb_id++)
{ {
printf("eNB_Inst %d Number of CC configured %d\n", enb_id,RC.nb_CC[enb_id]);
if (AddOrReconfigure->Basic.d == true) if (AddOrReconfigure->Basic.d == true)
{ {
MessageDef *msg_p = itti_alloc_new_message(TASK_ENB_APP, ENB_MODULE_ID_TO_INSTANCE(enb_id), RRC_CONFIGURATION_REQ); MessageDef *msg_p = itti_alloc_new_message(TASK_ENB_APP, ENB_MODULE_ID_TO_INSTANCE(enb_id), RRC_CONFIGURATION_REQ);
RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[enb_id]->configuration; RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[enb_id]->configuration;
if (AddOrReconfigure->Basic.v.StaticCellInfo.d == true) if (AddOrReconfigure->Basic.v.StaticCellInfo.d == true)
{ {
init_cell_context(cell_index, enb_id,msg_p);
/** Handle Static Cell Info */ /** Handle Static Cell Info */
/** TDD: 1 FDD: 0 in OAI */ /** TDD: 1 FDD: 0 in OAI */
switch (AddOrReconfigure->Basic.v.StaticCellInfo.v.Common.RAT.d) switch (AddOrReconfigure->Basic.v.StaticCellInfo.v.Common.RAT.d)
...@@ -793,10 +796,25 @@ int sys_handle_cell_config_req(struct CellConfigRequest_Type *Cell) ...@@ -793,10 +796,25 @@ int sys_handle_cell_config_req(struct CellConfigRequest_Type *Cell)
LOG_A(ENB_SS, "[SYS] Signalling main thread for cell config done indication\n"); LOG_A(ENB_SS, "[SYS] Signalling main thread for cell config done indication\n");
cell_config_done_indication(); cell_config_done_indication();
} }
//TODO Change it later to move to cell configuration //cell configuration
if ( SS_context.SSCell_list[cell_index].State == SS_STATE_NOT_CONFIGURED) if ( SS_context.SSCell_list[cell_index].State == SS_STATE_NOT_CONFIGURED)
{ {
returnState = SS_STATE_CELL_CONFIGURED; //The flag is used to initilize the cell in the RRC layer during init_SI funciton
RC.ss.CC_conf_flag[cell_index] = 1;
//Increment nb_cc only from 2nd cell as the initilization is done for 1 CC
if (cell_index)
{
//Increment the nb_CC supported as new cell is confiured
RC.nb_CC[0] ++;
//Set the number of MAC_CC to current configured CC value
*RC.nb_mac_CC= RC.nb_CC[0];
LOG_A (ENB_SS,"CC-MGMT nb_cc is incremented current Configured CC are %d current CC_index %d nb_mac_CC %d\n",
RC.nb_CC[0],cell_index,*RC.nb_mac_CC);
}
returnState = SS_STATE_CELL_CONFIGURED;
} }
...@@ -2213,7 +2231,8 @@ void *ss_eNB_sys_task(void *arg) ...@@ -2213,7 +2231,8 @@ void *ss_eNB_sys_task(void *arg)
// Set the state to NOT_CONFIGURED for Cell Config processing mode // Set the state to NOT_CONFIGURED for Cell Config processing mode
if (RC.ss.mode == SS_SOFTMODEM) if (RC.ss.mode == SS_SOFTMODEM)
{ {
SS_context.SSCell_list[cell_index].State = SS_STATE_NOT_CONFIGURED; init_ss_context(SS_context.SSCell_list);
//SS_context.SSCell_list[cell_index].State = SS_STATE_NOT_CONFIGURED;
} }
// Set the state to CELL_ACTIVE for SRB processing mode // Set the state to CELL_ACTIVE for SRB processing mode
else if (RC.ss.mode == SS_SOFTMODEM_SRB) else if (RC.ss.mode == SS_SOFTMODEM_SRB)
......
...@@ -73,6 +73,7 @@ typedef struct ss_config_s { ...@@ -73,6 +73,7 @@ typedef struct ss_config_s {
int mac_rlc_data_ind_frame; int mac_rlc_data_ind_frame;
int mac_rlc_data_ind_subframe; int mac_rlc_data_ind_subframe;
ss_l1macind_ctrl_t l1macind; ss_l1macind_ctrl_t l1macind;
uint8_t CC_conf_flag[MAX_NUM_CCs];
ss_rrc_pdcp_api_t *ss_pdcp_api; ss_rrc_pdcp_api_t *ss_pdcp_api;
} ss_config_t; } ss_config_t;
/** /**
......
...@@ -310,7 +310,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB, ...@@ -310,7 +310,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,
int tem_proc_ccid = proc->CC_id; int tem_proc_ccid = proc->CC_id;
/* MultiCell: Function modify for Multiple CC */ /* MultiCell: Function modify for Multiple CC */
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { for (int CC_id=0; CC_id<RC.nb_CC[eNB->Mod_id]; CC_id++) {
eNB->UL_INFO.CC_id = CC_id; eNB->UL_INFO.CC_id = CC_id;
proc->CC_id = CC_id;//Temp solution need to be fixed later proc->CC_id = CC_id;//Temp solution need to be fixed later
eNB->if_inst->UL_indication(&eNB->UL_INFO, proc); eNB->if_inst->UL_indication(&eNB->UL_INFO, proc);
......
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