openthread-br: update to 2026.09.0 - #30427
Conversation
openwrt-ai
left a comment
There was a problem hiding this comment.
Reviewed 4 new commits against upstream ot-br-posix at v2026.09.0 (tag fd872ab9d4afdfaf034b3b1154fed08b8b6d1e43). The version bump itself checks out: the tag exists, PKG_RELEASE is correctly reset to 1, patch 101 is genuinely upstream now (third_party/CMakeLists.txt does the pkg_check_modules(CJSON libcjson) dance, so +cJSON still buys you the system library), OTBR_DUA_ROUTING no longer exists upstream, --rest-listen-address / --rest-listen-port match realmain.cpp, the Vendor name must be set. string is verbatim, the 0.3.0 fallback claim is correct (project(openthread-br VERSION 0.3.0)), and <vendor> <product> is indeed how border_agent.cpp:194 composes the MeshCoP base name.
The one finding I'd treat as merge-blocking is the missing nftables kernel-module dependencies (inline on the +libnftnl line) — with OTBR_NFTABLES=ON a failed firewall install is SuccessOrDie, so on an image without fw4 this turns a working daemon into one that aborts at startup. The rest are documentation/commit-message accuracy and one question about the shipped marker file.
Commit checks
- 8af420e "openthread-br: update to 2026.09.0" — the message accounts for every other build-option change (vendor/product name,
OTBR_VERSION, the dropped patches, the LuCI app) but never mentions that the commit also drops-DOTBR_DNSSD_DISCOVERY_PROXY=ON,-DOTBR_DUA_ROUTING=ONand-DOTBR_SRP_ADVERTISING_PROXY=ON. All three removals look correct —OTBR_DUA_ROUTINGis gone upstream, and withOTBR_MDNSset the OT-core proxies now default on, so keeping either of the other two would hitmessage(FATAL_ERROR "Only one Advertising Proxy can be enabled.")/"Only one Discovery Proxy can be enabled."inetc/cmake/options.cmake— but three feature-visible options disappearing silently is exactly the kind of hunk a reader will stop on. A sentence saying they are now the OT-core equivalents would close it. - 644e613 "openthread-br: use the in-process nftables firewall backend" — the message's premise ("The package builds with the default firewall enabled, and that backend shells out to ipset, iptables and ip6tables at runtime") does not match the Makefile, which sets and keeps
-DOT_FIREWALL=OFF. Details and references inline on the-DOTBR_NFTABLES=ONline.
f5dbd03 and 50d6602 match their diffs.
CI on 644e613 is green on all three FormalityCheck runs, with the build/test workflows not yet reported — nothing to attribute to this diff.
Generated by Claude Code
644e613 to
0c2e300
Compare
The package has never had a Thread firewall: the OpenThread posix platform's own one (OT_FIREWALL) produces ipset/ip6tables rules, which is why firewall integration was disabled here pending openthread/ot-br-posix#1675. The 2026.09.0 release delivers what that issue asked for: an in-process nftables backend. Build with OTBR_NFTABLES=ON: otbr-agent then installs the Thread ingress filter and the NAT44 masquerade itself, through nftables in an isolated table. This needs nf_tables kernel support at runtime, so add kmod-nft-core and kmod-nft-nat alongside the userspace libmnl/libnftnl: with the backend compiled in, a failed firewall install aborts the agent rather than silently forwarding unfiltered traffic. OT_FIREWALL deliberately stays off; the in-process backend replaces its ipset producer wholesale. Also ship the marker file the build writes. Nothing on the target reads it today - it records which backend owns the rules, as a debugging aid and for anything that later needs to tell the backends apart. Mirrors openwrt/packages#30427 for the openwrt/packages copy of this packaging. Assisted-by: AI Signed-off-by: Christian Glombek <c.glombek@cosa.systems>
The package has never had a Thread firewall: the OpenThread posix platform's own one (OT_FIREWALL) produces ipset/ip6tables rules, which is why firewall integration was disabled here pending openthread/ot-br-posix#1675. The 2026.09.0 release delivers what that issue asked for: an in-process nftables backend. Build with OTBR_NFTABLES=ON: otbr-agent then installs the Thread ingress filter and the NAT44 masquerade itself, through nftables in an isolated table. This needs nf_tables kernel support at runtime, so add kmod-nft-core and kmod-nft-nat alongside the userspace libmnl/libnftnl: with the backend compiled in, a failed firewall install aborts the agent rather than silently forwarding unfiltered traffic. OT_FIREWALL deliberately stays off; the in-process backend replaces its ipset producer wholesale. Also ship the marker file the build writes. Nothing on the target reads it today - it records which backend owns the rules, as a debugging aid and for anything that later needs to tell the backends apart. Mirrors openwrt/packages#30427 for the openwrt/packages copy of this packaging. Assisted-by: AI Signed-off-by: Christian Glombek <c.glombek@cosa.systems> (cherry picked from commit d9c27cc)
The package has never had a Thread firewall: the OpenThread posix platform's own one (OT_FIREWALL) produces ipset/ip6tables rules, which is why firewall integration was disabled here pending openthread/ot-br-posix#1675. The 2026.09.0 release delivers what that issue asked for: an in-process nftables backend. Build with OTBR_NFTABLES=ON: otbr-agent then installs the Thread ingress filter and the NAT44 masquerade itself, through nftables in an isolated table. This needs nf_tables kernel support at runtime, so add kmod-nft-core and kmod-nft-nat alongside the userspace libmnl/libnftnl: with the backend compiled in, a failed firewall install aborts the agent rather than silently forwarding unfiltered traffic. OT_FIREWALL deliberately stays off; the in-process backend replaces its ipset producer wholesale. Also ship the marker file the build writes. Nothing on the target reads it today - it records which backend owns the rules, as a debugging aid and for anything that later needs to tell the backends apart. Mirrors openwrt/packages#30427 for the openwrt/packages copy of this packaging. Assisted-by: AI Signed-off-by: Christian Glombek <c.glombek@cosa.systems> (cherry picked from commit d9c27cc)
Firewall integration has been disabled here pending openthread/ot-br-posix#1675; the 2026.09.0 release delivers it as an in-process nftables backend. Enable it: otbr-agent now installs the Thread ingress filter and the NAT44 masquerade itself, in an isolated nftables table. Add kmod-nft-core and kmod-nft-nat for the runtime nf_tables support alongside the userspace libmnl/libnftnl: with the backend compiled in, a failed firewall install aborts the agent rather than silently forwarding unfiltered traffic. Also ship the marker file the build writes, recording which backend owns the rules. Mirrors openwrt/packages#30427. Assisted-by: AI Signed-off-by: Christian Glombek <c.glombek@cosa.systems>
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Pull request overview
Updates the OpenWrt openthread-br package to the upstream v2026.09.0 release while carrying forward packaging/behavior adjustments (REST bind configurability, OpenThread internal mDNS, nftables firewall backend) and adding a basic functional smoke test.
Changes:
- Bump
openthread-brto v2026.09.0 and adjust CMake options/dependencies (nftables backend, internal mDNS, vendor/product/version settings). - Make REST listen address/port configurable via netifd protocol options and document the security implications.
- Drop now-upstream patches (external cJSON, LuCI icons), remove the in-tree LuCI app packaging, and add a functional smoke test script.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| net/openthread-br/test.sh | Adds a functional smoke test to exercise otbr-agent/ot-ctl option parsing and runtime closure. |
| net/openthread-br/patches/102-openwrt-fix-LuCI-icons.patch | Removes a patch that is now upstream. |
| net/openthread-br/patches/101-rest-Permit-to-externally-provide-cJSON-library.patch | Removes a patch that is now upstream. |
| net/openthread-br/files/openthread-proto.sh | Adds netifd options for REST bind address/port and removes mdnsd service checks. |
| net/openthread-br/README.md | Updates documentation for 2026.09.0 changes, nftables backend, internal mDNS, REST binding, and LuCI packaging split. |
| net/openthread-br/Makefile | Updates versioning, dependencies, CMake options, installs nftables backend marker, and drops in-tree LuCI app packaging. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
openwrt-ai
left a comment
There was a problem hiding this comment.
Re-reviewed the range 644e613..0c2e300. The force-push rewrote all four commits, but only two carry content changes since my last pass: the Makefile gained the two kmod dependencies, and the README "Firewall support" section was rewritten. Commits 2 and 3 are byte-identical rebases; commit 1 changed only its message.
All four findings from my previous review are addressed:
- kmod dependencies —
+kmod-nft-coreand+kmod-nft-natare now inDEPENDS, tab-indented and alphabetically placed next to+kmod-tun, matching upstream's example Makefile swap.kmod-nft-natalready pullskmod-nft-corevianetfilter.mk:1371, so listing both is redundant but harmless and mirrors upstream. This was the merge-blocking one; it's resolved. - Firewall mechanism — the commit message and README no longer claim the package shelled out to ipset/iptables. The new text ("no Thread ingress filter existed at all") matches the Makefile, which has carried
-DOT_FIREWALL=OFFfor as far back as the file's history goes here. - Marker file — reworded to a debugging aid that nothing on the target reads today. Accurate.
- Stale README section — folded into "Packaging decisions" rather than left contradicting an appended tail section; the duplicate tail section is gone.
One new documentation-accuracy nit inline on the rewritten paragraph: the clause explaining why OT_FIREWALL stays off is contradicted by the same CMake guard I cited last round, and by upstream's example package pairing the two options. Non-blocking, and the rest of that paragraph already carries the rationale.
CI on 0c2e300: all three FormalityCheck runs green; the build/test workflows have not reported yet. Nothing to attribute to this diff.
Commit messages all match their diffs now — commit 1 picked up the paragraph on the three dropped CMake options, and commit 4's message was rewritten alongside its content.
Generated by Claude Code
Update from a 2025-06-12 snapshot to the v2026.09.0 release and switch to release-tag versioning. The in-tree LuCI app is gone: upstream removed it in this release (openthread/ot-br-posix#3326), so the luci-app-openthread package cannot be built from this source any more. A maintained replacement is proposed as a proper LuCI app in openwrt/luci#8871. OTBR_VENDOR_NAME and OTBR_PRODUCT_NAME are now required (the 2026.08.0 release removed the built-in defaults) and are set to the values those defaults had, so existing users' border routers keep their MeshCoP instance name. OTBR_VERSION is set so --version reports the release rather than the CMake project version; see the README for the reasoning on both. The gcc14 build fix is still needed: the bundled mbedtls still lacks the upstream fix at this release's submodule pins. Three CMake options also leave the invocation: OTBR_DUA_ROUTING no longer exists upstream, and OTBR_DNSSD_DISCOVERY_PROXY and OTBR_SRP_ADVERTISING_PROXY now default appropriately from OTBR_MDNS (forcing them ON alongside the OT-core proxies is a CMake FATAL_ERROR once the internal mDNS is selected). Also add a functional smoke test. Signed-off-by: Christian Glombek <c.glombek@cosa.systems> Assisted-By: AI
As of the 2026.07.0 update, otbr-agent's REST API defaults to listening on 127.0.0.1, so remote clients (e.g. Home Assistant on another host) can no longer reach it. Add rest_listen_address and rest_listen_port proto options and pass them through to otbr-agent when set; leaving them unset keeps the secure loopback-only default. Also drop the leftover unused 'foobar' proto config option. Signed-off-by: Christian Glombek <c.glombek@cosa.systems> Assisted-By: AI (cherry picked from commit caacf17)
Switch OTBR_MDNS from mDNSResponder to openthread, drop the mdnsd and mDNSResponder dependencies, and remove the proto handler's mdnsd service check, which would otherwise refuse to start otbr-agent now that mdnsd is no longer installed. This follows upstream, which made the internal implementation the default in openthread/ot-br-posix#2996 and uses it in its own OpenWrt example package, and it lets otbr-agent share a router with umdns, which is what advertises the router's procd-registered services (ssh, samba and the like) and resolves <hostname>.local. The two can coexist because they never contend for a name: OpenThread's mDNS names its host after the Thread extended address, while umdns keeps <hostname>.local. Both bind UDP 5353 with SO_REUSEADDR and each answers only for its own records. mDNSResponder instead takes its name from gethostname(), so it and umdns race for the same name, and the loser either stops announcing without logging anywhere procd captures or, if neither notices, both keep claiming it. That is the conflict with a running mdnsd noted in openwrt#29784. Border router discovery is unaffected: in this mode OpenThread's own border agent registers the _meshcop._udp service (its OPENTHREAD_CONFIG_BORDER_AGENT_MESHCOP_SERVICE_ENABLE follows OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE), and OTBR's publisher is disabled by design, so clients such as Home Assistant still find the border router. Note that OpenThread's mDNS serves a single interface, the one given by the backbone_network option, so Thread service records are announced on that network only. Signed-off-by: Christian Glombek <c.glombek@cosa.systems> Assisted-By: AI (cherry picked from commit 233cfaa)
The package has never had a Thread firewall: the OpenThread posix platform's own one (OT_FIREWALL) produces ipset/ip6tables rules, so it is disabled here, and the README documents waiting for openthread/ot-br-posix#1675 to revisit that. v2026.09.0 delivers what that issue asked for: an in-process nftables backend. Build with OTBR_NFTABLES=ON: otbr-agent then installs the Thread ingress filter and the NAT44 masquerade itself, through nftables in an isolated table, matching what an fw4-based OpenWrt runs. This needs nf_tables kernel support at runtime, so add kmod-nft-core and kmod-nft-nat alongside the userspace libmnl/libnftnl: with the backend compiled in, a failed firewall install aborts the agent rather than silently forwarding unfiltered traffic. OT_FIREWALL deliberately stays off; the in-process backend replaces its ipset producer wholesale. Also ship the marker file the build writes. Nothing on the target reads it today - it records which backend owns the rules, as a debugging aid and for anything that later needs to tell the backends apart. Signed-off-by: Christian Glombek <c.glombek@cosa.systems> Assisted-By: AI
0c2e300 to
5b15965
Compare
Update openthread-br from the 2025-06-12 snapshot to the v2026.09.0 release, carrying the packaging improvements from #30091 and #30096 on top. Supersedes both.
OTBR_VENDOR_NAME/OTBR_PRODUCT_NAMEare now required and are set to the values the removed built-in defaults had, so existing users' border routers keep their MeshCoP instance name. Patches 101 (external cJSON) and 102 (LuCI icons) are upstream; the gcc14/mbedtls fix is still needed at this release's submodule pins. Also adds a functional smoke test.Compile-tested in the CI SDK image (x86_64 snapshot), with
PKG_MIRROR_HASHgenerated by the SDK's own source pack. Written with AI assistance (Assisted-By trailers); I've reviewed and understand all of it and will answer questions myself.