Skip to content

A gNB bringing up a cell does not prove standards compliance. A successful UE attachment does not prove that the CU-CP selected the correct security algorithms, that the user plane used the signalled TEIDs and QFIs, or that the DU can recover when its CU restarts. Those questions can only be answered by examining what the implementation actually does.

The CNTC RAN certification framework in three parts. A seven-stage pipeline runs across the top: adapter, bring up, drive, capture, decode, grade, certify. Part one is the ranbench engine, with one adapter per CU/DU stack (OCUDU marked implemented today, alongside OAI, O-RAN-SC or your own), a UE supplied by ranbench using OpenAirInterface nr-UE over a ZeroMQ virtual radio with no RF hardware, observers that decode the wire using tshark and the stack's own pcaps, and interfaces decoded against E1 38.463, F1-C 38.473, F1-U 38.425, MAC 38.321, RRC 38.331, N2 38.413, N3 38.415 and GTP-U 29.281. Part two is the NG-RAN node under test, bring-your-own, with uncertified peers: a UE simulator, an AMF terminating N2 and a UPF terminating N3. The three product classes are O-CU-CP with 30 tests and 16 essential, O-DU with 14 tests and 7 essential, and O-CU-UP with 14 tests and 7 essential. A note records that every RRC message crosses F1 in an F1AP container per TS 38.473 section 8.4, so RRC conformance and Access Stratum security are observable on an ordinary IP link. Part three is the cntc umbrella: per-product-class catalogs, a versioned grader, an essential gate returning PASS, FAIL or INCOMPLETE where not evaluated is not a pass, and outputs of scorecard, certificate and dashboard.
CNTC RAN Certification: the ranbench engine measures, the cntc umbrella judges, and a certificate is issued only when every essential requirement for a product class passes.

CNTC RAN Certification brings that evidence-based approach to the 5G NG-RAN. It certifies a gNB in CU/DU split mode across N2, F1-C, E1, F1-U, N3 and the air interface. The complete environment runs on a single Linux host, using a software UE over a virtual radio instead of a conventional radio lab.

The first validated implementation is the OCUDU split gNB, peered with free5GC and driven by an OpenAirInterface UE. All 58 Level-1 requirements execute. The O-DU certified with all 7 essential requirements passing. The two CU product classes did not certify, because the evidence showed a specific security-policy failure: confidentiality was signalled as required, but the selected cipher was NEA0.

That result captures the purpose of CNTC. Certification is not confirmation that a system starts. It is an independent judgement based on what the system demonstrably does.

The remaining certification gap

CNTC already covers two major parts of a 5G system. UPF Certification exercises a User Plane Function over N3 and N4 and grades the observed behaviour. Control Plane Certification evaluates core network functions across NAS, NGAP, PFCP and the Service-Based Interface.

The RAN was the remaining gap, and the most difficult one to close, because RAN testing is commonly associated with spectrum, RF equipment and a dedicated radio lab.

A split gNB creates another path. Its behaviour can be observed across the standard interfaces connecting the CU control plane, CU user plane, DU, 5G Core and UE. CNTC RAN Certification turns those observations into reproducible, per-product-class verdicts.

A split gNB is not one product

3GPP TS 33.523 does not treat a split NG-RAN node as a single box. It separates the gNB into three product classes. In a disaggregated deployment these classes may come from different suppliers, and must therefore be evaluated independently.

Product class3GPP nameInterfacesLevel-1 requirements
O-CU-CPgNB-CU-CPN2, F1-C, E1 and RRC30, including 16 essential
O-CU-UPgNB-CU-UPE1, F1-U and N314, including 7 essential
O-DUgNB-DUF1-C, F1-U and the cell14, including 7 essential
Total58, including 30 essential

CNTC certifies each class separately. One class can certify while another does not. This is exactly what happened during validation against OCUDU: the O-DU certified, while the O-CU-CP and O-CU-UP did not.

Every interface tested against its own specification. A UE simulator connects over Uu to the O-DU (gNB-DU, holding RLC, MAC and PHY) with 3 tests. The O-DU connects over F1-C using F1AP to the O-CU-CP with 13 tests, and over F1-U using GTP-U to the O-CU-UP with 5 tests. The O-CU-CP (holding RRC and PDCP-C, selecting AS algorithms) connects over N2 using NGAP to the AMF with 8 tests. The O-CU-UP (holding SDAP and PDCP-U, enforcing user-plane security) connects over E1 using E1AP to the O-CU-CP with 9 tests, and over N3 using GTP-U to the UPF with 5 tests. Totals: 38 tests across the six interfaces, plus 4 for RRC inside F1-C, plus 12 for security, plus 4 for robustness.
Each interface is judged against the specification that defines it: TS 38.473 for F1-C, 38.425 for F1-U, 38.463 for E1, 38.413 for N2, 38.415 and 29.281 for N3, and 38.331 for RRC, with SCAS TS 33.523.

A single verdict for the complete gNB would have hidden that distinction, and reduced the value of the result for operators, vendors and integrators.

Observing radio behaviour through F1

RRC conformance and Access Stratum security appear to require direct radio instrumentation. In a CU/DU split, the necessary evidence is already carried across F1.

Every RRC message crosses the F1 interface inside an F1AP container, as defined in 3GPP TS 38.473, Section 8.4. DLRRCMessageTransfer and ULRRCMessageTransfer carry the RRC PDU as an octet string that can be decoded from a packet capture.

This makes the critical procedures observable on an ordinary IP link, including RRC setup, the Access Stratum Security Mode Command, algorithm selection, and the RRC reconfiguration that establishes the data radio bearer.

The radio side still requires a UE capable of completing the attachment procedure. CNTC uses a software UE over a virtual radio for that purpose.

Access Stratum security proven from the capture. A tshark command reads the F1AP capture from campaign OCUDU-RAN-003. A numbered list of 18 F1AP procedures shows the carried content and PDCP MAC for each. Frames 1 to 4 cover F1 Setup and RRC Setup. Frames 5 to 9, marked before activation, carry RRC Setup Complete, authentication request and response and the security mode command, all with a PDCP MAC of zero, so RRC is not integrity protected and registration and authentication legitimately run in the clear. Frames 10 and 11 are the UE Context Setup exchange where the AS Security Mode Command travels. Frames 12 to 18, marked after activation, carry real authentication codes such as 0xfdbbdaa6 and 0x02c133be, so integrity is active, but the content remains readable because the CU-CP selected NEA0, the null algorithm. Two verdicts are shown: PASS for CUCP-SEC-01, RRC integrity protection after AS Security Mode per TS 33.511 clause 4.2.2.1.1, and FAIL for CUCP-SEC-02, RRC ciphering after AS Security Mode, with NEA0 selected so RRC runs in the clear. A note explains that NAS ciphers between UE and core while AS ciphers between UE and gNB, and only AS is the gNB's job.
Integrity was switched on and ciphering was not. Neither verdict reads a configuration setting: both are decided by what the capture shows, and they disagree. A single "security activated" answer would have hidden this.

The result is not a simulated protocol-only test. One UE attaches through the complete split RAN, registers with the 5G Core, establishes a PDU session and reaches the data network through its tunnel.

One controlled run, focused evidence

CNTC separates measurement from judgement. The RAN engine records what happened, while the grading layer evaluates those observations against a versioned requirements catalogue.

Two decoupled layers. On the left, MEASURE: ranbench, the RAN engine, drives the RAN, observes the wire and records outcomes, and never decides, with no pass or fail formed there. It emits results.json, one schema shared by every CNTC engine. On the right, JUDGE: cntc, the grading umbrella, holds the versioned requirement catalog and the verdict engine with its essential gate, producing a scorecard that is always generated and a certificate only when the result is PASS. A caption notes the two layers are decoupled, so a past campaign can be re-graded when a catalog changes without re-running any tests.
Measurement and judgement are separate layers sharing one schema. A retained campaign can be re-graded against a newer catalogue without re-running the environment.

