/* OGT templated version of the lteenb configuration file for 4G and 5G NSA */ { %if enb.license_server_addr != '0.0.0.0': license_server: { server_addr: "${enb.license_server_addr}", name: "amarisoft", }, %endif % if enb.rf_dev_type == 'zmq': /* Force sampling rate (if uncommented) */ sample_rate: ${enb.sample_rate}, %endif /* Log filter: syntax: layer.field=value[,...] Possible layers are phy, mac, rlc, pdcp, rrc, nas, s1ap, x2ap, gtpu and all. The 'all' layer is used to address all the layers at the same time. field values: - 'level': the log level of each layer can be set to 'none', 'error', 'info' or 'debug'. Use 'debug' to log all the messages. - 'max_size': set the maximum size of the hex dump. 0 means no hex dump. -1 means no limit. */ log_options: "${enb.log_options}", log_filename: "${enb.log_filename}", % if enb.enable_pcap == 'true': pcap: {filename:"${enb.pcap_filename}"}, %endif /* Enable remote API and Web interface */ com_addr: "${enb.addr}:9001", /* RF driver configuration */ include "amarisoft_rf_driver.cfg", % if enb.enable_dl_awgn: channel_dl: { type: "awgn", snr: ${enb.dl_awgn_snr} }, % endif mme_list: [ { s1ap_bind_addr: "${enb.addr}", /* address of MME for S1AP connection. Must be modified if the MME runs on a different host. */ mme_addr: "${enb.mme_addr}", }, ], /* GTP bind address (=address of the ethernet interface connected to the MME). Must be modified if the MME runs on a different host. */ gtp_addr: "${enb.gtp_bind_addr}", /* high 20 bits of SIB1.cellIdentifier */ enb_id: ${enb.id}, % if int(enb.num_nr_cells) > 0: nr_support: true, % endif /* list of cells */ cell_list: [ %for cell in enb.cell_list: %if loop.index == 0: { dl_earfcn: ${cell.dl_earfcn}, rf_port: ${cell.rf_port}, cell_id: ${cell.cell_id}, n_id_cell: ${cell.pci}, tac: 0x0007, root_sequence_index: ${loop.index * 10 + 204}, /* PRACH root sequence index */ ncell_list: [ %for ncell in cell.ncell_list: { n_id_cell: ${ncell.pci}, dl_earfcn: ${ncell.dl_earfcn}, cell_id: ${ncell.cell_id}, tac: 7 }, %endfor ], scell_list: [ %for scell_id in cell.scell_list: { cell_id: ${scell_id}, cross_carrier_scheduling: false, scheduling_cell_id: ${cell.cell_id}, ul_allowed: true}, %endfor ], nr_scell_list: [ %for nr_scell_id in cell.nr_scell_list: { cell_id: ${nr_scell_id} }, %endfor ], }, %endif %endfor ], /* cell_list */ % if int(enb.num_nr_cells) > 0: nr_cell_list: [ %for nr_cell in enb.nr_cell_list: %if loop.index == 0: { rf_port: ${nr_cell.rf_port}, cell_id: ${nr_cell.cell_id}, band: ${nr_cell.band}, dl_nr_arfcn: ${nr_cell.dl_nr_arfcn}, }, %endif %endfor ], /* nr_cell_list */ % endif /* default cell parameters */ cell_default: { /* Broadcasted PLMN identities */ plmn_list: [ "${'{0:03}'.format(int(enb.mcc))}${'{0:02}'.format(int(enb.mnc))}", ], % if enb.get('duplex') == "tdd": uldl_config: ${enb.tdd_uldl_config}, sp_config: ${enb.tdd_special_subframe_pattern}, % endif % if int(enb.get('transmission_mode')) == 1: n_antenna_dl: 1, /* number of DL antennas */ n_antenna_ul: 1, /* number of UL antennas */ % else: n_antenna_dl: 2, /* number of DL antennas */ n_antenna_ul: 2, /* number of UL antennas */ % endif n_rb_dl: ${enb.num_prb}, /* Bandwidth: 25: 5 MHz, 50: 10 MHz, 75: 15 MHz, 100: 20 MHz */ cyclic_prefix: "normal", phich_duration: "normal", phich_resource: "1", /* ratio of NG */ /* System Information Block type 1 */ sib1: "amarisoft_sib1.asn", /* other SIBs, in same order as the scheduling list in SIB 1 */ sib_sched_list: [ "amarisoft_sib23.asn" ], % if int(enb.num_prb) == 6: si_coderate: 0.30, /* maximum code rate for SI/RA/P-RNTI messages */ % else: si_coderate: 0.20, /* maximum code rate for SI/RA/P-RNTI messages */ % endif si_pdcch_format: 2, /* 2 or 3. Log2 of the number of CCEs for PDCCH for SI/RA/P-RNTI */ n_symb_cch: 0, /* number of symbols for CCH (0 = auto) */ /* PDSCH dedicated config (currently same for all UEs) */ pdsch_dedicated: { p_a: 0, }, /* If defined, force for number of CCEs for UE specific PDCCH to 2^pdcch_format. Otherwise it is computed from the reported CQI. Range: 0 to 3. */ //pdcch_format: 1, /* if defined, force the PDSCH MCS for all UEs. Otherwise it is computed from the reported CQI */ /* pdsch_mcs: 12, */ /* PUSCH dedicated config (currently same for all UEs) */ pusch_dedicated: { beta_offset_ack_index: 9, beta_offset_ri_index: 6, beta_offset_cqi_index: 6, }, /* MCS for Msg3 (=CCCH RRC Connection Request) */ pusch_msg3_mcs: 0, /* this CQI value is assumed when none is received from the UE */ % if int(enb.num_prb) == 6: initial_cqi: 5, % else: initial_cqi: 3, % endif /* if defined, force the PUSCH MCS for all UEs. Otherwise it is computed from the last received SRS/PUSCH. */ // pusch_mcs: 18, transmission_mode: ${enb.transmission_mode}, dl_256qam: true, ul_64qam: true, /* Scheduling request period (ms). Must be >= 40 for HD-FDD */ sr_period: 20, /* CQI report config */ cqi_period: 40, /* period (ms). Must be >= 32 for HD-FDD */ /* RI reporting is done with a period of m_ri * cqi_period. m_ri = 0 (default) disables RI reporting. */ % if int(enb.get('transmission_mode')) > 1: m_ri: 8, % endif pucch_dedicated: { /* ack/nack feedback mode when carrier aggregation is enabled. It can be "cs" (for at most two scells) or "pucch3" (used in all cases if more than two cells). */ ack_nack_feedback_mode_ca: "cs", /* TDD ack/nack feedback mode when a rel 10 UE is detected. It can be "bundling", "multiplexing", "cs" or "pucch3". By default is it the same as tdd_ack_nack_feedback_mode. */ % if enb.get('duplex') == "tdd": tdd_ack_nack_feedback_mode: "bundling", // tdd_ack_nack_feedback_mode_r10: "cs", % endif n1_pucch_sr_count: 11, /* increase if more UEs are needed */ cqi_pucch_n_rb: 1, /* increase if more UEs are needed */ /* number of PUCCH 1b CS resources. It determines the maximum number of UEs that can be scheduled in one TTI using carrier aggregation with PUCCH 1b CS ack/nack feedback. */ n1_pucch_an_cs_count: 1, /* number of resource blocks for PUCCH 3. It determines the maximum number of UEs that can be scheduled in one TTI using carrier aggregation with PUCCH 3 ack/nack feedback. */ n3_pucch_an_n_rb: 0, }, /* SRS dedicated config. All UEs share these parameters. srs_config_index and freq_domain_position are allocated for each UE) */ srs_dedicated: { srs_period: 160, /* period (ms). Must be >= 40 for HD-FDD */ srs_bandwidth: 1, srs_hopping_bandwidth: 0, }, /* MAC configuration (same for all UEs) */ mac_config: { ul_max_harq_tx: 5, /* max number of HARQ transmissions for uplink */ dl_max_harq_tx: 5, /* max number of HARQ transmissions for downlink */ ul_max_consecutive_retx: 1000, }, /* CPU load limitation */ pusch_max_its: 6, /* max number of turbo decoder iterations */ /* dynamic power control */ dpc: true, dpc_pusch_snr_target: 15, dpc_pucch_snr_target: 10, /* RRC/UP ciphering algorithm preference. EEA0 is always the last. */ cipher_algo_pref: [${', '.join(list(dict.fromkeys(enb.cipher_list))).split("eea")[1] if len(list(dict.fromkeys(enb.cipher_list))) > 0 else ''}], /* RRC integrity algorithm preference. EIA0 is always the last. */ integ_algo_pref: [${', '.join(list(dict.fromkeys(enb.integrity_list))).split("eia")[1]}], /* (in ms) send RRC connection release after this time of network inactivity */ inactivity_timer: ${enb.inactivity_timer}, /* SRB configuration */ srb_config: [ { id: 1, maxRetxThreshold: 32, t_Reordering: 45, t_PollRetransmit: 60, }, { id: 2 , maxRetxThreshold: 32, t_Reordering: 45, t_PollRetransmit: 60, } ], /* DRB configuration */ drb_config: "amarisoft_drb.cfg", % if enb.enable_measurements: /* measurement configuration */ meas_config_desc: { a1_report_type: "${enb.a1_report_type}", a1_${enb.a1_report_type}: ${enb.a1_report_value}, a1_hysteresis: ${enb.a1_hysteresis}, a1_time_to_trigger: ${enb.a1_time_to_trigger}, a2_report_type: "${enb.a2_report_type}", a2_${enb.a2_report_type}: ${enb.a2_report_value}, a2_hysteresis: ${enb.a2_hysteresis}, a2_time_to_trigger: ${enb.a2_time_to_trigger}, a3_report_type: "${enb.a3_report_type}", a3_offset: ${enb.a3_report_value}, a3_hysteresis: ${enb.a3_hysteresis}, a3_time_to_trigger: ${enb.a3_time_to_trigger}, % if int(enb.num_nr_cells) > 0: // NR events hard-coded nr_b1_report_type: "rsrp", nr_b1_rsrp: -100, nr_b1_hysteresis: 0, nr_b1_time_to_trigger: 100, nr_rsrp_filter_coeff: 3 % endif }, /* measurement gap configuration */ meas_gap_config: "gp0", /* if true, initiate a handover when a suitable measurement report is received */ ho_from_meas: true, % endif }, % if int(enb.num_nr_cells) > 0: nr_cell_default: { subcarrier_spacing: 15, /* kHz */ ssb_subcarrier_spacing: 30, bandwidth: ${enb.nr_bandwidth}, /* MHz */ n_antenna_dl: 1, n_antenna_ul: 1, /* force the timing TA offset (optional) */ n_timing_advance_offset: 0, tdd_ul_dl_config: { pattern1: { period: 10, dl_slots: 6, dl_symbols: 0, ul_slots: 3, ul_symbols: 0, }, }, ssb_pos_bitmap: "10000000", ssb_period: 20, /* in ms */ n_id_cell: 500, root_sequence_index: 1, /* PRACH root sequence index */ /* Scheduling request period (slots). */ sr_period: 40, dmrs_type_a_pos: 2, /* to limit the number of HARQ feedback in UL, use pdsch_harq_ack_max; allows to workaround issues with SM-G977N for example */ //pdsch_harq_ack_max: 2, prach: { prach_config_index: 0, msg1_subcarrier_spacing: 15, /* kHz */ msg1_fdm: 1, % if int(enb.nr_bandwidth) == 10: msg1_frequency_start: 1, % else: msg1_frequency_start: 3, % endif zero_correlation_zone_config: 0, preamble_received_target_power: -110, /* in dBm */ preamble_trans_max: 7, power_ramping_step: 4, /* in dB */ ra_response_window: 10, /* in slots */ restricted_set_config: "unrestricted_set", ra_contention_resolution_timer: 64, /* in ms */ ssb_per_prach_occasion: 1, cb_preambles_per_ssb: 8, }, pdcch: { common_coreset: { rb_start: -1, /* -1 to have the maximum bandwidth */ l_crb: -1, /* -1 means all the bandwidth */ duration: 1, precoder_granularity: "sameAsREG_bundle", //dmrs_scid: 0, }, dedicated_coreset: { rb_start: -1, /* -1 to have the maximum bandwidth */ l_crb: -1, /* -1 means all the bandwidth */ duration: 1, precoder_granularity: "sameAsREG_bundle", //dmrs_scid: 0, }, css: { n_candidates: [ 1, 1, 1, 0, 0 ], }, rar_al_index: 2, uss: { n_candidates: [ 0, 2, 1, 0, 0 ], dci_0_1_and_1_1: false, force_dci_0_0: true, // Forces DCI format 0_0 for Uplink force_dci_1_0: true, // Forces DCI format 1_0 for Downlink }, al_index: 1, }, pdsch: { mapping_type: "typeA", start_symb: 1, n_symb: 13, dmrs_add_pos: 1, dmrs_type: 1, dmrs_max_len: 1, k0: 0, /* delay in slots from DCI to PDSCH */ /* delay in slots from PDSCH to PUCCH/PUSCH ACK/NACK */ k1: [ 8, 7, 6, 6, 5, 4], mcs_table: "qam64", rar_mcs: 2, /* If defined, force the PDSCH MCS for all UEs. Otherwise it is computed * based on DL channel quality estimation */ /* mcs: 24, */ }, csi_rs: { nzp_csi_rs_resource: [ { csi_rs_id: 0, n_ports: 1, frequency_domain_allocation: "row2", bitmap: "100000000000", cdm_type: "no_cdm", density: 1, first_symb: 4, rb_start: 0, l_crb: -1, /* -1 means from rb_start to the end of the bandwidth */ power_control_offset: 0, /* dB */ power_control_offset_ss: 0, /* dB */ scrambling_id: 0, period: 80, offset: 1, /* != 0 to avoid collision with SSB */ qcl_info_periodic_csi_rs: 0, }, #define USE_TRS #ifdef USE_TRS /* TRS : period of 40 ms, slots 1 & 2, symbols 4 and 8 */ { csi_rs_id: 1, n_ports: 1, frequency_domain_allocation: "row1", bitmap: "0001", cdm_type: "no_cdm", density: 3, first_symb: 4, rb_start: 0, l_crb: -1, /* -1 means from rb_start to the end of the bandwidth */ power_control_offset: 0, /* dB */ power_control_offset_ss: 0, /* dB */ scrambling_id: 0, period: 40, offset: 11, qcl_info_periodic_csi_rs: 0, }, { csi_rs_id: 2, n_ports: 1, frequency_domain_allocation: "row1", bitmap: "0001", cdm_type: "no_cdm", density: 3, first_symb: 8, rb_start: 0, l_crb: -1, /* -1 means from rb_start to the end of the bandwidth */ power_control_offset: 0, /* dB */ power_control_offset_ss: 0, /* dB */ scrambling_id: 0, period: 40, offset: 11, qcl_info_periodic_csi_rs: 0, }, { csi_rs_id: 3, n_ports: 1, frequency_domain_allocation: "row1", bitmap: "0001", cdm_type: "no_cdm", density: 3, first_symb: 4, rb_start: 0, l_crb: -1, /* -1 means from rb_start to the end of the bandwidth */ power_control_offset: 0, /* dB */ power_control_offset_ss: 0, /* dB */ scrambling_id: 0, period: 40, offset: 12, qcl_info_periodic_csi_rs: 0, }, { csi_rs_id: 4, n_ports: 1, frequency_domain_allocation: "row1", bitmap: "0001", cdm_type: "no_cdm", density: 3, first_symb: 8, rb_start: 0, l_crb: -1, /* -1 means from rb_start to the end of the bandwidth */ power_control_offset: 0, /* dB */ power_control_offset_ss: 0, /* dB */ scrambling_id: 0, period: 40, offset: 12, qcl_info_periodic_csi_rs: 0, }, #endif ], nzp_csi_rs_resource_set: [ { csi_rs_set_id: 0, nzp_csi_rs_resources: [ 0 ], repetition: false, }, #ifdef USE_TRS { csi_rs_set_id: 1, nzp_csi_rs_resources: [ 1, 2, 3, 4 ], repetition: false, trs_info: true, }, #endif ], csi_im_resource: [ { csi_im_id: 0, pattern: 1, subcarrier_location: 8, symbol_location: 8, rb_start: 0, l_crb: -1, /* -1 means from rb_start to the end of the bandwidth */ period: 80, offset: 1, /* != 0 to avoid collision with SSB */ }, ], csi_im_resource_set: [ { csi_im_set_id: 0, csi_im_resources: [ 0 ], } ], /* ZP CSI-RS to set the CSI-IM REs to zero */ zp_csi_rs_resource: [ { csi_rs_id: 0, frequency_domain_allocation: "row4", bitmap: "100", n_ports: 4, cdm_type: "fd_cdm2", first_symb: 8, density: 1, rb_start: 0, l_crb: -1, /* -1 means from rb_start to the end of the bandwidth */ period: 80, offset: 1, }, ], p_zp_csi_rs_resource_set: [ { zp_csi_rs_resources: [ 0 ], }, ], csi_resource_config: [ { csi_rsc_config_id: 0, nzp_csi_rs_resource_set_list: [ 0 ], resource_type: "periodic", }, { csi_rsc_config_id: 1, csi_im_resource_set_list: [ 0 ], resource_type: "periodic", }, #ifdef USE_TRS { csi_rsc_config_id: 2, nzp_csi_rs_resource_set_list: [ 1 ], resource_type: "periodic", }, #endif ], csi_report_config: [ { resources_for_channel_measurement: 0, csi_im_resources_for_interference: 1, report_config_type: "periodic", period: 80, report_quantity: "CRI_RI_PMI_CQI", cqi_table: 2, subband_size: "value1", }, ], }, pucch: { pucch_group_hopping: "neither", hopping_id: -1, /* -1 = n_cell_id */ p0_nominal: -90, pucch1: { n_cs: 3, n_occ: 3, freq_hopping: false, }, pucch2: { n_symb: 2, n_prb: 1, freq_hopping: false, simultaneous_harq_ack_csi: false, max_code_rate: 0.25, }, }, pusch: { mapping_type: "typeA", n_symb: 14, dmrs_add_pos: 1, dmrs_type: 1, dmrs_max_len: 1, tf_precoding: false, mcs_table: "qam64", /* without transform precoding */ mcs_table_tp: "qam64", /* with transform precoding */ ldpc_max_its: 5, k2: 4, /* delay in slots from DCI to PUSCH */ p0_nominal_with_grant: -90, msg3_k2: 5, msg3_mcs: 4, msg3_delta_power: 0, /* in dB */ beta_offset_ack_index: 9, /* hardcoded scheduling parameters */ n_dmrs_cdm_groups: 1, n_layer: 1, /* if defined, force the PUSCH MCS for all UEs. Otherwise it is computed from the last received PUSCH. */ //mcs: 16, //max_mcs: 16, }, /* MAC configuration */ mac_config: { msg3_max_harq_tx: 5, ul_max_harq_tx: 5, /* max number of HARQ transmissions for uplink */ dl_max_harq_tx: 5, /* max number of HARQ transmissions for downlink */ ul_max_consecutive_retx: 30, /* disconnect UE if reached */ dl_max_consecutive_retx: 30, /* disconnect UE if reached */ periodic_bsr_timer: 20, retx_bsr_timer: 320, periodic_phr_timer: 500, prohibit_phr_timer: 200, phr_tx_power_factor_change: "dB3", sr_prohibit_timer: 0, /* in ms, 0 to disable the timer */ sr_trans_max: 64, }, cipher_algo_pref: [${', '.join(list(dict.fromkeys(enb.cipher_list))).split("eea")[1] if len(list(dict.fromkeys(enb.cipher_list))) > 0 else ''}], integ_algo_pref: [${', '.join(list(dict.fromkeys(enb.integrity_list))).split("eia")[1]}], inactivity_timer: ${enb.inactivity_timer}, drb_config: "amarisoft_drb_nr.cfg", }, % endif }