Skip to content

Commit 91b849d

Browse files
committed
updated WHATSNEW for v1.6.0
1 parent 18d3405 commit 91b849d

2 files changed

Lines changed: 309 additions & 1 deletion

File tree

Version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.5.2
1+
1.6.0

WHATSNEW.md

Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,313 @@
11
# What's New in Simu5G
22

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+
3311
## v1.5.2 (2026-07-30)
4312

5313
This release corrects the names of the per-bearer PDCP and RLC entity modules

0 commit comments

Comments
 (0)