Skip to content

Commit 8b322cc

Browse files
committed
updated WHATSNEW for v1.6.0
1 parent 0c7b522 commit 8b322cc

2 files changed

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

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

0 commit comments

Comments
 (0)