Skip to content

openthread-br: update to 2026.09.0 - #30427

Open
LorbusChris wants to merge 4 commits into
openwrt:masterfrom
LorbusChris:openthread-br-2026.09.0
Open

openthread-br: update to 2026.09.0#30427
LorbusChris wants to merge 4 commits into
openwrt:masterfrom
LorbusChris:openthread-br-2026.09.0

Conversation

@LorbusChris

Copy link
Copy Markdown

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.

Compile-tested in the CI SDK image (x86_64 snapshot), with PKG_MIRROR_HASH generated 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.

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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=ON and -DOTBR_SRP_ADVERTISING_PROXY=ON. All three removals look correct — OTBR_DUA_ROUTING is gone upstream, and with OTBR_MDNS set the OT-core proxies now default on, so keeping either of the other two would hit message(FATAL_ERROR "Only one Advertising Proxy can be enabled.") / "Only one Discovery Proxy can be enabled." in etc/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=ON line.

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

Comment thread net/openthread-br/Makefile
Comment thread net/openthread-br/Makefile
Comment thread net/openthread-br/Makefile
Comment thread net/openthread-br/README.md Outdated
@LorbusChris
LorbusChris force-pushed the openthread-br-2026.09.0 branch from 644e613 to 0c2e300 Compare September 2, 2026 08:39
LorbusChris added a commit to LorbusChris/matter-openwrt that referenced this pull request Sep 2, 2026
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>
LorbusChris added a commit to LorbusChris/matter-openwrt that referenced this pull request Sep 2, 2026
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)
LorbusChris added a commit to LorbusChris/matter-openwrt that referenced this pull request Sep 2, 2026
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)
LorbusChris added a commit to LorbusChris/matter-openwrt that referenced this pull request Sep 2, 2026
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>
@BKPepe
BKPepe requested a lite review from Copilot September 2, 2026 19:52

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-br to 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.

Comment thread net/openthread-br/test.sh
Comment thread net/openthread-br/test.sh Outdated
Comment thread net/openthread-br/test.sh Outdated

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-core and +kmod-nft-nat are now in DEPENDS, tab-indented and alphabetically placed next to +kmod-tun, matching upstream's example Makefile swap. kmod-nft-nat already pulls kmod-nft-core via netfilter.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=OFF for 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

Comment thread net/openthread-br/README.md Outdated
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants