CGI Stands for Cell Global Identity. As the name implies, it is a specific ID which can uniquely identify a cell in the whole world. As shown in the figure from 23.003 4.3.1 Cell Identity (CI) and Cell Global Identification (CGI), CGI is made up of multiple components.
- What is CGI made of ?
- How does LTE identify a cell ?
- Example : WCDMA CGI Report in LTE Cell
- Reference
What is CGI made of ?
A cell identity on its own means nothing outside its own network. The value of CGI is that it carries enough context around that identity to make it unique anywhere in the world. The picture below is how 23.003 draws that, and it is worth reading the widths as carefully as the names.
As you know, MCC + MNC is PLMN. From MCC, you can figure out in which country the cell is located. From MNC, you can figure out which network operator it belongs to. From LAC, you can figure out which location area it belongs to. From CI (Cell Identity : two octets), you can identify the exact one cell.

23.003 Figure 5. Each bracket is a longer name for a longer prefix, so the same two-octet CI is unique only inside the LAI drawn above it. Nothing here is an LTE identifier.
Four boxes on the top row : MCC, MNC, LAC and CI, drawn left to right in that order and all the same size on the page.Two brackets underneath, and they nest : the upper arrow spans MCC, MNC and LAC and is labelled Location Area Identification. The lower one spans all four and is labelled Cell Global Identification (CGI).The nesting is the definition : 23.003 clause 4.3.1 says the Cell Global Identification is the concatenation of the Location Area Identification and the Cell Identity. The drawing is that sentence.CI is only locally unique : the same clause says Cell Identity shall be unique within a location area. Everything to its left exists to make that local value global.The equal box widths are not to scale : MCC is three digits, MNC is two or three, and 23.003 puts CI at a fixed two octets. The picture is a structure, not a bit layout.The drawing comes from the GERAN clauses : clause 4.3.1 sits in the GSM part of 23.003, which is why a LAC appears at all. The next section is where LTE differs from it.
Why we need this kind of ID ?
It is mainly for ANR and SON. ANR/SON is a big topic. Please see ANR and SON pages for further details.
CGI is a prefix problem, not a numbering problem : the cell identity stays short and local, and the identifier is made global by what is concatenated in front of it.Every field answers one question : country from MCC, operator from MNC, location area from LAC, cell from CI. That is the page's own reading and it matches the clause.ANR is the reason a UE ever reports one : a neighbour missing from the configured list has to be identified before it can be added. The PCI alone cannot do that.A PCI is not a CGI : LTE has 504 physical cell identities and UTRA has 512 primary scrambling codes. Both repeat across a network, so only the global identity settles which cell was seen.
How does LTE identify a cell ?
The figure above has a LAC in it, and LTE has no location areas. So the identifier LTE actually uses is a different one, defined in a different clause of the same specification. It is worth knowing both, because the word CGI gets used for both in conversation.
23.003 clause 19.6 gives the LTE version, and it is shorter than the GERAN one. The E-UTRAN Cell Global Identification is the concatenation of the PLMN Identifier and the E-UTRAN Cell Identity, and the clause says it shall be globally unique. There is no location area in it at all.
LTE spends bits on the cell identity instead. The ECI is a fixed length of 28 bits, against the two octets that clause 4.3.1 gives the GERAN CI. The exact coding inside those 28 bits is the responsibility of each PLMN operator, and 23.003 hands the detail to TS 36.413.
NR then repeats the pattern one more time. Clause 19.6A defines the NR Cell Global Identity as the PLMN Identifier concatenated with the NR Cell Identity, and puts the NCI at a fixed 36 bits. Same shape, same operator freedom inside, eight more bits of room.
All three are the PLMN identity followed by a cell identity. GERAN splits the second half into a location area and a short cell number. LTE and NR make the cell number long enough to stand on its own.
|
Property |
CGI (GERAN) |
ECGI (E-UTRAN) |
NCGI (NR) |
|
|
4.3.1 |
19.6 |
19.6A |
|
|
Location Area Identification and Cell Identity |
PLMN Identifier and E-UTRAN Cell Identity |
PLMN Identifier and NR Cell Identity |
|
|
2 octets |
|
|
|
|
Full hexadecimal representation |
Full hexadecimal, exact coding is the operator's responsibility |
Full hexadecimal, exact coding is the operator's responsibility |
|
|
Cell Identity unique within a location area |
The whole ECGI is globally unique |
The whole NCGI is globally unique |
|
|
− |
TS 36.413 |
TS 38.413 |
The row that moves is the cell identity length. Widening it is what lets the two later systems drop a whole field and still keep the identifier unique.
LTE has no LAC in its cell identity : the ECGI is PLMN-Id plus ECI and nothing else, so the figure further up does not describe an LTE cell.28 bits is the number to remember : that is the ECI, and 36.331 codes it asCellIdentity ::= BIT STRING (SIZE (28)) .The operator owns the inside of that field : 23.003 fixes the length and says the exact coding is each PLMN operator's responsibility. Any eNB and cell split inside it is a local convention.The Global eNodeB-ID reuses the same prefix : 23.003 clause 19.4.2.10 says its MCC and MNC are the same as the ones in the ECGI.NR changed the width, not the idea : NCGI is PLMN-Id plus a 36 bit NCI, defined one clause later in the same specification.
Example : WCDMA CGI Report in LTE Cell
Two captures follow, and they are two halves of one exchange. The first is what the network sent to ask for a CGI, and the second is what the UE sent back. Reading them as a pair shows which field in the request produced which field in the answer.
CGI detection and Measurement is also controled by Measurement operation in RRC Connection Reconfiguration. But in case of CGI detection, it would not be enough time for LTE cell to detect CGI during measurement GAP since it has to decode MIB and SIBs of target cell. So usually we configure connected mode DRX so that the LTE cell can perform CGI detection during DRX off time.
Decoded RRC Connection Reconfiguration from a tester log. The values record one exchange and are not specification values, so nothing here has been checked against a release.
+-rrcConnectionReconfiguration ::= SEQUENCE
+-rrc-TransactionIdentifier ::= INTEGER (0..3) [0]
+-criticalExtensions ::= CHOICE [c1]
+-c1 ::= CHOICE [rrcConnectionReconfiguration-r8]
+-rrcConnectionReconfiguration-r8 ::= SEQUENCE [100100]
+-measConfig ::= SEQUENCE [01010111000] OPTIONAL:Exist
| +-measObjectToRemoveList ::= SEQUENCE OF OPTIONAL:Omit
| +-measObjectToAddModList ::= SEQUENCE OF SIZE(1..maxObjectId[32]) [1]
| | +-MeasObjectToAddMod ::= SEQUENCE
| | +-measObjectId ::= INTEGER (1..maxObjectId[32]) [1]
| | +-measObject ::= CHOICE [measObjectUTRA]
| | +-measObjectUTRA ::= SEQUENCE [0011]
| | +-carrierFreq ::= INTEGER (0..16383) [9800]
| | +-offsetFreq ::= INTEGER OPTIONAL:Omit
| | +-cellsToRemoveList ::= SEQUENCE OF OPTIONAL:Omit
| | +-cellsToAddModList ::= CHOICE [cellsToAddModListUTRA-FDD] OPTIONAL:Exist
| | | +-cellsToAddModListUTRA-FDD ::= SEQUENCE OF SIZE(1..maxCellMeas[32]) [1]
| | | +-CellsToAddModUTRA-FDD ::= SEQUENCE
| | | +-cellIndex ::= INTEGER (1..maxCellMeas[32]) [2]
| | | +-physCellId ::= INTEGER (0..511) [9]
| | +-cellForWhichToReportCGI ::= CHOICE [utra-FDD] OPTIONAL:Exist
| | | +-utra-FDD ::= INTEGER (0..511) [9]
| | +-EXTENSION ::= SEQUENCE [0]
| | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| +-reportConfigToRemoveList ::= SEQUENCE OF OPTIONAL:Omit
| +-reportConfigToAddModList ::= SEQUENCE OF SIZE(1..maxReportConfigId[32]) [1]
| | +-ReportConfigToAddMod ::= SEQUENCE
| | +-reportConfigId ::= INTEGER (1..maxReportConfigId[32]) [1]
| | +-reportConfig ::= CHOICE [reportConfigInterRAT]
| | +-reportConfigInterRAT ::= SEQUENCE
| | +-triggerType ::= CHOICE [periodical]
| | | +-periodical ::= SEQUENCE
| | | +-purpose ::= ENUMERATED [reportCGI]
| | +-maxReportCells ::= INTEGER (1..maxCellReport[8]) [1]
| | +-reportInterval ::= ENUMERATED [ms1024]
| | +-reportAmount ::= ENUMERATED [r1]
| | +-EXTENSION ::= SEQUENCE [00]
| | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
| +-measIdToRemoveList ::= SEQUENCE OF OPTIONAL:Omit
| +-measIdToAddModList ::= SEQUENCE OF SIZE(1..maxMeasId[32]) [1] OPTIONAL:Exist
| | +-MeasIdToAddMod ::= SEQUENCE
| | +-measId ::= INTEGER (1..maxMeasId[32]) [1]
| | +-measObjectId ::= INTEGER (1..maxObjectId[32]) [1]
| | +-reportConfigId ::= INTEGER (1..maxReportConfigId[32]) [1]
| +-quantityConfig ::= SEQUENCE [0100] OPTIONAL:Exist
| | +-quantityConfigEUTRA ::= SEQUENCE OPTIONAL:Omit
| | +-quantityConfigUTRA ::= SEQUENCE [0] OPTIONAL:Exist
| | | +-measQuantityUTRA-FDD ::= ENUMERATED [cpich-EcN0]
| | | +-measQuantityUTRA-TDD ::= ENUMERATED [pccpch-RSCP]
| | | +-filterCoefficient ::= ENUMERATED OPTIONAL:Omit
| | +-quantityConfigGERAN ::= SEQUENCE OPTIONAL:Omit
| | +-quantityConfigCDMA2000 ::= SEQUENCE OPTIONAL:Omit
| | +-EXTENSION ::= SEQUENCE [0]
| | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| +-measGapConfig ::= CHOICE [release] OPTIONAL:Exist
| | +-release ::= NULL
| +-s-Measure ::= INTEGER OPTIONAL:Omit
| +-preRegistrationInfoHRPD ::= SEQUENCE OPTIONAL:Omit
| +-speedStatePars ::= CHOICE OPTIONAL:Omit
| +-EXTENSION ::= SEQUENCE [0]
| +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
+-mobilityControlInfo ::= SEQUENCE OPTIONAL:Omit
+-dedicatedInfoNASList ::= SEQUENCE OF OPTIONAL:Omit
+-radioResourceConfigDedicated ::= SEQUENCE [000100] OPTIONAL:Exist
| +-srb-ToAddModList ::= SEQUENCE OF OPTIONAL:Omit
| +-drb-ToAddModList ::= SEQUENCE OF OPTIONAL:Omit
| +-drb-ToReleaseList ::= SEQUENCE OF OPTIONAL:Omit
| +-mac-MainConfig ::= CHOICE [explicitValue] OPTIONAL:Exist
| | +-explicitValue ::= SEQUENCE [110]
| | +-ul-SCH-Config ::= SEQUENCE [11] OPTIONAL:Exist
| | | +-maxHARQ-Tx ::= ENUMERATED [n5] OPTIONAL:Exist
| | | +-periodicBSR-Timer ::= ENUMERATED [infinity] OPTIONAL:Exist
| | | +-retxBSR-Timer ::= ENUMERATED [sf10240]
| | | +-ttiBundling ::= BOOLEAN [FALSE]
| | +-drx-Config ::= CHOICE [setup] OPTIONAL:Exist
| | | +-setup ::= SEQUENCE [0]
| | | +-onDurationTimer ::= ENUMERATED [psf6]
| | | +-drx-InactivityTimer ::= ENUMERATED [psf1920]
| | | +-drx-RetransmissionTimer ::= ENUMERATED [psf16]
| | | +-longDRX-CycleStartOffset ::= CHOICE [sf2560]
| | | | +-sf2560 ::= INTEGER (0..2559) [0]
| | | +-shortDRX ::= SEQUENCE OPTIONAL:Omit
| | +-timeAlignmentTimerDedicated ::= ENUMERATED [infinity]
| | +-phr-Config ::= CHOICE OPTIONAL:Omit
| | +-EXTENSION ::= SEQUENCE [00]
| | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
| +-sps-Config ::= SEQUENCE OPTIONAL:Omit
| +-physicalConfigDedicated ::= SEQUENCE OPTIONAL:Omit
| +-EXTENSION ::= SEQUENCE [00]
| +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
+-securityConfigHO ::= SEQUENCE OPTIONAL:Omit
+-nonCriticalExtension ::= SEQUENCE OPTIONAL:Omit
The measurement object is a UTRA carrier :measObjectUTRA withcarrierFreq [9800] . That is the UARFCN the UE is told to look at.One cell is named for CGI reporting :cellForWhichToReportCGI is present and resolves toutra-FDD [9] . Primary scrambling code 9 is the cell the network wants identified.The report purpose says so explicitly : insidereportConfigInterRAT the trigger is periodical andpurpose ::= ENUMERATED [reportCGI] . 36.331 allows three values there, and this is the one that asks for a global identity rather than a signal level.The network asks for it once :maxReportCells [1] ,reportInterval [ms1024] andreportAmount [r1] . One cell, one report.DRX is set up in the same message :drx-Config issetup , withonDurationTimer [psf6] andlongDRX-CycleStartOffset [sf2560] . This is the arrangement the paragraph above describes, visible as configuration.The measurement quantity is EcN0 :measQuantityUTRA-FDD ::= ENUMERATED [cpich-EcN0] , which matters for the second capture because it decides which result fields can appear.
Decoded Measurement Report from the same tester log. Again a capture rather than specification text, and left exactly as it was recorded.
+-measurementReport ::= SEQUENCE
+-criticalExtensions ::= CHOICE [c1]
+-c1 ::= CHOICE [measurementReport-r8]
+-measurementReport-r8 ::= SEQUENCE [0]
+-measResults ::= SEQUENCE [1]
| +-measId ::= INTEGER (1..maxMeasId[32]) [1]
| +-measResultPCell ::= SEQUENCE
| | +-rsrpResult ::= INTEGER (0..97) [85]
| | +-rsrqResult ::= INTEGER (0..34) [28]
| +-measResultNeighCells ::= CHOICE [measResultListUTRA] OPTIONAL:Exist
| | +-measResultListUTRA ::= SEQUENCE OF SIZE(1..maxCellReport[8]) [1]
| | +-MeasResultUTRA ::= SEQUENCE [1]
| | +-physCellId ::= CHOICE [fdd]
| | | +-fdd ::= INTEGER (0..511) [9]
| | +-cgi-Info ::= SEQUENCE [110] OPTIONAL:Exist
| | | +-cellGlobalId ::= SEQUENCE
| | | | +-plmn-Identity ::= SEQUENCE [1]
| | | | | +-mcc ::= SEQUENCE OF SIZE(3) OPTIONAL:Exist
| | | | | | +-MCC-MNC-Digit ::= INTEGER (0..9) [0]
| | | | | | +-MCC-MNC-Digit ::= INTEGER (0..9) [0]
| | | | | | +-MCC-MNC-Digit ::= INTEGER (0..9) [1]
| | | | | +-mnc ::= SEQUENCE OF SIZE(2..3) [2]
| | | | | +-MCC-MNC-Digit ::= INTEGER (0..9) [0]
| | | | | +-MCC-MNC-Digit ::= INTEGER (0..9) [1]
| | | | +-cellIdentity ::= BIT STRING SIZE(28) [0000000000000000000000000000]
| | | +-locationAreaCode ::= BIT STRING SIZE(16) [0000000010000000]
| | | +-routingAreaCode ::= BIT STRING SIZE(8) [00000000] OPTIONAL:Exist
| | | +-plmn-IdentityList ::= SEQUENCE OF OPTIONAL:Omit
| | +-measResult ::= SEQUENCE [00]
| | +-utra-RSCP ::= INTEGER OPTIONAL:Omit
| | +-utra-EcN0 ::= INTEGER OPTIONAL:Omit
| | +-EXTENSION ::= SEQUENCE [0]
| | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| +-EXTENSION ::= SEQUENCE [00]
| +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
+-nonCriticalExtension ::= SEQUENCE OPTIONAL:Omit
It answers the measId the request set up :measId [1] , and the neighbour results arrive asmeasResultListUTRA .The same cell comes back :physCellId ::= CHOICE [fdd] withfdd [9] . Scrambling code 9 was asked for and scrambling code 9 answered.cgi-Info is the payload : it is markedOPTIONAL:Exist , and everything the page is about sits underneath it.The PLMN arrives digit by digit :mcc reads 0, 0, 1 andmnc reads 0, 1. MCC 001 with MNC 01 is the test PLMN, so this log came from a tester rather than a live network.cellIdentity is 28 bits, not two octets : the capture showsBIT STRING SIZE(28) , and 36.331 definesCellGlobalIdUTRA that way. The two octet CI in the figure near the top of this page is the GERAN field, and this is not it.locationAreaCode is carried separately :BIT STRING SIZE(16) , which is the two octets, sitting beside cellGlobalId rather than inside it, with an 8 bitroutingAreaCode after it.No signal level is reported :utra-RSCP andutra-EcN0 are bothOPTIONAL:Omit . A reportCGI report is about identity, and it does not have to carry a measurement.
reportCGI is a purpose, not a separate procedure : the same measurement machinery carries it, with one enumerated value changed.The network names the cell it wants : cellForWhichToReportCGI carries the scrambling code, so the UE is not asked to identify everything it can hear.DRX and CGI reading belong together : the UE has to decode the target cell's MIB and SIBs, and that takes longer than a measurement gap. The same message does both, asking for the CGI and setting up the DRX that makes room to read it.A CGI report can carry no measurement at all : both UTRA quantities are omitted here, which is normal when the purpose is identity.Read the two captures together : scrambling code 9 appears in both, once as a request and once as an answer. That pairing is the quickest way to check a CGI problem in a log.
Reference
- 23.003 : 3GPP - Numbering, addressing and identification, v20.0.0. Clause 4.3.1 (Cell Identity and Cell Global Identification), clause 19.4.2.10 (Global eNodeB-ID), clause 19.6 (ECI and ECGI) and clause 19.6A (NCI and NCGI).
- 36.331 : 3GPP - E-UTRA; Radio Resource Control (RRC); Protocol specification, v19.3.0. CellGlobalIdUTRA, CellGlobalIdEUTRA, CellIdentity and ReportConfigInterRAT.