Ericsson RAN Integration with SD-Core

Ericsson RAN Integration with SD-Core

This blueprint presents how to integrate the Ericsson gNB with the Aether SD-Core. The blueprint assumes that you have already deployed the Aether SD-Core successfully using the official Aether SD-Core Quick Start guide and therefore familiar with the setup. The blueprint also includes how to program a Quectel UE to connect to the network.

Hardware Requirements

  1. Ericsson AIR 6419 RRH(s)

  2. Quectel RG530N or RM5xxQ-GL UE

  3. A SIM reader/writer

  4. Programmable SIM cards preferably from OpenCells.

Next, it is important to modify the vars/main.yml file in the aether-onramp directory in order to match configuration in the Ericsson gNB. This blueprint assumes you start with a variant of vars/main.yml customized for running physical 5G radios.

The following command copies main-gNB.yml to main.yml in the vars directory:

$ cd vars $ cp main-gNB.yml main.yml

Modifying SD-Core Configuration Parameters

  1. Now modify the main.yml file as follows:

    1. Under the core section, change the data_iface from ens18 to the interface of the SD-Core server that connects to the Ericsson gNB. For instance, in data_iface: eno12399, we assume eno12399 is the interface on the SD-Core server that connects to the Ericsson gNB.

    2. The values_file should be updated to the sd-core-5g-values.yaml file. For the purpose of this blueprint, we will set the values_file as follows:

      values_file: "deps/5gc/roles/core/templates/sd-core-5g-values.yaml"

    3. Update the ran_subnet to reflect the subnet of the Ericsson gNB. For instance if the IP addresses of the gNB host connecting to the SD-Core is 10.189.59.10, we can set the ran_subnet as follows:

      ran_subnet: 10.189.59.0/27.

    4. (Optional) Depending on your network configuration, you may also change the UPF subnet which is identified by ip_prefix. However this is not mandatory. For this blueprint, we change the UPF access subnet as ip_prefix: "10.189.16.0/24". The access and core IPs should also change accordingly.

    5. Now change the AMF IP to the IP of the interface on the SD-Core server that connects to the Ericsson gNB. This is done under the amf subsection under the core section as ip: 10.189.8.10. Where 10.189.8.10 is the IP of the eno12399 interface on the SD-Core server.

After the above modifications the core section of vars/main.yml, should look like the following:

core: standalone: true # set to false to place under control of ROC data_iface: eno12399 values_file: "deps/5gc/roles/core/templates/sd-core-5g-values.yaml" ran_subnet: "10.189.59.0/27" # set to empty string to get subnet from 'data_iface' helm: local_charts: false # set chart_ref to local path name if true chart_ref: aether/sd-core chart_version: 1.1.0 upf: ip_prefix: "10.189.16.0/24" iface: "access" mode: af_packet # Options: af_packet or dpdk default_upf: ip: access: "10.189.16.3/24" core: "10.189.20.3/24" ue_ip_pool: "172.250.0.0/16" amf: ip: "10.189.8.10"
  1. Given we are using the sdcore-5g-values.yaml values file for this blueprint, we need to modify the deps/5gc/roles/core/templates/sdcore-5g-values.yaml as follows:

    1. In the subscribers section, modify the ueId-start and ueId-end values, opc and key to reflect that of the UEs to be used with the Ericsson gNB. In the device-groups section, the imsis should also be updated to reflect all the UEs to be connected to the network.

    2. The plmnId also need to match the PLMN ID set in the Ericsson gNB. In this blueprint, we use 24080.

    3. Depending on the IP address pool needed for the UEs, we modify the ue-ip-pool accordingly. For instance, to dynamically assign IPs to UEs from 10.189.55.0/24 subnet, set the following: ue-ip-pool: "10.189.55.0/24"

    4. Update the network-slices section with sd and sst values matching that of the gNB. Also, the gNodeBs subsection should also be updated with matching name, tac, mcc and mnc.

After modification, the omec-sub-provision section of the sdcore-5g-values.yaml file should like the following:

