|
1 | 1 | # What's New in Simu5G |
2 | 2 |
|
| 3 | +## v1.6.0 (2026-07-31) |
| 4 | + |
| 5 | +This release adds a standards-compliant NR RLC to Simu5G. RLC Unacknowledged |
| 6 | +Mode and Acknowledged Mode per TS 38.322 contributed by Esteban Egea Lopez have |
| 7 | +been integrated into the mainline and are now the default on NR bearers. The RLC |
| 8 | +entity modules were restructured into shared bases with LTE and NR concrete |
| 9 | +implementations. The previously incomplete LTE RLC AM was reimplemented per TS |
| 10 | +36.322 on the same architecture. Radio link failure detection with RRC |
| 11 | +re-establishment was added. |
| 12 | + |
| 13 | +Tested with INET-4.5.4 and OMNeT++ 6.3, compatible with INET-4.6.0 and OMNeT++ |
| 14 | +6.1 through 6.4. |
| 15 | + |
| 16 | +### NR RLC (TS 38.322) |
| 17 | + |
| 18 | +Simu5G's RLC layer so far implemented only the LTE wire format (TS 36.322: FI |
| 19 | +framing with concatenation, one sequence number per PDU), and NR bearers used |
| 20 | +it as well. This release adds a faithful NR RLC: |
| 21 | + |
| 22 | +- **Unacknowledged Mode**: `NrRlcUmTxEntity`/`NrRlcUmRxEntity` perform SI + |
| 23 | + byte-offset (SO) segmentation without concatenation -- one SDU or SDU |
| 24 | + segment per PDU, one sequence number per SDU, `NrRlcUmDataPdu` on the wire. |
| 25 | + Reassembly is byte-coverage based (`RlcUmReceptionBuffer`) over an SDU-SN |
| 26 | + window with `t-Reassembly`. The SN field length is selectable (6 or 12 bits). |
| 27 | + |
| 28 | +- **Acknowledged Mode**: `NrRlcAmTxEntity`/`NrRlcAmRxEntity` perform SO |
| 29 | + segmentation with re-segmentation on retransmission (via |
| 30 | + `RlcRetransmissionBuffer`), `pollByte`/`pollPDU`-driven status polling |
| 31 | + with `t-PollRetransmit`, and reassembly with `t-Reassembly` and |
| 32 | + `t-StatusProhibit`, using the `NrRlcAmDataPdu`/`NrRlcAmStatusPdu` formats |
| 33 | + over a 12- or 18-bit sequence number window. |
| 34 | + |
| 35 | +- **NR bearers use the NR RLC by default**: `BearerManagement` gained the |
| 36 | + `nrRlcUmEntityModuleType` and `nrRlcAmEntityModuleType` parameters (default: |
| 37 | + the new `NrRlcUmEntity`/`NrRlcAmEntity` compound modules), and selects them |
| 38 | + for every bearer that has an NR node at either end; LTE bearers keep the |
| 39 | + `lteRlc*` ones. RLC framing is a function of the RAT rather than a free |
| 40 | + choice, so there is no LTE/NR mix; TM, being transparent, is identical for |
| 41 | + both RATs and has no NR variant. |
| 42 | + |
| 43 | +This changes results in every NR simulation: the NR wire format has different |
| 44 | +per-PDU header sizes and a different segmentation/reassembly discipline than |
| 45 | +LTE FI framing, so packet timing, delay and throughput shift. (The MAC and |
| 46 | +scheduler groundwork for it -- one PDU per SDU or segment, several RLC PDUs |
| 47 | +multiplexed into one grant, exact octet-aligned header sizing -- shipped in |
| 48 | +v1.5.1 and is only now actually exercised.) A configuration that needs the |
| 49 | +previous behavior can point `nrRlcUmEntityModuleType` and |
| 50 | +`nrRlcAmEntityModuleType` back at the `LteRlcUmEntity`/`LteRlcAmEntity` |
| 51 | +compounds. |
| 52 | + |
| 53 | +The NR RLC UM and AM implementations were contributed by Esteban Egea Lopez |
| 54 | +(Universidad Politécnica de Cartagena). The code was originally published as |
| 55 | +the "Simu5G-1.3.1 RLC-AM" special release and rebased onto several Simu5G |
| 56 | +versions since; adapting it to the current RLC architecture was done by Attila |
| 57 | +Török (OpenSim Ltd). |
| 58 | + |
| 59 | +### RLC entity modules restructured |
| 60 | + |
| 61 | +The RLC entity module and class names were made consistent with their |
| 62 | +surroundings (`RlcMux`, `RlcTxEntityBase`, ...), the AM "Queue" names were |
| 63 | +normalized to "Entity", and each mode's two variants were factored into a |
| 64 | +shared base with LTE and NR concrete subclasses (`RlcUmTxEntityBase` with |
| 65 | +`LteRlcUmTxEntity`/`NrRlcUmTxEntity`, and likewise for the other three). The |
| 66 | +common shell -- MAC plumbing, D2D mode-switch machinery, UL burst-throughput |
| 67 | +accounting -- lives in the base; only buffering, PDU build, reassembly, window |
| 68 | +and timer logic is mode-specific. The renames: |
| 69 | + |
| 70 | + UmTxEntity -> LteRlcUmTxEntity TmTxEntity -> RlcTmTxEntity |
| 71 | + UmRxEntity -> LteRlcUmRxEntity TmRxEntity -> RlcTmRxEntity |
| 72 | + AmTxQueue -> LteRlcAmTxEntity |
| 73 | + AmRxQueue -> LteRlcAmRxEntity |
| 74 | + |
| 75 | +Configurations that name these NED types explicitly need to be updated. The |
| 76 | +`NrRlcUmEntity` and `NrRlcAmEntity` compounds are subclasses of |
| 77 | +`RlcUmEntityBase` and `RlcAmEntityBase` that bind their two sides to the NR |
| 78 | +concrete entities with `tx.typename`/`rx.typename`. |
| 79 | + |
| 80 | +### LTE RLC AM reimplemented per TS 36.322 |
| 81 | + |
| 82 | +Simu5G's original LTE RLC AM was derived from UMTS RLC (TS 25.322), it was |
| 83 | +incomplete, and no simulation configuration used it. What it implemented was not |
| 84 | +TS 36.322 compliant: the wire format was per-SDU fragmentation with a sequence |
| 85 | +number per fragment (no concatenation, no FI/LI, no poll bit), retransmission |
| 86 | +was driven by per-PDU timeouts that resent without any NACK, a PDU exhausting |
| 87 | +its retransmissions was silently discarded with no radio link failure |
| 88 | +indication, and status reporting was periodic rather than event-driven. |
| 89 | + |
| 90 | +It has been reimplemented from scratch on the architecture of the NR AM |
| 91 | +entity, whose TS 38.322 ARQ skeleton TS 36.322 shares; only the framing is |
| 92 | +LTE-specific: |
| 93 | + |
| 94 | +- One AMD PDU per MAC grant, built by concatenating queued SDUs and SDU |
| 95 | + fragments (FI framing, on the same PDU model the LTE UM entity uses). The |
| 96 | + built PDU, retained in the 512-entry (10-bit SN) transmission window, is the |
| 97 | + unit of ARQ. |
| 98 | +- NACK-driven retransmission with the `ACK_SN` + NACK-list STATUS PDU (the |
| 99 | + same `StatusPduData` structure the NR AM uses, including SOstart/SOend byte |
| 100 | + ranges), re-segmenting a retained PDU into AMD PDU segments when the grant |
| 101 | + is smaller than the PDU. |
| 102 | +- `pollPDU`/`pollByte`/`t-PollRetransmit` polling, `t-Reordering` and |
| 103 | + `t-StatusProhibit` at the receiver, and radio link failure at |
| 104 | + `maxRtxThreshold` retransmissions, wired to the same |
| 105 | + `BearerManagement` teardown and RRC re-establishment as the NR AM. |
| 106 | + |
| 107 | +Since no configuration could use the old LTE AM, this does not affect existing |
| 108 | +simulation results. |
| 109 | + |
| 110 | +### Selecting RLC AM |
| 111 | + |
| 112 | +Acknowledged Mode is now usable on both RATs, but nothing selects it by default: |
| 113 | +every bearer stays in the mode it had before, so existing simulations are |
| 114 | +unaffected. Two mechanisms choose the mode of a bearer, depending on whether |
| 115 | +SDAP is in the stack. |
| 116 | + |
| 117 | +Without SDAP, `Ip2Nic` classifies each packet into a traffic class by packet name |
| 118 | +(`VoIP*` -> conversational, `gaming*` -> interactive, `VoDPacket*` -> streaming, |
| 119 | +anything else -> background) and maps the class to an RLC mode with its |
| 120 | +`conversationalRlc`, `streamingRlc`, `interactiveRlc` and `backgroundRlc` |
| 121 | +parameters. They accept `"TM"`, `"UM"` and `"AM"`, and all four default to |
| 122 | +`"UM"` (which is the pre-v1.6.0 behavior, kept for backward compatibility). |
| 123 | + |
| 124 | +With SDAP in the stack (`hasSdap = true` on the NR NIC), `Ip2Nic` skips traffic |
| 125 | +classification entirely and the mode becomes a property of the DRB: every entry |
| 126 | +of `NrSdap.drbConfig` takes an optional `rlcType` field, again one of `"AM"`, |
| 127 | +`"UM"` and `"TM"`, and again defaulting to `"UM"`. For example: |
| 128 | + |
| 129 | + *.gnb.cellularNic.hasSdap = true |
| 130 | + *.gnb.cellularNic.sdap.drbConfig = [ |
| 131 | + {"drb": 0, "ue": 2049, "qfiList": [1, 2], "rlcType": "UM"}, |
| 132 | + {"drb": 1, "ue": 2049, "qfiList": [3, 4], "rlcType": "AM"}] |
| 133 | + |
| 134 | +Either way, both ends of a bearer must be configured with the same mode: each |
| 135 | +node builds its own RLC entity from its own configuration, so a mismatch leaves |
| 136 | +an AM entity facing a UM one. With `Ip2Nic`, this can be ensured by using `**.` |
| 137 | +wildcards; with SDAP, the UE's `drbConfig` entry for a DRB and the gNB's entry |
| 138 | +for the same DRB have to agree on `rlcType`. |
| 139 | + |
| 140 | +Which entity type then implements the mode follows from the RAT, as described |
| 141 | +above: an AM bearer with an NR node at either end runs the `NrRlcAmEntity` |
| 142 | +compound, an LTE one `LteRlcAmEntity`. TM is available on both, and is the same |
| 143 | +entity for both. |
| 144 | + |
| 145 | +### RLC validation scenarios |
| 146 | + |
| 147 | +The new `simulations/nr/rlc` and `simulations/lte/rlc` directories hold |
| 148 | +protocol-validation scenarios for the two RLC implementations: a single UE |
| 149 | +over `LteDummyChannelModel` -- which replaces propagation modelling with a |
| 150 | +configurable per-direction packet error rate, so with independent HARQ |
| 151 | +attempts the residual loss RLC sees is exactly `perDl^(maxHarqRtx+1)` -- with |
| 152 | +deterministic CBR traffic and the loss process on its own RNG. The scenarios |
| 153 | +sweep the error rate (`AM-Lossy`, with `UM-Lossy` as the no-ARQ contrast), |
| 154 | +force segmentation and re-segmentation on retransmission (`AM-Segmentation`), |
| 155 | +concatenation on LTE (`AM-Concatenation`), a transmission-window stall that |
| 156 | +must recover (`AM-WindowStall`), and a scripted mid-run coverage loss that |
| 157 | +must end in a radio link failure (`AM-RLF`) or in RRC re-establishment with |
| 158 | +the flow resuming (`AM-RLF-Reestablish`). Three scenarios cover the common |
| 159 | +usage patterns beyond a lossy downlink: `AM-Lossy-UL` (both RATs) runs the |
| 160 | +flow uplink, through the UE MAC's strict grant accounting; `TCP-AM` carries a |
| 161 | +TCP transfer over the lossy bearer, its acknowledgement stream putting data |
| 162 | +through the reverse direction of the same bearer; and |
| 163 | +`lte/test_handover VoIP-AM-Handover` runs bidirectional VoIP over AM with the |
| 164 | +UEs moving through handovers. |
| 165 | + |
| 166 | +Measured on both RATs: every AM configuration delivers every offered SDU at |
| 167 | +every loss rate in the sweep, uplink and downlink -- the AM guarantee -- |
| 168 | +while UM loses the predicted residual fraction, and the per-attempt HARQ |
| 169 | +error rate matches the configured error rate throughout. TCP makes steady |
| 170 | +progress over a downlink losing half its transmission attempts, and the |
| 171 | +handover scenario completes with zero application-level frame loss and no |
| 172 | +entities left behind at the old cell. |
| 173 | + |
| 174 | +Defects found in the NR AM implementation found using these scenarios |
| 175 | +were fixed. |
| 176 | + |
| 177 | +### Radio link failure and RRC re-establishment |
| 178 | + |
| 179 | +The RLC AM transmitters declare a radio link failure when a PDU exceeds |
| 180 | +`maxRtxThreshold` retransmissions (TS 38.322 5.3.2 / TS 36.322 5.2.1). This |
| 181 | +is now wired to a full teardown of the link: |
| 182 | + |
| 183 | +- `BearerManagement::scheduleRadioLinkFailure()` defers the teardown to a safe |
| 184 | + execution context (so that entity modules are never deleted from inside |
| 185 | + packet processing), then releases the link at both ends -- reaching the |
| 186 | + peer's `BearerManagement` through the `Binder` -- deleting the bearer's MAC |
| 187 | + (`deleteQueuesRadioLinkFailure()`, which also drops the node's in-flight HARQ |
| 188 | + feedback), RLC and PDCP state. |
| 189 | + |
| 190 | +- `Ip2Nic` gained `releaseUe()`/`resumeUe()`, and drops a released peer's DL |
| 191 | + and UL packets for as long as its context is released, modeling the RRC UE |
| 192 | + Context Release. Without this, the application kept pushing packets at |
| 193 | + torn-down entities, which crashed; handover does not have this problem only |
| 194 | + because it redirects the traffic to a new cell. |
| 195 | + |
| 196 | +- RRC re-establishment (TS 38.331 5.3.7) is modeled by its timers, the way |
| 197 | + handover signaling already is: `BearerManagement.t311` (cell selection) and |
| 198 | + `t301` (request to complete). When `t301` expires, the peer is un-released |
| 199 | + and its bearer re-establishes on demand. The default `t311 = 0s` disables |
| 200 | + re-establishment, that is, a radio link failure releases the UE to idle. |
| 201 | + |
| 202 | +This is inert in simulations that do not use RLC AM, as only the AM entities |
| 203 | +detect radio link failures. |
| 204 | + |
| 205 | +### RLC statistics recorded on the bearer entities |
| 206 | + |
| 207 | +The per-bearer RLC statistics -- `rlcDelay*`, `rlcThroughput*`, `rlcPduDelay*`, |
| 208 | +`rlcPduThroughput*`, `rlcPacketLoss*` and their D2D variants -- are now recorded |
| 209 | +on the RLC entity module of the bearer that produced them, instead of on an |
| 210 | +`RlcMux`. **Configurations and analysis files that refer to these results by |
| 211 | +module path need to be updated**, for example from |
| 212 | + |
| 213 | + SingleCell.ue[0].cellularNic.nrRlcMux.rlcDelayDl:mean |
| 214 | + |
| 215 | +to the bearer entity that measured it, such as |
| 216 | + |
| 217 | + SingleCell.ue[0].cellularNic.nrRlc-um-1-1.rx.rlcDelayDl:mean |
| 218 | + |
| 219 | +The old arrangement dates from when RLC was a single module per network |
| 220 | +interface, with the per-connection entities being plain C++ objects inside it: |
| 221 | +there was no per-bearer module to record on, so a receiving entity reached the |
| 222 | +*other* node's mux through the `Binder` and emitted the sample there -- an |
| 223 | +uplink measurement taken at the gNB was recorded as a result of the UE. Since |
| 224 | +v1.5.0 the entities are modules in their own right, one per peer and radio |
| 225 | +bearer, so each sample is now recorded where it is produced. Results for one UE |
| 226 | +across its bearers are obtained by aggregating over its entity modules in the |
| 227 | +analysis tool. |
| 228 | + |
| 229 | +The cell-level statistics (`rlcCellThroughput*`, `rlcCellPacketLoss*`) were |
| 230 | +**removed** rather than moved. The cell throughput was computed from a C++ |
| 231 | +`static` byte counter -- one counter for the entire simulation, not one per |
| 232 | +cell -- so in any scenario with more than one cell, every serving node reported |
| 233 | +approximately the network-wide total as its own cell throughput. (In |
| 234 | +`lte/multicell`, both eNBs report the global figure; the true per-cell values |
| 235 | +are about half of what was recorded.) The statistic was correct only in |
| 236 | +single-cell scenarios, where it equals the sum of the per-bearer |
| 237 | +`rlcThroughput*` results, which is how it can be obtained now. |
| 238 | + |
| 239 | +The MAC layer's `macCellThroughput*` statistics (including the D2D variant, |
| 240 | +which shared the same counter and thus mixed D2D and cellular bytes) had the |
| 241 | +identical defect and were removed for the same reason; the per-UE |
| 242 | +`macThroughput*` results remain. `macCellPacketLoss*`, which is computed |
| 243 | +per-cell correctly, is kept. |
| 244 | + |
| 245 | +Two side effects are worth noting. `rlcPacketLoss*` was emitted onto a module |
| 246 | +that did not declare it, so it was never recorded at all; it now is. And |
| 247 | +per-bearer results that used to be merged into one mux are visible separately |
| 248 | +per bearer, which is what makes the two legs of a Dual Connectivity split |
| 249 | +bearer individually measurable. |
| 250 | + |
| 251 | +### Other |
| 252 | + |
| 253 | +- **RLC statistics on NR bearers**: the NR RLC entities did not emit the |
| 254 | + per-bearer delay and throughput statistics that their LTE counterparts do, so |
| 255 | + those results were empty in NR simulations from the moment the NR RLC became |
| 256 | + the default on NR bearers. They are emitted now. `NrRlcAmRxEntity` also emits |
| 257 | + `rxWindowOccupation`, which was declared but never emitted; the NR UM |
| 258 | + transmitter's `requestedPDUSize`/`sentPDUSize` statistics were renamed to |
| 259 | + `requestedPduSize`/`sentPduSize`, and it gained the |
| 260 | + `receivedPacketFromUpperLayer`/`sentPacketToLowerLayer` counters. |
| 261 | + |
| 262 | +- **LteDummyChannelModel made usable**: the class had no NED type (so it could |
| 263 | + not be instantiated) and hardcoded error rates. It now has one, with `per` / |
| 264 | + `perDl` / `perUl` / `perD2D` and `harqReduction` parameters -- the |
| 265 | + per-direction rates volatile, so a coverage loss can be scripted as a |
| 266 | + function of time -- turning it into a controlled loss source for protocol |
| 267 | + validation: with `harqReduction = 1` the residual loss RLC sees is exactly |
| 268 | + `per^(maxHarqRtx+1)`. It also reports SINR/RSRP on every band; the |
| 269 | + single-element vector it used to return broke the AMC. |
| 270 | + |
| 271 | +- **MEC RNI**: `PacketFlowObserver` now also tracks NR SO PDUs, which carry no |
| 272 | + per-PDU RLC sequence number, by keying the per-SDU tracking on the PDCP |
| 273 | + sequence number instead. The reported delay is exact for the common |
| 274 | + unsegmented case; an SDU segmented across several MAC PDUs is accounted as |
| 275 | + delivered on the acknowledgement of its first segment. |
| 276 | + |
| 277 | +- **D2D**: D2D bearers run on the NR RLC as well; draining of the mode-switch |
| 278 | + holding buffer now takes place in the owning entity's context. |
| 279 | + |
| 280 | +- **Module references**: the RLC-to-RRC and RRC-to-Ip2Nic lookups became NED |
| 281 | + module-path parameters (`RlcMux.bearerManagementModule`, |
| 282 | + `BearerManagement.ip2nicModule`), continuing the `ModuleRefByPar` conversion. |
| 283 | + |
| 284 | +- **Simulations**: `nr/standalone` gained the `VoIP-DL-AM`, `VoIP-DL-AM-Lossy`, |
| 285 | + `VoIP-UL-AM`, `VoIP-DL-UM-NR` and `VoIP-UL-UM-NR` configurations, and |
| 286 | + `lte/demo` the `VoIP-AM` configuration, exercising the AM and the NR RLC |
| 287 | + paths. |
| 288 | + |
| 289 | +- **Fingerprint tests**: the five new configurations above were added to the |
| 290 | + suite, together with the RLC validation scenarios of `simulations/nr/rlc` |
| 291 | + and `simulations/lte/rlc` and the `VoIP-AM-Handover` configuration of |
| 292 | + `lte/test_handover` (157 configurations in total), and the rows were |
| 293 | + re-recorded for the NR RLC default and the statistics changes. |
| 294 | + |
| 295 | +- **Documentation**: the RLC entity documentation comments were retargeted at |
| 296 | + the compound modules that actually bind them -- several still referred to |
| 297 | + per-side `rlcUm{Tx,Rx}EntityModuleType` parameters, which v1.5.1 replaced |
| 298 | + with selection on the per-bearer compound -- and the `RlcUmEntityBase` / |
| 299 | + `RlcAmEntityBase` comments now name both of their concrete subclasses. |
| 300 | + |
| 301 | +- **Source housekeeping**: file headers were brought in line -- the contributed |
| 302 | + NR RLC sources now carry the standard Simu5G header naming their author |
| 303 | + instead of an LGPL blurb, files that had no header got one, and new files |
| 304 | + that had inherited the header of the file they were derived from now name |
| 305 | + their actual author. The redundant `@class` line was dropped from the C++ |
| 306 | + class comments, and `IRlcAmEntities.ned` was split into `IRlcAmTxEntity.ned` |
| 307 | + and `IRlcAmRxEntity.ned`, one interface per file. The interfaces themselves, |
| 308 | + and all type names, are unchanged. |
| 309 | + |
| 310 | + |
3 | 311 | ## v1.5.2 (2026-07-30) |
4 | 312 |
|
5 | 313 | This release corrects the names of the per-bearer PDCP and RLC entity modules |
|
0 commit comments