Clone
4
how to connect cots ue to oai enb via ngfi 2rru
Raphael Defosseux edited this page 2019-04-16 15:09:34 +02:00

How to use OAI to setup C-RAN(2RRUs)

In this tutorial, we will describe how to connect an OAI UE with the C-RAN version of the OAI eNB with 2 RRUs. You can get more information about the C-RAN architecture and 1 rru case from How to use OAI to setup C-RAN -> NGFI RCC/RRU

1. Prerequisites

  • Please ensure that you meet the system requirements for OAI installationsystem requirements for OAI.
  • We assume that OAI EPC and HSS are setup and ready to be used with the RCC. Refer to OAI eNB <-> OAI CN tutorial.
  • You need a Octoclock-G from Ettus to provide PPS and 10MHz signals.

You can see the architecture of 2 RRUs C-RAN platform from the below picture:

topology_wiki

Figure 1: 2 OAI RRUs, OAI RCC and OAI EPC+HSS on different hosts (interface information included)

1.1 Configuration files

At the time of writing this tutorial, OAI architecture supports IF4.5 and IF5 functional splits. we have tested the IF4.5 file.

NGFI IF4p5(10MHz)

  • rcc_file:rcc.band7.tm1.if4p5.50PRB.2rru.conf
  • rru_file:rru.oaisim.conf

2. Installation and Confuguration of OAI RRU1

2.1 installation

Step 1: Check out the trunk

Download the source code according to Get the sources

Step 2: Run automated script for OAI RRU/RCC

cd ~/openairinterface5g
source oaienv
cd cmake_targets
./build_oai -I --eNB -w USRP      #for USRP Device

note:there is also lots of command line instrument of ./build_oai, for example:

  • -I:install required packages.
  • --eNB:complies for eNB application
  • -w:adds the hardware support, which s USRP B210 in our case.
  • -t:adds fronthaul transport protocol, for now ETHERNET is supported and used in our case.
  • for more information, you can use ./build_oai -h to check.

2.2 Configuration and execution

Step 1: Edit the RRU configuration file

the file is ~/openairinterface5g/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru_file.conf. the file is edited appropriately with respect to Figure 2.

  • RRU0.conf:
RUs = (
    {
      local_if_name                    = "enx000ec6a0a625";
      remote_address                   = "10.10.20.154"
    	local_address                    = "10.10.20.112";
    	local_portc                       = 50000;
    	remote_portc                      = 50000;
    	local_portd                       = 50001;
    	remote_portd                      = 50001;
	    local_rf                         = "yes"
    	tr_preference                    = "udp_if4p5";
	    nb_tx                            = 1;
    	nb_rx                            = 1;
	    max_pdschReferenceSignalPower    = -29;
	    max_rxgain                       = 120;
	    bands                            = [7,13];
      is_slave                         = "no";
    }
);

log_config = {
      global_log_level                      ="info";
      global_log_verbosity                  ="medium";
      hw_log_level                          ="info";
      hw_log_verbosity                      ="medium";
      phy_log_level                         ="info";
      phy_log_verbosity                     ="medium";
      mac_log_level                         ="info";
      mac_log_verbosity                     ="high";
      rlc_log_level                         ="info";
      rlc_log_verbosity                     ="medium";
      pdcp_log_level                        ="info";
      pdcp_log_verbosity                    ="medium";
      rrc_log_level                         ="info";
      rrc_log_verbosity                     ="medium";
};
  • RRU1.conf
RUs = (
    {
        local_if_name                    = "eth1";
        remote_address                   = "10.10.10.153"
        local_address                    = "10.10.10.111";
        local_portc                       = 50002;
        remote_portc                      = 50002;
        local_portd                       = 50003;
        remote_portd                      = 50003;
        local_rf                         = "yes"
        tr_preference                    = "udp_if4p5";
        nb_tx                            = 1;
        nb_rx                            = 1;
        max_pdschReferenceSignalPower    = -29;
        max_rxgain                       = 120;
        bands                            = [7];
        is_slave                         = "no";
      }
);
log_config = {
      global_log_level                      ="info";
      global_log_verbosity                  ="medium";
      hw_log_level                          ="info";
      hw_log_verbosity                      ="medium";
      phy_log_level                         ="info";
      phy_log_verbosity                     ="medium";
      mac_log_level                         ="info";
      mac_log_verbosity                     ="high";
      rlc_log_level                         ="info";
      rlc_log_verbosity                     ="medium";
      pdcp_log_level                        ="info";
      pdcp_log_verbosity                    ="medium";
      rrc_log_level                         ="info";
      rrc_log_verbosity                     ="medium";
};

Step2: Compile & Run the RRUs

