# 3rd task. 03.08.2022. SA: OAI DU & CU ###### tags: `Internship 2nd level` **Resources:** - [Tony’s note](https://hackmd.io/eK8xc3X8RI-j9WhFSXpHPQ?view) - [openairinterface5G](https://gitlab.eurecom.fr/oai/openairinterface5g.git) ![](https://imgur.com/q1TsQy3.png) # 1st stage. Git clone repository from OAI and build up the binary first, with using UE simulator for testing. ![](https://imgur.com/hJbU81b.png) ## Build up UE simulator and gNB ![](https://imgur.com/hjrU5EU.png) It is not neccessary to create a new folder if ./build_oai -I failed You need to use sudo prefix with ./build_oai -I and launch it again. # gNB configuration in CU/DU split mode For the configuration of the gNB in CU and DU blocks, we have the configuration files are provided for the CU and the DU entities respectively. The CU configuration file, local_s_address corresponds to the CU address and remote_s_address corresponds to the DU address: openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf ![](https://imgur.com/1xzcX2g.png) For DU configuration file, we use the same approach: openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf ![](https://imgur.com/Z7E3rCK.png) ... ``` :::spoiler Detail of `openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf` ```shell= Active_gNBs = ( "gNB-Eurecom-CU"); # Asn1_verbosity, choice in: none, info, annoying Asn1_verbosity = "none"; Num_Threads_PUSCH = 8; gNBs = ( { ////////// Identification parameters: gNB_CU_ID = 0xe00; # cell_type = "CELL_MACRO_GNB"; gNB_name = "gNB-Eurecom-CU"; // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; sd = 0x010203; // 0 false, else true }, { sst = 1; sd = 0x112233; // 0 false, else true } ); }); nr_cellid = 12345678L; tr_s_preference = "f1"; local_s_if_name = "lo"; local_s_address = "127.0.0.4"; remote_s_address = "127.0.0.3"; local_s_portc = 501; local_s_portd = 2152; remote_s_portc = 500; remote_s_portd = 2152; ssb_SubcarrierOffset = 0; pdsch_AntennaPorts = 1; pusch_AntennaPorts = 1; min_rxtxtime = 6; sib1_tda = 0; 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; dl_frequencyBand = 78; # this is 3600 MHz dl_absoluteFrequencyPointA = 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 = 11; initialDLBWPsearchSpaceZero = 0; #uplinkConfigCommon #frequencyInfoUL ul_frequencyBand = 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.69.131"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); NETWORK_INTERFACES : { GNB_INTERFACE_NAME_FOR_NG_AMF = "eth0"; GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.18.207"; GNB_INTERFACE_NAME_FOR_NGU = "eth0"; GNB_IPV4_ADDRESS_FOR_NGU = "192.168.18.207"; GNB_PORT_FOR_S1U = 2152; # Spec 2152 }; } ); 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 ="debug"; pdcp_log_level ="info"; rrc_log_level ="info"; f1ap_log_level ="debug"; ngap_log_level ="debug"; }; ``` ::: :::spoiler Detail of `openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf` ```shell= Active_gNBs = ( "gNB-Eurecom-DU"); # Asn1_verbosity, choice in: none, info, annoying Asn1_verbosity = "none"; gNBs = ( { ////////// Identification parameters: gNB_CU_ID = 0xe00; # cell_type = "CELL_MACRO_GNB"; gNB_name = "gNB-Eurecom-DU"; // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; sd = 0x010203; // 0 false, else true }, { sst = 1; sd = 0x112233; // 0 false, else true } ); }); nr_cellid = 12345678L; ////////// Physical parameters: ssb_SubcarrierOffset = 0; min_rxtxtime = 6; sib1_tda = 0; 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; dl_frequencyBand = 78; # this is 3600 MHz dl_absoluteFrequencyPointA = 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 = 11; initialDLBWPsearchSpaceZero = 0; #uplinkConfigCommon #frequencyInfoUL ul_frequencyBand = 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; }; } ); MACRLCs = ( { num_cc = 1; tr_s_preference = "local_L1"; tr_n_preference = "f1"; local_n_if_name = "lo"; local_n_address = "127.0.0.3"; remote_n_address = "127.0.0.4"; local_n_portc = 500; local_n_portd = 2152; remote_n_portc = 501; remote_n_portd = 2152; } ); L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; thread_pool_size = 8; prach_dtx_threshold = 120; pucch0_dtx_threshold = 150; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); RUs = ( { local_rf = "yes" nb_tx = 1 nb_rx = 1 att_tx = 0 att_rx = 0; bands = [78]; max_pdschReferenceSignalPower = -27; max_rxgain = 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" } 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"; f1ap_log_level ="debug"; ngap_log_level ="debug"; }; ``` ::: ## 2nd stage. Run. Launching the UE simulator and gNB in CU/DU split mode: cd <OAI File Path>/openairinterface5g/cmake_targets/ran_build/build/ Launch the CU component: sudo RFSIMULATOR=server ./nr-softmodem --rfsim --sa -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf Launch the DU component: sudo RFSIMULATOR=server ./nr-softmodem --rfsim --sa -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf Launch the UE simulator: sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa --nokrnmod -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.conf # DU Initialization Start F1 interface ![](https://imgur.com/syPX772.jpg) Config the IP of the CU and the DU over the F1 interface ![](https://imgur.com/RihKkBV.jpg) Start cell basic config and RU initialization ![](https://imgur.com/zSLJ72R.jpg) # DU Cell Configuration Set TDD mode as default setting ![](https://imgur.com/qxLcyoX.jpg) Config basic cell info for later F1 Setup Request, including MCC and MNC ![](https://imgur.com/rHeKab6.jpg) # F1AP Setup Request SCTP CU will receive the F1 Setup Request after DU sends the message through ![](https://imgur.com/1Q7ntPn.jpg) ![](https://imgur.com/cv18S2B.jpg) DU target the goal by SCTP, the SCTP info will be shown in log ![](https://imgur.com/Db8aW3c.jpg) ![](https://imgur.com/awiAojf.jpg) # F1AP Setup Response The CU will respond the F1 Setup Response to DU after the F1 Setup Request is successful ![](https://imgur.com/2wRLPK5.jpg) ![](https://imgur.com/9d12TUX.jpg) # gNB-CU Configuration Update CU will continue gNB-CU Configuration Update to update the cell config in DU ![](https://imgur.com/Bg5g0g4.jpg) ![](https://imgur.com/Qum4bTy.jpg) # Initial UL RRC Message Transfer After UE attached, DU send Initial UL RRC Message Transfer to CU ![](https://imgur.com/rIz3QYn.jpg) ![](https://imgur.com/0r0Lipu.jpg) # DL RRC Message Transfer CU will reply the DL RRC Message Transfer to DU for RRC SETUP ![](https://imgur.com/90W0kOk.jpg) ![](https://imgur.com/NFnftb2.jpg) # Data Transfer After all of that, UE could transfer data through gNB ![](https://imgur.com/OYoJI1L.jpg) ![](https://imgur.com/2V0DEvK.jpg)