A campaign follows one controlled sequence: acquire the test-rig lock so only one campaign runs on the rig; confirm the AMF is reachable and subscriber data can be served; start the O-CU-CP and wait for the F1-C listener; start the O-CU-UP and wait for the E1 association; start the O-DU and wait for cell activation; attach one UE, complete registration and establish a PDU session; verify reachability to the data network through the UE tunnel; stop the components so their interface captures are flushed and readable; decode the captures and execute the certification suite; and grade the evidence to produce the scorecard and certificate decision.

One attachment produces evidence for 51 of the 58 Level-1 requirements. Seven robustness cases are exercised separately, by restarting products or sending malformed input to exposed sockets.

Teardown is part of evidence collection, not merely cleanup. The tested RAN stack closes its per-interface capture files during shutdown, which is what makes the retained captures complete and readable.

What counts as evidence

EvidenceSourceUsed to evaluate
Wire capturePer-interface packet captures decoded with tsharkProtocol conformance, security information elements and user-plane behaviour
Socket stateSCTP and other socket stateAssociations, recovery and listener readiness
Process stateProcess inspectionLiveness and crash detection

Product logs are retained for diagnosis but never determine a verdict. This prevents a product from effectively certifying itself through its own log statements.

The distinction is deliberate: packet, socket and process evidence establish what happened; product logs help explain why it happened; and the versioned catalogue determines what that observation means for certification.

Validated against a live OCUDU split gNB

The framework was validated using an OCUDU split gNB running as three processes, free5GC on Kubernetes as the 5G Core, an OpenAirInterface nr-UE, and a ZeroMQ virtual radio. All 58 Level-1 requirements executed.

The O-DU passed all 7 of 7 essential requirements and certified.

The two CU classes did not certify. Both exposed the same underlying security condition through different interfaces. The security policy indicated that confidentiality protection was required, while the selected ciphering algorithm was the null cipher NEA0. The E1AP Bearer Context Setup Request showed:

BearerContextSetupRequest
    cipheringAlgorithm: nEA0 (0)
    integrityProtectionAlgorithm: i-128-NIA2 (2)
    securityIndication
        integrityProtectionIndication: not-needed (2)
        confidentialityProtectionIndication: required (0)

Integrity protection received a real algorithm in the same procedure. The stack was operational, but one specific protection had been downgraded. A successful attachment alone would not have exposed that distinction.

The condition was independently visible for two product classes across two interfaces: in the F1AP evidence for the O-CU-CP, and in the E1AP evidence for the O-CU-UP.

A terminal showing the end of a CUUP campaign. Individual results include PASS for CUUP-UP-02 N3 tunnel to the UPF on the NGAP-signalled TEID, CUUP-UP-03 end-to-end data path where UE traffic reaches the data network, and CUUP-UP-04 unknown TEID on F1-U or N3 dropped. CUUP-SEC-01, UP ciphering applied per the security policy, is marked FAIL. CUUP-SEC-02 and SEC-03 are marked na, the latter because E1 runs only between loopback addresses. CUUP-SEC-04, F1-U and N3 transport protection, is FAIL. Category scores show protocol 3 passed and dataplane 3 passed at 100 percent, robustness 2 passed at 100 percent, and security 0 passed with 2 failed at 0 percent. The essential gate reads 6 passed, 1 failed, 0 na of 7, with failed essentials CUUP-SEC-01, and RESULT: FAIL. A problems-found section groups the failures under their causes: the null ciphering algorithm NEA0 is in use so nothing is encrypted, and F1-U or N3 leaves the host with no IPsec SA covering it so traffic is carried in the clear.
CNTC groups related failures under their underlying fault, so one implementation issue does not appear as a collection of unrelated symptoms.

Not Applicable never means Pass

Not every requirement can be judged in every deployment. CNTC records such a requirement as Not Applicable, together with the reason it could not be evaluated and what would be required to evaluate it.

A Not Applicable result is never promoted to Pass. If an essential requirement cannot be evaluated, the product class is marked incomplete rather than certified. A certificate is issued only when every essential requirement for that class passes.

This produces a more meaningful report. A result set in which every untested condition quietly becomes a pass may look complete, but it does not establish conformance.

Running a certification campaign

