From 258eeeddfe8048acf5cde3a7eb59603030a22976 Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 00:47:37 +0300
Subject: [PATCH 01/13] prplmesh: reconcile topology client state
---
net/prplmesh/Makefile | 2 +-
...-topology-reported-clients-connected.patch | 43 +++++++++++++++++++
2 files changed, 44 insertions(+), 1 deletion(-)
create mode 100644 net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
diff --git a/net/prplmesh/Makefile b/net/prplmesh/Makefile
index 09a0d76555be4..d213d6f905fd9 100644
--- a/net/prplmesh/Makefile
+++ b/net/prplmesh/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=prplmesh
PKG_VERSION:=6.0.1
-PKG_RELEASE:=1
+PKG_RELEASE:=2
PKG_SOURCE:=prplMesh-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://gitlab.com/prpl-foundation/prplmesh/prplMesh/-/archive/$(PKG_VERSION)/
diff --git a/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch b/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
new file mode 100644
index 0000000000000..4a7d93d6c7266
--- /dev/null
+++ b/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
@@ -0,0 +1,43 @@
+From 4a53626de35419a859a071aa345a3eeb6bcb4b7d Mon Sep 17 00:00:00 2001
+From: Andrei Ovcharenko
+Date: Mon, 14 Sep 2026 00:47:00 +0300
+Subject: [PATCH] controller: mark topology-reported clients connected
+
+Some agents send a topology notification without the optional client
+association event. The controller then falls back to a topology query and
+adds every station from the Associated Clients TLV, but add_station() leaves
+new entries disconnected. Subsequent topology responses see the entry under
+its BSS and skip it, so BML omits a client that remains associated in hostapd.
+
+Reconcile the state of every currently reported station after applying the
+topology snapshot. This also repairs stale disconnected entries created by an
+earlier query while preserving the ordinary association-notification path.
+
+Signed-off-by: Andrei Ovcharenko
+---
+ controller/src/beerocks/master/tasks/topology_task.cpp | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+--- a/controller/src/beerocks/master/tasks/topology_task.cpp
++++ b/controller/src/beerocks/master/tasks/topology_task.cpp
+@@ -883,6 +883,20 @@ bool topology_task::handle_associated_cl
+
+ database.add_station(agent.al_mac, sta_mac, current_bssid);
+ }
++
++ // A topology response is authoritative for the current association state. If the agent
++ // omitted the optional Client Association Event TLV, add_station() above creates the
++ // station but intentionally leaves it disconnected. The next topology response then sees
++ // the station under its BSS and would keep skipping it forever, which also hides it from
++ // BML. Reconcile every station in the reported snapshot, including stale entries created
++ // by an earlier response.
++ for (const auto &connected_pair : current_connected) {
++ auto station = database.get_station(connected_pair.first);
++ if (station && station->state != beerocks::STATE_CONNECTED) {
++ son_actions::handle_completed_connection(database, cmdu_tx, tasks,
++ tlvf::mac_to_string(connected_pair.first));
++ }
++ }
+
+ return true;
+ }
From 49b38b312af54fcdd7df28e77fd24a85478955a7 Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 01:09:00 +0300
Subject: [PATCH 02/13] prplmesh: normalize topology client patch
---
.../180-mark-topology-reported-clients-connected.patch | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch b/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
index 4a7d93d6c7266..126aa3760dcc3 100644
--- a/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
+++ b/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
@@ -20,11 +20,10 @@ Signed-off-by: Andrei Ovcharenko
--- a/controller/src/beerocks/master/tasks/topology_task.cpp
+++ b/controller/src/beerocks/master/tasks/topology_task.cpp
-@@ -883,6 +883,20 @@ bool topology_task::handle_associated_cl
-
+@@ -884,6 +884,20 @@ bool topology_task::handle_associated_cl
database.add_station(agent.al_mac, sta_mac, current_bssid);
}
-+
+
+ // A topology response is authoritative for the current association state. If the agent
+ // omitted the optional Client Association Event TLV, add_station() above creates the
+ // station but intentionally leaves it disconnected. The next topology response then sees
@@ -38,6 +37,7 @@ Signed-off-by: Andrei Ovcharenko
+ tlvf::mac_to_string(connected_pair.first));
+ }
+ }
-
++
return true;
}
+
From 8c155219c6edb5fe94d28079088c0b8a7126479c Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 01:27:03 +0300
Subject: [PATCH 03/13] ci: validate against OpenWrt 25.12
From 0994a4602c4e39305b23ed7ee3b0973f25b2c2c2 Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 01:32:28 +0300
Subject: [PATCH 04/13] ci: build the AX6S package target
---
.github/workflows/multi-arch-test-build.yml | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/.github/workflows/multi-arch-test-build.yml b/.github/workflows/multi-arch-test-build.yml
index aa45eb4bf830b..7a8727153cf10 100644
--- a/.github/workflows/multi-arch-test-build.yml
+++ b/.github/workflows/multi-arch-test-build.yml
@@ -12,3 +12,18 @@ jobs:
build:
name: Feeds Package Test Build
uses: openwrt/actions-shared-workflows/.github/workflows/multi-arch-test-build.yml@main
+ with:
+ matrix: >-
+ {"include":[
+ {"arch":"aarch64_cortex-a53","target":"mediatek-mt7622","runtime_test":false},
+ {"arch":"aarch64_generic","target":"armsr-armv8","runtime_test":true},
+ {"arch":"arm_cortex-a15_neon-vfpv4","target":"armsr-armv7","runtime_test":true},
+ {"arch":"arm_cortex-a9_vfpv3-d16","target":"mvebu-cortexa9","runtime_test":false},
+ {"arch":"i386_pentium-mmx","target":"x86-geode","runtime_test":true},
+ {"arch":"mips_24kc","target":"ath79-generic","runtime_test":true},
+ {"arch":"mipsel_24kc","target":"mt7621","runtime_test":false},
+ {"arch":"powerpc_464fp","target":"apm821xx-nand","runtime_test":false},
+ {"arch":"powerpc_8548","target":"mpc85xx-p1010","runtime_test":false},
+ {"arch":"riscv64_riscv64","target":"sifiveu-generic","runtime_test":false},
+ {"arch":"x86_64","target":"x86-64","runtime_test":true}
+ ]}
From f0ecbe0c1fe4f7e9022b9e90698459016a41407c Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 01:35:22 +0300
Subject: [PATCH 05/13] ci: use the 25.12 RISC-V SDK name
---
.github/workflows/multi-arch-test-build.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/multi-arch-test-build.yml b/.github/workflows/multi-arch-test-build.yml
index 7a8727153cf10..58613a01a6b58 100644
--- a/.github/workflows/multi-arch-test-build.yml
+++ b/.github/workflows/multi-arch-test-build.yml
@@ -24,6 +24,6 @@ jobs:
{"arch":"mipsel_24kc","target":"mt7621","runtime_test":false},
{"arch":"powerpc_464fp","target":"apm821xx-nand","runtime_test":false},
{"arch":"powerpc_8548","target":"mpc85xx-p1010","runtime_test":false},
- {"arch":"riscv64_riscv64","target":"sifiveu-generic","runtime_test":false},
+ {"arch":"riscv64_generic","target":"sifiveu-generic","runtime_test":false},
{"arch":"x86_64","target":"x86-64","runtime_test":true}
]}
From e5cdb55899647e150767984d7ef56561d900ec60 Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 01:40:38 +0300
Subject: [PATCH 06/13] prplmesh: supersede deployed package release
---
net/prplmesh/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/prplmesh/Makefile b/net/prplmesh/Makefile
index d213d6f905fd9..8bfe4ebd7be4b 100644
--- a/net/prplmesh/Makefile
+++ b/net/prplmesh/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=prplmesh
PKG_VERSION:=6.0.1
-PKG_RELEASE:=2
+PKG_RELEASE:=5
PKG_SOURCE:=prplMesh-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://gitlab.com/prpl-foundation/prplmesh/prplMesh/-/archive/$(PKG_VERSION)/
From ff3b8d6919f34180c8aa8348da1f2b4a6149b855 Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 02:15:58 +0300
Subject: [PATCH 07/13] prplmesh: preserve BSSID for imported clients
---
net/prplmesh/Makefile | 2 +-
.../175-set-imported-client-bssid.patch | 52 +++++++++++++++++++
2 files changed, 53 insertions(+), 1 deletion(-)
create mode 100644 net/prplmesh/patches/175-set-imported-client-bssid.patch
diff --git a/net/prplmesh/Makefile b/net/prplmesh/Makefile
index 8bfe4ebd7be4b..df79c758f3677 100644
--- a/net/prplmesh/Makefile
+++ b/net/prplmesh/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=prplmesh
PKG_VERSION:=6.0.1
-PKG_RELEASE:=5
+PKG_RELEASE:=6
PKG_SOURCE:=prplMesh-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://gitlab.com/prpl-foundation/prplmesh/prplMesh/-/archive/$(PKG_VERSION)/
diff --git a/net/prplmesh/patches/175-set-imported-client-bssid.patch b/net/prplmesh/patches/175-set-imported-client-bssid.patch
new file mode 100644
index 0000000000000..b91c6d2418c1a
--- /dev/null
+++ b/net/prplmesh/patches/175-set-imported-client-bssid.patch
@@ -0,0 +1,52 @@
+From 7be23388d8e34960a5b155c6d8ea8763b1ec17bb Mon Sep 17 00:00:00 2001
+From: Andrei Ovcharenko
+Date: Mon, 14 Sep 2026 02:15:00 +0300
+Subject: [PATCH] nl80211: preserve BSSID for imported clients
+
+The startup STA-FIRST/STA-NEXT sweep populated the station MAC and VAP id
+but left the BSSID zeroed. The agent therefore discarded every imported
+association because it could not map 00:00:00:00:00:00 to a radio, leaving
+clients that were already connected before an agent restart absent from the
+topology and BML.
+
+Copy the enumerated VAP BSSID into the synthetic association event so the
+normal AgentDB and controller notification path can process it.
+
+Signed-off-by: Andrei Ovcharenko
+---
+ .../bwl/nl80211/ap_wlan_hal_nl80211.cpp | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+--- a/common/beerocks/bwl/nl80211/ap_wlan_hal_nl80211.cpp
++++ b/common/beerocks/bwl/nl80211/ap_wlan_hal_nl80211.cpp
+@@ -1392,7 +1392,8 @@ static void sta_caps_from_rates(const in
+ // notification. Returns nullptr on malformed input. A station that has not
+ // completed association carries no connected_time line; it is reported
+ // through @a associated so the caller can skip it but keep iterating.
+-static std::shared_ptr parse_sta_block(const std::string &reply, int vap_id, bool radio_5G,
++static std::shared_ptr parse_sta_block(const std::string &reply, int vap_id,
++ const sMacAddr &bssid, bool radio_5G,
+ bool &associated, sMacAddr &mac_out)
+ {
+ std::istringstream stream(reply);
+@@ -1433,6 +1434,7 @@ static std::shared_ptr parse_sta_b
+
+ msg->params.vap_id = vap_id;
+ msg->params.mac = mac_out;
++ msg->params.bssid = bssid;
+ msg->params.capabilities = {};
+
+ int supported_rates[16] = {0};
+@@ -1545,8 +1547,10 @@ bool ap_wlan_hal_nl80211::generate_conn
+
+ bool associated = false;
+ sMacAddr sta_mac;
+- auto msg_buff = parse_sta_block(text, m_vap_id_in_progress, get_radio_info().is_5ghz,
+- associated, sta_mac);
++ auto msg_buff =
++ parse_sta_block(text, m_vap_id_in_progress,
++ tlvf::mac_from_string(vap_it->second.mac),
++ get_radio_info().is_5ghz, associated, sta_mac);
+ if (!msg_buff) {
+ LOG(WARNING) << "Malformed station block on " << vap_iface
+ << ", skipping the rest of this VAP";
From 555b3211ad97915aa3f40d61b1a97450a6c467f3 Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 02:30:26 +0300
Subject: [PATCH 08/13] prplmesh: normalize imported client patch
---
.../175-set-imported-client-bssid.patch | 21 +------------------
1 file changed, 1 insertion(+), 20 deletions(-)
diff --git a/net/prplmesh/patches/175-set-imported-client-bssid.patch b/net/prplmesh/patches/175-set-imported-client-bssid.patch
index b91c6d2418c1a..312b555e8c4f9 100644
--- a/net/prplmesh/patches/175-set-imported-client-bssid.patch
+++ b/net/prplmesh/patches/175-set-imported-client-bssid.patch
@@ -1,22 +1,3 @@
-From 7be23388d8e34960a5b155c6d8ea8763b1ec17bb Mon Sep 17 00:00:00 2001
-From: Andrei Ovcharenko
-Date: Mon, 14 Sep 2026 02:15:00 +0300
-Subject: [PATCH] nl80211: preserve BSSID for imported clients
-
-The startup STA-FIRST/STA-NEXT sweep populated the station MAC and VAP id
-but left the BSSID zeroed. The agent therefore discarded every imported
-association because it could not map 00:00:00:00:00:00 to a radio, leaving
-clients that were already connected before an agent restart absent from the
-topology and BML.
-
-Copy the enumerated VAP BSSID into the synthetic association event so the
-normal AgentDB and controller notification path can process it.
-
-Signed-off-by: Andrei Ovcharenko
----
- .../bwl/nl80211/ap_wlan_hal_nl80211.cpp | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
--- a/common/beerocks/bwl/nl80211/ap_wlan_hal_nl80211.cpp
+++ b/common/beerocks/bwl/nl80211/ap_wlan_hal_nl80211.cpp
@@ -1392,7 +1392,8 @@ static void sta_caps_from_rates(const in
@@ -37,7 +18,7 @@ Signed-off-by: Andrei Ovcharenko
msg->params.capabilities = {};
int supported_rates[16] = {0};
-@@ -1545,8 +1547,10 @@ bool ap_wlan_hal_nl80211::generate_conn
+@@ -1545,8 +1547,10 @@ bool ap_wlan_hal_nl80211::generate_conne
bool associated = false;
sMacAddr sta_mac;
From 227fe6249ef3bb96aa60814a3cc90101ed423a16 Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 03:02:38 +0300
Subject: [PATCH 09/13] prplmesh: handle empty imported association frames
---
net/prplmesh/Makefile | 2 +-
...dle-empty-imported-association-frame.patch | 21 +++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
create mode 100644 net/prplmesh/patches/176-handle-empty-imported-association-frame.patch
diff --git a/net/prplmesh/Makefile b/net/prplmesh/Makefile
index df79c758f3677..ddbc9b5f23b2e 100644
--- a/net/prplmesh/Makefile
+++ b/net/prplmesh/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=prplmesh
PKG_VERSION:=6.0.1
-PKG_RELEASE:=6
+PKG_RELEASE:=7
PKG_SOURCE:=prplMesh-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://gitlab.com/prpl-foundation/prplmesh/prplMesh/-/archive/$(PKG_VERSION)/
diff --git a/net/prplmesh/patches/176-handle-empty-imported-association-frame.patch b/net/prplmesh/patches/176-handle-empty-imported-association-frame.patch
new file mode 100644
index 0000000000000..179e32281a8b3
--- /dev/null
+++ b/net/prplmesh/patches/176-handle-empty-imported-association-frame.patch
@@ -0,0 +1,21 @@
+--- a/agent/src/beerocks/slave/son_slave_thread.cpp
++++ b/agent/src/beerocks/slave/son_slave_thread.cpp
+@@ -2607,10 +2607,15 @@ bool slave_thread::process_client_associ
+ return false;
+ }
+
++ const auto association_frame_length = notification_in->association_frame_length();
++ uint8_t empty_association_frame = 0;
++ auto association_frame = association_frame_length > 0
++ ? notification_in->association_frame()
++ : &empty_association_frame;
+ radio->associated_clients.emplace(
+- client_mac, AgentDB::sRadio::sClient{bssid, notification_in->association_frame_length(),
+- notification_in->association_frame(),
+- notification_in->capabilities().btm_supported});
++ client_mac,
++ AgentDB::sRadio::sClient{bssid, association_frame_length, association_frame,
++ notification_in->capabilities().btm_supported});
+
+ auto pending_wds_it = m_pending_wds_iface_notifications.find(client_mac);
+ if (pending_wds_it != m_pending_wds_iface_notifications.end()) {
From 6ce0b55aa4405e9cbd470c0bc9af85a894fe1aa9 Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 03:32:35 +0300
Subject: [PATCH 10/13] prplmesh: deliver local topology notifications
---
net/prplmesh/Makefile | 2 +-
...ast-colocated-topology-notifications.patch | 20 +++++++++++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)
create mode 100644 net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
diff --git a/net/prplmesh/Makefile b/net/prplmesh/Makefile
index ddbc9b5f23b2e..86a75f0fd181d 100644
--- a/net/prplmesh/Makefile
+++ b/net/prplmesh/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=prplmesh
PKG_VERSION:=6.0.1
-PKG_RELEASE:=7
+PKG_RELEASE:=8
PKG_SOURCE:=prplMesh-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://gitlab.com/prpl-foundation/prplmesh/prplMesh/-/archive/$(PKG_VERSION)/
diff --git a/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch b/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
new file mode 100644
index 0000000000000..44ef9eb045f62
--- /dev/null
+++ b/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
@@ -0,0 +1,20 @@
+Index: prplmesh-quilt-r6-lf-20260914/agent/src/beerocks/slave/son_slave_thread.cpp
+===================================================================
+--- prplmesh-quilt-r6-lf-20260914.orig/agent/src/beerocks/slave/son_slave_thread.cpp
++++ prplmesh-quilt-r6-lf-20260914/agent/src/beerocks/slave/son_slave_thread.cpp
+@@ -5560,6 +5560,15 @@ bool slave_thread::send_cmdu_to_controll
+ sMacAddr dst_addr;
+ switch (cmdu_tx.getMessageType()) {
+ case ieee1905_1::eMessageType::TOPOLOGY_NOTIFICATION_MESSAGE:
++ // Multicast topology notifications are not looped back to a controller that is
++ // colocated with this agent. Other controller-bound CMDUs already use unicast and
++ // reach the local controller through the broker, so do the same for this case.
++ if (db->controller_info.bridge_mac == src_addr) {
++ dst_addr = db->controller_info.bridge_mac;
++ break;
++ }
++ dst_addr = network_utils::MULTICAST_1905_MAC_ADDR;
++ break;
+ case ieee1905_1::eMessageType::AP_AUTOCONFIGURATION_SEARCH_MESSAGE:
+ case ieee1905_1::eMessageType::ASSOCIATION_STATUS_NOTIFICATION_MESSAGE:
+ dst_addr = network_utils::MULTICAST_1905_MAC_ADDR;
From 4c1ae157d00752b6de3a7545d5edea4bc9482bdf Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Mon, 14 Sep 2026 03:39:04 +0300
Subject: [PATCH 11/13] prplmesh: normalize colocated notification patch
---
.../177-unicast-colocated-topology-notifications.patch | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch b/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
index 44ef9eb045f62..d9e67099e645e 100644
--- a/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
+++ b/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
@@ -1,7 +1,5 @@
-Index: prplmesh-quilt-r6-lf-20260914/agent/src/beerocks/slave/son_slave_thread.cpp
-===================================================================
---- prplmesh-quilt-r6-lf-20260914.orig/agent/src/beerocks/slave/son_slave_thread.cpp
-+++ prplmesh-quilt-r6-lf-20260914/agent/src/beerocks/slave/son_slave_thread.cpp
+--- a/agent/src/beerocks/slave/son_slave_thread.cpp
++++ b/agent/src/beerocks/slave/son_slave_thread.cpp
@@ -5560,6 +5560,15 @@ bool slave_thread::send_cmdu_to_controll
sMacAddr dst_addr;
switch (cmdu_tx.getMessageType()) {
From a5dc2976111dac2c086e47fe7c5d20940ddb4d7b Mon Sep 17 00:00:00 2001
From: Andrei Ovcharenko
Date: Sat, 10 Oct 2026 20:04:48 +0300
Subject: [PATCH 12/13] prplmesh: guard topology reconciliation and test
binaries
Keep topology notifications multicast: the transport already delivers them
to the local broker and controller, while unicast omits mesh neighbors.
Complete connections only for stations attached to the reporting agent's
BSS, and initialize their Wi-Fi interface type, channel and VAP ID.
Verify the installed agent and controller versions through their early
version-query paths instead of checking only generated metadata.
Signed-off-by: Andrei Ovcharenko
---
net/prplmesh/Makefile | 2 +-
...ast-colocated-topology-notifications.patch | 18 -----------
...-topology-reported-clients-connected.patch | 32 ++++++++++++++-----
net/prplmesh/test-version.sh | 16 +++++++---
4 files changed, 37 insertions(+), 31 deletions(-)
delete mode 100644 net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
diff --git a/net/prplmesh/Makefile b/net/prplmesh/Makefile
index 86a75f0fd181d..4613ed1260421 100644
--- a/net/prplmesh/Makefile
+++ b/net/prplmesh/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=prplmesh
PKG_VERSION:=6.0.1
-PKG_RELEASE:=8
+PKG_RELEASE:=9
PKG_SOURCE:=prplMesh-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://gitlab.com/prpl-foundation/prplmesh/prplMesh/-/archive/$(PKG_VERSION)/
diff --git a/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch b/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
deleted file mode 100644
index d9e67099e645e..0000000000000
--- a/net/prplmesh/patches/177-unicast-colocated-topology-notifications.patch
+++ /dev/null
@@ -1,18 +0,0 @@
---- a/agent/src/beerocks/slave/son_slave_thread.cpp
-+++ b/agent/src/beerocks/slave/son_slave_thread.cpp
-@@ -5560,6 +5560,15 @@ bool slave_thread::send_cmdu_to_controll
- sMacAddr dst_addr;
- switch (cmdu_tx.getMessageType()) {
- case ieee1905_1::eMessageType::TOPOLOGY_NOTIFICATION_MESSAGE:
-+ // Multicast topology notifications are not looped back to a controller that is
-+ // colocated with this agent. Other controller-bound CMDUs already use unicast and
-+ // reach the local controller through the broker, so do the same for this case.
-+ if (db->controller_info.bridge_mac == src_addr) {
-+ dst_addr = db->controller_info.bridge_mac;
-+ break;
-+ }
-+ dst_addr = network_utils::MULTICAST_1905_MAC_ADDR;
-+ break;
- case ieee1905_1::eMessageType::AP_AUTOCONFIGURATION_SEARCH_MESSAGE:
- case ieee1905_1::eMessageType::ASSOCIATION_STATUS_NOTIFICATION_MESSAGE:
- dst_addr = network_utils::MULTICAST_1905_MAC_ADDR;
diff --git a/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch b/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
index 126aa3760dcc3..cd1532d0c6615 100644
--- a/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
+++ b/net/prplmesh/patches/180-mark-topology-reported-clients-connected.patch
@@ -10,17 +10,21 @@ new entries disconnected. Subsequent topology responses see the entry under
its BSS and skip it, so BML omits a client that remains associated in hostapd.
Reconcile the state of every currently reported station after applying the
-topology snapshot. This also repairs stale disconnected entries created by an
-earlier query while preserving the ordinary association-notification path.
+topology snapshot, but only when it is attached to a BSS of the reporting
+agent. add_station() can return an existing station even when BSS lookup
+fails, so a non-null station alone is not enough to complete a connection.
+Initialize the Wi-Fi interface type, channel and VAP ID as in the ordinary
+association-notification path; new stations otherwise retain Ethernet
+defaults and never receive wireless association handling.
Signed-off-by: Andrei Ovcharenko
---
- controller/src/beerocks/master/tasks/topology_task.cpp | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
+ controller/src/beerocks/master/tasks/topology_task.cpp | 26 ++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
--- a/controller/src/beerocks/master/tasks/topology_task.cpp
+++ b/controller/src/beerocks/master/tasks/topology_task.cpp
-@@ -884,6 +884,20 @@ bool topology_task::handle_associated_cl
+@@ -884,6 +884,32 @@ bool topology_task::handle_associated_cl
database.add_station(agent.al_mac, sta_mac, current_bssid);
}
@@ -32,9 +36,21 @@ Signed-off-by: Andrei Ovcharenko
+ // by an earlier response.
+ for (const auto &connected_pair : current_connected) {
+ auto station = database.get_station(connected_pair.first);
-+ if (station && station->state != beerocks::STATE_CONNECTED) {
-+ son_actions::handle_completed_connection(database, cmdu_tx, tasks,
-+ tlvf::mac_to_string(connected_pair.first));
++ auto bss = database.get_bss(connected_pair.second, agent.al_mac);
++ if (!station || !bss || station->get_bss() != bss) {
++ // Do not complete a failed BSS lookup or a station attached to another agent.
++ continue;
++ }
++
++ const auto client_mac = tlvf::mac_to_string(connected_pair.first);
++ database.set_sta_backhaul_iface_type(connected_pair.first,
++ beerocks::IFACE_TYPE_WIFI_UNSPECIFIED);
++ database.set_sta_wifi_channel(connected_pair.first,
++ database.get_radio_wifi_channel(bss->radio.radio_uid));
++ database.set_sta_vap_id(client_mac, database.get_bss_vap_id(bss->bssid));
++
++ if (station->state != beerocks::STATE_CONNECTED) {
++ son_actions::handle_completed_connection(database, cmdu_tx, tasks, client_mac);
+ }
+ }
+
diff --git a/net/prplmesh/test-version.sh b/net/prplmesh/test-version.sh
index 0edd7c654ec53..e04d577c0635d 100644
--- a/net/prplmesh/test-version.sh
+++ b/net/prplmesh/test-version.sh
@@ -5,11 +5,19 @@
set -eu
case "$PKG_NAME" in
-prplmesh)
- grep -F "prplmesh_version=$PKG_VERSION" /usr/share/prplmesh/config/version
- ;;
+prplmesh) ;;
*)
- echo "Untested package: $PKG_NAME" >&2
+ echo "Unexpected package: $PKG_NAME" >&2
exit 1
;;
esac
+
+[ -n "$PKG_VERSION" ]
+
+# These entry points handle --version before configuration or daemon startup.
+# In particular, ieee1905_transport ignores version flags and starts its broker;
+# do not let the generic flag sweep start it repeatedly in the test container.
+for binary in beerocks_agent beerocks_controller; do
+ output="$(timeout --kill-after=5s 10s "/usr/libexec/prplmesh/bin/$binary" --version 2>&1)"
+ printf '%s\n' "$output" | grep -F "$binary $PKG_VERSION ("
+done
From f31bb5a27310fd1f0cfacbe00492976226792b1c Mon Sep 17 00:00:00 2001
From: "Andrei.Ovcharenko"
Date: Sat, 10 Oct 2026 21:33:27 +0300
Subject: [PATCH 13/13] =?UTF-8?q?ci:=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?=
=?UTF-8?q?=D1=82=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?=
=?UTF-8?q?=D0=BA=D1=83=20prplmesh=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?=
=?UTF-8?q?=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20Action?=
=?UTF-8?q?s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit