SD-RAN 1.1 Release Notes


The second release of the SD-RAN project builds on the O-RAN and 3GPP consistent end-to-end mobile RAN stack introduced in the first release. This includes the micro-ONOS based nRT-RIC, a white-box based CU/DU/RU solution with LTE support, and a completely virtualized dev/test environment RiaB (sdRan-in-a-Box).

The main highlight of this release is the collaboration between ONF, Facebook and AirHop towards a demonstration of SON functionality as an xApp. AirHop’s eSON server, a commercial product, was integrated with ONF’s nRT-RIC via an app-SDK developed by Facebook. The SON use-case showcased in this release involves Physical Cell Identifier (PCI) conflict resolution, for which a pre-standard Service Model (RC-PRE) was jointly designed and developed. As part of this work, a Python based xApp-SDK that makes it easy for xApps to integrate with the RIC was developed. It complements ONF’s Go based SDK, both of which can be used simultaneously by different xApps.

Another highlight of this release is ONF’s RAN simulator (RANSim) which is now O-RAN compliant in its use of the E2 interface and Service Models (SMs) when interacting with the RIC. In this release, RANSim was completely rearchitected to simulate dozens of E2 nodes, and simultaneously support multiple Service Models such as KPM and RC-PRE SMs. Runtime gRPC APIs were added to support CRUD operations on E2 nodes, cells and their attributes, and a supporting utility was added that generates a hexagonal grid of cell-towers that can be loaded into RANSim to create a RAN topology.

Also in this release, the entire SD-RAN stack was upgraded to support O-RAN standardized KPM-SM v2.0.3 and E2-AP v1.0.1. Changes were made not only in the RIC and RanSim, but also to the OAI-based CU/DU in support of the new versions. The KPImon-xAPP developed by ONF, now simultaneously supports 4G statistics (from CU) and 5G statistics (from RanSim) via KPM-v2.

Finally, RiaB can now be used in 3 different modes depending on the use case

  • with OAI CU/DU enhanced by ONF to support E2AP and KPM-SM together with onos-kpimon xApp, OAI UE software and ONF’s mobile core (OMEC) - this option can also be deployed on white-box hardware as noted below;

  • with RANSim supporting KPM and RC-PRE SMs, and the RIC using onos-pci and onos-kpimon xApps via the Go SDK;

  • with RANSim supporting KPM and RC-PRE SMs, and the RIC using FB/AirHop’s xApp via the Python SDK and the onos-kpimon xApp via the Go SDK; note that the use of AirHop’s eSON server requires a commercial agreement with AirHop and is not included in the release. In its place a test-eson-server is included to showcase integration.

Features and Improvements