# Override values for omec-sub-provision (subscriber) Helm Chart # https://github.com/omec-project/sdcore-helm-charts/blob/main/omec-sub-provision/values.yaml # ***Note: Most of these values can (and should) be set via ROC API*** omec-sub-provision: enable: true images: repository: "" # defaults to Docker Hub #tags: # simapp: #add simapp override image config: simapp: cfgFiles: simapp.yaml: configuration: provision-network-slice: {{ core.standalone | string }} # if enabled, Device Groups & Slices configure by simapp sub-provision-endpt: addr: webui.omec.svc.cluster.local # subscriber configuation endpoint. # sub-proxy-endpt: # used if subscriber proxy is enabled in the ROC. # addr: subscriber-proxy.aether-roc.svc.cluster.local # port: 5000 # Configure Subscriber IMSIs and their security details. # You can have any number of subscriber ranges # This block is always necessary to establish range(s) of valid IMSIs subscribers: - ueId-start: "240800100007487" ueId-end: "240800100007500" plmnId: "24080" opc: "981d464c7c52eb6e5036234984ad0bcf" op: "" key: "5122250214c33e723a5dd523fc145fc0" sequenceNumber: "16f3b3f70fc2" - ueId-start: "240800100007501" ueId-end: "240800100007586" plmnId: "24080" opc: "981d464c7c52eb6e5036234984ad0bcf" op: "" key: "5122250214c33e723a5dd523fc145fc0" sequenceNumber: "16f3b3f70fc2" # Configure Device Groups (ignored if provision-network-slice is disabled) device-groups: - name: "5g-gnbsim-user-group1" imsis: - "240800100007501" - "240800100007502" - "240800100007503" - "240800100007504" ip-domain-name: "pool1" ip-domain-expanded: dnn: internet dns-primary: "8.8.8.8" # Value is sent to UE mtu: 1460 # Value is sent to UE when PDU Session Established ue-ip-pool: "10.189.55.0/24" # IP address pool for subscribers ue-dnn-qos: dnn-mbr-downlink: 1000 # UE level downlink QoS (Maximum bit rate per UE) dnn-mbr-uplink: 1000 # UE level uplink QoS (Maximum bit rate per UE) bitrate-unit: Mbps # Unit for above QoS rates traffic-class: # Default bearer QCI/ARP (not used in 5G) name: "platinum" qci: 9 arp: 6 pdb: 300 pelr: 6 site-info: "enterprise" # UPF allocates IP address if there is only 1 device-group # SMF allocates IP address if there is >1 device-group # Configure Network Slices (ignored if provision-network-slice is disabled) network-slices: - name: "default" # can be any unique slice name slice-id: # must match with slice configured in gNB, UE sd: "000001" sst: 1 site-device-group: - "5g-gnbsim-user-group1" # All UEs in this device-group are assigned to this slice # Applicaiton filters control what each user can access. # Default, allow access to all applications application-filtering-rules: - rule-name: "ALLOW-ALL" priority: 250 action: "permit" endpoint: "0.0.0.0/0" site-info: # Provide gNBs and UPF details and also PLMN for the site gNodeBs: - name: "RESEARCH_PARK_BUILDING_MB" tac: 4694 plmn: mcc: "240" mnc: "80" site-name: "enterprise" upf: upf-name: "upf" # associated UPF for this slice. One UPF per Slice. upf-port: 8805

In this blueprint, we use different subnets for the UPF access and core networks. Therefore, we will have to update the access.ip, access.gateway, core.ip and core.gateway sections of the omec-user-plane in the sdcore-5g-values.yaml file as seen the next section.

