gNBSim Usage

Description

The gNBSim tool simulates gNodeB and UE by generating and processing NAS and NGAP messages for the configured UEs and call flows. The tool currently supports simulation profiles for the following procedures,

  • Registration

  • UE Initiated PDU Session Establishment

  • UE Initiated De-registration.

  • AN Release

  • Ue Initiated Service Request Procedure

  • NW triggered de-registration

  • UE Requested PDU Session Release

  • NW triggered PDU Session Release

It is also capable to generate and send user data packets (ICMP echo request) and process down-link user data (ICMP echo response) over the established data plane path (N3 Tunnel).

gNBSim Code References

Configure gNBSim

  • The sample config file for gNBSim can be found here

    Note: The configuration has following major fields (Read the comments in the config file for more details)

    • gnbs:

      List of gNB’s to be simulated. Each item in the list holds configuration specific to a gNB.

    • profiles:

      List of test/simulation profiles. Each item in the list holds configuration specific to a profile.

    • customProfiles:

      List of custom profiles. Each item in the list holds configuration specific to a customProfile.

  • Enable or disable a specific profile using the enable field within profile block.

    Note: Currently following profiles are supported

Run gNBSim

  • To quickly launch and test AiaB with 5G SD-CORE using gNBSim:

    $ make 5g-test
    

    (refer AiaB documentation Aether In a Box - 5G)

  • Alternatively, you can do following

    running:

    $ make 5g-core
    
  • Once all PODs are up then you can enter into the gNBSim pod by running

    $ kubectl exec -it gnbsim-0 -n omec bash
    
  • Then run following command to launch gNBSim profiles:

    $ ./gnbsim
    

    Note: By default, the gNB Sim reads the configuration from /gnbsim/config/gnb.conf file. To provide a different configuration file, use the below command

    $ ./gnbsim --cfg <config file path>
    

Build gNBSim

  • If you find a need to change gNBSim code and use the updated image in the AIAB setup then follow below steps.

  • To modify gNBSim and build a new docker image:

    $ git clone https://github.com/omec-project/gnbsim.git
    $ cd gnbsim
    $ make docker-build  #requires golang installed on the machine
    
  • To use newly created image in the AiaB cluster:

Update ~/aether-in-box/sd-core-5g-values.yaml to point to the newly built image, then run:

$ cd ~/aether-in-a-box/
$ make reset-5g-test
$ make 5g-test

(refer AiaB documentation Aether In a Box - 5G)

gNBSim System level features

  • Logging summary result

  • HTTP API to create new profile. Below configuration enables http server in gNBSim. Example to use gNBSim can be found script

    config:
      gnbsim:
        httpServer:
          enable: true #enable httpServer in gnbsim
          port: 6000
    
  • Gnbsim can generate and send user data packets (ICMP echo request) and process downlink user data (ICMP echo response) over the established data plane path (N3 Tunnel). Configure number of data packets to be sent. Configure AS (Application Server) address. This is used to send data packets.

    - profileType: nwtriggeruedereg # profile type
      profileName: profile6 # uniqely identifies a profile within application
      enable: false # Set true to execute the profile, false otherwise.
      gnbName: gnb1 # gNB to be used for this profile
      startImsi: 208930100007497 # First IMSI. Subsequent values will be used if ueCount is more than 1
      ueCount: 1 # Number of UEs for for which the profile will be executed
      defaultAs: "192.168.250.1" #default icmp pkt destination
      perUserTimeout: 10 #if no expected event received in this time then treat it as failure
    
  • Executing all enabled profiles in parallel or in sequential order.

    config:
      gnbsim:
        yamlCfgFiles:
          gnb.conf:
            configuration:
                execInParallel: false #run all profiles in parallel
    

Note