micro-ONOS based nRT-RIC (ONOS-RIC), SDKs & xApps

  • onos-e2t

    • Upgrades E2 Protocol to use E2AP v1.0.1

    • Implements control API to support E2 control procedure

    • Adds validation for control requests

    • Uses OID for creating the mapping between service models and RAN functions and registering service model plugins

    • Adds support for subscription deletes

    • Adds buffers for indication streams to avoid race conditions and preserve indications through xApp restarts

    • Adds validation for subscriptions

  • onos-e2-sm

    • Provides Protobuf interface to E2 Service Models

    • Translates to/from Protobuf to/from ASN.1 APER encoding

    • Accessible as a plugin (for onos-e2t) or a Go module (for xApps)

    • Supports KPM Service Model v1.0 and v2.0.3

    • Supports RC-PRE Service Model v1.0

    • Provides a utility (protoc-gen-cgo) for auto-generation of Go code wrappers for C code generated by asn1c tool. Generated code still requires some changes by hand.

  • onos-e2sub

    • Upgrades subscription API

  • onos-api

    • Supports E2 Control API

    • Updates E2 subscription API to define service model ID using service model name and version

    • Added a set of APIs for interacting with RAN simulator (see RANSim section below)

  • onos-ric-sdk-go

    • Supports E2 Control SDK

    • Adds capability to handle subscription failures

  • onos-kpimon-app

    • Monitors both 4G stats (from LTE CU) and 5G stats (from RANSim) including Max/Avg number of Active UE’s per cell

    • Makes the monitored result available through CLI

    • Monitors config changes (i.e. changes in report interval) and reacts to them by deleting old subscription and creating a new one using new configured report interval value

  • onos-pci

    • Reference xapp for resolving PCI conflicts using Go based SDK; can be used in place of fb-ah-xapp and AirHop’s eSON server, but does not support all the features of the latter

    • Provides capability to subscribe to RC-PRE service model and receives indication messages from E2 nodes

    • Provides capability to send control requests to change PCI values for cells

    • Supports listing of PCI resources such metrics, neighbors, PCI, and PCI conflicts of cell(s) using CLI that is integrated with onos-cli

    • Detects PCI conflicts and resolves them based on an algorithm that uses cell neighbors information

  • onos-config

    • Configuration model plugins are now compiled at deploy time and loaded in by onos-operator

    • Model plugin definitions (ric and e2node) have been moved to Helm charts

    • Added authentication and authorization and security logging

    • Improved handling for more complex YANG models with lists in lists

    • Upgraded version of YGOT and other libraries

  • onos-topo

    • Minor bug fixes to event notifications and CI improvements

    • Removed deprecated device APIs

  • onos-cli

    • Merged the sdran and onos CLIs into a single ONOS CLI

    • Integrated RANSim CLI capabilities (see RANSim section below)

    • Integrated PCI xApp CLI capabilities (see onos-pci section)

    • Added support for querying the config model registry

  • Python xApp SDK (tentatively called aiomsa)

    • SDK is used in fb-ah-xapp.

    • “Getting started” documentation here

    • Package available via “pip install aiomsa”.

    • Will be open sourced on github in the near future.

  • fb-ah-xapp

    • This xApp uses the Python SDK (aiomsa) to communicate with the ONF RIC, and a gRPC interface to communicate with AirHops eSON server

    • PCI xApp receives indication messages from the RIC and notifies the Airhop eSON service. Deploy with ah-eson-test-server if eSON service is not available (requires commercial agreement)

    • Receives change requests from the eSON service, and sends E2AP control messages to e2 node

    • Ignores FCN and PCI pool in the indication message

  • fb-ah-gui

    • GUI for viewing RAN simulator state, displaying a table with columns ECGI, PCI, neighbors.

    • Displays a map with cells as vertices, neighbor relationships as edges, and color codes edges to display conflicts and confusions

    • Sectors are not shown, so cells with identical coordinates will overlap

    • Neighbor relationship edges may overlap, hiding conflicts

    • Google maps API dev key is locked to localhost:8080. To access, port forward via ssh -L 8080:localhost:30095 <k8s_node> and browse to http://localhost:8080

  • ah-eson-test-server

    • Stand-in for commercial Airhop eSON service, responds to Airhop eSON gRPC service requests from fb-ah-xapp

    • Does not resolve PCI conflicts, but pushes down random PCI change requests

  • onos-operator

    • Provides a Kubernetes operator which extends the k8s control plane to automate configuration management in SD-RAN components

    • Consists of two component-specific operators: topo-operator and config-operator

    • Each operator extends the Kubernetes API and control plane with custom resources and control logic

    • topo-operator

      • Extends the Kubernetes API with custom resources for topology elements: Kind, Entity, and Relation

      • Propagates Kubernetes API resources defined in Helm charts to the onos-topo service

      • Enables load balancing between services with dynamic topology Entity and Relation elements linked to ReplicaSets

      • Automates management of topology elements (Entity and Relation) using Kubernetes failure detection and garbage collection algorithms

    • config-operator

      • Extends the Kubernetes API, adding a custom Model resource for defining YANG models in Helm charts

      • Injects config models into onos-config pods as Go plugins

      • Replaces finicky plugin build scripts with automated just-in-time compilation of Go plugins

      • Uses Go module system to eliminate problematic version conflicts when loading config model plugins

      • Enables rolling upgrades of onos-config by compiling plugins for multiple versions

      • Serves as a proof-of-concept for making other SD-RAN components extensible in Helm charts — particularly service model plugins

ONF/OAI CU-CP & White-Box RAN hardware

sdRan-in-a-Box (RiaB)

  • Deploys onos-pci (RC-PRE SM) and onos-kpimon (KPM 2.0 SM) with RANSim

  • Deploys onos-kpimon (KPM 2.0 SM) with CU-CP/OAI DU/OAI UE

  • Deploys Facebook-AirHop use case with RANSim to resolve PCI conflicts

  • Deploys ONF & OAI CU-CP / OAI-DU / OAI-UE for the USRP/Hardware scenario

  • Supports multiple OAI UEs deployment

  • Support test-user-plane, test-kpimon-v1/v2, and test-pci to test

    • “test-user-plane”: test user plane with OAI-UE and OMEC-UP

    • “test-kpimon-v1/v2”: test onos-kpimon-v1 (KPM 1.0) and onos-kpimon-v2 (KPM 2.0) applications

    • “test-pci”: test ONOS-PCI application

  • Minor bug fixes for RiaB reset and deployment


  • Upgrades E2 Protocol to use E2AP v1.0.1

  • Supports simulation of multiple E2 nodes with ability to add/remove E2 nodes at runtime

  • Supports running of multiple service models for each simulated E2 node

  • Uses OID for registering of service models

  • Provides generic and use case specific simulation models for modeling of RAN environments

  • Implements data store interfaces for storing information about RAN entities and metrics.

  • Implements preliminary subscription and subscription delete handlers for KPM v2 service model

  • Supports a preliminary implementation of indication messages for KPM v2 service model

  • Implements subscription and subscription delete handlers for RC-PRE service model (i.e PCI use case)

  • Implements control procedure handler for RC-PRE service model (i.e. PCI use case)

  • Supports sending indication messages for RC-PRE service model based on two approaches: periodic and on cell attributes and metrics changes

  • Provides new APIs to:

    • manipulate SD-RAN nodes, their agents, cells and UEs to allow for simulating changing RAN environments

    • inject and retrieve arbitrary metrics on per-node, per-cell and per-UE basis

    • wholesale load new RAN simulation models and associated metrics

  • CLI integrated with onos-cli to allow command-line access to the above APIs

  • Implements auxiliary tools to:

    • generate large honeycomb RAN topologies with cell neighbor relationships based on distance and direction

    • generate PCI metrics for a given model and with desired number of PCI collisions and confusions


  • CI infrastructure was moved from Travis CI to an internally hosted Jenkins instance. This gives us the ability to run CI jobs on hardware resources and offers more flexibility in the kinds of jobs we can run.

  • Automatically generated mocks for Golang are now released as part of the onos-api module

  • Robot tests for hardware based QA pods are under development

    • Deploy job runs off of an internally hosted Jenkins instance that cleans and deploys individual components to their respective QA pod (OMEC, RIC, OAI-ENB-USRP/CU and DU) using RiaB

    • Robot tests verifies the relevant pods are running for each component

    • Sanity tests attaches a UE using OAI-UE and verifies that it attached successfully, and runs a ping test with the UE

  • Increased unit test coverage in onos-e2t, onos-e2sub, and onos-config

  • Added new integration tests for onos-e2t functionality

  • Added new smoke test for the fp-ah-xapp

  • Added new integration test for onos-pci xApp


  • sdran-helm-charts

    • ONOS RIC can be installed from the helm charts as shown below:

# Set up onos and sdran repos
helm repo add cord
helm repo add atomix
helm repo add onos
helm repo add sdran --username "$repo_user" --password "$repo_password"
helm repo update

# Create Atomix resources
helm install -n kube-system atomix-controller atomix/atomix-controller 
helm install -n kube-system raft-storage-controller atomix/raft-storage-controller 
helm install -n kube-system cache-storage-controller atomix/cache-storage-controller

# Create the ONOS operator
helm install -n kube-system onos-operator onos/onos-operator --wait

# Run the sdran chart
helm install sd-ran sdran/sd-ran

# Remove sdran and its dependencies
helm uninstall sd-ran
helm uninstall -n kube-system onos-operator atomix-controller raft-storage-controller cache-storage-controller


Known Issues

  • KPM v2 service model logic in RAN simulator is partially implemented

  • Some new features are required in E2T and SDK to fully support Action Definition in subscription requests

  • Decoding of unsuccessful outcome for control messages in E2AP v1.0.1 is not implemented yet

Component Versions












v0.7.14 chart 1.0.14


v0.7.3 chart 1.0.2


v0.7.3 chart 1.0.4


v0.7.18 chart 1.0.13


v0.4.0 chart 0.4.1


v0.7.24 chart 1.0.35


v0.7.11 chart 1.0.9


v0.1.7 chart 0.6.4


v0.1.2 chart 0.6.3


v0.1.4 chart 0.1.4

oai du

v0.1.4 chart 0.1.4

oai ue

v0.1.4 chart 0.1.4




v0.0.1 chart 0.0.1


v0.0.1 chart 0.0.1


v0.0.1 chart 0.0.1


v3.1.9 chart 0.1.5