omec-user-plane: enable: true nodeSelectors: enabled: true resources: enabled: false images: repository: "" # defaults to Docker Hub # following two lines pull busybox from Docker Hub instead of Aether Registry tags: tools: omecproject/busybox:stable # uncomment following section to add update bess image tag #tags: # bess: <bess image tag> # pfcpiface: <pfcp image tag> config: upf: name: "oaisim" sriov: enabled: false # SRIOV is disabled by default hugepage: enabled: false # Should be enabled if DPDK is enabled routes: - to: {{ ansible_default_ipv4.address }} via: 169.254.1.1 enb: subnet: {{ ran_subnet }} # Subnet for the gNB network access: ipam: static cniPlugin: macvlan # Can be any other plugin. Dictates how IP address are assigned iface: {{ core.data_iface }} gateway: 10.189.16.1 ip: 10.189.16.3/24 core: ipam: static cniPlugin: macvlan # Can be any other plugin. Dictates how IP address are assigned iface: {{ core.data_iface }} gateway: 10.189.20.1 ip: 10.189.20.3/24 cfgFiles: upf.jsonc: mode: af_packet # This mode implies no DPDK hwcksum: true log_level: "trace" measure_upf: true measure_flow: true gtppsc: true # Extension header enabled in 5G. #core: # ifname: core # ip_masquerade: 10.189.8.10 cpiface: dnn: "internet" # Must match Slice dnn hostname: "upf" #http_port: "8080" enable_ue_ip_alloc: false # If true, UPF allocates address from following pool ue_ip_pool: "10.189.55.0/24" # IP pool used UEs if enable_ue_ip_alloc=true slice_rate_limit_config: # Slice-level rate limiting (also controlled by ROC) # Uplink n6_bps: 10000000000 # 10Gbps n6_burst_bytes: 12500000 # 10ms * 10Gbps # Downlink n3_bps: 10000000000 # 10Gbps n3_burst_bytes: 12500000 # 10ms * 10Gbps
  1. Given we are using a different subnet for UPF access networks, we need to modify the 20-aether-access.network as follows:

[Match] Name=access [Network] IPForward=yes Address=10.189.16.1/24
  1. Similarly, we need to modify the 20-aether-core.network. The Destination network represents the network dedicated for the UEs. After modification, the content of the file should look like the following:

[Match] Name=core [Network] IPForward=yes Address=10.189.20.1/24 [Route] Gateway=10.189.20.3 Destination=10.189.55.0/24
  1. Finally, we modify the aether-ue-nat.service file to reflect the updated UE address pool or subnet as follows:

[Service] Type=oneshot ExecStart=/bin/bash -c "sudo iptables -t nat -C POSTROUTING -s 10.189.55.0/24 -o {{ core.data_iface }} -j MASQUERADE || sudo iptables -t nat -A POSTROUTING -s 10.189.55.0/24 -o {{ core.data_iface }} -j MASQUERADE" [Install] WantedBy=sys-subsystem-net-devices-core.device

Restarting Aether SD-Core

After making the configuration changes, we need to restart the core by running the following commands:

make aether-5gc-uninstall make aether-5gc-install

Preparing Quectel UEs

For the purpose of this blueprint, we use the Quectel RG530N UE to connect to the Ericsson gNB. Given a SIM card is needed to make the UE work, we will highlight the steps in programming the SIM card using the SIM card reader/writer from OpenCell highlighted in the beginning of the this blueprint.

  1. To begin the UICC/SIM programming using OpenCells, you need to download the source code of the UICC software here.

  2. Untar the downloaded zip file by running the following command:

tar -xvzf uicc-v3.3.tgz
  1. Change directory to uicc-v3.3 and build by doing the following:

cd uicc-v3.3 make

After building the software, we are ready to start programming the SIM.

  1. Insert the SIM card into the SIM card reader/writer and plug the SIM card reader/writer into the USB port of your computer.

  2. To program the SIM card, you will need to set the plmnId(constructed from a valid MCC/MNC pair), the imsi, adm, spnand two secret keys for each SIM card. For this blueprint, we will use the following values:

  • IMSI:240800100007501

  • OPc: 981d464c7c52eb6e5036234984ad0bcf

  • Key: 5122250214c33e723a5dd523fc145fc0

  • spn: Ericsson5g

  • adm: 12345678

The adm is the 8-digit master password written on the SIM card. Each SIM card has a unique adm value. The spn is the service provider name – the name that the UE will show as ‘network’ (default “open cells”). More UICC flags can be found by running the command below:

sudo ./program_uicc --help
  1. Now the SIM is programmed by running the command below:

sudo ./program_uicc --adm 12345678 --imsi 240800100007501 --key 5122250214c33e723a5dd523fc145fc0 --opc 981d464c7c52eb6e5036234984ad0bcf -spn "Ericsson5g" --authenticate
  1. After inserting the SIM card into the device and powering it up, run the Quectel Connection Manager to attach the UE to the network.