osmo-gsm-tester/src/osmo_gsm_tester/templates/amarisoft_enb.cfg.tmpl

684 lines
19 KiB
Cheetah

/* 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
}