Deploy an LTE Environment using OAI 5GCN and USRP B200 mini - caprivm/virtualization GitHub Wiki

caprivm ([email protected]), jhonny9211 ([email protected])

Updated: January 31, 2023

Description

This page explains all the steps required to connect a 5G NR RAN using the USRP B200 (mini) to a 5G Stand-Alone Core Network (5G SA CN) based on OpenAirInterface (OAI). This scenario was tested in an infrastructure with the following characteristics.

The contents of the page are:

RAN Minimum Requirements

The RAN controller was tested on a single server with the next considerations:

Feature Value
OS Used Ubuntu Server 22.04 LTS
vCPU 16
RAM (GB) 16
Swap (GB) 2
Disk SSD (GB) 250
Home User ubuntu
Server Model DELL XPS 8940
Number of NICs 1 (ens160)
Kernel 5.15.0-58-lowlatency

NOTE: The server has a Serial/USB converter MA-8910P.

USRP B200 (mini) Requirements

  • The USRP used for the scenario is the Ettus Research USRP B200 mini with USB 3.0 port.
  • The Antennas connected to the USRP are VERT2450 model.
  • The UHD Version is v4.3.0.

User Equipment (UE) Requirements

  • The UE used is a Google Pixel 6a - International Model.
  • The 5G SIM Card used is a Open cells SIM card.
  • The Card Reader (Smart IO - SIO PL2303) is used for writing information into the SIM.
  • The SIM Programming use uiccsim software for writing information.

SIM Card parameters:

Parameter Value Description
adm 48535313 SIM card security code
imsi 001010000000001 PLMN (MCC + MNC) configuration + MSIN
isdn 00000001 Phone number of UE
acc 0001 Security code for the base station
key fec86ba6eb707ed08905757b1bb44b8f Secret key
opc C42449363BBAD02B66D16BC975D77CC1 Operator key
spn "OpenAirInterface" Service provider name

The scenario included two frequency bands with the following configuration.

Band 78

The configuration used for Band 78 is shown in the next table:

Feature Value
Frecuency (MHz) 3619.200
NR-ARFCN Downlink (kHz) 641280
NR-ARFCN Uplink (kHz) 640008
Bandwidth (PRB) 106
TX PWR (dBm) -27
TX Attenuation (dB) 10
RX Gain (dB) 110
RX Attenuation (dB) 10

Consider the following configuration file gNB_CONFIG_FILE='band78.106PRB.usrpb210.conf' to use this band when you start the gNB.

band78.106PRB.usrpb210.conf
Active_gNBs = ( "gNB-OAI");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";

