Skip to main content

Cell Identity

An operator declares the radio-facing fields of a cell: PCI, band, ARFCN, bandwidth, PLMN, TAC, the radio backend, a node. The controller owns everything that must be unique across the gNB and assigns it:

  • gnbId, one CU-wide value shared by every cell (one gNB per CU). It is the chart value racora-controller.gnbId (default 411); the controller stamps it into every cell.
  • sectorId, unique per cell: the lowest free 14-bit value (0 to 16383) across all cells, so a gap left by a deleted cell is refilled before the range extends. It feeds the cell identity: NCI = gnbId << 14 | sectorId.
  • gnbDuId, unique per DU. One DU serves one cell, so it tracks sectorId. F1AP identifies DUs by it, and the CU-CP rejects a second DU with the same id as a duplicate, which is what lets several cells run under one CU.

They live in the NRCell status, never the spec, with identitySource: controller recording who assigned them. The status subresource makes them unsettable through kubectl apply, and kubectl get nrcell shows them as the SECTOR, DU-ID and NCI columns.

Assignment is stable: a cell keeps its identifiers for life, so adding or removing other cells never renumbers it and its NCI, which UEs and the core cache, stays put. A deleted cell frees its identifiers for the next new cell. Cells declared at the same moment get distinct identifiers: the controller serialises first-time allocation and counts an identifier as taken from the instant it hands it out, before the API shows it.

PCI is handled differently: it stays declarable in the spec, with the controller filling a temporary value from its pool when none is given and CU-IP's PCI function replacing it (How Decisions Become Network State); status.pciSource says which (spec, controller-temp, controller-retuned).