cd ~/openairinterface5g
source oaienv
cmake_targets/build_oai -w USRP -t ETHERNET -x -c --eNB
cd cmake_targets/lte_build_oai/build
sudo sudo ./lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/**rru_file** --external-clock --external-timesource -q # replace based on choice of functional split

--external-clock --external-timesource means that we use the PSS and 10MHz to synchronized the RRUs.

When RRUs are up waiting for a connection from the OAI RCC, They all look like the following picture:

rru_ready

Figure 2: 2RRU up and waiting for connection from RCC

3. Installation and Configuration of OAI RCC

3.1 installation

Step 1: Check out the trunk

download the source code according to Get the Sources.

Step 2: Run automated script for OAI RRU/RCC

cd ~/openairinterface5g
source oaienv
cd cmake_targets
cmake_targets/build_oai -w None -t ETHERNET -x -c --eNB

note:there is also lots of command line instrument of ./build_oai, for example:

  • -I:install required packages.
  • --eNB:complies for eNB application
  • -w:adds the hardware support, which s USRP B210 in our case.
  • -t:adds fronthaul transport protocol, for now ETHERNET is supported and used in our case.
  • -x:add a software oscilloscope feature to the produced binaries
  • for more information, you can use ./build_oai -h to check.

3.2 Configuration and execution

Step 1: Edit the RRU configuration file

the file is ~/openairinterface5g/targets/PROJECTS/GENERIC-LTE-EPC/CONF/**rcc_file**

the file is edited appropriately with respect to Figure 2.

  • RCC configuration file
Active_eNBs = ( "eNB-Eurecom-LTEBox");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";

eNBs =
(
 {
    # real_time choice in {hard, rt-preempt, no}
    real_time       =  "no";

    ////////// Identification parameters:
    eNB_ID    =  0xe00;

    cell_type =  "CELL_MACRO_ENB";

    eNB_name  =  "eNB-Eurecom-LTEBox";

    // Tracking area code, 0x0000 and 0xfffe are reserved values
    tracking_area_code  =  "1";

    mobile_country_code =  "208";

    mobile_network_code =  "93";

    tr_s_preference     = "local_mac"

    ////////// Physical parameters:

    component_carriers = (
      {
      node_function             = "NGFI_RCC_IF4p5";
      node_timing               = "synch_to_ext_device";
      node_synch_ref            = 0;
      frame_type					      = "FDD";
      tdd_config 					      = 3;
      tdd_config_s            			      = 0;
      prefix_type             			      = "NORMAL";
      eutra_band              			      = 7;
      downlink_frequency      			      = 2685000000L;
      uplink_frequency_offset 			      = -120000000;
      Nid_cell					      = 0;
      N_RB_DL                 			      = 50;
      Nid_cell_mbsfn          			      = 0;
      nb_antenna_ports                                = 1;
      nb_antennas_tx          			      = 1;
      nb_antennas_rx          			      = 1;
      tx_gain                                            = 90;
      rx_gain                                            = 125;
      pbch_repetition                                 = "FALSE";
      prach_root              			      = 0;
      prach_config_index      			      = 0;
      prach_high_speed        			      = "DISABLE";
      prach_zero_correlation  			      = 1;
      prach_freq_offset       			      = 2;
      pucch_delta_shift       			      = 1;
      pucch_nRB_CQI           			      = 0;
      pucch_nCS_AN            			      = 0;
      pucch_n1_AN             			      = 32;
      pdsch_referenceSignalPower 			      = -27;
      pdsch_p_b                  			      = 0;
      pusch_n_SB                 			      = 1;
      pusch_enable64QAM          			      = "DISABLE";
      pusch_hoppingMode                                  = "interSubFrame";
      pusch_hoppingOffset                                = 0;
      pusch_groupHoppingEnabled  			      = "ENABLE";
      pusch_groupAssignment      			      = 0;
      pusch_sequenceHoppingEnabled		   	      = "DISABLE";
      pusch_nDMRS1                                       = 1;
      phich_duration                                     = "NORMAL";
      phich_resource                                     = "ONESIXTH";
      srs_enable                                         = "DISABLE";
      /*  srs_BandwidthConfig                                =;
      srs_SubframeConfig                                 =;
      srs_ackNackST                                      =;
      srs_MaxUpPts                                       =;*/

      pusch_p0_Nominal                                   = -96;
      pusch_alpha                                        = "AL1";
      pucch_p0_Nominal                                   = -104;
      msg3_delta_Preamble                                = 6;
      pucch_deltaF_Format1                               = "deltaF2";
      pucch_deltaF_Format1b                              = "deltaF3";
      pucch_deltaF_Format2                               = "deltaF0";
      pucch_deltaF_Format2a                              = "deltaF0";
      pucch_deltaF_Format2b		    	      = "deltaF0";

      rach_numberOfRA_Preambles                          = 64;
      rach_preamblesGroupAConfig                         = "DISABLE";
      /*
      rach_sizeOfRA_PreamblesGroupA                      = ;
      rach_messageSizeGroupA                             = ;
      rach_messagePowerOffsetGroupB                      = ;
      */
      rach_powerRampingStep                              = 4;
      rach_preambleInitialReceivedTargetPower            = -108;
      rach_preambleTransMax                              = 10;
      rach_raResponseWindowSize                          = 10;
      rach_macContentionResolutionTimer                  = 48;
      rach_maxHARQ_Msg3Tx                                = 4;

      pcch_default_PagingCycle                           = 128;
      pcch_nB                                            = "oneT";
      bcch_modificationPeriodCoeff			      = 2;
      ue_TimersAndConstants_t300			      = 1000;
      ue_TimersAndConstants_t301			      = 1000;
      ue_TimersAndConstants_t310			      = 1000;
      ue_TimersAndConstants_t311			      = 10000;
      ue_TimersAndConstants_n310			      = 20;
      ue_TimersAndConstants_n311			      = 1;
      ue_TransmissionMode                                    = 1;
      }
    );


    srb1_parameters :
    {
        # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
        timer_poll_retransmit    = 80;

        # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
        timer_reordering         = 35;

        # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
        timer_status_prohibit    = 0;

        # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
        poll_pdu                 =  4;

        # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
        poll_byte                =  99999;

        # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
        max_retx_threshold       =  4;
    }

    # ------- SCTP definitions
    SCTP :
    {
        # Number of streams to use in input/output
        SCTP_INSTREAMS  = 2;
        SCTP_OUTSTREAMS = 2;
    };


    ////////// MME parameters:
    mme_ip_address      = ( { ipv4       = "192.168.12.26";
                              ipv6       = "192:168:30::17";
                              active     = "yes";
                              preference = "ipv4";
                            }
                          );

    NETWORK_INTERFACES :
    {

        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.19/24";
        ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
        ENB_IPV4_ADDRESS_FOR_S1U                 = "127.0.0.5/24";
        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
    };
  }
);