gNBs =
(
 {
    ////////// Identification parameters:
    gNB_ID    =  0xe00;
    gNB_name  =  "gNB-OAI";

    // Tracking area code, 0x0000 and 0xfffe are reserved values
    tracking_area_code  =  1;
    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; sd = 0x1; }) });

    nr_cellid = 12345678L;

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

    do_CSIRS                                                  = 1;
    do_SRS                                                    = 1;

     pdcch_ConfigSIB1 = (
      {
        controlResourceSetZero = 12;
        searchSpaceZero = 0;
      }
      );

    servingCellConfigCommon = (
    {
 #spCellConfigCommon

      physCellId                                                    = 0;

#  downlinkConfigCommon
    #frequencyInfoDL
      # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
      absoluteFrequencySSB                                             = 641280; #471000; #641280;
      dl_frequencyBand                                                 = 78; #30; #78;
      # this is 3600 MHz
      dl_absoluteFrequencyPointA                                       = 640008; #470500; #640008;
      #scs-SpecificCarrierList
        dl_offstToCarrier                                              = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
        dl_subcarrierSpacing                                           = 1;
        dl_carrierBandwidth                                            = 106;
     #initialDownlinkBWP
      #genericParameters
        # this is RBstart=27,L=48 (275*(L-1))+RBstart
        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
        initialDLBWPsubcarrierSpacing                                   = 1;
      #pdcch-ConfigCommon
        initialDLBWPcontrolResourceSetZero                              = 12;
        initialDLBWPsearchSpaceZero                                     = 0;

  #uplinkConfigCommon
     #frequencyInfoUL
      ul_frequencyBand                                              = 78; #30; #78;
      #scs-SpecificCarrierList
      ul_offstToCarrier                                             = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
      ul_subcarrierSpacing                                          = 1;
      ul_carrierBandwidth                                           = 106;
      pMax                                                          = 20;
     #initialUplinkBWP
      #genericParameters
        initialULBWPlocationAndBandwidth                            = 28875;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
        initialULBWPsubcarrierSpacing                               = 1;
      #rach-ConfigCommon
        #rach-ConfigGeneric
          prach_ConfigurationIndex                                  = 98;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
          prach_msg1_FDM                                            = 0;
          prach_msg1_FrequencyStart                                 = 0;
          zeroCorrelationZoneConfig                                 = 13;
          preambleReceivedTargetPower                               = -96;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
          preambleTransMax                                          = 6;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
        powerRampingStep                                            = 1;
#ra_ReponseWindow
#1,2,4,8,10,20,40,80
        ra_ResponseWindow                                           = 4;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
#oneHalf (0..15) 4,8,12,16,...60,64
        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14;
#ra_ContentionResolutionTimer
#(0..7) 8,16,24,32,40,48,56,64
        ra_ContentionResolutionTimer                                = 7;
        rsrp_ThresholdSSB                                           = 19;
#prach-RootSequenceIndex_PR
#1 = 839, 2 = 139
        prach_RootSequenceIndex_PR                                  = 2;
        prach_RootSequenceIndex                                     = 1;
        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
        #
        msg1_SubcarrierSpacing                                      = 1,
# restrictedSetConfig
# 0=unrestricted, 1=restricted type A, 2=restricted type B
        restrictedSetConfig                                         = 0,

        msg3_DeltaPreamble                                          = 1;
        p0_NominalWithGrant                                         =-90;

# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
        pucchGroupHopping                                           = 0;
        hoppingId                                                   = 40;
        p0_nominal                                                  = -90;
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
      ssb_PositionsInBurst_PR                                       = 2;
      ssb_PositionsInBurst_Bitmap                                   = 1;

# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
      ssb_periodicityServingCell                                    = 2;

# dmrs_TypeA_position
# 0 = pos2, 1 = pos3
      dmrs_TypeA_Position                                           = 0;

# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
      subcarrierSpacing                                             = 1;


  #tdd-UL-DL-ConfigurationCommon
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
      referenceSubcarrierSpacing                                    = 1;
      # pattern1
      # dl_UL_TransmissionPeriodicity
      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
      dl_UL_TransmissionPeriodicity                                 = 6;
      nrofDownlinkSlots                                             = 7;
      nrofDownlinkSymbols                                           = 6;
      nrofUplinkSlots                                               = 2;
      nrofUplinkSymbols                                             = 4;

      ssPBCH_BlockPower                                             = -25;
  }

  );


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


    ////////// AMF parameters:
    amf_ip_address      = ( { ipv4       = "192.168.70.132";
                              ipv6       = "192:168:30::17";
                              active     = "yes";
                              preference = "ipv4";
                            }
                          );


    NETWORK_INTERFACES :
    {
        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.70.129/26";
        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.70.129/26";
        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
    };

  }
);

MACRLCs = (
{
  num_cc                      = 1;
  tr_s_preference             = "local_L1";
  tr_n_preference             = "local_RRC";
  pusch_TargetSNRx10          = 150;
  pucch_TargetSNRx10          = 200;
  ulsch_max_frame_inactivity  = 0;
}
);

L1s = (
{
  num_cc = 1;
  tr_n_preference       = "local_mac";
  prach_dtx_threshold   = 120;
  pucch0_dtx_threshold  = 100;
  ofdm_offset_divisor   = 8; #set this to UINT_MAX for offset 0
}
);

RUs = (
{
  local_rf       = "yes"
  nb_tx          = 1
  nb_rx          = 1
  att_tx         = 10; #12;
  att_rx         = 10; #12;
  bands          = [78];
  max_pdschReferenceSignalPower = -27;
  max_rxgain                    = 110; #114;
  eNB_instances  = [0];
  #beamforming 1x4 matrix:
  bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
  clock_src = "internal";
}
);

THREAD_STRUCT = (
{
  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
  parallel_config    = "PARALLEL_SINGLE_THREAD";
  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
  worker_config      = "WORKER_ENABLE";
}
);

rfsimulator :
{
  serveraddr = "server";
  serverport = "4043";
  options = (); #("saviq"); or/and "chanmod"
  modelname = "AWGN";
  IQfile = "/tmp/rfsimulator.iqs";
};

security = {
  # preferred ciphering algorithms
  # the first one of the list that an UE supports in chosen
  # valid values: nea0, nea1, nea2, nea3
  ciphering_algorithms = ( "nea0" );

  # preferred integrity algorithms
  # the first one of the list that an UE supports in chosen
  # valid values: nia0, nia1, nia2, nia3
  integrity_algorithms = ( "nia1", "nia0" );

  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
  drb_ciphering = "yes";
  drb_integrity = "no";
};

log_config :
{
  global_log_level                      ="info";
  hw_log_level                          ="info";
  phy_log_level                         ="info";
  mac_log_level                         ="info";
  rlc_log_level                         ="info";
  pdcp_log_level                        ="info";
  rrc_log_level                         ="info";
  ngap_log_level                        ="debug";
  f1ap_log_level                        ="debug";
};

Band 7

The configuration used for Band 7 is shown in the next table:

Feature Value
Frecuency 2635.000 MHz
NR-ARFCN Downlink 527000
NR-ARFCN Uplink 524000
Bandwidth 106 PRB
TX PWR -30
TX Attenuation 15
RX Gain 110
RX Attenuation 13

Consider the following configuration file gNB_CONFIG_FILE='band7.106PRB.usrpb210.conf' to use this band when you start the gNB.

band7.106PRB.usrpb210.conf
Active_gNBs = ( "gNB-OAI");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";

gNBs =
(
 {
    ////////// Identification parameters:
    gNB_ID    =  0xe00;
    gNB_name  =  "gNB-OAI";

    // Tracking area code, 0x0000 and 0xfffe are reserved values
    tracking_area_code  =  1;
    plmn_list = ({ mcc = 208; mnc = 93; mnc_length = 2; snssaiList = ({ sst = 1; sd = 0x1; }) });

    nr_cellid = 12345678L;

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

    do_CSIRS                                                  = 1;
    do_SRS                                                    = 1;

     pdcch_ConfigSIB1 = (
      {
        controlResourceSetZero = 12;
        searchSpaceZero = 0;
      }
      );

    servingCellConfigCommon = (
    {
 #spCellConfigCommon

      physCellId                                                    = 0;

#  downlinkConfigCommon
    #frequencyInfoDL
      # this is 2574.270 MHz + 53 PRBs@30kHz SCS (same as initial BWP)
      absoluteFrequencySSB                                             = 527000;
      dl_frequencyBand                                                 = 7;
      # this is 3600 MHz
      dl_absoluteFrequencyPointA                                       = 524000;
      #scs-SpecificCarrierList
        dl_offstToCarrier                                              = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
        dl_subcarrierSpacing                                           = 1;
        dl_carrierBandwidth                                            = 106;
     #initialDownlinkBWP
      #genericParameters
        # this is RBstart=0,L=106 (275*(L-1))+RBstart
        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
        initialDLBWPsubcarrierSpacing                                   = 1;
      #pdcch-ConfigCommon
        initialDLBWPcontrolResourceSetZero                              = 12;
        initialDLBWPsearchSpaceZero                                     = 0;

  #uplinkConfigCommon
     #frequencyInfoUL
      ul_frequencyBand                                              = 7;
      #scs-SpecificCarrierList
      ul_offstToCarrier                                             = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
      ul_subcarrierSpacing                                          = 1;
      ul_carrierBandwidth                                           = 106;
      pMax                                                          = 20;
     #initialUplinkBWP
      #genericParameters
        initialULBWPlocationAndBandwidth                            = 28875;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
        initialULBWPsubcarrierSpacing                               = 1;
      #rach-ConfigCommon
        #rach-ConfigGeneric
          prach_ConfigurationIndex                                  = 98;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
          prach_msg1_FDM                                            = 0;
          prach_msg1_FrequencyStart                                 = 0;
          zeroCorrelationZoneConfig                                 = 13;
          preambleReceivedTargetPower                               = -96;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
          preambleTransMax                                          = 6;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
        powerRampingStep                                            = 1;
#ra_ReponseWindow
#1,2,4,8,10,20,40,80
        ra_ResponseWindow                                           = 4;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
#oneHalf (0..15) 4,8,12,16,...60,64
        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14;
#ra_ContentionResolutionTimer
#(0..7) 8,16,24,32,40,48,56,64
        ra_ContentionResolutionTimer                                = 7;
        rsrp_ThresholdSSB                                           = 19;
#prach-RootSequenceIndex_PR
#1 = 839, 2 = 139
        prach_RootSequenceIndex_PR                                  = 2;
        prach_RootSequenceIndex                                     = 1;
        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
        #
        msg1_SubcarrierSpacing                                      = 1,
# restrictedSetConfig
# 0=unrestricted, 1=restricted type A, 2=restricted type B
        restrictedSetConfig                                         = 0,

        msg3_DeltaPreamble                                          = 1;
        p0_NominalWithGrant                                         =-90;

# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
        pucchGroupHopping                                           = 0;
        hoppingId                                                   = 40;
        p0_nominal                                                  = -90;
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
      ssb_PositionsInBurst_PR                                       = 2;
      ssb_PositionsInBurst_Bitmap                                   = 1;

# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
      ssb_periodicityServingCell                                    = 2;

# dmrs_TypeA_position
# 0 = pos2, 1 = pos3
      dmrs_TypeA_Position                                           = 0;

# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
      subcarrierSpacing                                             = 1;


  #tdd-UL-DL-ConfigurationCommon
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
      referenceSubcarrierSpacing                                    = 1;
      # pattern1
      # dl_UL_TransmissionPeriodicity
      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
      dl_UL_TransmissionPeriodicity                                 = 6;
      nrofDownlinkSlots                                             = 7;
      nrofDownlinkSymbols                                           = 6;
      nrofUplinkSlots                                               = 2;
      nrofUplinkSymbols                                             = 4;

      ssPBCH_BlockPower                                             = -25;
  }

  );


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


    ////////// AMF parameters:
    amf_ip_address      = ( { ipv4       = "192.168.70.132";
                              ipv6       = "192:168:30::17";
                              active     = "yes";
                              preference = "ipv4";
                            }
                          );


    NETWORK_INTERFACES :
    {
        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.70.129/26";
        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.70.129/26";
        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
    };

  }
);