Install the tester without installing or modifying the RAN under evaluation, or the 5G Core it uses as a peer:

git clone https://github.com/TOSSI-Foundation/CNTC.git
cd CNTC
make ran-prereqs

Configure the adapter for the target stack:

make ran-configure

The configuration workflow derives UE radio parameters from the O-DU cell configuration, removing a common source of attachment failures. Run the preflight checks before starting a campaign:

make ran-doctor CONFIG=configs/my-ran.yaml
Terminal output from make ran-doctor against an OCUDU configuration. Every check reports ok: the yaml module and the tcpdump, tshark, pgrep and sudo binaries are installed; the OCUDU build has cucp, cuup and du; endpoints and per-interface pcap settings are confirmed for du, cucp and cuup; the core is free5gc_k8s as the N2 and N3 peer; one subscriber is in config; the AMF at 10.43.24.185 port 38412 is accepting SCTP; and the UDM serves session-management data for imsi-208930000000001. The final line reads RESULT: READY.
The preflight validates the RAN build and capture configuration, then contacts the 5G Core. These checks detect peer-side problems that might otherwise be misclassified as RAN failures.

Certify each product class independently:

make ran-run CONFIG=configs/my-ran.yaml TARGET=cucp CAMPAIGN=MY-RAN-CUCP
make ran-run CONFIG=configs/my-ran.yaml TARGET=cuup CAMPAIGN=MY-RAN-CUUP
make ran-run CONFIG=configs/my-ran.yaml TARGET=du   CAMPAIGN=MY-RAN-DU

Each class takes approximately two to five minutes in the validated environment. Results are rendered in a live dashboard, and every campaign retains the captures and logs needed to independently re-examine its findings.

A common certification model across the 5G system

With RAN Certification, CNTC now covers the path taken by both signalling and user traffic. RAN Certification evaluates where the UE attaches and Access Stratum security is activated. Control Plane Certification evaluates the core functions that establish and manage the session. UPF Certification evaluates the user plane that carries the traffic.

All three capabilities share a result schema, grading model and definition of what a verdict may assert. This gives operators and integrators a consistent basis for comparing results across domains.

RAN-specific integration is isolated in an adapter with a small contract: describe the implementation, expose endpoints and capture paths, report liveness, and start or stop the required components. The 58 requirements and grading logic operate on decoded evidence rather than implementation-specific logs. Supporting another split RAN therefore means adding an adapter without rewriting the certification model.

CNTC can also work with an independently supplied 5G Core. In manual core mode, the RAN engine does not probe or modify the core beyond the configured readiness checks.

Roadmap: deeper tests and additional splits

The CU/DU split is the first RAN decomposition covered by CNTC, but it is not the only interface where independently supplied components must interoperate.

SplitInterfaceSeparatesSpecificationStatus
Option 2F1CU from DU3GPP TS 38.473Available in Level 1
CU separationE1CU-CP from CU-UP3GPP TS 38.463Available in Level 1
Option 6FAPI and nFAPIMAC from PHY, L2 from L1SCF 222 and SCF 225Planned
Option 7.2xO-RAN Open FronthaulO-DU from O-RUO-RAN WG4Planned

The roadmap also deepens the test model. Level 1 asks whether a product behaves correctly when its peers behave correctly. Level 2 will ask how it responds when a peer replays, corrupts, downgrades or malforms protocol input.

Eighteen Level-2 requirements are drafted as roadmap catalogues: 10 for O-CU-CP, 4 for O-CU-UP and 4 for O-DU. Executing them requires deliberately misbehaving peer implementations, which remains future work. Additional adapters are planned for srsRAN Project and the OpenAirInterface gNB.

Open implementation, independently checkable results

CNTC is released under the Apache License 2.0 by the TOSSI Foundation. The RAN implementation builds on OCUDU for the CU/DU stack, OpenAirInterface nr-UE for the software UE, free5GC for the validation core, and Wireshark tooling for packet decoding.

Every campaign retains the packet captures and product logs associated with its findings. This allows a result to be reviewed against the same evidence used to produce it.

A result that cannot be independently checked is an opinion. A result that can be independently checked is a measurement.