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) UE-2: U_serving(88%)>85% ✓, RSRP_target(-78)>-100 ✓, T_dl(3) 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 = 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 - Calculate deficit: - New scheduling weight: - Issue E2SM-RC scheduling weight update UE-A (enterprise slice): T_dl = 32 Mbps, W_base = 1.0 Deficit D = (50 - 32)/50 = 0.36 W_new = 1.0 (1 + 20.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 + 20.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) Dish Network built the first greenfield O-RAN 5G network in the US: Vodafone deployed Near-RT RIC across select markets in Europe: Rakuten's fully virtualized O-RAN network provides the largest-scale reference: rApps operate on longer timescales and provide strategic intelligence: The A1 interface carries two types of messages: 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.`
HANDOVER containing the target cell Global Cell ID and UE ID. The O-CU-CP executes the handover via Xn or N2 procedures.`
`
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:
T_dl < 50 Mbps:D = (50 - T_dl) / 50W_new = W_base (1 + 2 D)`
`
Operator Deployment Results
Dish Network (US) -- O-RAN Native Deployment
Vodafone (Europe) -- Near-RT RIC in Brownfield
Rakuten Mobile (Japan) -- Full Stack O-RAN
rApps and the Non-RT RIC
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 Challenges and Future Direction