MACRLCs = (
{
  num_cc                      = 1;
  tr_s_preference             = "local_L1";
  tr_n_preference             = "local_RRC";
  pusch_TargetSNRx10          = 150;
  pucch_TargetSNRx10          = 200;
  ulsch_max_frame_inactivity  = 0;
}
);

L1s = (
{
  num_cc = 1;
  tr_n_preference       = "local_mac";
  prach_dtx_threshold   = 120;
  pucch0_dtx_threshold  = 100;
  ofdm_offset_divisor   = 8; #set this to UINT_MAX for offset 0
}
);

RUs = (
{
  local_rf       = "yes"
  nb_tx          = 1
  nb_rx          = 1
  att_tx         = 15;
  att_rx         = 13;
  bands          = [7];
  max_pdschReferenceSignalPower = -30;
  max_rxgain                    = 110;
  eNB_instances  = [0];
  #beamforming 1x4 matrix:
  bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
  clock_src = "internal";
}
);

THREAD_STRUCT = (
{
  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
  parallel_config    = "PARALLEL_SINGLE_THREAD";
  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
  worker_config      = "WORKER_ENABLE";
}
);

rfsimulator :
{
  serveraddr = "server";
  serverport = "4043";
  options = (); #("saviq"); or/and "chanmod"
  modelname = "AWGN";
  IQfile = "/tmp/rfsimulator.iqs";
};

security = {
  # preferred ciphering algorithms
  # the first one of the list that an UE supports in chosen
  # valid values: nea0, nea1, nea2, nea3
  ciphering_algorithms = ( "nea0" );

  # preferred integrity algorithms
  # the first one of the list that an UE supports in chosen
  # valid values: nia0, nia1, nia2, nia3
  integrity_algorithms = ( "nia2", "nia0" );

  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
  drb_ciphering = "yes";
  drb_integrity = "no";
};

log_config :
{
  global_log_level                      ="info";
  hw_log_level                          ="info";
  phy_log_level                         ="info";
  mac_log_level                         ="info";
  rlc_log_level                         ="info";
  pdcp_log_level                        ="info";
  rrc_log_level                         ="info";
  ngap_log_level                        ="debug";
  f1ap_log_level                        ="debug";
};

Prepare the Scenario

Initially, the USRP model that is used to distinguish known issues that happens is identified. Errors can be minimized by correctly adjusting the physical conditions of the radio equipment when it is used. It should be noted that parameters such as temperature, distance between the RAN equipments, possible sources of interference, location of the antennas or type of antenna, can affect the performance of the scenario. Therefore, it is good practice to perform a careful initial calibration. If parameters are used that exceed the capabilities of the equipment, the radio frequency system of the USRP could be damaged.

