/* lteenb configuration file version 2021-09-18
 * Copyright (C) 2015-2021 Amarisoft
 */

#define TDD                 1 // Values: 0 (FDD), 1(TDD)
#define N_RB_DL             {{ slapparameter_dict.get('n_rb_dl', slap_configuration['configuration.default_lte_n_rb_dl']) }} // Values: 6 (1.4 MHz), 15 (3MHz), 25 (5MHz), 50 (10MHz), 75 (15MHz), 100 (20MHz)
#define N_ANTENNA_DL        2 // Values: 1 (SISO), 2 (MIMO 2x2)
#define N_ANTENNA_UL        2 // Values: 1, 2
#define CHANNEL_SIM         0 // Values: 0 (channel simulator disabled), 1 (channel simulator enabled)

{
  /* 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: "all.level=debug,all.max_size=32",
  log_filename: "{{ directory['log'] }}/enb.log",

  /* Enable remote API and Web interface */
  com_addr: "[{{ slap_configuration['ipv6-random'] }}]:{{ slap_configuration['configuration.enb_ws_port'] }}",

  /* RF driver configuration */
  rf_driver: {
      name: "sdr",
      /* list of devices. 'dev0' is always the master. */
      args: "dev0=/dev/sdr0",
      /* synchronisation source: none, internal, gps, external (default = none) */
      // sync: "gps",
      rx_antenna:"tx_rx",
  },
  tx_gain: {{ slapparameter_dict.get('tx_gain', slap_configuration['configuration.default_lte_tx_gain']) }}, /* TX gain (in dB) */
  rx_gain: {{ slapparameter_dict.get('rx_gain', slap_configuration['configuration.default_lte_rx_gain']) }}, /* RX gain (in dB) */

#if CHANNEL_SIM == 1
  rf_ports: [
    {
      channel_dl: {
        type: "awgn",
        noise_level: -30,
      },
    }
  ],  
#endif

  mme_list: [ 
    { 
      /* address of MME for S1AP connection. Must be modified if the MME
         runs on a different host. */
      mme_addr: "{{ slapparameter_dict.get('mme_addr', '127.0.1.100') }}"
    },
  ],
  /* GTP bind address (=address of the ethernet interface connected to
     the MME). Must be modified if the MME runs on a different host. */
{% if slapparameter_dict.get('mme_addr', '') %}
  gtp_addr: "{{ gtp_addr }}",
{% else %}
  gtp_addr: "127.0.1.1",
{% endif %}

  /* high 20 bits of SIB1.cellIdentifier */
  enb_id: {{ slapparameter_dict.get('enb_id', '0x1A2D0') }},

  /* list of cells */
  cell_list: [
  {
    /* Broadcasted PLMN identities */
    plmn_list: [
      "00101", 
    ],

    dl_earfcn: {{ slapparameter_dict.get('dl_earfcn', slap_configuration['configuration.default_dl_earfcn']) }},

    n_id_cell: 1,
    cell_id: 0x01,
    tac: 0x0001,
    root_sequence_index: 204, /* PRACH root sequence index */
  },
  ], /* cell_list */

  /* default cell parameters */
  cell_default: {
    n_antenna_dl: N_ANTENNA_DL, /* number of DL antennas */
    n_antenna_ul: N_ANTENNA_UL, /* number of UL antennas */
    
#if TDD == 1
    uldl_config: 2, /* TDD only */
    sp_config: 7, /* TDD only */
#endif

    n_rb_dl: N_RB_DL, /* 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 */

    /* SIB1 */
    si_value_tag: 0, /* increment modulo 32 if SI is modified */
    cell_barred: false, /* SIB1.cellBarred-r13 */
    intra_freq_reselection: true, /* SIB1.intraFreqReselection */
    q_rx_lev_min: -70, /* SIB1.q-RxLevMin */
    p_max: 10, /* maximum power allowed for the UE (dBm) */
    si_window_length: 40, /* ms */
    sib_sched_list: [ 
      {
        filename: "{{ directory['software'] }}/enb/config/sib23.asn",
        si_periodicity: 16, /* frames */
      },
    ],

#if N_RB_DL == 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: {
#if N_ANTENNA_DL == 4
      p_a: -6,
#elif N_ANTENNA_DL == 2
      p_a: -3,
#else
      p_a: 0,
#endif
      p_b: -1, /* -1 means automatic */
    },

    /* 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. */
#if N_RB_DL == 6
    pdcch_format: 1,
#else
    pdcch_format: 2,
#endif

    /* if defined, force the PDSCH MCS for all UEs. Otherwise it is
       computed from the reported CQI */ 
    /* pdsch_mcs: 12, */

#if N_RB_DL == 6
    prach_config_index: 15, /* subframe 9 every 20 ms */
#else
    prach_config_index: 4, /* subframe 4 every 10 ms */
#endif
    prach_freq_offset: -1, /* -1 means automatic */

    /* PUCCH dedicated config (currently same for all UEs) */
    pucch_dedicated: {
      n1_pucch_sr_count: 11, /* increase if more UEs are needed */
      cqi_pucch_n_rb: 1, /* increase if more UEs are needed */
#if TDD == 1
      //tdd_ack_nack_feedback_mode: "bundling", /* TDD only */
      tdd_ack_nack_feedback_mode: "multiplexing", /* TDD only */
#endif
    },

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

    pusch_hopping_offset: -1, /* -1 means automatic */

    /* MCS for Msg3 (=CCCH RRC Connection Request) */
    pusch_msg3_mcs: 0,

    /* this CQI value is assumed when none is received from the UE */
#if N_RB_DL == 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, 

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

#if N_ANTENNA_DL >= 2
    /* RI reporting is done with a period of m_ri * cqi_period. 
       m_ri = 0 (default) disables RI reporting. */
    m_ri: 8,
    /* transmission mode */
    transmission_mode: 3,
#endif

    /* SRS dedicated config. All UEs share these
       parameters. srs_config_index and freq_domain_position are
       allocated for each UE) */ 
    srs_dedicated: {
#if N_RB_DL == 6
      srs_bandwidth_config: 7,
      srs_bandwidth: 1,
#elif N_RB_DL == 15
      srs_bandwidth_config: 6,
      srs_bandwidth: 1,
#elif N_RB_DL == 25
      srs_bandwidth_config: 3,
      srs_bandwidth: 1,
#elif N_RB_DL == 50
      srs_bandwidth_config: 2,
      srs_bandwidth: 2,
#elif N_RB_DL == 75
      srs_bandwidth_config: 2,
      srs_bandwidth: 2,
#else
      srs_bandwidth_config: 2,
      srs_bandwidth: 3,
#endif
      srs_subframe_config: 3, /* 0 - 15 */
      srs_period: 40, /* period (ms). Must be >= 40 for HD-FDD */
      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 */
    },

    /* CPU load limitation */
    pusch_max_its: 6, /* max number of turbo decoder iterations */

    /* dynamic power control */
    dpc: true,
    dpc_pusch_snr_target: 25,
    dpc_pucch_snr_target: 20,

    /* RRC/UP ciphering algorithm preference. EEA0 is always the last. */
    cipher_algo_pref: [],
    /* RRC integrity algorithm preference. EIA0 is always the last. */
    integ_algo_pref: [2, 1],

    /* (in ms) send RRC connection release after this time of network
       inactivity */ 
    inactivity_timer: 10000,

    /* 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: "{{ directory['software'] }}/enb/config/drb.cfg",
  },
}
