Release v3.4.0 - May 1, 2026 #96
Replies: 5 comments 33 replies
|
first of all, thanks for your outstanding work. unfortunately, I ran into a little problem: flash_efr32.sh did not update radio.conf. Info on the gateway. SoC was flashed on May 1st, at 23:42. flash_efr32 was run on May 2nd. radio.conf not yet edited. |
|
Hello jnilo1, thank you for this outstanding work. I updated one fully stock gateway with usb-serial without any problems and it is working great as router and recognized in Z2M I have problem with my first gateway, I have version 1.x.x on it? Or older version? I can not restart to bootloader to flash version 3. |
|
After upgrading to 3.4 from 2.x, the border router is quite unstable, I have to reboot it after some days, at least in one location. I had to reset the border router completely once as well. |
|
@sipe That's the confirmation. The fresh-DB log is clean from end to end — zero Direct answer to your A vs B questionGo with B — re-pair from the clean database. Reasons:
One small ask, if you have the patienceWhile you're re-pairing, the only thing that would genuinely help the project is a targeted check on one device. The two units in your inventory most likely to be the trigger are your Either way, no dichotomy, no extra setup — just one device, one window of logs. Don't worry about it if you'd rather just get back to normal. Side curiosityYou have two Thanks for the methodical testing — that's exactly what nailed this down. |
Uh oh!
There was an error while loading. Please reload this page.
A hardening release. Closes the
S40buttonSIGSEGV known issue from v3.3.0, reduces the worst-case latency on the Zigbee / Thread radio path under heavy LAN load, and applies four out-of-band kernel driver audits as small, bounded patch sets.S40button— closes the v3.3.0 known issueThe v3.3.0 release notes flagged an intermittent SIGSEGV in
S40buttonafter some hours of idle polling — when it died, you silently lost the long-press →recover_efr32recovery surface until the next reboot. Root cause was the busyboxashinterpreter occasionally crashing on the loop that polled/dev/memwithdevmem.S40buttonis now a static C daemon (~112 KB, Lexra musl), with the same observable behaviour: 100 ms poll on GPIO 9, 3-sample debounce, 5 s long-press firesrecover_efr32 -q, status LED blinks during the hold for visual feedback. No more interpreter-level crash.To verify it's running on a v3.4.0 gateway:
Lower worst-case latency on the Zigbee / Thread radio path
Under simultaneous heavy Ethernet activity (e.g. iperf-class TCP) and Spinel / EZSP burst (Matter commissioning attestation, Z2M device discovery), the kernel's CPU IRQ priority order used to favour Ethernet over UART1 — the bus carrying the radio link. At 460800 baud the UART RX FIFO has roughly 350 µs of latency budget; if an Ethernet ISR ran first and took longer than that, the FIFO could overrun and lose Zigbee bytes.
This release swaps the priorities at the interrupt-controller routing level: UART1 is now serviced before the Ethernet switch IRQ. The asymmetric benefit is:
Validated by an overnight OT-RCP soak at 460800 baud with two paired Sleepy End Devices: 8 h+ stable, zero overruns measured by a periodic LSR sampler, no
HandleRcpTimeout(). Not a fix for an active bug — a margin improvement that makes the gateway slightly more tolerant to bursts during Matter commissioning while LAN traffic is heavy.Ethernet TX no longer leaks slab tailroom on short frames
The Ethernet driver was DMA'ing
max(skb->len, 60)bytes for every transmitted frame, but never extending the SKB itself when sending a short frame. The bytes betweenskb->lenand 60 came from slab tailroom — uninitialised memory that may briefly hold data from another kernel user — and the switch DMA was happily transmitting them on the wire on every short frame (ARP, IPv4 minimal, etc.). Low-impact but undesirable.Fixed: the driver now calls
skb_put_padto(skb, 60)before the cache flush, which extends the SKB and zero-fills the new tail.ip link set eth0 down/upis safe under loadIf you ran an
ip link set eth0 down; ip link set eth0 upcycle while traffic was flowing (e.g. via an init script restart), the nextupwould reuse descriptor rings the previousdownhad left in indeterminate ownership. Symptoms ranged from harmless (a few dropped packets at the moment of the cycle) to noticeable (TX stuck after a watchdog timeout, SKB leaks). Validated with a 50-cycle down/up loop under traffic on the dev gateway: zerorx_errors, zerotx_errorsafter the patch.This is a defensive fix — most users will never trigger the failure mode — but if you ever script
ip linkcycles, it's now safe.Kernel driver hardening pass
Four small out-of-band audits were applied to the custom RTL8196E kernel drivers. Most are robustness / API alignment, not user-visible bugs:
.irq_unmaskcallback. Plus the priority swap above.For traceability, each driver now ships a local
AUDIT.mdthat maps every audit finding ID to its commit SHA and status (fixed, deferred, or rejected — including the rejected ones, with the reasoning, so a future audit pass doesn't re-litigate decisions already made on hardware).No regression measured
Same iperf baseline as v3.3.0 (TCP RX 93.9 / TX 70.2 Mbit/s vs 93.9 / 71 reference), 5-min stress retransmit rate 0.00 %, no new kernel warnings or errors during 5 back-to-back reboots, no UART overrun on the overnight OTBR soak.
Upgrade
In-place upgrade. No EFR32 reflash needed — the
.gblartefacts (NCP / RCP / OT-RCP / Router) are unchanged from v3.3.0.radio.confand sysfs interfaces are unchanged.If you'd rather not type the password during an unattended upgrade:
(Requires
sudo apt install sshpass.)Full changelogs
AUDIT.mdin the kernel treeAll reactions