The calibration consists of 3 stages:

  • Ideal hardware location: USRP location, antenna position at an angle of no less than 90 degrees and distance between Rx and Tx equipment.
  • Signal type identification: FDD or TDD, modulation type and band.
  • Adjustment of power: Based on application, for example, mobile networks, FM signal, AM signal, etc. In this case, the application is a mobile network deployment.

For this scenario, it was considered that for Mobile Networks a relatively high power is required if good throughput is to be obtained. However, the intersymbol interference caused by the proximity between the transmitter and the reception port, generates connectivity problems, connection instability, and even loss of connection.

We have identified that one way to reduce this interference is to modify the attenuation and gain parameters, without affecting the power. You should avoid modifying these parameters randomly, and proportionally lower the reception parameters.

The last thing is not to modify the power parameters of the device. These parameters are found in the USRP Tx/Rx module specifications. Although the UHD is programmed to prevent this from happening, when making changes to the UHD version of each device depending on the type of application, the power parameter can be forced to vary and cause damage.

Prerequisites

Before starting the step-by-step procedure, you should have installed the following tools. You can check the adjacent links if you haven't already:

The 5GCN parameters to connect the RAN are shown in next table.

Parameter Value
mcc 001
mnc 01
sst 1
sd 0x1
amf_ip_address 192.168.70.132
GNB_INTERFACE_NAME_FOR_NG_AMF demo-oai
GNB_IPV4_ADDRESS_FOR_NG_AMF 192.168.70.129/26
GNB_INTERFACE_NAME_FOR_NGU demo-oai
GNB_IPV4_ADDRESS_FOR_NGU 192.168.70.129/26
GNB_PORT_FOR_S1U 2152
integrity_algorithms ( "nia2", "nia0" )

NOTE: This scenario assumes that the 5G Core is installed on the same server where the RAN Controller is running.

Write the SIM Card

The SIM Card reader must be located to verify that it's correctly installed on the server:

lsusb
# Bus 001 Device 008: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port / Mobile Action MA-8910P

Considering the SIM Card parameters, they are written to the SIM using the following command. It is necessary to install the software UICC v2.6 to be able to execute the command:

sudo ./program_uicc --adm 48535313 --imsi 001010000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate

At the end of the process, an automatic test of the authentication algorithm (milenage) will be executed for testing. After this, the SIM Card is ready to be used in the UE.

Build and Install UHD from Source

You can install the USRP dependencies from its source code. This way, if you make any changes to the code, you can regenerate it here. First, clone the repository and build the binaries:

sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential
git clone https://github.com/EttusResearch/uhd.git ~/uhd; cd ~/uhd
git checkout v4.3.0.0
cd host && mkdir build && cd build

# Build the binaries
cmake ../
make -j16   # -j16 it's because the server has 16 vCPU
make test
sudo make install

Next, configure the shared folder and download the UHD image that will be used:

sudo ldconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
sudo uhd_images_downloader

NOTE: At this point it is necessary to have the USRP B200 (mini) connected to the server via USB 3.0.

Test the USRP image upload using:

uhd_find_devices
uhd_usrp_probe --args "addr=$IP_USRP"   # --args is used if USRP is not connected via USB.

NOTE: If the USRP is connected via USB, the --args flag can be removed.

Deploy the RAN (gNB)

Clone and install the gNB repository using the OpenAirInterface 5G project.

git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g; cd ~/openairinterface5g
source oaienv
cd cmake_targets
./build_oai -I

# Build all the project
./build_oai -w USRP --ninja --nrUE --gNB --build-lib all -c

Deploy the RAN using the configuration files:

cd ~/openairinterface5g/cmake_targets/ran_build/build
sudo ./nr-softmodem --sa -E --continuous-tx -O $gNB_CONFIG_FILE

Troubleshooting

Some UE level suggestions for the attach:

  • The UE must have the APN configured and it must match the one specified in the Core. By default, OAI (OpenAirInterface) define the APN (or DNN_0) as oai. In a 5G UE, by preference you should specify the "Bearer" as NR. This parameter is defined in the APN configuration itself.
  • Verify the operating bands of the UE. Depending on the model, the 5G scenario may fail if it does not support the configured bands.
  • Always try to attach by turning on/off Airplane mode. If it is done through search networks, it usually takes more time (although it still works).
  • An important parameter in the attach is the PRB (Physical Resource Blocks). Many times the UE does not see the Mobile Network if a very high or very low PRB is used.
⚠️ **GitHub.com Fallback** ⚠️