MACRLCs = (
	{
	num_cc = 1;
	tr_s_preference = "local_L1";
	tr_n_preference = "local_RRC";
        }  
);

L1s = (
    	{
	num_cc = 1;
	tr_n_preference = "local_mac";
        }  
);

RUs = (
    {
        local_if_name  = "eth6";
        remote_address = "10.10.10.111";
        local_address  = "10.10.10.153";
        local_portc    = 50002;
        remote_portc   = 50002;
        local_portd    = 50003;
        remote_portd   = 50003;
        local_rf       = "no"
        tr_preference  = "udp_if4p5"
        nb_tx          = 1
        nb_rx          = 1
        att_tx         = 0
        att_rx         = 0;
        eNB_instances  = [0];
        is_slave       = "no"
    },

    {		  
      	local_if_name  = "eth1";			  
      	remote_address = "10.10.20.112";
    	local_address  = "10.10.20.154";
    	local_portc    = 50000;
    	remote_portc   = 50000;
    	local_portd    = 50001;
    	remote_portd   = 50001;
	local_rf       = "no"
    	tr_preference  = "udp_if4p5"
	nb_tx          = 1
	nb_rx          = 1
	att_tx         = 0
	att_rx         = 0;
	eNB_instances  = [0];
	is_slave       = "no"
    }
);  

log_config = {
      global_log_level                      ="info";
      global_log_verbosity                  ="medium";
      hw_log_level                          ="info";
      hw_log_verbosity                      ="medium";
      phy_log_level                         ="info";
      phy_log_verbosity                     ="medium";
      mac_log_level                         ="info";
      mac_log_verbosity                     ="high";
      rlc_log_level                         ="info";
      rlc_log_verbosity                     ="medium";
      pdcp_log_level                        ="info";
      pdcp_log_verbosity                    ="medium";
      rrc_log_level                         ="info";
      rrc_log_verbosity                     ="medium";
};
  1. Compile & Run the RRUs
cd ~/openairinterface5g
source oaienv
cmake_targets/build_oai -w None -t ETHERNET -x -c --eNB
cd cmake_targets/lte_build_oai/build
sudo -E ./lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/**rcc_file**  -V
  • -V is very useful for debugging purpose, it enables VCD and generate a log file (/tmp/openair_dump_eNB.vcd) with lots of details.
  • -d enable software oscilloscope with interactive graphic interfaces
  • you should alse know that both -V and -d will consume lots of computing resources, it is recommand for debugging, not normal use.

you can see the -V result by the commandgtkwave /tmp/openair_dump_eNB.vcd -a targets/RT/USER/rcc_if4.gtkw , the result is shown below:

gtkwave_debug_pic

When RCC is successfully connected, you can see the result looks like followings:

  • RCC:

success_run_rcc_end

  • RRUs

success_run_rru_end