The RIC: Programmable Brain of the RAN
Traditional RANs operate on vendor-embedded algorithms: handover, scheduling, and power control logic are hardcoded into proprietary baseband software. Operators have limited ability to customize behavior beyond parameter tuning. The O-RAN Alliance's RAN Intelligent Controller (RIC) changes this paradigm by externalizing RAN intelligence into a programmable platform.
The RIC comes in two variants:
- Near-RT RIC: Operates on a 10 ms to 1 second control loop. Hosts xApps that make per-UE, per-cell decisions such as traffic steering, QoS optimization, and interference mitigation.
- Non-RT RIC: Operates on a > 1 second control loop (typically minutes to hours). Hosts rApps that handle policy management, ML model training, and RAN analytics enrichment.
This architecture is specified in the O-RAN Alliance's O-RAN.WG2.RIC-Architecture and O-RAN.WG3.E2AP documents. 3GPP provides the underlying RAN protocol foundation through TS 38.300 (NR overall description), while the O-RAN specifications define the open interfaces that expose RAN data and control to the RIC.
Architecture and Interfaces
RIC Interface Overview
| Interface | Endpoints | Protocol | Latency | Purpose | O-RAN Spec |
|---|---|---|---|---|---|
| E2 | Near-RT RIC <-> E2 Node (O-DU/O-CU) | SCTP/ASN.1 | < 10 ms | Per-UE control and RAN data streaming | O-RAN.WG3.E2AP |
| A1 | Non-RT RIC -> Near-RT RIC | HTTP/REST | Seconds | Policy guidance and ML model delivery | O-RAN.WG2.A1AP |
| O1 | SMO -> All O-RAN nodes | NETCONF/YANG | Minutes | Configuration, fault, performance management | O-RAN.WG1.O1 |
| R1 | rApp <-> Non-RT RIC framework | REST API | Seconds | rApp lifecycle and data access | O-RAN.WG2.R1 |
| E2SM | Near-RT RIC internal | ASN.1 definitions | -- | Service model definitions for E2 | O-RAN.WG3.E2SM-* |
E2 Service Models (E2SM)
E2SMs define what data the RIC can collect and what control actions it can issue. Each E2SM is a self-contained specification:
| E2SM | Full Name | Key Data Exposed | Key Control Actions | Use Case |
|---|---|---|---|---|
| E2SM-KPM | KPI Monitoring | Per-UE RSRP, throughput, BLER, CQI, RLC buffer | None (monitoring only) | Data collection for xApps |
| E2SM-RC | RAN Control | UE context, handover state, scheduling weights | Handover trigger, scheduling weight adjustment, cell parameter change | Traffic steering, load balancing |
| E2SM-NI | Network Interface | F1, Xn, X2 message contents | Message injection/modification | Protocol-level control |
| E2SM-CCC | Connected Cell Configuration | Cell configuration parameters | Parameter modification (tilt, power, frequency) | SON-like automation |
E2SM-KPM and E2SM-RC are the most widely deployed. E2SM-KPM v3.0 supports over 50 measurement types aligned with 3GPP TS 28.552 (performance measurements). E2SM-RC v1.03 supports 12 control action types including handover, scheduling, and slicing resource allocation.
xApp Architecture and Lifecycle
An xApp is a containerized application that runs on the Near-RT RIC platform. It follows a standardized lifecycle:
- Onboarding: xApp descriptor (JSON/YAML) registered with the Near-RT RIC. Descriptor specifies E2SM subscriptions, resource requirements, and A1 policy types consumed.
- Deployment: Kubernetes creates xApp pod on the RIC cluster. RIC framework provisions the xApp's E2 subscriptions with target E2 nodes.
- Subscription: xApp subscribes to E2SM-KPM indications for specific UE/cell measurements via the E2 interface.
- Execution: xApp receives periodic RAN data (e.g., per-UE RSRP every 100 ms), runs its algorithm, and issues E2SM-RC control messages.
- Termination: xApp unsubscribes from E2 indications, pod is deleted.
xApp Internal Components
| Component | Function | Technology |
|---|---|---|
| E2 Subscription Manager | Manages E2SM-KPM/RC subscriptions | ASN.1 codec, SCTP client |
| SDL (Shared Data Layer) | Persistent storage for xApp state | Redis, RNIB (RAN Network Information Base) |
| A1 Policy Handler | Receives policy guidance from Non-RT RIC | REST client |
| Algorithm Engine | Core logic (ML model, rule engine, or optimization) | Python, Go, C++ |
| Metrics Exporter | Publishes xApp metrics for monitoring | Prometheus exporter |
Worked Example 1 -- Traffic Steering xApp
Scenario: Operator Z has co-located 5G NR cells at 3.5 GHz (n78, 100 MHz) and 700 MHz (n28, 20 MHz). During peak hours, the n78 cell is congested (PRB utilization > 85%) while n28 is underutilized (PRB utilization 40%). A traffic steering xApp rebalances load. Algorithm Design:The xApp implements a threshold-based steering policy with hysteresis:
- Input (E2SM-KPM, every 200 ms per UE):
- Serving cell PRB utilization: U_serving
- Target cell SS-RSRP for each UE: RSRP_target
- UE DL throughput: T_dl
- UE QoS requirements (from A1 policy): T_min (minimum guaranteed throughput)
- Steering decision for each UE:
1. If U_serving > 85% AND RSRP_target > -100 dBm AND T_dl < T_min:
- Issue E2SM-RC handover control to move UE to n28 cell
2. If U_serving < 60% AND UE was previously steered:
- Move UE back to n78 for higher throughput
Numerical Walk-Through:Time T=0:
n78 cell PRB utilization: 88%
UE-1: RSRP(n78)=-75 dBm, RSRP(n28)=-82 dBm, DL throughput=8 Mbps, QoS T_min=15 Mbps
UE-2: RSRP(n78)=-92 dBm, RSRP(n28)=-78 dBm, DL throughput=3 Mbps, QoS T_min=5 Mbps
Decision:
UE-1: U_serving(88%)>85% ✓, RSRP_target(-82)>-100 ✓, T_dl(8)<T_min(15) ✓ → STEER to n28
UE-2: U_serving(88%)>85% ✓, RSRP_target(-78)>-100 ✓, T_dl(3)<T_min(5) ✓ → STEER to n28
Time T=5s (after steering):
n78 cell PRB utilization: 62%
n28 cell PRB utilization: 58%
UE-1 on n28: DL throughput = 18 Mbps (meets QoS)
UE-2 on n28: DL throughput = 12 Mbps (meets QoS)
The xApp issues E2SM-RC Control Request messages with Action ID = HANDOVER containing the target cell Global Cell ID and UE ID. The O-CU-CP executes the handover via Xn or N2 procedures.
E2SM-RC Control Header:
ueID: gNB-CU-UE-F1AP-ID = 1001
ricControlAction: HANDOVER
E2SM-RC Control Message:
targetCellGlobalID: PLMN(310/260) + NR-Cell-ID(n28-cell-12)
handoverType: intra-gNB
Worked Example 2 -- QoS-Aware Scheduling xApp
Scenario: An enterprise slice (S-NSSAI: SST=1, SD=000010) requires guaranteed 50 Mbps per user for an AR application. The scheduling xApp adjusts per-UE scheduling weights via E2SM-RC. Algorithm:- Every 100 ms, the xApp reads per-UE throughput from E2SM-KPM
- For UEs on the enterprise slice with
T_dl < 50 Mbps:
- Calculate deficit: D = (50 - T_dl) / 50
- New scheduling weight: W_new = W_base (1 + 2 D)
- Issue E2SM-RC scheduling weight update
Numerical Walk-Through:UE-A (enterprise slice): T_dl = 32 Mbps, W_base = 1.0
Deficit D = (50 - 32)/50 = 0.36
W_new = 1.0 * (1 + 2*0.36) = 1.72
UE-B (enterprise slice): T_dl = 48 Mbps, W_base = 1.0
Deficit D = (50 - 48)/50 = 0.04
W_new = 1.0 * (1 + 2*0.04) = 1.08
UE-C (consumer slice): T_dl = 25 Mbps, W_base = 1.0
No adjustment (different slice, not managed by this policy)
After weight adjustment (next scheduling period):
UE-A: T_dl improves to 49 Mbps (weight increased scheduler allocation)
UE-B: T_dl remains at 50 Mbps (minimal adjustment needed)
Operator Deployment Results
Dish Network (US) -- O-RAN Native Deployment
Dish Network built the first greenfield O-RAN 5G network in the US:
- RIC Vendor: VMware (now Broadcom) RIC platform
- xApps deployed: Traffic steering, interference management, energy saving
- E2 nodes: Fujitsu O-RU + Mavenir O-DU/O-CU across 70+ markets
- Traffic steering result: 22% reduction in cell-edge user throughput variance
- Control loop latency: Average 45 ms E2 round trip (subscription to control acknowledgment)
- Scale: 15,000+ E2 connections managed by regional RIC clusters
Vodafone (Europe) -- Near-RT RIC in Brownfield
Vodafone deployed Near-RT RIC across select markets in Europe:
- RIC Vendor: Nokia RIC with third-party xApps (Rimedo Labs, Capgemini)
- Use case: Energy saving xApp that reduces n78 transmit power during low-traffic hours
- Result: 18% energy reduction in RAN during off-peak (midnight to 6 AM) with < 1% throughput degradation to active users
- Deployment model: RIC runs at regional data centers, E2 interface over operator MPLS transport
- A1 policy: Non-RT RIC sets energy saving targets per cell based on traffic forecasts from rApp ML model
Rakuten Mobile (Japan) -- Full Stack O-RAN
Rakuten's fully virtualized O-RAN network provides the largest-scale reference:
- RIC: In-house RIC platform (Rakuten Symphony)
- xApps: 8 active xApps including traffic steering, MRO (Mobility Robustness Optimization), load balancing, and anomaly detection
- MRO result: Handover failure rate reduced from 1.8% to 0.4% through real-time A3 event threshold optimization via E2SM-RC
- xApp conflict resolution: Implemented priority-based arbitration when multiple xApps issue conflicting E2 controls for the same UE
rApps and the Non-RT RIC
rApps operate on longer timescales and provide strategic intelligence:
| rApp Type | Function | Input | Output | Timescale |
|---|---|---|---|---|
| Traffic forecasting | Predict per-cell load 1--24 hours ahead | Historical KPM data, external events | A1 policy (target load thresholds) | Hourly |
| ML model training | Train/retrain xApp ML models | E2SM-KPM historical data | ML model artifacts via A1 | Daily |
| Coverage optimization | Adjust antenna tilt/power via O1 | Drive test data, MDT reports | O1 configuration changes | Weekly |
| Slice SLA monitoring | Track per-slice KPI compliance | E2SM-KPM aggregated per S-NSSAI | A1 policy adjustment, alarm | Minutes |
The A1 interface carries two types of messages:
- A1 Policy: Non-RT RIC sets target KPIs or constraints (e.g., "minimum cell-edge throughput = 10 Mbps") that guide xApp behavior.
- A1 Enrichment Information: Non-RT RIC delivers contextual data (e.g., traffic predictions, ML models) to xApps.
Challenges and Future Direction
- E2 interface scalability: Each UE-level subscription generates significant data volume. At 200 ms reporting intervals with 1,000 UEs per cell and 50 cells per RIC, the E2 data rate exceeds 100 Mbps. E2SM-KPM v3.0 supports aggregation and filtering to reduce this.
- xApp conflict management: When a traffic steering xApp and energy saving xApp issue conflicting controls for the same cell, the RIC's conflict mitigation function (O-RAN WG2) must arbitrate. Current solutions use priority-based ordering, but AI-driven multi-objective optimization is being researched.
- Multi-vendor interoperability: Despite O-RAN specifications, E2 interface interoperability between vendors remains challenging. The O-RAN Software Community (OSC) provides a reference implementation (RIC "I" Release), but production interoperability requires extensive testing. The O-RAN TIFG (Testing and Integration Focus Group) administers plugfest events to validate compliance.
- Real-time ML inference: xApps using deep learning models must complete inference within the 10 ms--1 s control loop. GPU acceleration on the RIC platform, ONNX Runtime optimization, and model quantization (INT8) are common approaches. Rakuten achieved 4.2 ms inference latency for their traffic steering neural network using ONNX on CPU.
> Key Takeaway: The O-RAN RIC transforms the RAN from a closed, vendor-locked system to a programmable platform where operators and third parties deploy custom intelligence via xApps and rApps. E2SM-KPM and E2SM-RC provide the standardized data and control interfaces. Real deployments by Dish (greenfield), Vodafone (brownfield), and Rakuten (full-stack) demonstrate measurable gains in traffic steering, energy saving, and mobility optimization. The key challenge is scaling E2 data flows and resolving multi-xApp conflicts in real time.