Skip to main content

Attach a Phone to a Live Cell

This tutorial takes a dormant Racora to a phone with a data session: one cell on a real radio, one SIM declared to the network, one registration you can read in the core's log. It uses the default Open5GS core and the default network identity (PLMN 90170, tracking area 7).

Before You Begin​

  • The control node is installed and the RAN is dormant (Install the Control Node).
  • A USRP B210 on USB 3 sits on a node carrying racora.io/rf-ready=true: the control node itself or a radio node. Note the radio's serial and the node's name.
  • A SIM whose IMSI, K and OPc you know, in a phone that supports band n78.

1. Put a Cell on the Air​

One cell runs on the radio's internal clock, so no GPS is needed. Save this as cell-live.yaml with your radio's serial and node:

apiVersion: racora.io/v1alpha1
kind: NRCell
metadata:
name: nr-n78-b210
namespace: racora-system
spec:
band: 78
dlArfcn: 632628
channelBandwidthMHz: 10
commonScs: 30
plmn: "90170"
tac: 7
pci: 1
radioBackend:
ruType: uhd
uhd:
deviceArgs: "type=b200,serial=<your serial>,num_recv_frames=64,num_send_frames=64"
clockSource: internal
otwFormat: sc12
srate: 23.04
txGain: 80
rxGain: 40
duAssignment:
nodeName: <your node>
kubectl apply -f cell-live.yaml
kubectl get nrcell -n racora-system # PHASE ConfigGenerated
kubectl get pods -n distributed-unit # du-nr-n78-b210 Running
kubectl get deploy -n centralized-unit # cu-cp, cu-up, cuip 1/1

The controller assigns the cell's identity, generates the DU on your node, and scales the CU plane up. The cell declares its PCI so that it stays on the air while you attach: a cell declared without one gets a temporary PCI that the Intelligence Plane then replaces, and that retune locks the cell and rolls its DU, dropping any phone on it (How Decisions Become Network State). What each field does is Connect a Radio; how the controller treats the cell is Deploy Cells.

2. Declare the SIM​

Save the example as subscriber-1.yaml, and put your SIM's IMSI, K and OPc in it:

apiVersion: v1
kind: Secret
metadata:
name: sim-1
namespace: racora-system
type: Opaque
stringData:
k: "00112233445566778899aabbccddeeff"
opc: "63bfa50ee6523365ff14c1f45f88737d"
---
apiVersion: racora.io/v1alpha1
kind: Subscriber
metadata:
name: sim-1
namespace: racora-system
spec:
imsi: "901700000000001"
credentialsSecretRef:
name: sim-1
kubectl apply -f subscriber-1.yaml
kubectl -n racora-system get sim # PHASE Provisioned, PROVIDER open5gs

Provisioned means the SIM is in the core's database. The fields and phases are Add Subscribers.

3. Attach the Phone​

On the phone, select the network manually: before it registers it lists the network by its PLMN, 90170. Once it registers, the core sends its network name, RACORA by default (racora-core-open5gs.networkNameFull), which most phones then display. Read the core's log for the IMSI:

kubectl -n 5g-core logs deploy/open5gs --since=5m | grep <imsi>

Registration complete followed by a PDU session line is a phone on your network with a data session. The CU-CP prints the UE's RNTI as it is admitted:

kubectl exec -n centralized-unit deploy/cu-cp -c cu-cp -- grep 'Updated UE with' /tmp/cu_cp.log | tail -3

4. Clean Up​

kubectl delete -f subscriber-1.yaml
kubectl delete -f cell-live.yaml

Deleting the Subscriber removes the SIM from the core; deleting the last cell dissolves the CU plane back to 0/0.

What's Next​