From cd18c09fc84bc718dae5086fc6b65e10e95cf740 Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Thu, 21 Aug 2014 11:51:05 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5740 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair2/COMMON/phy_messages_types.h | 8 +- openair2/COMMON/rrc_messages_types.h | 75 ++ openair2/ENB_APP/Makefile.inc | 4 +- openair2/ENB_APP/enb_app.c | 29 +- openair2/ENB_APP/enb_config.c | 1165 +++++++++++++++-- openair2/ENB_APP/enb_config.h | 98 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 11 +- .../LAYER2/MAC/eNB_scheduler_primitives.c | 92 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 24 +- openair2/LAYER2/MAC/pre_processor.c | 60 +- openair2/LAYER2/MAC/proto.h | 8 +- openair2/PHY_INTERFACE/defs.h | 2 +- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 214 +-- openair2/UTIL/OCG/OCG.h | 14 +- openair2/UTIL/OCG/OCG_parse_XML.c | 14 +- 15 files changed, 1365 insertions(+), 453 deletions(-) diff --git a/openair2/COMMON/phy_messages_types.h b/openair2/COMMON/phy_messages_types.h index 191b527959f..2bba244c647 100644 --- a/openair2/COMMON/phy_messages_types.h +++ b/openair2/COMMON/phy_messages_types.h @@ -78,10 +78,10 @@ typedef struct CellInfo_s { //-------------------------------------------------------------------------------------------// // eNB: ENB_APP -> PHY messages typedef struct PhyConfigurationReq_s { - lte_frame_type_t frame_type; - lte_prefix_type_t prefix_type; - uint32_t downlink_frequency; - int32_t uplink_frequency_offset; + lte_frame_type_t frame_type[MAX_NUM_CCs]; + lte_prefix_type_t prefix_type[MAX_NUM_CCs]; + uint32_t downlink_frequency[MAX_NUM_CCs]; + int32_t uplink_frequency_offset[MAX_NUM_CCs]; } PhyConfigurationReq; // UE: RRC -> PHY messages diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 901e3e0f05e..7a9b3cf872c 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -40,6 +40,7 @@ #include "as_message.h" #include "rrc_types.h" #include "s1ap_messages_types.h" +#include "RRC/LITE/MESSAGES/SystemInformationBlockType2.h" //-------------------------------------------------------------------------------------------// // Messages for RRC logging @@ -95,12 +96,86 @@ typedef struct RrcConfigurationReq_s { uint16_t mnc; uint8_t mnc_digit_length; + /* paging_drx_t default_drx; lte_frame_type_t frame_type; uint8_t tdd_config; uint8_t tdd_config_s; int16_t eutra_band; + */ + int16_t nb_cc; + lte_frame_type_t frame_type[MAX_NUM_CCs]; + uint8_t tdd_config[MAX_NUM_CCs]; + uint8_t tdd_config_s[MAX_NUM_CCs]; + lte_prefix_type_t prefix_type[MAX_NUM_CCs]; + int16_t eutra_band[MAX_NUM_CCs]; + uint32_t downlink_frequency[MAX_NUM_CCs]; + int32_t uplink_frequency_offset[MAX_NUM_CCs]; + + int16_t Nid_cell[MAX_NUM_CCs];// for testing, change later + int16_t N_RB_DL[MAX_NUM_CCs];// for testing, change later + int nb_antennas_tx[MAX_NUM_CCs]; + int nb_antennas_rx[MAX_NUM_CCs]; + long prach_root[MAX_NUM_CCs]; + long prach_config_index[MAX_NUM_CCs]; + BOOLEAN_t prach_high_speed[MAX_NUM_CCs]; + long prach_zero_correlation[MAX_NUM_CCs]; + long prach_freq_offset[MAX_NUM_CCs]; + long pucch_delta_shift[MAX_NUM_CCs]; + long pucch_nRB_CQI[MAX_NUM_CCs]; + long pucch_nCS_AN[MAX_NUM_CCs]; +#ifndef Rel10 + long pucch_n1_AN[MAX_NUM_CCs]; +#endif + long pdsch_referenceSignalPower[MAX_NUM_CCs]; + long pdsch_p_b[MAX_NUM_CCs]; + long pusch_n_SB[MAX_NUM_CCs]; + long pusch_hoppingMode[MAX_NUM_CCs]; + long pusch_hoppingOffset[MAX_NUM_CCs]; + BOOLEAN_t pusch_enable64QAM[MAX_NUM_CCs]; + BOOLEAN_t pusch_groupHoppingEnabled[MAX_NUM_CCs]; + long pusch_groupAssignment[MAX_NUM_CCs]; + BOOLEAN_t pusch_sequenceHoppingEnabled[MAX_NUM_CCs]; + long pusch_nDMRS1[MAX_NUM_CCs]; + long phich_duration[MAX_NUM_CCs]; + long phich_resource[MAX_NUM_CCs]; + BOOLEAN_t srs_enable[MAX_NUM_CCs]; + long srs_BandwidthConfig[MAX_NUM_CCs]; + long srs_SubframeConfig[MAX_NUM_CCs]; + BOOLEAN_t srs_ackNackST[MAX_NUM_CCs]; + BOOLEAN_t srs_MaxUpPts[MAX_NUM_CCs]; + long pusch_p0_Nominal[MAX_NUM_CCs]; + long pusch_alpha[MAX_NUM_CCs]; + long pucch_p0_Nominal[MAX_NUM_CCs]; + long msg3_delta_Preamble[MAX_NUM_CCs]; + long ul_CyclicPrefixLength[MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format1 pucch_deltaF_Format1[MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format1b pucch_deltaF_Format1b[MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format2 pucch_deltaF_Format2[MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format2a pucch_deltaF_Format2a[MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format2b pucch_deltaF_Format2b[MAX_NUM_CCs]; + long rach_numberOfRA_Preambles[MAX_NUM_CCs]; + BOOLEAN_t rach_preamblesGroupAConfig[MAX_NUM_CCs]; + long rach_sizeOfRA_PreamblesGroupA[MAX_NUM_CCs]; + long rach_messageSizeGroupA[MAX_NUM_CCs]; + e_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB rach_messagePowerOffsetGroupB[MAX_NUM_CCs]; + long rach_powerRampingStep[MAX_NUM_CCs]; + long rach_preambleInitialReceivedTargetPower[MAX_NUM_CCs]; + long rach_preambleTransMax[MAX_NUM_CCs]; + long rach_raResponseWindowSize[MAX_NUM_CCs]; + long rach_macContentionResolutionTimer[MAX_NUM_CCs]; + long rach_maxHARQ_Msg3Tx[MAX_NUM_CCs]; + long bcch_modificationPeriodCoeff[MAX_NUM_CCs]; + long pcch_defaultPagingCycle[MAX_NUM_CCs]; + long pcch_nB[MAX_NUM_CCs]; + long ue_TimersAndConstants_t300[MAX_NUM_CCs]; + long ue_TimersAndConstants_t301[MAX_NUM_CCs]; + long ue_TimersAndConstants_t310[MAX_NUM_CCs]; + long ue_TimersAndConstants_t311[MAX_NUM_CCs]; + long ue_TimersAndConstants_n310[MAX_NUM_CCs]; + long ue_TimersAndConstants_n311[MAX_NUM_CCs]; + } RrcConfigurationReq; // UE: NAS -> RRC messages diff --git a/openair2/ENB_APP/Makefile.inc b/openair2/ENB_APP/Makefile.inc index cb31d32c139..e018d676105 100644 --- a/openair2/ENB_APP/Makefile.inc +++ b/openair2/ENB_APP/Makefile.inc @@ -3,5 +3,5 @@ ENB_APP_DIR = $(OPENAIR2_TOP)/ENB_APP ENB_APP_OBJS = $(ENB_APP_DIR)/enb_app.o \ $(ENB_APP_DIR)/enb_config.o ENB_APP_incl = \ - -I$(ENB_APP_DIR) - \ No newline at end of file + -I$(ENB_APP_DIR) -I$(OPENAIR2_TOP) + diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 5f2613d53c5..b3d7ed1a4ae 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -71,14 +71,15 @@ extern unsigned char NB_eNB_INST; static void configure_phy(uint32_t enb_id, const Enb_properties_array_t *enb_properties) { MessageDef *msg_p; + int CC_id; msg_p = itti_alloc_new_message (TASK_ENB_APP, PHY_CONFIGURATION_REQ); - - PHY_CONFIGURATION_REQ (msg_p).frame_type = enb_properties->properties[enb_id]->frame_type; - PHY_CONFIGURATION_REQ (msg_p).prefix_type = enb_properties->properties[enb_id]->prefix_type; - PHY_CONFIGURATION_REQ (msg_p).downlink_frequency = enb_properties->properties[enb_id]->downlink_frequency; - PHY_CONFIGURATION_REQ (msg_p).uplink_frequency_offset = enb_properties->properties[enb_id]->uplink_frequency_offset; - + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + PHY_CONFIGURATION_REQ (msg_p).frame_type[CC_id] = enb_properties->properties[enb_id]->frame_type[CC_id]; + PHY_CONFIGURATION_REQ (msg_p).prefix_type[CC_id] = enb_properties->properties[enb_id]->prefix_type[CC_id]; + PHY_CONFIGURATION_REQ (msg_p).downlink_frequency[CC_id] = enb_properties->properties[enb_id]->downlink_frequency[CC_id]; + PHY_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[CC_id] = enb_properties->properties[enb_id]->uplink_frequency_offset[CC_id]; + } itti_send_msg_to_task (TASK_PHY_ENB, enb_id, msg_p); } @@ -86,6 +87,7 @@ static void configure_phy(uint32_t enb_id, const Enb_properties_array_t *enb_pro static void configure_rrc(uint32_t enb_id, const Enb_properties_array_t *enb_properties) { MessageDef *msg_p = NULL; + int CC_id; msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ); @@ -94,12 +96,13 @@ static void configure_rrc(uint32_t enb_id, const Enb_properties_array_t *enb_pro RRC_CONFIGURATION_REQ (msg_p).mcc = enb_properties->properties[enb_id]->mcc; RRC_CONFIGURATION_REQ (msg_p).mnc = enb_properties->properties[enb_id]->mnc; RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length = enb_properties->properties[enb_id]->mnc_digit_length; - RRC_CONFIGURATION_REQ (msg_p).default_drx = enb_properties->properties[enb_id]->default_drx; - RRC_CONFIGURATION_REQ (msg_p).frame_type = enb_properties->properties[enb_id]->frame_type; - RRC_CONFIGURATION_REQ (msg_p).tdd_config = enb_properties->properties[enb_id]->tdd_config; - RRC_CONFIGURATION_REQ (msg_p).tdd_config_s = enb_properties->properties[enb_id]->tdd_config_s; - RRC_CONFIGURATION_REQ (msg_p).eutra_band = enb_properties->properties[enb_id]->eutra_band; - + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[CC_id] = enb_properties->properties[enb_id]->pcch_defaultPagingCycle[CC_id]; + RRC_CONFIGURATION_REQ (msg_p).frame_type[CC_id] = enb_properties->properties[enb_id]->frame_type[CC_id]; + RRC_CONFIGURATION_REQ (msg_p).tdd_config[CC_id] = enb_properties->properties[enb_id]->tdd_config[CC_id]; + RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[CC_id] = enb_properties->properties[enb_id]->tdd_config_s[CC_id]; + RRC_CONFIGURATION_REQ (msg_p).eutra_band[CC_id] = enb_properties->properties[enb_id]->eutra_band[CC_id]; + } itti_send_msg_to_task (TASK_RRC_ENB, enb_id, msg_p); } @@ -139,7 +142,7 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con s1ap_register_eNB->mcc = enb_properties->properties[enb_id]->mcc; s1ap_register_eNB->mnc = enb_properties->properties[enb_id]->mnc; s1ap_register_eNB->mnc_digit_length = enb_properties->properties[enb_id]->mnc_digit_length; - s1ap_register_eNB->default_drx = enb_properties->properties[enb_id]->default_drx; + s1ap_register_eNB->default_drx = enb_properties->properties[enb_id]->pcch_defaultPagingCycle[0]; s1ap_register_eNB->nb_mme = enb_properties->properties[enb_id]->nb_mme; AssertFatal (s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, "Too many MME for eNB %d (%d/%d)!", enb_id, s1ap_register_eNB->nb_mme, S1AP_MAX_NB_MME_IP_ADDRESS); diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 6142b9d2049..427e2d58cc4 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -54,7 +54,7 @@ # include "sctp_eNB_task.h" # endif #endif - +#include "RRC/LITE/MESSAGES/SystemInformationBlockType2.h" #include "LAYER2/MAC/extern.h" #define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" @@ -68,19 +68,78 @@ #define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code" #define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code" -#define ENB_CONFIG_STRING_DEFAULT_PAGING_DRX "default_paging_drx" - -#define ENB_CONFIG_STRING_FRAME_TYPE "frame_type" -#define ENB_CONFIG_STRING_TDD_CONFIG "tdd_config" -#define ENB_CONFIG_STRING_TDD_CONFIG_S "tdd_config_s" -#define ENB_CONFIG_STRING_PREFIX_TYPE "prefix_type" -#define ENB_CONFIG_STRING_EUTRA_BAND "eutra_band" -#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY "downlink_frequency" -#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET "uplink_frequency_offset" - -#define ENB_CONFIG_STRING_COMPONENT_CARRIERS "component_carriers" -#define ENB_CONFIG_STRING_CELL_ID "cell_id" -#define ENB_CONFIG_STRING_N_RB_DL "N_RB_DL" +#define ENB_CONFIG_STRING_COMPONENT_CARRIERS "component_carriers" + +#define ENB_CONFIG_STRING_FRAME_TYPE "frame_type" +#define ENB_CONFIG_STRING_TDD_CONFIG "tdd_config" +#define ENB_CONFIG_STRING_TDD_CONFIG_S "tdd_config_s" +#define ENB_CONFIG_STRING_PREFIX_TYPE "prefix_type" +#define ENB_CONFIG_STRING_EUTRA_BAND "eutra_band" +#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY "downlink_frequency" +#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET "uplink_frequency_offset" + +#define ENB_CONFIG_STRING_NID_CELL "Nid_cell" +#define ENB_CONFIG_STRING_N_RB_DL "N_RB_DL" +#define ENB_CONFIG_STRING_CELL_MBSFN "Nid_cell_mbsfn" +#define ENB_CONFIG_STRING_NB_ANT_TX "nb_antennas_tx" +#define ENB_CONFIG_STRING_NB_ANT_RX "nb_antennas_rx" +#define ENB_CONFIG_STRING_PRACH_ROOT "prach_root" +#define ENB_CONFIG_STRING_PRACH_CONFIG_INDEX "prach_config_index" +#define ENB_CONFIG_STRING_PRACH_HIGH_SPEED "prach_high_speed" +#define ENB_CONFIG_STRING_PRACH_ZERO_CORRELATION "prach_zero_correlation" +#define ENB_CONFIG_STRING_PRACH_FREQ_OFFSET "prach_freq_offset" +#define ENB_CONFIG_STRING_PUCCH_DELTA_SHIFT "pucch_delta_shift" +#define ENB_CONFIG_STRING_PUCCH_NRB_CQI "pucch_nRB_CQI" +#define ENB_CONFIG_STRING_PUCCH_NCS_AN "pucch_nCS_AN" +#ifndef Rel10 +#define ENB_CONFIG_STRING_PUCCH_N1_AN "pucch_n1_AN" +#endif +#define ENB_CONFIG_STRING_PDSCH_RS_EPRE "pdsch_referenceSignalPower" +#define ENB_CONFIG_STRING_PDSCH_PB "pdsch_p_b" +#define ENB_CONFIG_STRING_PUSCH_N_SB "pusch_n_SB" +#define ENB_CONFIG_STRING_PUSCH_HOPPINGMODE "pusch_hoppingMode" +#define ENB_CONFIG_STRING_PUSCH_HOPPINGOFFSET "pusch_hoppingOffset" +#define ENB_CONFIG_STRING_PUSCH_ENABLE64QAM "pusch_enable64QAM" +#define ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN "pusch_groupHoppingEnabled" +#define ENB_CONFIG_STRING_PUSCH_GROUP_ASSIGNMENT "pusch_groupAssignment" +#define ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN "pusch_sequenceHoppingEnabled" +#define ENB_CONFIG_STRING_PUSCH_NDMRS1 "pusch_nDMRS1" +#define ENB_CONFIG_STRING_PHICH_DURATION "phich_duration" +#define ENB_CONFIG_STRING_PHICH_RESOURCE "phich_resource" +#define ENB_CONFIG_STRING_SRS_ENABLE "srs_enable" +#define ENB_CONFIG_STRING_SRS_BANDWIDTH_CONFIG "srs_BandwidthConfig" +#define ENB_CONFIG_STRING_SRS_SUBFRAME_CONFIG "srs_SubframeConfig" +#define ENB_CONFIG_STRING_SRS_ACKNACKST_CONFIG "srs_ackNackST" +#define ENB_CONFIG_STRING_SRS_MAXUPPTS "srs_MaxUpPts" +#define ENB_CONFIG_STRING_PUSCH_PO_NOMINAL "pusch_p0_Nominal" +#define ENB_CONFIG_STRING_PUSCH_ALPHA "pusch_alpha" +#define ENB_CONFIG_STRING_PUCCH_PO_NOMINAL "pucch_p0_Nominal" +#define ENB_CONFIG_STRING_MSG3_DELTA_PREAMBLE "msg3_delta_Preamble" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1 "pucch_deltaF_Format1" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1b "pucch_deltaF_Format1b" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2 "pucch_deltaF_Format2" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2A "pucch_deltaF_Format2a" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2B "pucch_deltaF_Format2b" +#define ENB_CONFIG_STRING_RACH_NUM_RA_PREAMBLES "rach_numberOfRA_Preambles" +#define ENB_CONFIG_STRING_RACH_PREAMBLESGROUPACONFIG "rach_preamblesGroupAConfig" +#define ENB_CONFIG_STRING_RACH_SIZEOFRA_PREAMBLESGROUPA "rach_sizeOfRA_PreamblesGroupA" +#define ENB_CONFIG_STRING_RACH_MESSAGESIZEGROUPA "rach_messageSizeGroupA" +#define ENB_CONFIG_STRING_RACH_MESSAGEPOWEROFFSETGROUPB "rach_messagePowerOffsetGroupB" +#define ENB_CONFIG_STRING_RACH_POWERRAMPINGSTEP "rach_powerRampingStep" +#define ENB_CONFIG_STRING_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER "rach_preambleInitialReceivedTargetPower" +#define ENB_CONFIG_STRING_RACH_PREAMBLETRANSMAX "rach_preambleTransMax" +#define ENB_CONFIG_STRING_RACH_RARESPONSEWINDOWSIZE "rach_raResponseWindowSize" +#define ENB_CONFIG_STRING_RACH_MACCONTENTIONRESOLUTIONTIMER "rach_macContentionResolutionTimer" +#define ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX "rach_maxHARQ_Msg3Tx" +#define ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE "pcch_default_PagingCycle" +#define ENB_CONFIG_STRING_PCCH_NB "pcch_nB" +#define ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF "bcch_modificationPeriodCoeff" +#define ENB_CONFIG_STRING_UETIMERS_T300 "ue_TimersAndConstants_t300" +#define ENB_CONFIG_STRING_UETIMERS_T301 "ue_TimersAndConstants_t301" +#define ENB_CONFIG_STRING_UETIMERS_T310 "ue_TimersAndConstants_t310" +#define ENB_CONFIG_STRING_UETIMERS_T311 "ue_TimersAndConstants_t311" +#define ENB_CONFIG_STRING_UETIMERS_N310 "ue_TimersAndConstants_n310" +#define ENB_CONFIG_STRING_UETIMERS_N311 "ue_TimersAndConstants_n311" #define ENB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address" #define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4" @@ -179,12 +238,13 @@ static void enb_config_display(void) { printf( "\tTAC: \t%u:\n",enb_properties.properties[i]->tac); printf( "\tMCC: \t%u:\n",enb_properties.properties[i]->mcc); printf( "\tMNC: \t%u:\n",enb_properties.properties[i]->mnc); - printf( "\teutra band: \t%d:\n",enb_properties.properties[i]->eutra_band); - printf( "\tdownlink freq: \t%u:\n",enb_properties.properties[i]->downlink_frequency); - printf( "\tuplink freq: \t%d:\n",enb_properties.properties[i]->uplink_frequency_offset); for (j=0; j< enb_properties.properties[i]->nb_cc; j++) { - printf( "\n\tCell ID for CC %d:\t%d:\n",j,enb_properties.properties[i]->cell_id[j]); + printf( "\teutra band for CC %d: \t%d:\n",j,enb_properties.properties[i]->eutra_band[j]); + printf( "\tdownlink freq for CC %d: \t%llu:\n",j,enb_properties.properties[i]->downlink_frequency[j]); + printf( "\tuplink freq for CC %d: \t%d:\n",j,enb_properties.properties[i]->uplink_frequency_offset[j]); + + printf( "\n\tCell ID for CC %d:\t%d:\n",j,enb_properties.properties[i]->Nid_cell[j]); printf( "\tN_RB_DL for CC %d:\t%d:\n",j,enb_properties.properties[i]->N_RB_DL[j]); } @@ -271,7 +331,6 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) { const char* enb_name = NULL; const char* mcc = 0; const char* mnc = 0; - const char* default_drx = NULL; const char* frame_type; long int tdd_config; long int tdd_config_s; @@ -279,8 +338,73 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) { long int eutra_band; long long int downlink_frequency; long int uplink_frequency_offset; - long int cell_id[MAX_NUM_CCs]; - long int N_RB_DL[MAX_NUM_CCs]; + long int Nid_cell; + long int Nid_cell_mbsfn; + long int N_RB_DL; + long int nb_antennas_tx; + long int nb_antennas_rx; + long int prach_root; + long int prach_config_index; + const char* prach_high_speed; + long int prach_zero_correlation; + long int prach_freq_offset; + long int pucch_delta_shift; + long int pucch_nRB_CQI; + long int pucch_nCS_AN; +#ifndef Rel10 + long int pucch_n1_AN; +#endif + long int pdsch_referenceSignalPower; + long int pdsch_p_b; + long int pusch_n_SB; + const char * pusch_hoppingMode; + long int pusch_hoppingOffset; + const char* pusch_enable64QAM; + const char* pusch_groupHoppingEnabled; + long int pusch_groupAssignment; + const char* pusch_sequenceHoppingEnabled; + long int pusch_nDMRS1; + const char* phich_duration; + const char* phich_resource; + const char* srs_enable; + long int srs_BandwidthConfig; + long int srs_SubframeConfig; + const char* srs_ackNackST; + const char* srs_MaxUpPts; + long int pusch_p0_Nominal; + const char* pusch_alpha; + long int pucch_p0_Nominal; + long int msg3_delta_Preamble; + long int ul_CyclicPrefixLength; + const char* pucch_deltaF_Format1; + const char* pucch_deltaF_Format1a; + const char* pucch_deltaF_Format1b; + const char* pucch_deltaF_Format2; + const char* pucch_deltaF_Format2a; + const char* pucch_deltaF_Format2b; + long rach_numberOfRA_Preambles; + const char* rach_preamblesGroupAConfig; + long rach_sizeOfRA_PreamblesGroupA; + long rach_messageSizeGroupA; + const char* rach_messagePowerOffsetGroupB; + long rach_powerRampingStep; + long rach_preambleInitialReceivedTargetPower; + long rach_preambleTransMax; + long rach_raResponseWindowSize; + long rach_macContentionResolutionTimer; + long rach_maxHARQ_Msg3Tx; + long pcch_defaultPagingCycle; + const char* pcch_nB; + long bcch_modificationPeriodCoeff; + long ue_TimersAndConstants_t300; + long ue_TimersAndConstants_t301; + long ue_TimersAndConstants_t310; + long ue_TimersAndConstants_t311; + long ue_TimersAndConstants_n310; + long ue_TimersAndConstants_n311; + + + char* ipv4 = NULL; char* ipv6 = NULL; char* active = NULL; @@ -388,7 +512,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) { && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_TRACKING_AREA_CODE, &tac) && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, &mcc) && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, &mnc) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_DEFAULT_PAGING_DRX, &default_drx) + ) ) { @@ -417,132 +541,903 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) { enb_properties.properties[enb_properties_index]->mnc = (uint16_t)atoi(mnc); enb_properties.properties[enb_properties_index]->mnc_digit_length = strlen(mnc); - if (strcmp(default_drx, "PAGING_DRX_32") == 0) { - enb_properties.properties[enb_properties_index]->default_drx = PAGING_DRX_32; - } else if (strcmp(default_drx, "PAGING_DRX_64") == 0) { - enb_properties.properties[enb_properties_index]->default_drx = PAGING_DRX_64; - } else if (strcmp(default_drx, "PAGING_DRX_128") == 0) { - enb_properties.properties[enb_properties_index]->default_drx = PAGING_DRX_128; - } else if (strcmp(default_drx, "PAGING_DRX_256") == 0) { - enb_properties.properties[enb_properties_index]->default_drx = PAGING_DRX_256; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for default_drx choice: PAGING_DRX_32..PAGING_DRX_256 !\n", - lib_config_file_name_pP, i, default_drx); - } // Parse optional physical parameters - if(config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_FRAME_TYPE, &frame_type)) { - if (strcmp(frame_type, "FDD") == 0) { - enb_properties.properties[enb_properties_index]->frame_type = FDD; - } else if (strcmp(frame_type, "TDD") == 0) { - enb_properties.properties[enb_properties_index]->frame_type = TDD; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n", - lib_config_file_name_pP, i, frame_type); - } - } else { - enb_properties.properties[enb_properties_index]->frame_type = FDD; // Default frame type - } - - if(config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_TDD_CONFIG, &tdd_config)) { - enb_properties.properties[enb_properties_index]->tdd_config = tdd_config; - AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %ld (should be 0-%d)!", - lib_config_file_name_pP, i, tdd_config, TDD_Config__subframeAssignment_sa6); - } else { - enb_properties.properties[enb_properties_index]->tdd_config = 3; // Default TDD sub-frame configuration - } - if(config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_TDD_CONFIG_S, &tdd_config_s)) { - enb_properties.properties[enb_properties_index]->tdd_config_s = tdd_config_s; - AssertError (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %ld (should be 0-%d)!", - lib_config_file_name_pP, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); - } else { - enb_properties.properties[enb_properties_index]->tdd_config_s = 0; // Default TDD S-sub-frame configuration - } - - if(config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_PREFIX_TYPE, &prefix_type)) { - if (strcmp(prefix_type, "NORMAL") == 0) { - enb_properties.properties[enb_properties_index]->prefix_type = NORMAL; - } else if (strcmp(prefix_type, "EXTENDED") == 0) { - enb_properties.properties[enb_properties_index]->prefix_type = EXTENDED; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", - lib_config_file_name_pP, i, prefix_type); - } - } else { - enb_properties.properties[enb_properties_index]->prefix_type = NORMAL; // Default prefix type - } - - if(config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_EUTRA_BAND, &eutra_band)) { - enb_properties.properties[enb_properties_index]->eutra_band = eutra_band; - // printf( "\teutra band:\t%d\n",enb_properties.properties[enb_properties_index]->eutra_band); - } else { - enb_properties.properties[enb_properties_index]->eutra_band = 7; // Default band - //printf( "\teutra band:\t%d (default)\n",enb_properties.properties[enb_properties_index]->eutra_band); - } - - if(config_setting_lookup_int64(setting_enb, ENB_CONFIG_STRING_DOWNLINK_FREQUENCY, &downlink_frequency)) { - enb_properties.properties[enb_properties_index]->downlink_frequency = (uint32_t) downlink_frequency; - //printf( "\tdownlink freq:\t%u\n",enb_properties.properties[enb_properties_index]->downlink_frequency); - } else { - enb_properties.properties[enb_properties_index]->downlink_frequency = 2680000000UL; // Default downlink frequency - // printf( "\tdownlink freq:\t%u (default)\n",enb_properties.properties[enb_properties_index]->downlink_frequency); - } - if(config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET, &uplink_frequency_offset)) { - enb_properties.properties[enb_properties_index]->uplink_frequency_offset = (unsigned int) uplink_frequency_offset; - //printf( "\tuplink freq offset:\t%ld\n",enb_properties.properties[enb_properties_index]->uplink_frequency_offset); - } else { - // Default uplink frequency offset - if (enb_properties.properties[enb_properties_index]->frame_type == FDD) { - enb_properties.properties[enb_properties_index]->uplink_frequency_offset = -120000000; - } else { - enb_properties.properties[enb_properties_index]->uplink_frequency_offset = 0; - } - //printf( "\tuplink freq offset:\t%ld (default)\n",enb_properties.properties[enb_properties_index]->uplink_frequency_offset); - } - - parse_errors += enb_check_band_frequencies(lib_config_file_name_pP, - enb_properties_index, - enb_properties.properties[enb_properties_index]->eutra_band, - enb_properties.properties[enb_properties_index]->downlink_frequency, - enb_properties.properties[enb_properties_index]->uplink_frequency_offset, - enb_properties.properties[enb_properties_index]->frame_type); setting_component_carriers = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_COMPONENT_CARRIERS); enb_properties.properties[enb_properties_index]->nb_cc = 0; if(setting_component_carriers != NULL) { - + num_component_carriers = config_setting_length(setting_component_carriers); - //printf("num component carrier %d \n", num_component_carriers); + printf("num component carrier %d \n", num_component_carriers); //enb_properties.properties[enb_properties_index]->nb_cc = num_component_carriers; for (j = 0; j < num_component_carriers /*&& j < MAX_NUM_CCs*/; j++) { component_carrier = config_setting_get_elem(setting_component_carriers, j); - if(!(config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_CELL_ID, &cell_id[j]) && - config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_N_RB_DL, &N_RB_DL[j]) ) - ){ - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, Component Carrier!\n", - lib_config_file_name_pP); - } - enb_properties.properties[enb_properties_index]->nb_cc++; - enb_properties.properties[enb_properties_index]->cell_id[j]= cell_id[j]; - enb_properties.properties[enb_properties_index]->N_RB_DL[j]= N_RB_DL[j]; - //printf("adding component carrier %d\n", j); - } - - } else { - for (j=0; j< MAX_NUM_CCs; j++) { - enb_properties.properties[enb_properties_index]->nb_cc +=1; - enb_properties.properties[enb_properties_index]->cell_id[j]=j; - enb_properties.properties[enb_properties_index]->N_RB_DL[j]=25; + + //printf("Component carrier %d\n",component_carrier); + if(!(config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_FRAME_TYPE, &frame_type) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TDD_CONFIG, &tdd_config) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TDD_CONFIG_S, &tdd_config_s) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PREFIX_TYPE, &prefix_type) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_EUTRA_BAND, &eutra_band) + && config_setting_lookup_int64(component_carrier, ENB_CONFIG_STRING_DOWNLINK_FREQUENCY, &downlink_frequency) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET, &uplink_frequency_offset) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_NID_CELL, &Nid_cell) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_N_RB_DL, &N_RB_DL) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_CELL_MBSFN, &Nid_cell_mbsfn) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_NB_ANT_TX, &nb_antennas_tx) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_NB_ANT_RX, &nb_antennas_rx) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PRACH_ROOT, &prach_root) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PRACH_CONFIG_INDEX, &prach_config_index) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PRACH_HIGH_SPEED, &prach_high_speed) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PRACH_ZERO_CORRELATION, &prach_zero_correlation) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PRACH_FREQ_OFFSET, &prach_freq_offset) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTA_SHIFT, &pucch_delta_shift) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_NRB_CQI, &pucch_nRB_CQI) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_NCS_AN, &pucch_nCS_AN) +#ifndef Rel10 + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_N1_AN, &pucch_n1_AN) +#endif + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PDSCH_RS_EPRE, &pdsch_referenceSignalPower) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PDSCH_PB, &pdsch_p_b) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_N_SB, &pusch_n_SB) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE, &pusch_hoppingMode) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_HOPPINGOFFSET, &pusch_hoppingOffset) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM, &pusch_enable64QAM) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN, &pusch_groupHoppingEnabled) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_GROUP_ASSIGNMENT, &pusch_groupAssignment) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN, &pusch_sequenceHoppingEnabled) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_NDMRS1, &pusch_nDMRS1) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PHICH_DURATION, &phich_duration) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PHICH_RESOURCE, &phich_resource) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_SRS_ENABLE, &srs_enable) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_PO_NOMINAL, &pusch_p0_Nominal) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_ALPHA, &pusch_alpha) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_PO_NOMINAL, &pucch_p0_Nominal) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_MSG3_DELTA_PREAMBLE, &msg3_delta_Preamble) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1, &pucch_deltaF_Format1) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1b, &pucch_deltaF_Format1b) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2, &pucch_deltaF_Format2) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2A, &pucch_deltaF_Format2a) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2B, &pucch_deltaF_Format2b) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_NUM_RA_PREAMBLES, &rach_numberOfRA_Preambles) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_RACH_PREAMBLESGROUPACONFIG, &rach_preamblesGroupAConfig) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_POWERRAMPINGSTEP, &rach_powerRampingStep) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER, &rach_preambleInitialReceivedTargetPower) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_PREAMBLETRANSMAX, &rach_preambleTransMax) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_RARESPONSEWINDOWSIZE, &rach_raResponseWindowSize) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MACCONTENTIONRESOLUTIONTIMER, &rach_macContentionResolutionTimer) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX, &rach_maxHARQ_Msg3Tx) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX, &bcch_modificationPeriodCoeff) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE, &pcch_defaultPagingCycle) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PCCH_NB, &pcch_nB) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF, &bcch_modificationPeriodCoeff) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_T300, &ue_TimersAndConstants_t300) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_T301, &ue_TimersAndConstants_t301) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_T310, &ue_TimersAndConstants_t310) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_T311, &ue_TimersAndConstants_t311) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_N310, &ue_TimersAndConstants_n310) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_N311, &ue_TimersAndConstants_n311) + +#ifdef Rel10 + +#endif + )){ + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, Component Carrier %d!\n", + lib_config_file_name_pP, enb_properties.properties[enb_properties_index]->nb_cc++); + } + enb_properties.properties[enb_properties_index]->nb_cc++; + + enb_properties.properties[enb_properties_index]->tdd_config[j] = tdd_config; + AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %ld (should be 0-%d)!", + lib_config_file_name_pP, i, tdd_config, TDD_Config__subframeAssignment_sa6); + + enb_properties.properties[enb_properties_index]->tdd_config_s[j] = tdd_config_s; + AssertError (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %ld (should be 0-%d)!", + lib_config_file_name_pP, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); + + if (strcmp(prefix_type, "NORMAL") == 0) { + enb_properties.properties[enb_properties_index]->prefix_type[j] = NORMAL; + } else if (strcmp(prefix_type, "EXTENDED") == 0) { + enb_properties.properties[enb_properties_index]->prefix_type[j] = EXTENDED; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", + lib_config_file_name_pP, i, prefix_type); + } + enb_properties.properties[enb_properties_index]->eutra_band[j] = eutra_band; + enb_properties.properties[enb_properties_index]->downlink_frequency[j] = (uint32_t) downlink_frequency; + enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset; + enb_properties.properties[enb_properties_index]->Nid_cell[j]= Nid_cell; + if (Nid_cell>503) { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n", + lib_config_file_name_pP, i, Nid_cell); + } + enb_properties.properties[enb_properties_index]->N_RB_DL[j]= N_RB_DL; + if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n", + lib_config_file_name_pP, i, N_RB_DL); + } + + if (strcmp(frame_type, "FDD") == 0) { + enb_properties.properties[enb_properties_index]->frame_type[j] = FDD; + } else if (strcmp(frame_type, "TDD") == 0) { + enb_properties.properties[enb_properties_index]->frame_type[j] = TDD; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n", + lib_config_file_name_pP, i, frame_type); + } + + + enb_properties.properties[enb_properties_index]->tdd_config[j] = tdd_config; + AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %ld (should be 0-%d)!", + lib_config_file_name_pP, i, tdd_config, TDD_Config__subframeAssignment_sa6); + + + enb_properties.properties[enb_properties_index]->tdd_config_s[j] = tdd_config_s; + AssertError (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %ld (should be 0-%d)!", + lib_config_file_name_pP, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); + + + + if (strcmp(prefix_type, "NORMAL") == 0) { + enb_properties.properties[enb_properties_index]->prefix_type[j] = NORMAL; + } else if (strcmp(prefix_type, "EXTENDED") == 0) { + enb_properties.properties[enb_properties_index]->prefix_type[j] = EXTENDED; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", + lib_config_file_name_pP, i, prefix_type); + } + + + + enb_properties.properties[enb_properties_index]->eutra_band[j] = eutra_band; + // printf( "\teutra band:\t%d\n",enb_properties.properties[enb_properties_index]->eutra_band); + + + + enb_properties.properties[enb_properties_index]->downlink_frequency[j] = (uint32_t) downlink_frequency; + //printf( "\tdownlink freq:\t%u\n",enb_properties.properties[enb_properties_index]->downlink_frequency); + + + enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset; + + parse_errors += enb_check_band_frequencies(lib_config_file_name_pP, + enb_properties_index, + enb_properties.properties[enb_properties_index]->eutra_band[j], + enb_properties.properties[enb_properties_index]->downlink_frequency[j], + enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j], + enb_properties.properties[enb_properties_index]->frame_type[j]); + + enb_properties.properties[enb_properties_index]->nb_antennas_tx[j] = nb_antennas_tx; + if ((nb_antennas_tx <1) || (nb_antennas_tx > 4)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antennas_tx choice: 1..4 !\n", + lib_config_file_name_pP, i, nb_antennas_tx); + + enb_properties.properties[enb_properties_index]->nb_antennas_rx[j] = nb_antennas_rx; + if ((nb_antennas_rx <1) || (nb_antennas_rx > 4)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antennas_rx choice: 1..4 !\n", + lib_config_file_name_pP, i, nb_antennas_rx); + + enb_properties.properties[enb_properties_index]->prach_root[j] = prach_root; + if ((prach_root <0) || (prach_root > 1023)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_root choice: 0..1023 !\n", + lib_config_file_name_pP, i, prach_root); + + enb_properties.properties[enb_properties_index]->prach_config_index[j] = prach_config_index; + if ((prach_config_index <0) || (prach_config_index > 63)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_config_index choice: 0..1023 !\n", + lib_config_file_name_pP, i, prach_config_index); + + if (strcmp(prach_high_speed, "ENABLE") == 0) + enb_properties.properties[enb_properties_index]->prach_high_speed[j] = TRUE; + else if (strcmp(prach_high_speed, "DISABLE") == 0) + enb_properties.properties[enb_properties_index]->prach_high_speed[j] = FALSE; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n", + lib_config_file_name_pP, i, prach_high_speed); + enb_properties.properties[enb_properties_index]->prach_zero_correlation[j] =prach_zero_correlation; + if ((prach_zero_correlation <0) || (prach_zero_correlation > 63)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n", + lib_config_file_name_pP, i, prach_zero_correlation); + + enb_properties.properties[enb_properties_index]->prach_freq_offset[j] = prach_freq_offset; + if ((prach_freq_offset <0) || (prach_freq_offset > 94)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 0..94!\n", + lib_config_file_name_pP, i, prach_freq_offset); + + + enb_properties.properties[enb_properties_index]->pucch_delta_shift[j] = pucch_delta_shift-1; + if ((pucch_delta_shift <1) || (pucch_delta_shift > 3)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n", + lib_config_file_name_pP, i, pucch_delta_shift); + + enb_properties.properties[enb_properties_index]->pucch_nRB_CQI[j] = pucch_nRB_CQI; + if ((pucch_nRB_CQI <0) || (pucch_nRB_CQI > 98)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n", + lib_config_file_name_pP, i, pucch_nRB_CQI); + enb_properties.properties[enb_properties_index]->pucch_nCS_AN[j] = pucch_nCS_AN; + if ((pucch_nCS_AN <0) || (pucch_nCS_AN > 7)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n", + lib_config_file_name_pP, i, pucch_nCS_AN); +#ifndef Rel10 + enb_properties.properties[enb_properties_index]->pucch_n1_AN[j] = pucch_n1_AN; + + if ((pucch_n1_AN <0) || (pucch_n1_AN > 2047)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n", + lib_config_file_name_pP, i, pucch_n1_AN); +#endif + enb_properties.properties[enb_properties_index]->pdsch_referenceSignalPower[j] = pdsch_referenceSignalPower; + if ((pdsch_referenceSignalPower <-60) || (pdsch_referenceSignalPower > 50)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n", + lib_config_file_name_pP, i, pdsch_referenceSignalPower); + + enb_properties.properties[enb_properties_index]->pdsch_p_b[j] = pdsch_p_b; + if ((pdsch_p_b <0) || (pdsch_p_b > 3)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_p_b choice: 0..3!\n", + lib_config_file_name_pP, i, pdsch_p_b); + + enb_properties.properties[enb_properties_index]->pusch_n_SB[j] = pusch_n_SB; + if ((pusch_n_SB <1) || (pusch_n_SB > 4)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_n_SB choice: 1..4!\n", + lib_config_file_name_pP, i, pusch_n_SB); + if (strcmp(pusch_hoppingMode,"interSubFrame")==0) + enb_properties.properties[enb_properties_index]->pusch_n_SB[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame; + else if (strcmp(pusch_hoppingMode,"intraAndInterSubFrame")==0) + enb_properties.properties[enb_properties_index]->pusch_n_SB[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n", + lib_config_file_name_pP, i, pusch_hoppingMode); + enb_properties.properties[enb_properties_index]->pusch_hoppingOffset[j] = pusch_hoppingOffset; + + if ((pusch_hoppingOffset<0) || (pusch_hoppingOffset>98)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%f\" for pusch_hoppingOffset choice: 0..98!\n", + lib_config_file_name_pP, i, pusch_hoppingMode); + + if (strcmp(pusch_enable64QAM, "ENABLE") == 0) + enb_properties.properties[enb_properties_index]->pusch_enable64QAM[j] = TRUE; + else if (strcmp(pusch_enable64QAM, "DISABLE") == 0) + enb_properties.properties[enb_properties_index]->pusch_enable64QAM[j] = FALSE; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n", + lib_config_file_name_pP, i, pusch_enable64QAM); + + if (strcmp(pusch_groupHoppingEnabled, "ENABLE") == 0) + enb_properties.properties[enb_properties_index]->pusch_groupHoppingEnabled[j] = TRUE; + else if (strcmp(pusch_groupHoppingEnabled, "DISABLE") == 0) + enb_properties.properties[enb_properties_index]->pusch_groupHoppingEnabled[j] = FALSE; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n", + lib_config_file_name_pP, i, pusch_groupHoppingEnabled); + + + enb_properties.properties[enb_properties_index]->pusch_groupAssignment[j] = pusch_groupAssignment; + if ((pusch_groupAssignment<0)||(pusch_groupAssignment>29)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n", + lib_config_file_name_pP, i, pusch_groupAssignment); + + if (strcmp(pusch_sequenceHoppingEnabled, "ENABLE") == 0) + enb_properties.properties[enb_properties_index]->pusch_groupHoppingEnabled[j] = TRUE; + else if (strcmp(pusch_sequenceHoppingEnabled, "DISABLE") == 0) + enb_properties.properties[enb_properties_index]->pusch_sequenceHoppingEnabled[j] = FALSE; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n", + lib_config_file_name_pP, i, pusch_sequenceHoppingEnabled); + + enb_properties.properties[enb_properties_index]->pusch_nDMRS1[j] = pusch_nDMRS1; //cyclic_shift in RRC! + if ((pusch_nDMRS1 <0) || (pusch_nDMRS1>7)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n", + lib_config_file_name_pP, i, pusch_nDMRS1); + + if (strcmp(phich_duration,"NORMAL")==0) + enb_properties.properties[enb_properties_index]->phich_duration[j] = normal; + else if (strcmp(phich_duration,"EXTENDED")==0) + enb_properties.properties[enb_properties_index]->phich_duration[j] = extended; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n", + lib_config_file_name_pP, i, phich_duration); + + if (strcmp(phich_resource,"ONESIXTH")==0) + enb_properties.properties[enb_properties_index]->phich_resource[j] = oneSixth; + else if (strcmp(phich_duration,"HALF")==0) + enb_properties.properties[enb_properties_index]->phich_resource[j] = half; + else if (strcmp(phich_duration,"ONE")==0) + enb_properties.properties[enb_properties_index]->phich_resource[j] = one; + else if (strcmp(phich_duration,"TWO")==0) + enb_properties.properties[enb_properties_index]->phich_resource[j] = two; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n", + lib_config_file_name_pP, i, phich_resource); + + if (strcmp(srs_enable, "ENABLE") == 0) + enb_properties.properties[enb_properties_index]->srs_enable[j] = TRUE; + else if (strcmp(srs_enable, "DISABLE") == 0) + enb_properties.properties[enb_properties_index]->srs_enable[j] = FALSE; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", + lib_config_file_name_pP, i, srs_enable); + if (enb_properties.properties[enb_properties_index]->srs_enable[j] == TRUE) { + if (!(config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_SRS_BANDWIDTH_CONFIG, &srs_BandwidthConfig) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_SRS_SUBFRAME_CONFIG, &srs_SubframeConfig) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_SRS_ACKNACKST_CONFIG, &srs_ackNackST) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_SRS_MAXUPPTS, &srs_MaxUpPts) + )) + AssertError(0, parse_errors++,"Failed to parse eNB configuration file %s, enb %d unknown values for srs_BandwidthConfig, srs_SubframeConfig, srs_ackNackST, srs_MaxUpPts\n", + lib_config_file_name_pP, i, srs_BandwidthConfig); + + enb_properties.properties[enb_properties_index]->srs_BandwidthConfig[j] = srs_BandwidthConfig; + if ((srs_BandwidthConfig < 0) || (srs_BandwidthConfig >7)) + AssertError (0, parse_errors ++, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n", + lib_config_file_name_pP, i, srs_BandwidthConfig); + enb_properties.properties[enb_properties_index]->srs_SubframeConfig[j] = srs_SubframeConfig; + if ((srs_SubframeConfig<0) || (srs_SubframeConfig>15)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n", + lib_config_file_name_pP, i, srs_SubframeConfig); + + if (strcmp(srs_ackNackST, "ENABLE") == 0) + enb_properties.properties[enb_properties_index]->srs_ackNackST[j] = TRUE; + else if (strcmp(srs_ackNackST, "DISABLE") == 0) + enb_properties.properties[enb_properties_index]->srs_ackNackST[j] = FALSE; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", + lib_config_file_name_pP, i, srs_ackNackST); + + if (strcmp(srs_MaxUpPts, "ENABLE") == 0) + enb_properties.properties[enb_properties_index]->srs_MaxUpPts[j] = TRUE; + else if (strcmp(srs_MaxUpPts, "DISABLE") == 0) + enb_properties.properties[enb_properties_index]->srs_MaxUpPts[j] = FALSE; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n", + lib_config_file_name_pP, i, srs_MaxUpPts); + } + + enb_properties.properties[enb_properties_index]->pusch_p0_Nominal[j] = pusch_p0_Nominal; + + if ((pusch_p0_Nominal<-126) || (pusch_p0_Nominal>24)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n", + lib_config_file_name_pP, i, pusch_p0_Nominal); + + if (strcmp(pusch_alpha,"AL0")) + enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al0; + else if (strcmp(pusch_alpha,"AL04")) + enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al04; + else if (strcmp(pusch_alpha,"AL05")) + enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al05; + else if (strcmp(pusch_alpha,"AL06")) + enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al06; + else if (strcmp(pusch_alpha,"AL07")) + enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al07; + else if (strcmp(pusch_alpha,"AL08")) + enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al08; + else if (strcmp(pusch_alpha,"AL09")) + enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al09; + else if (strcmp(pusch_alpha,"AL1")) + enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al1; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_p0_Nominal choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n", + lib_config_file_name_pP, i, pusch_alpha); + + enb_properties.properties[enb_properties_index]->pucch_p0_Nominal[j] = pucch_p0_Nominal; + if ((pucch_p0_Nominal<-127) || (pucch_p0_Nominal>-96)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n", + lib_config_file_name_pP, i, pucch_p0_Nominal); + + enb_properties.properties[enb_properties_index]->msg3_delta_Preamble[j] = msg3_delta_Preamble; + if ((msg3_delta_Preamble<-1) || (msg3_delta_Preamble>6)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n", + lib_config_file_name_pP, i, msg3_delta_Preamble); + + + if (strcmp(pucch_deltaF_Format1,"deltaF_2")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2; + else if (strcmp(pucch_deltaF_Format1,"deltaF0")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0; + else if (strcmp(pucch_deltaF_Format1,"deltaF2")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n", + lib_config_file_name_pP, i, pucch_deltaF_Format1); + + if (strcmp(pucch_deltaF_Format1b,"deltaF1")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1; + else if (strcmp(pucch_deltaF_Format1b,"deltaF3")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3; + else if (strcmp(pucch_deltaF_Format1b,"deltaF5")) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n", + lib_config_file_name_pP, i, pucch_deltaF_Format1b); + + + if (strcmp(pucch_deltaF_Format2,"deltaF_2")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2; + else if (strcmp(pucch_deltaF_Format2,"deltaF0")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0; + else if (strcmp(pucch_deltaF_Format2,"deltaF1")) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1; + else if (strcmp(pucch_deltaF_Format2,"deltaF2")) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n", + lib_config_file_name_pP, i, pucch_deltaF_Format2); + + + if (strcmp(pucch_deltaF_Format2a,"deltaF_2")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2; + else if (strcmp(pucch_deltaF_Format2a,"deltaF0")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0; + else if (strcmp(pucch_deltaF_Format2a,"deltaF2")) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n", + lib_config_file_name_pP, i, pucch_deltaF_Format2a); + + if (strcmp(pucch_deltaF_Format2b,"deltaF_2")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2; + else if (strcmp(pucch_deltaF_Format2b,"deltaF0")==0) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0; + else if (strcmp(pucch_deltaF_Format2b,"deltaF2")) + enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n", + lib_config_file_name_pP, i, pucch_deltaF_Format2b); + + + + + enb_properties.properties[enb_properties_index]->rach_numberOfRA_Preambles[j] = (rach_numberOfRA_Preambles/4)-1; + if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>64) || ((rach_numberOfRA_Preambles&3)!=0)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n", + lib_config_file_name_pP, i, rach_numberOfRA_Preambles); + + if (strcmp(rach_preamblesGroupAConfig, "ENABLE") == 0) { + enb_properties.properties[enb_properties_index]->rach_preamblesGroupAConfig[j] = TRUE; + + if (!(config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_SIZEOFRA_PREAMBLESGROUPA, &rach_sizeOfRA_PreamblesGroupA) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MESSAGESIZEGROUPA, &rach_messageSizeGroupA) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_RACH_MESSAGEPOWEROFFSETGROUPB, &rach_messagePowerOffsetGroupB))) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d rach_sizeOfRA_PreamblesGroupA, messageSizeGroupA,messagePowerOffsetGroupB!\n", + lib_config_file_name_pP, i, pucch_deltaF_Format2b); + + enb_properties.properties[enb_properties_index]->rach_sizeOfRA_PreamblesGroupA[j] = (rach_sizeOfRA_PreamblesGroupA/4)-1; + if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>60) || ((rach_numberOfRA_Preambles&3)!=0)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n", + lib_config_file_name_pP, i, rach_sizeOfRA_PreamblesGroupA); + + + switch (rach_messageSizeGroupA) { + case 56: + enb_properties.properties[enb_properties_index]->rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56; + break; + case 144: + enb_properties.properties[enb_properties_index]->rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144;break; + case 208: + enb_properties.properties[enb_properties_index]->rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208;break; + case 256: + enb_properties.properties[enb_properties_index]->rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256;break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n", + lib_config_file_name_pP, i, rach_messageSizeGroupA); + break; + } + + if (strcmp(rach_messagePowerOffsetGroupB,"minusinfinity")==0) + enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity; + else if (strcmp(rach_messagePowerOffsetGroupB,"dB0")==0) + enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0; + else if (strcmp(rach_messagePowerOffsetGroupB,"dB5")==0) + enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5; + else if (strcmp(rach_messagePowerOffsetGroupB,"dB8")==0) + enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8; + else if (strcmp(rach_messagePowerOffsetGroupB,"dB10")==0) + enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10; + else if (strcmp(rach_messagePowerOffsetGroupB,"dB12")==0) + enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12; + else if (strcmp(rach_messagePowerOffsetGroupB,"dB15")==0) + enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15; + else if (strcmp(rach_messagePowerOffsetGroupB,"dB18")==0) + enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n", + lib_config_file_name_pP, i, rach_messagePowerOffsetGroupB); + + } + else if (strcmp(rach_preamblesGroupAConfig, "DISABLE") == 0) + enb_properties.properties[enb_properties_index]->rach_preamblesGroupAConfig[j] = FALSE; + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n", + lib_config_file_name_pP, i, rach_preamblesGroupAConfig); + + enb_properties.properties[enb_properties_index]->rach_preambleInitialReceivedTargetPower[j] = (rach_preambleInitialReceivedTargetPower+120)/2; + if ((rach_preambleInitialReceivedTargetPower<-120) || (rach_preambleInitialReceivedTargetPower>-90) || ((rach_preambleInitialReceivedTargetPower&1)!=0)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n", + lib_config_file_name_pP, i, rach_preambleInitialReceivedTargetPower); + + + enb_properties.properties[enb_properties_index]->rach_powerRampingStep[j] = rach_powerRampingStep/2; + if ((rach_powerRampingStep<0) || (rach_powerRampingStep>6) || ((rach_powerRampingStep&1)!=0)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n", + lib_config_file_name_pP, i, rach_powerRampingStep); + + + + switch (rach_preambleTransMax) { + case 3: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3; + break; + case 4: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4; + break; + case 5: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5; + break; + case 6: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6; + break; + case 7: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7; + break; + case 8: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8; + break; + case 10: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10; + break; + case 20: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20; + break; + case 50: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50; + break; + case 100: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100; + break; + case 200: + enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n", + lib_config_file_name_pP, i, rach_preambleTransMax); + break; + } + enb_properties.properties[enb_properties_index]->rach_raResponseWindowSize[j] = (rach_raResponseWindowSize==10)?7:rach_raResponseWindowSize-2; + if ((rach_raResponseWindowSize<0)||(rach_raResponseWindowSize==9)||(rach_raResponseWindowSize>10)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n", + lib_config_file_name_pP, i, rach_preambleTransMax); + + + enb_properties.properties[enb_properties_index]->rach_macContentionResolutionTimer[j] = (rach_macContentionResolutionTimer/8)-1; + if ((rach_macContentionResolutionTimer<8) || (rach_macContentionResolutionTimer>64) || ((rach_macContentionResolutionTimer&7)!=0)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n", + lib_config_file_name_pP, i, rach_preambleTransMax); + + enb_properties.properties[enb_properties_index]->rach_maxHARQ_Msg3Tx[j] = rach_maxHARQ_Msg3Tx; + if ((rach_maxHARQ_Msg3Tx<0) || (rach_maxHARQ_Msg3Tx>8)) + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n", + lib_config_file_name_pP, i, rach_preambleTransMax); + + + switch (pcch_defaultPagingCycle) { + case 32: + enb_properties.properties[enb_properties_index]->pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf32; + break; + case 64: + enb_properties.properties[enb_properties_index]->pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf64; + break; + case 128: + enb_properties.properties[enb_properties_index]->pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf128; + break; + case 256: + enb_properties.properties[enb_properties_index]->pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf256; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n", + lib_config_file_name_pP, i, pcch_defaultPagingCycle); + break; + } + + if (strcmp(pcch_nB, "fourT") == 0) { + enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_fourT; + } + else if (strcmp(pcch_nB, "twoT") == 0) { + enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_twoT; + } + else if (strcmp(pcch_nB, "oneT") == 0) { + enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneT; + } + else if (strcmp(pcch_nB, "halfT") == 0) { + enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_halfT; + } + else if (strcmp(pcch_nB, "quarterT") == 0) { + enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_quarterT; + } + else if (strcmp(pcch_nB, "oneEighthT") == 0) { + enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneEighthT; + } + else if (strcmp(pcch_nB, "oneSixteenthT") == 0) { + enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneSixteenthT; + } + else if (strcmp(pcch_nB, "oneThirtySecondT") == 0) { + enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneThirtySecondT; + } + else + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n", + lib_config_file_name_pP, i, pcch_defaultPagingCycle); + + + + switch (bcch_modificationPeriodCoeff) { + case 2: + enb_properties.properties[enb_properties_index]->bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n2; + break; + case 4: + enb_properties.properties[enb_properties_index]->bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n4; + break; + case 8: + enb_properties.properties[enb_properties_index]->bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n8; + break; + case 16: + enb_properties.properties[enb_properties_index]->bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n16; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for bcch_modificationPeriodCoeff choice: 2,4,8,16", + lib_config_file_name_pP, i, bcch_modificationPeriodCoeff); + + break; + } + + + switch (ue_TimersAndConstants_t300) { + case 100: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms100; + break; + case 200: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms200; + break; + case 300: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms300; + break; + case 400: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms400; + break; + case 600: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms600; + break; + case 1000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1000; + break; + case 1500: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1500; + break; + case 2000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms2000; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for ue_TimersAndConstants_t300 choice: 100,200,300,400,600,1000,1500,2000 ", + lib_config_file_name_pP, i, ue_TimersAndConstants_t300); + break; + + } + + switch (ue_TimersAndConstants_t301) { + case 100: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms100; + break; + case 200: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms200; + break; + case 300: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms300; + break; + case 400: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms400; + break; + case 600: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms600; + break; + case 1000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1000; + break; + case 1500: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1500; + break; + case 2000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms2000; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for ue_TimersAndConstants_t301 choice: 100,200,300,400,600,1000,1500,2000 ", + lib_config_file_name_pP, i, ue_TimersAndConstants_t301); + break; + + } + switch (ue_TimersAndConstants_t310) { + case 0: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms0; + break; + case 50: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms50; + break; + case 100: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms100; + break; + case 200: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms200; + break; + case 500: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms500; + break; + case 1000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms1000; + break; + case 2000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms2000; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for ue_TimersAndConstants_t310 choice: 0,50,100,200,500,1000,1500,2000 ", + lib_config_file_name_pP, i, ue_TimersAndConstants_t310); + break; + + } + switch (ue_TimersAndConstants_t311) { + case 1000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms1000; + break; + case 3110: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms3000; + break; + case 5000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms5000; + break; + case 10000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms10000; + break; + case 15000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms15000; + break; + case 20000: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms20000; + break; + case 31100: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms30000; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for ue_TimersAndConstants_t311 choice: 1000,3000,5000,10000,150000,20000,30000", + lib_config_file_name_pP, i, ue_TimersAndConstants_t311); + break; + + } + + switch (ue_TimersAndConstants_n310) { + case 1: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n1; + break; + case 2: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n2; + break; + case 3: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n3; + break; + case 4: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n4; + break; + case 6: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n6; + break; + case 8: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n8; + break; + case 10: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n10; + break; + case 20: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n20; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for ue_TimersAndConstants_n310 choice: 1,2,3,4,6,6,8,10,20", + lib_config_file_name_pP, i, ue_TimersAndConstants_n311); + break; + + } + switch (ue_TimersAndConstants_n311) { + case 1: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n1; + break; + case 2: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n2; + break; + case 3: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n3; + break; + case 4: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n4; + break; + case 5: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n5; + break; + case 6: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n6; + break; + case 8: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n8; + break; + case 10: + enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n10; + break; + default: + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for ue_TimersAndConstants_t311 choice: 1,2,3,4,5,6,8,10", + lib_config_file_name_pP, i, ue_TimersAndConstants_t311); + break; + + } } } - setting_mme_addresses = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_MME_IP_ADDRESS); num_mme_address = config_setting_length(setting_mme_addresses); enb_properties.properties[enb_properties_index]->nb_mme = 0; diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 3e89b913318..d8ff1f1d2aa 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -42,6 +42,7 @@ #include "commonDef.h" #include "PHY/impl_defs_lte.h" #include "s1ap_messages_types.h" +#include "RRC/LITE/MESSAGES/SystemInformationBlockType2.h" // Hard to find a defined value for max enb... #define MAX_ENB 16 @@ -89,33 +90,92 @@ typedef struct Enb_properties_s { uint16_t mnc; uint8_t mnc_digit_length; - /* Default Paging DRX of the eNB as defined in TS 36.304 */ - paging_drx_t default_drx; + /* Physical parameters */ - lte_frame_type_t frame_type; - uint8_t tdd_config; - uint8_t tdd_config_s; - lte_prefix_type_t prefix_type; - int16_t eutra_band; - uint32_t downlink_frequency; - int32_t uplink_frequency_offset; - - /* Nb of component carrier for a given enb */ int16_t nb_cc; - int16_t cell_id[2];//cell_id[MAX_NUM_CCs];// for testing, change later - int16_t N_RB_DL[2];//N_RB_DL[MAX_NUM_CCs];// for testing, change later + lte_frame_type_t frame_type[1+MAX_NUM_CCs]; + uint8_t tdd_config[1+MAX_NUM_CCs]; + uint8_t tdd_config_s[1+MAX_NUM_CCs]; + lte_prefix_type_t prefix_type[1+MAX_NUM_CCs]; + int16_t eutra_band[1+MAX_NUM_CCs]; + uint64_t downlink_frequency[1+MAX_NUM_CCs]; + int32_t uplink_frequency_offset[1+MAX_NUM_CCs]; + + int16_t Nid_cell[1+MAX_NUM_CCs];// for testing, change later + int16_t N_RB_DL[1+MAX_NUM_CCs];// for testing, change later + int nb_antennas_tx[1+MAX_NUM_CCs]; + int nb_antennas_rx[1+MAX_NUM_CCs]; + long prach_root[1+MAX_NUM_CCs]; + long prach_config_index[1+MAX_NUM_CCs]; + BOOLEAN_t prach_high_speed[1+MAX_NUM_CCs]; + long prach_zero_correlation[1+MAX_NUM_CCs]; + long prach_freq_offset[1+MAX_NUM_CCs]; + long pucch_delta_shift[1+MAX_NUM_CCs]; + long pucch_nRB_CQI[1+MAX_NUM_CCs]; + long pucch_nCS_AN[1+MAX_NUM_CCs]; +#ifndef Rel10 + long pucch_n1_AN[1+MAX_NUM_CCs]; +#endif + long pdsch_referenceSignalPower[1+MAX_NUM_CCs]; + long pdsch_p_b[1+MAX_NUM_CCs]; + long pusch_n_SB[1+MAX_NUM_CCs]; + long pusch_hoppingMode[1+MAX_NUM_CCs]; + long pusch_hoppingOffset[1+MAX_NUM_CCs]; + BOOLEAN_t pusch_enable64QAM[1+MAX_NUM_CCs]; + BOOLEAN_t pusch_groupHoppingEnabled[1+MAX_NUM_CCs]; + long pusch_groupAssignment[1+MAX_NUM_CCs]; + BOOLEAN_t pusch_sequenceHoppingEnabled[1+MAX_NUM_CCs]; + long pusch_nDMRS1[1+MAX_NUM_CCs]; + long phich_duration[1+MAX_NUM_CCs]; + long phich_resource[1+MAX_NUM_CCs]; + BOOLEAN_t srs_enable[1+MAX_NUM_CCs]; + long srs_BandwidthConfig[1+MAX_NUM_CCs]; + long srs_SubframeConfig[1+MAX_NUM_CCs]; + BOOLEAN_t srs_ackNackST[1+MAX_NUM_CCs]; + BOOLEAN_t srs_MaxUpPts[1+MAX_NUM_CCs]; + long pusch_p0_Nominal[1+MAX_NUM_CCs]; + long pusch_alpha[1+MAX_NUM_CCs]; + long pucch_p0_Nominal[1+MAX_NUM_CCs]; + long msg3_delta_Preamble[1+MAX_NUM_CCs]; + long ul_CyclicPrefixLength[1+MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format1 pucch_deltaF_Format1[1+MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format1b pucch_deltaF_Format1b[1+MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format2 pucch_deltaF_Format2[1+MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format2a pucch_deltaF_Format2a[1+MAX_NUM_CCs]; + e_DeltaFList_PUCCH__deltaF_PUCCH_Format2b pucch_deltaF_Format2b[1+MAX_NUM_CCs]; + long rach_numberOfRA_Preambles[1+MAX_NUM_CCs]; + BOOLEAN_t rach_preamblesGroupAConfig[1+MAX_NUM_CCs]; + long rach_sizeOfRA_PreamblesGroupA[1+MAX_NUM_CCs]; + long rach_messageSizeGroupA[1+MAX_NUM_CCs]; + e_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB rach_messagePowerOffsetGroupB[1+MAX_NUM_CCs]; + long rach_powerRampingStep[1+MAX_NUM_CCs]; + long rach_preambleInitialReceivedTargetPower[1+MAX_NUM_CCs]; + long rach_preambleTransMax[1+MAX_NUM_CCs]; + long rach_raResponseWindowSize[1+MAX_NUM_CCs]; + long rach_macContentionResolutionTimer[1+MAX_NUM_CCs]; + long rach_maxHARQ_Msg3Tx[1+MAX_NUM_CCs]; + long bcch_modificationPeriodCoeff[1+MAX_NUM_CCs]; + long pcch_defaultPagingCycle[1+MAX_NUM_CCs]; + long pcch_nB[1+MAX_NUM_CCs]; + long ue_TimersAndConstants_t300[1+MAX_NUM_CCs]; + long ue_TimersAndConstants_t301[1+MAX_NUM_CCs]; + long ue_TimersAndConstants_t310[1+MAX_NUM_CCs]; + long ue_TimersAndConstants_t311[1+MAX_NUM_CCs]; + long ue_TimersAndConstants_n310[1+MAX_NUM_CCs]; + long ue_TimersAndConstants_n311[1+MAX_NUM_CCs]; + /* Nb of MME to connect to */ - uint8_t nb_mme; + uint8_t nb_mme; /* List of MME to connect to */ - mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS]; + mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS]; - char *enb_interface_name_for_S1U; - in_addr_t enb_ipv4_address_for_S1U; + char *enb_interface_name_for_S1U; + in_addr_t enb_ipv4_address_for_S1U; - char *enb_interface_name_for_S1_MME; - in_addr_t enb_ipv4_address_for_S1_MME; + char *enb_interface_name_for_S1_MME; + in_addr_t enb_ipv4_address_for_S1_MME; // log config int16_t glog_level; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 4c7bed36607..56ceddccdb7 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -365,6 +365,7 @@ void schedule_ue_spec(module_id_t module_idP, stop_meas(&eNB->schedule_dlsch_preprocessor); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR,VCD_FUNCTION_OUT); + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { if (mbsfn_flag[CC_id]>0) continue; @@ -400,7 +401,7 @@ void schedule_ue_spec(module_id_t module_idP, nb_available_rb = pre_nb_available_rbs[CC_id][UE_id]; UE_list->eNB_UE_stats[CC_id][UE_id].crnti= rnti; UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status=mac_get_rrc_status(module_idP,1,UE_id); - mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,subframeP,&harq_pid,&round,0); + mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); UE_list->eNB_UE_stats[CC_id][UE_id].harq_pid = harq_pid; UE_list->eNB_UE_stats[CC_id][UE_id].harq_round = round; @@ -1640,7 +1641,7 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: Checking if Msg4 was acknowledged: \n", module_idP,frameP,subframeP); // Get candidate harq_pid from PHY - mac_xface->get_ue_active_harq_pid(module_idP,CC_id,RA_template->rnti,subframeP,&harq_pid,&round,0); + mac_xface->get_ue_active_harq_pid(module_idP,CC_id,RA_template->rnti,frameP,subframeP,&harq_pid,&round,0); if (round>0) { // we have to schedule a retransmission if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) @@ -1688,16 +1689,16 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP } } // RA is scheduled in this subframeP - LOG_I(MAC,"Doing UE_spec DCIs\n"); + // UE specific DCIs for (UE_id=UE_list->head;UE_id>=0;UE_id=UE_list->next[UE_id]) { - LOG_I(MAC,"UE_id: %d => status %d\n",UE_id,eNB_dlsch_info[module_idP][UE_id].status); + // printf("UE_id: %d => status %d\n",UE_id,eNB_dlsch_info[module_idP][UE_id].status); if (eNB_dlsch_info[module_idP][UE_id].status == S_DL_SCHEDULED) { // clear scheduling flag eNB_dlsch_info[module_idP][UE_id].status = S_DL_WAITING; rnti = UE_RNTI(module_idP,UE_id); - mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,subframeP,&harq_pid,&round,0); + mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; DLSCH_dci = (void *)UE_list->UE_template[CC_id][UE_id].DLSCH_DCI[harq_pid]; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 7df59bdaf6a..5bc6be53e7e 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -194,6 +194,15 @@ uint8_t find_num_active_UEs_in_cbagroup(module_id_t module_idP, int CC_id,unsign return(nb_ue_in_pusch); } #endif + +void dump_ue_list(UE_list_t *listP) { + int j; + + for (j=listP->head;j>=0;j=listP->next[j]) { + LOG_T(MAC,"node %d => %d\n",j,listP->next[j]); + } +} + int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP) { int UE_id; int j; @@ -201,6 +210,7 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP) { UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; LOG_D(MAC,"[eNB %d, CC_id %d] Adding UE with rnti %x (next avail %d, num_UEs %d)\n",mod_idP,cc_idP,rntiP,UE_list->avail,UE_list->num_UEs); + dump_ue_list(UE_list); if (UE_list->avail>=0) { UE_id = UE_list->avail; @@ -224,8 +234,12 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP) { eNB_ulsch_info[mod_idP][UE_id].status = S_UL_WAITING; eNB_dlsch_info[mod_idP][UE_id].status = S_UL_WAITING; LOG_D(MAC,"[eNB %d] Add UE_id %d on Primary CC_id %d: rnti %x\n",mod_idP,UE_id,cc_idP,rntiP); + dump_ue_list(UE_list); return(UE_id); } + + LOG_E(MAC,"error in add_new_ue(), could not find space in UE_list, Dumping UE list\n"); + dump_ue_list(UE_list); return(-1); } @@ -237,6 +251,7 @@ int mac_remove_ue(module_id_t mod_idP, int ue_idP) { int pCC_id = UE_PCCID(mod_idP,ue_idP); LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n",ue_idP,pCC_id, UE_list->UE_template[pCC_id][ue_idP].rnti); + dump_ue_list(UE_list); // clear all remaining pending transmissions UE_list->UE_template[pCC_id][ue_idP].bsr_info[LCGID0] = 0; @@ -266,18 +281,23 @@ int mac_remove_ue(module_id_t mod_idP, int ue_idP) { UE_list->next[i] = UE_list->avail; UE_list->avail = i; UE_list->active[i] = FALSE; - return(0); + UE_list->num_UEs--; + return(0); } prev=i; } - UE_list->num_UEs--; + + LOG_E(MAC,"error in mac_remove_ue(), could not find previous to %d in UE_list, should never happen, Dumping UE list\n",ue_idP); + dump_ue_list(UE_list); + mac_xface->macphy_exit(""); return(-1); } + int prev(UE_list_t *listP, int nodeP) { int j; @@ -287,35 +307,75 @@ int prev(UE_list_t *listP, int nodeP) { if (listP->next[j]==nodeP) return(j); } - LOG_E(MAC,"error in prev(), could not find previous in UE_list, should never happen\n"); + + + LOG_E(MAC,"error in prev(), could not find previous to %d in UE_list, should never happen, Dumping UE list\n",nodeP); + dump_ue_list(listP); + + return(-1); } void swap_UEs(UE_list_t *listP,int nodeiP, int nodejP) { - int prev_i,prev_j,next_i; + int prev_i,prev_j,next_i,next_j; + + LOG_D(MAC,"Swapping UE %d,%d\n",nodeiP,nodejP); + dump_ue_list(listP); prev_i = prev(listP,nodeiP); prev_j = prev(listP,nodejP); + if ((prev_i<0) || (prev_j<0)) + mac_xface->macphy_exit(""); next_i = listP->next[nodeiP]; - listP->next[nodeiP] = listP->next[nodejP]; - listP->next[nodejP] = next_i; + next_j = listP->next[nodejP]; + LOG_D(MAC,"next_i %d, next_i, next_j %d, head %d\n",next_i,next_j,listP->head); - if (nodeiP==listP->head) { - listP->head=nodejP; - } - else { - listP->next[prev_i] = nodejP; - } - if (nodejP==listP->head) { - listP->head=nodeiP; + if (next_i == nodejP) { // case ... p(i) i j n(j) ... => ... p(j) j i n(i) ... + LOG_D(MAC,"Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); + + listP->next[nodeiP] = next_j; + listP->next[nodejP] = nodeiP; + if (nodeiP==listP->head) // case i j n(j) + listP->head = nodejP; + else + listP->next[prev_i] = nodejP; } - else { - listP->next[prev_j] = nodeiP; + else if (next_j == nodeiP) { // case ... p(j) j i n(i) ... => ... p(i) i j n(j) ... + LOG_D(MAC,"Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); + listP->next[nodejP] = next_i; + listP->next[nodeiP] = nodejP; + if (nodejP==listP->head) // case j i n(i) + listP->head = nodeiP; + else + listP->next[prev_j] = nodeiP; } + else { // case ... p(i) i n(i) ... p(j) j n(j) ... + + listP->next[nodejP] = next_i; + listP->next[nodeiP] = next_j; + + if (nodeiP==listP->head) { + LOG_D(MAC,"changing head to %d\n",nodejP); + listP->head=nodejP; + listP->next[prev_j] = nodeiP; + } + else if (nodejP==listP->head){ + LOG_D(MAC,"changing head to %d\n",nodeiP); + listP->head=nodeiP; + listP->next[prev_i] = nodejP; + } + else { + listP->next[prev_i] = nodejP; + listP->next[prev_j] = nodeiP; + } + } + + LOG_D(MAC,"After swap\n"); + dump_ue_list(listP); } void SR_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP) { diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index a99388ca16b..807ae8df2e5 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -527,8 +527,9 @@ void schedule_ulsch_rnti(module_id_t module_idP, if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel int8_t ret; // Get candidate harq_pid from PHY - ret = mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,subframeP,&harq_pid,&round,1); - LOG_I(MAC,"Got harq_pid %d, round %d, UE_id %d\n",harq_pid,round,UE_id); + ret = mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,1); + LOG_I(MAC,"Got harq_pid %d, round %d, UE_id %d (UE_to_be_scheduled %d)\n",harq_pid,round,UE_id, + UE_is_to_be_scheduled(module_idP,CC_id,UE_id)); /* [SR] 01/07/13: Don't schedule UE if we cannot get harq pid */ #ifndef EXMIMO_IOT @@ -538,8 +539,8 @@ void schedule_ulsch_rnti(module_id_t module_idP, if (round==0) #endif { - LOG_D(MAC,"[eNB %d][PUSCH %x] Frame %d subframeP %d Scheduling UE %d (SR %d)\n", - module_idP,rnti,frameP,subframeP,UE_id, + LOG_D(MAC,"[eNB %d][PUSCH %d] Frame %d subframeP %d Scheduling UE %d round %d (SR %d)\n", + module_idP,harq_pid,frameP,subframeP,UE_id,round, UE_template->ul_SR); // reset the scheduling request @@ -559,7 +560,10 @@ void schedule_ulsch_rnti(module_id_t module_idP, if (round > 0) { ndi = UE_template->oldNDI_UL[harq_pid]; - mcs = rvidx_tab[round&3] + 29; //not correct for round==4! + if ((round&3)==0) + mcs = openair_daq_vars.target_ue_ul_mcs; + else + mcs = rvidx_tab[round&3] + 28; //not correct for round==4! } else { ndi = 1-UE_template->oldNDI_UL[harq_pid]; @@ -569,13 +573,14 @@ void schedule_ulsch_rnti(module_id_t module_idP, LOG_D(MAC,"[eNB %d] ULSCH scheduler: Ndi %d, mcs %d\n",module_idP,ndi,mcs); - if((cooperation_flag > 0) && (UE_id == 1)) { // Allocation on same set of RBs + /* if((cooperation_flag > 0) && (UE_id == 1)) { // Allocation on same set of RBs // RIV:resource indication value // function in openair1/PHY/LTE_TRANSPORT/dci_tools.c rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, ((UE_id-1)*4),//openair_daq_vars.ue_ul_nb_rb), 4);//openair_daq_vars.ue_ul_nb_rb); - } - else if ((round==0) && (mcs < 29)) { + }*/ + + if (round==0) { rb_table_index = 1; TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); buffer_occupancy = ((UE_template->bsr_info[LCGID0] == 0) && @@ -618,7 +623,7 @@ void schedule_ulsch_rnti(module_id_t module_idP, //rb_table_index = 8; LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframeP %d Scheduled UE (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", - module_idP,UE_id,rnti,frameP,subframeP,mcs, + module_idP,harq_pid,rnti,frameP,subframeP,mcs, *first_rb,rb_table[rb_table_index], rb_table_index,mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]), harq_pid); @@ -628,6 +633,7 @@ void schedule_ulsch_rnti(module_id_t module_idP, rb_table[rb_table_index]);//openair_daq_vars.ue_ul_nb_rb); *first_rb+=rb_table[rb_table_index]; // increment for next UE allocation + UE_template->nb_rb_ul[harq_pid] = rb_table[rb_table_index]; //store for possible retransmission buffer_occupancy -= mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index f67e218b29e..c0e7343d4ae 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -219,13 +219,13 @@ void assign_rbs_required (module_id_t Mod_id, // This function scans all CC_ids for a particular UE to find the maximum round index of its HARQ processes -int maxround(module_id_t Mod_id,uint16_t rnti,sub_frame_t subframe) { +int maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe) { uint8_t round,round_max=0,harq_pid; int CC_id; for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++){ - mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,subframe,&harq_pid,&round,0); + mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frame,subframe,&harq_pid,&round,0); if (round > round_max) round_max = round; } @@ -252,8 +252,9 @@ int maxcqi(module_id_t Mod_id,uint16_t rnti) { // This fuction sorts the UE in order their dlsch buffer and CQI -void sort_UEs (module_id_t Mod_id, - sub_frame_t subframe) { +void sort_UEs (module_id_t Mod_idP, + int frameP, + sub_frame_t subframeP) { int UE_id1,UE_id2; @@ -262,30 +263,30 @@ void sort_UEs (module_id_t Mod_id, int i=0,ii=0,j=0; rnti_t rnti1,rnti2; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + UE_list_t *UE_list = &eNB_mac_inst[Mod_idP].UE_list; for (i=UE_list->head;i>=0;i=UE_list->next[i]) { - rnti1 = UE_RNTI(Mod_id,i); + rnti1 = UE_RNTI(Mod_idP,i); if(rnti1 == 0) continue; UE_id1 = i; - pCC_id1 = UE_PCCID(Mod_id,UE_id1); - cqi1 = maxcqi(Mod_id,rnti1); // - round1 = maxround(Mod_id,rnti1,subframe); + pCC_id1 = UE_PCCID(Mod_idP,UE_id1); + cqi1 = maxcqi(Mod_idP,rnti1); // + round1 = maxround(Mod_idP,rnti1,frameP,subframeP); for(ii=UE_list->next[i];ii>=0;ii=UE_list->next[ii]){ UE_id2 = ii; - rnti2 = UE_RNTI(Mod_id,UE_id2); + rnti2 = UE_RNTI(Mod_idP,UE_id2); if(rnti2 == 0) continue; - cqi2 = maxcqi(Mod_id,rnti2); - round2 = maxround(Mod_id,rnti2,subframe); //mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0); - pCC_id2 = UE_PCCID(Mod_id,UE_id2); + cqi2 = maxcqi(Mod_idP,rnti2); + round2 = maxround(Mod_idP,rnti2,frameP,subframeP); //mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0); + pCC_id2 = UE_PCCID(Mod_idP,UE_id2); if(round2 > round1){ // Check first if one of the UEs has an active HARQ process which needs service and swap order swap_UEs(UE_list,UE_id1,UE_id2); @@ -331,8 +332,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX], int *mbsfn_flag){ - unsigned char rballoc_sub[MAX_NUM_CCs][13],harq_pid=0,harq_pid1=0,harq_pid2=0,round=0,round1=0,round2=0,total_ue_count; - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][13]; + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],harq_pid=0,harq_pid1=0,harq_pid2=0,round=0,round1=0,round2=0,total_ue_count; + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]; int UE_id, UE_id2, i; uint16_t ii,j; uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; @@ -357,11 +358,14 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, continue; frame_parms[CC_id] = mac_xface->get_lte_frame_parms(Mod_id,CC_id); + + min_rb_unit[CC_id]=get_min_rb_unit(Mod_id,CC_id); for (i=UE_list->head;i>=0;i=UE_list->next[i]) { UE_id = i; // Initialize scheduling information for all active UEs + dlsch_scheduler_pre_processor_reset(UE_id, CC_id, N_RBG[CC_id], @@ -375,15 +379,23 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, } } - + + + // Store the DLSCH buffer for each logical channel store_dlsch_buffer (Mod_id,frameP,subframeP); + + // Calculate the number of RBs required by each UE on the basis of logical channel's buffer assign_rbs_required (Mod_id,frameP,subframeP,nb_rbs_required,min_rb_unit); + + // Sorts the user on the basis of dlsch logical channel buffer and CQI - sort_UEs (Mod_id,subframeP); + sort_UEs (Mod_id,frameP,subframeP); + + total_ue_count =0; // loop over all active UEs @@ -402,7 +414,7 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, average_rbs_per_user[CC_id]=0; - mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,subframeP,&harq_pid,&round,0); + mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); if(round>0) nb_rbs_required[CC_id][UE_id] = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; //nb_rbs_required_remaining[UE_id] = nb_rbs_required[UE_id]; @@ -480,7 +492,7 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, if(rnti == 0) continue; transmission_mode = mac_xface->get_transmission_mode(Mod_id,CC_id,rnti); - mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,subframeP,&harq_pid,&round,0); + mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); rrc_status = mac_get_rrc_status(Mod_id,1,UE_id); /* 1st allocate for the retx */ @@ -523,7 +535,7 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, continue; eNB_UE_stats2 = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti2); - mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,subframeP,&harq_pid2,&round2,0); + mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,frameP,subframeP,&harq_pid2,&round2,0); if ((mac_get_rrc_status(Mod_id,1,UE_id2) >= RRC_RECONFIGURED) && (round2==0) && @@ -635,8 +647,8 @@ void dlsch_scheduler_pre_processor_reset (int UE_id, uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][13], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][13]){ + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]){ int i; nb_rbs_required[CC_id][UE_id]=0; pre_nb_available_rbs[CC_id][UE_id] = 0; @@ -662,8 +674,8 @@ void dlsch_scheduler_pre_processor_allocate (module_id_t Mod_id, uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][13], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][13]){ + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]){ int i; diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index be66d37250e..ab98bfd6b39 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -178,8 +178,8 @@ void dlsch_scheduler_pre_processor_reset (int UE_id, uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][13], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][13]); + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]); // eNB functions /* \brief This function assigns pre-available RBS to each UE in specified sub-bands before scheduling is done @@ -215,8 +215,8 @@ void dlsch_scheduler_pre_processor_allocate (module_id_t Mod_id, uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX], uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][13], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][13]); + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]); /* \brief Function to trigger the eNB scheduling procedure. It is called by PHY at the beginning of each subframe, \f$n$\f and generates all DLSCH allocations for subframe \f$n\f$ and ULSCH allocations for subframe \f$n+k$\f. The resultant DCI_PDU is diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h index 7948d292ff8..16943b529fc 100755 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -236,7 +236,7 @@ typedef struct uint16_t (*get_TBS_UL)(uint8_t mcs, uint16_t nb_rb); /// Function to retrieve the HARQ round index for a particular UL/DLSCH and harq_pid - int (*get_ue_active_harq_pid)(module_id_t Mod_id, uint8_t CC_id,rnti_t rnti, uint8_t subframe, uint8_t *harq_pid, uint8_t *round, uint8_t ul_flag); + int (*get_ue_active_harq_pid)(module_id_t Mod_id, uint8_t CC_id,rnti_t rnti, int frame, uint8_t subframe, uint8_t *harq_pid, uint8_t *round, uint8_t ul_flag); /// Function to retrieve number of CCE uint16_t (*get_nCCE_max)(module_id_t Mod_id,uint8_t CC_id); diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 51bbfd85ef7..99160f58a50 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -506,7 +506,7 @@ uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer //*((*sib1)->p_Max) = 23; (*sib1)->freqBandIndicator = #if defined(ENABLE_ITTI) - configuration->eutra_band; + configuration->eutra_band[0]; #else 7; #endif @@ -519,23 +519,23 @@ uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer ASN_SEQUENCE_ADD(&(*sib1)->schedulingInfoList.list,&schedulingInfo); // ASN_SEQUENCE_ADD(&schedulingInfo.sib_MappingInfo.list,NULL); - + #if defined(ENABLE_ITTI) - if (configuration->frame_type == TDD) + if (configuration->frame_type[0] == TDD) #endif { (*sib1)->tdd_Config = CALLOC(1,sizeof(struct TDD_Config)); (*sib1)->tdd_Config->subframeAssignment = #if defined(ENABLE_ITTI) - configuration->tdd_config; + configuration->tdd_config[0]; #else frame_parms->tdd_config; #endif (*sib1)->tdd_Config->specialSubframePatterns = #if defined(ENABLE_ITTI) - configuration->tdd_config_s; + configuration->tdd_config_s[0]; #else frame_parms->tdd_config_S; #endif @@ -584,206 +584,6 @@ uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer return((enc_rval.encoded+7)/8); } -uint8_t do_SIB2_AT4(uint8_t Mod_id, - uint8_t *buffer, - BCCH_DL_SCH_Message_t *bcch_message, - SystemInformationBlockType2_t **sib2 -#if defined(ENABLE_ITTI) - , RrcConfigurationReq *configuration -#endif - ) { - - struct SystemInformation_r8_IEs_sib_TypeAndInfo_Member *sib2_part; - - asn_enc_rval_t enc_rval; - - memset(bcch_message,0,sizeof(BCCH_DL_SCH_Message_t)); - - - bcch_message->message.present = BCCH_DL_SCH_MessageType_PR_c1; - bcch_message->message.choice.c1.present = BCCH_DL_SCH_MessageType__c1_PR_systemInformation; - bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.present = SystemInformation__criticalExtensions_PR_systemInformation_r8; - - bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count=0; - - sib2_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs_sib_TypeAndInfo_Member)); - memset(sib2_part,0,sizeof(struct SystemInformation_r8_IEs_sib_TypeAndInfo_Member)); - - ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list, - sib2_part); - - sib2_part->present = SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib2; - - *sib2 = &sib2_part->choice.sib2; - - // sib2 - - (*sib2)->ac_BarringInfo = NULL; -#ifdef Rel10 - (*sib2)->ssac_BarringForMMTEL_Voice_r9 = NULL; - (*sib2)->ssac_BarringForMMTEL_Video_r9 = NULL; - (*sib2)->ac_BarringForCSFB_r10 = NULL; -#endif - - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles=RACH_ConfigCommon__preambleInfo__numberOfRA_Preambles_n52; - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig = NULL; - - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep=RACH_ConfigCommon__powerRampingParameters__powerRampingStep_dB2; - - - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower=RACH_ConfigCommon__powerRampingParameters__preambleInitialReceivedTargetPower_dBm_104; - - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax=RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6; - - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize=RACH_ConfigCommon__ra_SupervisionInfo__ra_ResponseWindowSize_sf10; - - - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer=RACH_ConfigCommon__ra_SupervisionInfo__mac_ContentionResolutionTimer_sf48; - - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx = 4; - - // BCCH-Config - - (*sib2)->radioResourceConfigCommon.bcch_Config.modificationPeriodCoeff=BCCH_Config__modificationPeriodCoeff_n4; - - // PCCH-Config - - (*sib2)->radioResourceConfigCommon.pcch_Config.defaultPagingCycle = -#if defined(ENABLE_ITTI) - configuration->default_drx; -#else - PCCH_Config__defaultPagingCycle_rf128; -#endif - (*sib2)->radioResourceConfigCommon.pcch_Config.nB=PCCH_Config__nB_oneT; - - // PRACH-Config - (*sib2)->radioResourceConfigCommon.prach_Config.rootSequenceIndex=22;//0;//384; - (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_ConfigIndex = 3;//3; - (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.highSpeedFlag = 0; - (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig = 0;//12; - (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset = 0; - - // PDSCH-Config - (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=-24; - (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=0; - - // PUSCH-Config - (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB=1; - - (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode=PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame; - (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset=4; - (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM=0; - (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled=0; - (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH=0; - (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled=0; - (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift=1; - - // PUCCH-Config - - - (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.deltaPUCCH_Shift=PUCCH_ConfigCommon__deltaPUCCH_Shift_ds2; - (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nRB_CQI = 2; - (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN = 0; - (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN = 0; - - - (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present=SoundingRS_UL_ConfigCommon_PR_release; - (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.release=0; - - // uplinkPowerControlCommon - - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUSCH = -95; - - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.alpha=UplinkPowerControlCommon__alpha_al08; - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUCCH = -117; - - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1=DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0; - - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b=DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3; - - - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2=DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0; - - - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a=DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0; - - - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b=DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0; - - (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaPreambleMsg3 = 4; - - - (*sib2)->radioResourceConfigCommon.ul_CyclicPrefixLength=UL_CyclicPrefixLength_len1; - - - (*sib2)->ue_TimersAndConstants.t300=UE_TimersAndConstants__t300_ms1000; - - - (*sib2)->ue_TimersAndConstants.t301=UE_TimersAndConstants__t301_ms1000; - - - (*sib2)->ue_TimersAndConstants.t310=UE_TimersAndConstants__t310_ms1000; - - - (*sib2)->ue_TimersAndConstants.n310=UE_TimersAndConstants__n310_n1; - - - (*sib2)->ue_TimersAndConstants.t311=UE_TimersAndConstants__t311_ms10000; - - - (*sib2)->ue_TimersAndConstants.n311=UE_TimersAndConstants__n311_n1; - - (*sib2)->freqInfo.additionalSpectrumEmission = 1; - (*sib2)->freqInfo.ul_Bandwidth = CALLOC(1,sizeof(long)); - (*sib2)->freqInfo.ul_CarrierFreq = CALLOC(1,sizeof(ARFCN_ValueEUTRA_t)); - *((*sib2)->freqInfo.ul_CarrierFreq) = 38050; - *((*sib2)->freqInfo.ul_Bandwidth) = SystemInformationBlockType2__freqInfo__ul_Bandwidth_n50; - (*sib2)->mbsfn_SubframeConfigList = NULL; - (*sib2)->timeAlignmentTimerCommon= TimeAlignmentTimer_infinity;//TimeAlignmentTimer_sf10240; - - -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_BCCH_DL_SCH_Message, (void*)bcch_message); -#endif - enc_rval = uper_encode_to_buffer(&asn_DEF_BCCH_DL_SCH_Message, - (void*)bcch_message, - buffer, - 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", - enc_rval.failed_type->name, enc_rval.encoded); - -#if defined(ENABLE_ITTI) -# if !defined(DISABLE_XER_SPRINT) - { - char message_string[10000]; - size_t message_string_size; - - if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_BCCH_DL_SCH_Message, (void *)bcch_message)) > 0) - { - MessageDef *msg_p; - - msg_p = itti_alloc_new_message_sized (TASK_RRC_ENB, RRC_DL_BCCH, message_string_size + sizeof (IttiMsgText)); - msg_p->ittiMsg.rrc_dl_bcch.size = message_string_size; - memcpy(&msg_p->ittiMsg.rrc_dl_bcch.text, message_string, message_string_size); - - itti_send_msg_to_task(TASK_UNKNOWN, Mod_id, msg_p); - } - } -# endif -#endif - -#ifdef USER_MODE - LOG_D(RRC,"[eNB] SystemInformation Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif - - if (enc_rval.encoded==-1) { - msg("[RRC] ASN1 : SI encoding failed for SIB2\n"); - return(-1); - } - return((enc_rval.encoded+7)/8); - -} - uint8_t do_SIB23(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, @@ -883,7 +683,7 @@ uint8_t do_SIB23(uint8_t Mod_id, (*sib2)->radioResourceConfigCommon.pcch_Config.defaultPagingCycle = #if defined(ENABLE_ITTI) - configuration->default_drx; + configuration->pcch_defaultPagingCycle[0]; #else PCCH_Config__defaultPagingCycle_rf128; #endif @@ -902,7 +702,7 @@ uint8_t do_SIB23(uint8_t Mod_id, #ifdef EXMIMO // This corresponds to raw output of ExpressMIMO2 v2 (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=-24; #else - (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=15; + (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=0; // corresponds to 24.7 dBm 5 MHz/ 27.7 10 MHz/ 30.7 20 MHz #endif if (frame_parms->mode1_flag==1) (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=0; diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h index c697734781d..8d5265116f8 100644 --- a/openair2/UTIL/OCG/OCG.h +++ b/openair2/UTIL/OCG/OCG.h @@ -732,13 +732,13 @@ The following diagram is based on graphviz (http://www.graphviz.org/), you need // phy related params unsigned int n_frames; unsigned int n_frames_flag; // if set, then let the emulation goes to infinity - unsigned char frame_type; - char * frame_type_name; - unsigned char tdd_config; - unsigned char tdd_config_S; - unsigned char extended_prefix_flag; - unsigned char N_RB_DL; - unsigned char transmission_mode; + unsigned char frame_type[MAX_NUM_CCs]; + char * frame_type_name[MAX_NUM_CCs]; + unsigned char tdd_config[MAX_NUM_CCs]; + unsigned char tdd_config_S[MAX_NUM_CCs]; + unsigned char extended_prefix_flag[MAX_NUM_CCs]; + unsigned char N_RB_DL[MAX_NUM_CCs]; + unsigned char transmission_mode[MAX_NUM_CCs]; int max_predefined_traffic_config_index; int max_customized_traffic_config_index; diff --git a/openair2/UTIL/OCG/OCG_parse_XML.c b/openair2/UTIL/OCG/OCG_parse_XML.c index 47bffa4471c..f30dd26b1a3 100644 --- a/openair2/UTIL/OCG/OCG_parse_XML.c +++ b/openair2/UTIL/OCG/OCG_parse_XML.c @@ -947,19 +947,19 @@ void characters(void *user_data, const xmlChar *xmlch, int xmllen) { // called o } else if (system_frequency_GHz_) { oai_emulation.environment_system_config.system_frequency_GHz = atof(ch); } else if (number_of_rbs_dl_) { - oai_emulation.info.N_RB_DL = atoi(ch); + oai_emulation.info.N_RB_DL[0] = atoi(ch); } else if (transmission_mode_) { - oai_emulation.info.transmission_mode = atoi(ch); + oai_emulation.info.transmission_mode[0] = atoi(ch); } else if (frame_config_) { if (frame_type_) { - oai_emulation.info.frame_type = atoi(ch); - if (oai_emulation.info.frame_type) { - oai_emulation.info.frame_type_name = "TDD"; + oai_emulation.info.frame_type[0] = atoi(ch); + if (oai_emulation.info.frame_type[0]) { + oai_emulation.info.frame_type_name[0] = "TDD"; } else { - oai_emulation.info.frame_type_name = "FDD"; + oai_emulation.info.frame_type_name[0] = "FDD"; } } else if (tdd_config_) { - oai_emulation.info.tdd_config = atoi(ch); + oai_emulation.info.tdd_config[0] = atoi(ch); } } else if (antenna_) { if (eNB_antenna_) { -- GitLab