There is execInParallel option under each profile as well. execInParallel under profile means that all the subscribers in the profile are run in parallel

  • Timeout for each call flow within profile

    - profileType: nwtriggeruedereg # profile type
      profileName: profile6 # uniqely identifies a profile within application
      perUserTimeout: 10 #if no expected event received in this time then treat it as failure
    
  • Getting gNBSim golang profile

    config:
      gnbsim:
        goProfile:
          enable: true #enable/disable golang profile in gnbsim
          port: 5000
    
  • Run gNBSim with single Interface or multi interface

    config:
      gnbsim:
        yamlCfgFiles:
          gnb.conf:
            configuration:
                singleInterface: false #default false i.e. multiInterface. Works well for AIAB
    
  • Support of Custom Profiles: User can now define your own profile. New profile can be created by using existing baseline procedure. Example of custom profile can be found here. Check customProfiles in gNBSim config <https://github.com/omec-project/gnbsim/blob/main/config/gnbsim.yaml>_

    customProfiles:
      customProfiles1:
        profileType: custom # profile type
        profileName: custom1 # uniqely identifies a profile within application
        enable: false # Set true to execute the profile, false otherwise.
        execInParallel: false #run all subscribers in parallel
        stepTrigger: true #wait for trigger to move to next step
        gnbName: gnb1 # gNB to be used for this profile
        startImsi: 208930100007487
        ueCount: 5
        defaultAs: "192.168.250.1" #default icmp pkt destination
        opc: "981d464c7c52eb6e5036234984ad0bcf"
        key: "5122250214c33e723a5dd523fc145fc0"
        sequenceNumber: "16f3b3f70fc2"
        plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
          mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
          mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
        startiteration: iteration1
        iterations:
          #at max 7 actions
          - "name": "iteration1"
            "1": "REGISTRATION-PROCEDURE 5"
            "2": "PDU-SESSION-ESTABLISHMENT-PROCEDURE 5"  #5 second delay after this procedure
            "3": "USER-DATA-PACKET-GENERATION-PROCEDURE 10"
            "next":  "iteration2"
          - "name": "iteration2"
            "1": "AN-RELEASE-PROCEDURE 100"
            "2": "UE-TRIGGERED-SERVICE-REQUEST-PROCEDURE 10"
            "repeat": 5
            "next":  "iteration3"
          - "name": "iteration3"
            "1": "UE-INITIATED-DEREGISTRATION-PROCEDURE 10"
            #"repeat": 0 #default value 0 . i.e execute once
            #"next":  "quit" #default value quit. i.e. no further iteration to run
    
  • Support of Multiple gNBs: Two gnbs are configured by default. So User can create profiles by using these gnbs. Configuration of two gNBs can be found here

    gnb:
      ips:
      - '"192.168.251.5/24"' #gnb1 IP
      - '"192.168.251.6/32"' #gnb2 IP
    configuration:
      runConfigProfilesAtStart: true
      singleInterface: #this will be added thorugh configmap script
      execInParallel: false #run all profiles in parallel
      gnbs: # pool of gNodeBs
        gnb1:
          n2IpAddr: # gNB N2 interface IP address used to connect to AMF
          n2Port: 9487 # gNB N2 Port used to connect to AMF
          n3IpAddr: 192.168.251.5 # gNB N3 interface IP address used to connect to UPF
          n3Port: 2152 # gNB N3 Port used to connect to UPF
          name: gnb1 # gNB name that uniquely identify a gNB within application
          globalRanId:
            plmnId:
              mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
              mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
            gNbId:
              bitLength: 24
              gNBValue: "000102" # gNB identifier (3 bytes hex string, range: 000000~FFFFFF)
          supportedTaList:
          - tac: "000001" # Tracking Area Code (3 bytes hex string, range: 000000~FFFFFF)
            broadcastPlmnList:
              - plmnId:
                  mcc: 208
                  mnc: 93
                taiSliceSupportList:
                    - sst: 1 # Slice/Service Type (uinteger, range: 0~255)
                      sd: "010203" # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)
          defaultAmf:
            hostName: amf # Host name of AMF
            ipAddr: # AMF IP address
            port: 38412 # AMF port
        gnb2:
          n2IpAddr: # gNB N2 interface IP address used to connect to AMF
          n2Port: 9488 # gNB N2 Port used to connect to AMF
          n3IpAddr: 192.168.251.6 # gNB N3 interface IP address used to connect to UPF
          n3Port: 2152 # gNB N3 Port used to connect to UPF
          name: gnb2 # gNB name that uniquely identify a gNB within application
          globalRanId:
            plmnId:
              mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
              mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
            gNbId:
              bitLength: 24
              gNBValue: "000112" # gNB identifier (3 bytes hex string, range: 000000~FFFFFF)
          supportedTaList:
          - tac: "000001" # Tracking Area Code (3 bytes hex string, range: 000000~FFFFFF)
            broadcastPlmnList:
              - plmnId:
                  mcc: 208
                  mnc: 93
                taiSliceSupportList:
                    - sst: 1 # Slice/Service Type (uinteger, range: 0~255)
                      sd: "010203" # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)
          defaultAmf:
            hostName: amf # Host name of AMF
            ipAddr: # AMF IP address
            port: 38412 # AMF port
    
  • Delay between Procedures can be added using customProfiles.