/* lteenb configuration file version 2026-08-26 * Copyright (C) 2019-2026 Amarisoft * NR SA NTN cell */ #define NR_BANDWIDTH 10 // NR cell bandwidth, limited to 20 MHz in NTN bands 255 or 256 #define N_ANTENNA_DL 1 // Values: 1 (SISO), 2 (MIMO 2x2), 4 (MIMO 4x4) #define N_ANTENNA_UL 1 // Values: 1, 2, 4 #define NR_LONG_PUCCH_FORMAT 0 // Values: 0 (automatic), 2, 3 or 4 #define CHANNEL_SIM 1 // Enable satellite link emulation within eNB DL channel simulator #define EARTH_MOVING 0 #define N_CELL 3 #define USE_TLE 1 #define CSI_SRS_PERIOD 40 #define MAX_HARQ 5 #define T3XX_TIMER 1000 #define SRB_T_POLL_RETX 80 #define CHO 0 // Enable conditional Handover #define EVENT_D1 0 #define EVENT_T1 0 { //log_options: "all.level=debug,all.max_size=1,phy.ntn=1", log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,ngap.level=debug,ngap.max_size=1,xnap.level=debug,xnap.max_size=1,rrc.level=debug,rrc.max_size=1,phy.level=debug,phy.max_size=1,phy.ntn=1,bcch=1,mac.level=debug,mac.max_size=1", log_filename: "/tmp/gnb0.log", /* Enable remote API and Web interface */ com_addr: "[::]:9001", internal_time_ref: "rf_frontend", rf_frontend_time_offset: 1788781247000, rf_driver: { name: "sdr", #if N_CELL == 1 args: "dev0=/dev/sdr0", #elif N_CELL == 2 args: "dev0=/dev/sdr0,dev1=/dev/sdr1", #elif N_CELL == 3 args: "dev0=/dev/sdr0,dev1=/dev/sdr1,dev2=/dev/sdr2", #elif N_CELL == 4 args: "dev0=/dev/sdr0,dev1=/dev/sdr1,dev2=/dev/sdr2,dev3=/dev/sdr3", #elif N_CELL == 5 args: "dev0=/dev/sdr0,dev1=/dev/sdr1,dev2=/dev/sdr2,dev3=/dev/sdr3,dev4=/dev/sdr4", #endif /* TDD: force the RX antenna on the RX connector */ rx_antenna: "rx", /* synchronisation source: none, internal, gps, external (default = none) */ // sync: "gps", }, tx_gain: 70.0, /* TX gain (in dB) */ rx_gain: 30.0, /* RX gain (in dB) */ internal_time_ref: "rf_frontend", rf_frontend_time_offset: 1788781440000, amf_list: [ { /* address of AMF for NGAP connection. Must be modified if the AMF runs on a different host. */ amf_addr: "127.0.1.100", "5qi_dscp_mapping": [ { "5qi": 1, dscp: 0x2e }, { "5qi": 65, dscp: 0x2e } ] }, ], /* GTP bind address (=address of the ethernet interface connected to the AMF). Must be modified if the AMF runs on a different host. */ gtp_addr: "127.0.1.1", #ifdef GTP_U_BUNDLING gtp_use_packet_bundling: true, #endif gnb_id_bits: 28, gnb_id: 0x12345, rf_ports: [ { #if CHANNEL_SIM channel_dl: { type: "awgn", noise_level: -50 } #endif }, #if N_CELL > 1 { #if CHANNEL_SIM channel_dl: { type: "awgn", noise_level: -50 } #endif }, #endif #if N_CELL > 2 { #if CHANNEL_SIM channel_dl: { type: "awgn", noise_level: -50 } #endif }, #endif #if N_CELL > 3 { #if CHANNEL_SIM channel_dl: { type: "awgn", noise_level: -50 } #endif }, #endif #if N_CELL > 4 { #if CHANNEL_SIM channel_dl: { type: "awgn", noise_level: -50 } #endif } #endif ], rx_ta_offset: 30, /* Add a safety margin in UL reception window in case the UE overcompensates the TA */ /* list of cells */ cell_list: [], nr_cell_list: [ { rf_port: 0, cell_id: 0x01, band: 256, dl_nr_arfcn: 435000, ssb_subcarrier_spacing: 15, subcarrier_spacing: 30, ssb_pos_bitmap: "1000", ssb_period: 5, /* Close SSBs allow for better timing estimation on UE side */ n_id_cell: 501, ntn: { #if USE_TLE tle_filename: "ONEWEB-0019.tle", #else default_elevation_offset: 0, #endif }, ncell_list : [ #if N_CELL > 1 { cell_id: 2, #if CHO conditional_handover_target: true #endif } #endif ], }, #if N_CELL > 1 { rf_port: 1, cell_id: 0x02, band: 256, dl_nr_arfcn: 437000, ssb_subcarrier_spacing: 15, subcarrier_spacing: 30, ssb_pos_bitmap: "1000", ssb_period: 5, /* Close SSBs allow for better timing estimation on UE side */ n_id_cell: 502, ntn: { #if USE_TLE tle_filename: "ONEWEB-0443.tle", #else default_elevation_offset: -40, #endif }, ncell_list : [ #if N_CELL > 2 { cell_id: 3, #if CHO conditional_handover_target: true #endif } #endif ], }, #endif #if N_CELL > 2 { rf_port: 2, cell_id: 0x03, band: 256, dl_nr_arfcn: 439000, ssb_subcarrier_spacing: 15, subcarrier_spacing: 30, ssb_pos_bitmap: "1000", ssb_period: 5, /* Close SSBs allow for better timing estimation on UE side */ n_id_cell: 503, ntn: { #if USE_TLE tle_filename: "ONEWEB-0018.tle", #else default_elevation_offset: -80, #endif }, ncell_list : [ #if N_CELL > 3 { cell_id: 4, #if CHO conditional_handover_target: true #endif } #endif ], }, #endif #if N_CELL > 3 { rf_port: 3, cell_id: 0x04, band: 256, dl_nr_arfcn: 435000, ssb_subcarrier_spacing: 15, subcarrier_spacing: 30, ssb_pos_bitmap: "1000", ssb_period: 5, /* Close SSBs allow for better timing estimation on UE side */ n_id_cell: 504, ntn: { #if USE_TLE tle_filename: "ONEWEB-0461.tle", #else default_elevation_offset: -85, #endif }, ncell_list : [ #if N_CELL > 4 { cell_id: 5, #if CHO conditional_handover_target: true #endif } #endif ], }, #endif ], /* nr_cell_list */ nr_cell_default: { bandwidth: NR_BANDWIDTH, /* MHz */ n_antenna_dl: N_ANTENNA_DL, n_antenna_ul: N_ANTENNA_UL, plmn_list: [ { tac: 100, plmn: "00101", reserved: false, nssai: [ { sst: 1, }, ], }, ], sib_sched_list: [ { filename: "sib2_nr.asn", si_periodicity: 16, } ], si_window_length: 40, sib19: { si_periodicity: 16, si_value_tag: 0 }, sib9: { si_periodicity: 16, si_value_tag: 0 }, cell_barred: false, intra_freq_reselection: true, q_rx_lev_min: -70, q_qual_min: -20, root_sequence_index: 1, /* PRACH root sequence index */ /* Scheduling request period (slots). */ sr_period: 40, dmrs_type_a_pos: 2, prach: { prach_config_index: 16, /* subframe 1 every frame */ ra_response_window: 20, /* in slots */ msg1_fdm: 1, msg1_frequency_start: -1, zero_correlation_zone_config: 15, preamble_received_target_power: -110, /* in dBm */ preamble_trans_max: 7, power_ramping_step: 4, /* in dB */ restricted_set_config: "unrestricted_set", ra_contention_resolution_timer: 64, /* in ms */ ssb_per_prach_occasion: 1, cb_preambles_per_ssb: 8, }, pdcch: { search_space0_index: 0, dedicated_coreset: { rb_start: -1, /* -1 to have the maximum bandwidth */ l_crb: -1, /* -1 means all the bandwidth */ duration: 0, /* 0 means to automatically set it from the coreset bandwidth */ precoder_granularity: "sameAsREG_bundle", }, css: { n_candidates: [ 0, 0, 4, 0, 0 ], }, rar_al_index: 2, si_al_index: 2, uss: { n_candidates: [ 0, 4, 0, 0, 0 ], dci_0_1_and_1_1: true, }, al_index: 1, }, pdsch: { mapping_type: "typeA", dmrs_add_pos: 3, dmrs_type: 1, dmrs_max_len: 1, mcs_table: "qam256", rar_mcs: 2, si_mcs: 6, /* If defined, force the PDSCH MCS for all UEs. Otherwise it is computed * based on DL channel quality estimation */ /* mcs: 24, */ }, csi_rs: { resource_auto: { nzp_csi_rs_period: CSI_SRS_PERIOD, }, csi_report_config: [ { report_config_type: "periodic", period: CSI_SRS_PERIOD, }, ], }, pucch: { p0_nominal: -96, resource_auto: { #if NR_LONG_PUCCH_FORMAT == 2 formats: "format_0_and_2" #elif NR_LONG_PUCCH_FORMAT == 3 formats: "format_1_and_3" #elif NR_LONG_PUCCH_FORMAT == 4 formats: "format_1_and_4" #endif } }, srs: { resource_auto: { codebook: { resource_type: "periodic", period: CSI_SRS_PERIOD, /* in slots */ } } }, pusch: { tf_precoding: false, mcs_table: "qam256", /* without transform precoding */ mcs_table_tp: "qam256", /* with transform precoding */ ldpc_max_its: 5, p0_nominal_with_grant: -84, msg3_mcs: 4, msg3_delta_power: 0, /* in dB */ beta_offset_ack_index: 9, max_rank: N_ANTENNA_UL, ta_upd_snr_threshold: 3.0, /* Allow TA updates in most cases */ /* if defined, force the PUSCH MCS for all UEs. Otherwise it is computed from the last received PUSCH. */ /* mcs: 10, */ }, /* MAC configuration */ mac_config: { msg3_max_harq_tx: MAX_HARQ, ul_max_harq_tx: MAX_HARQ, /* max number of HARQ transmissions for uplink */ dl_max_harq_tx: MAX_HARQ, /* max number of HARQ transmissions for downlink */ ul_max_consecutive_retx: MAX_HARQ * 5, /* disconnect UE if reached */ dl_max_consecutive_retx: MAX_HARQ * 5, /* disconnect UE if reached */ periodic_phr_timer: 0, phr_tx_power_factor_change: "dB3", periodic_bsr_timer: 20, retx_bsr_timer: 80, sr_prohibit_timer: 16, prohibit_phr_timer: 20, sr_trans_max: 64, time_alignment_tx_timer: 40, data_inactivity_timer: 15 }, timers_and_constants: { t300: T3XX_TIMER, t301: T3XX_TIMER, t319: T3XX_TIMER, }, inactivity_timer: 10000, srb_config: [ { id: 1, t_PollRetransmit: SRB_T_POLL_RETX, }, { id: 2, t_PollRetransmit: SRB_T_POLL_RETX, } ], ntn: { #if USE_TLE == 0 default_ephemeris: "leo", #endif ul_sync_validity: 5, /* Uncomment based on UE interpretation of the ECI reference frame */ /* eci_reference: "ecef_greenwich" */ ground_position: { longitude: 13.4050, latitude: 52.52, altitude: 20 }, #if EARTH_MOVING earth_moving: { beam_center_offset:[ 100e3, 0], }, #endif #if CHANNEL_SIM channel_sim_control: { type: "auto_feeder_service_link", /* This should reflect the actual UE position in order to simulate properly the service link delay */ ue_position: { longitude: 11.4050, latitude: 45.52, altitude: 20, }, ue_dl_attenuation: true, ue_dl_gain_offset: 65, ue_doppler_shift: true, } #endif }, cipher_algo_pref: [], integ_algo_pref: [2, 1], drb_config: "drb_nr.cfg", /* measurement configuration */ meas_config_desc: { a1_report_type: "rsrp", a1_rsrp: -62, a1_hysteresis: 10, a1_time_to_trigger: 100, a2_report_type: "rsrp", a2_rsrp: -62, a2_hysteresis: 0, a2_time_to_trigger: 100, nr_handover: { a3_report_type: "rsrp", a3_offset: 3, hysteresis: 0, time_to_trigger: 100, }, #if EVENT_D1 nr_handover_location_based: { distance_threshold_from_ref1: 1000, distance_threshold_from_ref2: 800, hysteresis: 50, time_to_trigger: 5120, }, #endif #if CHO nr_conditional_handover: { measurement_trigger: { a3_report_type: "rsrp", a3_offset: 2, hysteresis: 1, time_to_trigger: 100, }, #if EVENT_D1 location_or_time_trigger: { distance_threshold_from_ref1: 1000, distance_threshold_from_ref2: 800, hysteresis: 50, time_to_trigger: 0, } #elif EVENT_T1 location_or_time_trigger: { //time_threshold: "2025-12-10T11:04:30", time_threshold: "below_elevation", time_duration: 5, time_satellite_elevation: 50, single_trigger_allowed: true } #endif }, #endif ssb_rsrq_filter_coeff: 2, ssb_sinr_filter_coeff: 2 }, meas_gap_config: { pattern_id: 0 }, }, }