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 valueracora-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 trackssectorId. 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).