Repository navigation
The first release since the 20250225 snapshot.
Highlights
- User-plane tunnels without a kernel module.
--tunnelworks out of the box: the newebpfbackend carries
the traffic of the UEs in the kernel with eBPF programs (Linux 6.6 or later), and the newuserspacebackend
runs anywhere. gtp5g remains supported, and--tunnel-backend auto, the default, takes the first available of
ebpf,gtp5ganduserspace. - As fast as the kernel module, or faster. Through a free5GC UPF on one 16-core host, four UEs carry
10 Gbit/s uplink and 14 Gbit/s downlink in total withebpf, against 11 and 10.5 with gtp5g. The README has
the figures. - IPv6 and dual-stack PDU sessions, with
ue.pdusessiontype. - Several UEs carry traffic through one gNB:
--tunnelno longer requires--dedicatedGnb. - UEs driven while a test runs:
multi-ue --control-socket, thencontrolfor one action (idle, reconnect,
handover, deregister, register…) orrun-scenariofor a JSON list of them. - Procedure results as a JSON report (
--report-json) and Prometheus metrics (--metrics-addr). - Tagged releases come with Linux amd64 and arm64 archives and a
ghcr.io/hewlettpackard/packetrusher
image, andpacketrusher --versiontells which one is running.
Added
--tunnel-backend ebpf|gtp5g|userspace|auto. Onlyautofalls back: a backend requested by name that is not
available is an error.- gNB IDs of 22 to 32 bits and a cell ID:
gnodeb.plmnlist.gnbidlengthandcellid. multi-ue --number-of-gnbs, for handover targets;--numPduSessions 0, to only register;--loopCountand
--timeBeforeReregistration, for registration loops.ue.tunnelmtu. By default the MTU of a tunnel is the MTU of the N3 interface minus the 44 bytes of GTP-U.- The gNB re-establishes a lost AMF association, with a new NG Setup, after releasing the UEs it served.
- A gNB whose N2 or N3 address is unavailable tries the next ones.
- Each UE reports its own IMEISV, which strict cores can now decode.
- CI registers a UE against Open5GS, with traffic through its UPF, and against free5GC.
Changed
- gtp5g is optional, and its bundled version is 0.10.2, which builds on Linux up to 7.0.
- A handover keeps the address and the connections of the UE: the address is on
val<MSIN>, and the tunnel
alternates betweengtp0<MSIN>andgtp1<MSIN>. - A run removes the devices and routing rules that a killed one left behind.
- A gNB that cannot reach its AMF or complete NG Setup ends the command with an error, and Ctrl-C during startup
is a clean exit. - The first UE uses the configured gNB, and each following UE the next one.
- Logs are written by zap: a line is now
<time> <level> <message>. - Go 1.26.2 is required.
Fixed
- NGAP messages of a UE are handled in order (#102), and one UE's failed procedure no longer stops the simulator.
- Races during fast registration and deregistration cycles (#187).
- Duplicate gNB addresses after NG Setup retries (#138).
- Uplink GTP-U packets leave from the N3 address of their gNB.
- An N2 handover no longer loses the packets that the UPF still sends to the source gNB.
- The bundled gtp5g on recent kernels: a handover could leave a CPU dropping every packet until reboot (Linux
7.0), and the device was no longer lockless (Linux 6.12 and later), which capped its throughput. - The SQN is formatted on 6 bytes, and a PDU Session Resource Setup Request without NAS-PDU is accepted.
What's Changed
- Fix packet-rusher crashing when running multi-ue cmd with loop and certain time parameters by @gw-de in #160
- add source interface by @chen042531 in #161
- fix: integrate latest free5gc's refactored MILENAGE library by @linouxis9 in #163
- fix: off-by-one error in GNBUe.GetSelectedNssai by @yoursunny in #167
- fix: fmt errors flagged by go vet by @yoursunny in #169
- fix: format-san-to-6-bytes by @Alonza0314 in #171
- Upgrade to go-gtp5gnl v1.6.0 by @yoursunny in #170
- fix: set outer source IP for uplink GTP-U traffic by @yoursunny in #173
- Replace google/gopacket with gopacket/gopacket by @yoursunny in #174
- Represent IP addresses as netip.AddrPort by @yoursunny in #177
- Represent N3 IP address as netip.Addr by @yoursunny in #178
- Add logic to prevent gNB crash under PDU session create failure by @LSKhappychild in #188
- Add fallback mechanism for gNB N2 IP setting by @LSKhappychild in #190
- Make NAS-PDU in PDU Session Resource Setup Request List IE be optional by @LSKhappychild in #191
- Add local release in case of NGAP EI after pending UE Context Release… by @LSKhappychild in #192
- Add fallback mechanism for gNB N3 IP setting by @LSKhappychild in #195
- Fix #187: Resolve race conditions during rapid UE registration/deregistration by @ssam18 in #189
- feat(gtp5g): upgrade to upstream 4d3c39b by @Niahh in #196
- Send a decodable, per-UE IMEISV in Security Mode Complete by @midwell in #197
- Re-establish a lost AMF association instead of going silent by @midwell in #198
- Stop one UE's NGAP message from ending the simulator by @midwell in #200
- Share one GTP-U device per gNB so many UEs can carry traffic by @midwell in #199
- Fix a self-deadlock in the test 5GC when force-releasing PDU sessions by @midwell in #201
- Refuse PDU Session IDs outside 1..16 instead of crashing by @midwell in #202
- Make a UE's AMF UE NGAP ID and state safe for concurrent use by @midwell in #203
- Run build and test on pushes to main by @midwell in #204
- Send a rejected PDU session's retry from the UE's own goroutine by @midwell in #206
- fix: Preserve UE message order and finish shutdown after association loss by @linouxis9 in #208
- refactor: Upgrade free5GC codecs and aio5gc to the native APIs by @linouxis9 in #213
- fix: Keep tunnel ownership and UE sockets stable through handover by @linouxis9 in #209
- fix: Correct UE distribution and validate multi-ue arguments by @linouxis9 in #211
- fix: Repair the Docker workflow and document multi-gNB networking by @linouxis9 in #212
- fix: Calculate tunnel MTU from N3 and the full GTP-U overhead by @linouxis9 in #210
- feat: Export procedure results as JSON, CSV and Prometheus metrics by @linouxis9 in #214
- Support configurable gNB identifier widths by @linouxis9 in #215
- Add UE procedure controls and JSON scenarios by @linouxis9 in #216
- Add a userspace GTP-U backend by @linouxis9 in #217
- Support IPv6 and dual-stack PDU sessions by @linouxis9 in #218
- Report the build version and publish tagged releases by @linouxis9 in #219
- Preserve gNB addresses across setup retries by @linouxis9 in #220
- Make gNB startup cancellable and return its errors by @linouxis9 in #222
- Add an eBPF GTP-U backend by @linouxis9 in #223
- Add real-core interoperability CI by @linouxis9 in #224
- Remove leftovers of the recent changes by @linouxis9 in #228
- Simplify the tunnel setup by @linouxis9 in #229
- Simplify the procedure reports by @linouxis9 in #230
- Retry rejected PDU sessions with one mechanism by @linouxis9 in #231
- Dispatch NGAP messages through one queue per UE by @linouxis9 in #232
- Remove test-only seams and tidy argument validation by @linouxis9 in #233
- Switch logging from logrus to zap by @linouxis9 in #226
- Add the v2.0.0 changelog by @linouxis9 in #234
- Add a script measuring the user-plane throughput by @linouxis9 in #235
- Keep receiving from the source gNB after a handover by @linouxis9 in #238
- gtp5g: restore lockless transmit and TX stats on recent kernels by @linouxis9 in #237
- gtp5g: disable BH around the End Marker transmit by @linouxis9 in #236
- Update Codacy workflow actions by @linouxis9 in #225
New Contributors
- @gw-de made their first contribution in #160
- @chen042531 made their first contribution in #161
- @Alonza0314 made their first contribution in #171
- @LSKhappychild made their first contribution in #188
- @ssam18 made their first contribution in #189
- @Niahh made their first contribution in #196
- @midwell made their first contribution in #197
Full Changelog: 2025022...v2.0.0