diff --git a/modules b/modules
index 493378cf25a6e6c07f5fc625d1e4bb4f46f3343c..b505cfa5d818e87f63b7d512a797a0bc479b8978 100644
--- a/modules
+++ b/modules
@@ -2,14 +2,14 @@ GLUON_FEEDS='gluon packages routing'
 
 OPENWRT_REPO=https://github.com/openwrt/openwrt.git
 OPENWRT_BRANCH=openwrt-24.10
-OPENWRT_COMMIT=4cc1da1e44c28aa153956e179f28b8ee38dc3ac6
+OPENWRT_COMMIT=c06d4df9748aea84b9a4ffcbe51b2e6fff94de1e
 
 PACKAGES_GLUON_REPO=https://github.com/freifunk-gluon/packages.git
 PACKAGES_GLUON_COMMIT=3d08b0fee8dc5d96d8bcdb985fad1d5564de4022
 
 PACKAGES_PACKAGES_REPO=https://github.com/openwrt/packages.git
 PACKAGES_PACKAGES_BRANCH=openwrt-24.10
-PACKAGES_PACKAGES_COMMIT=dfeae07c2495539f85dbcb4c633eb52c6a9b2e72
+PACKAGES_PACKAGES_COMMIT=9b5ce53f512429910dba62b3b5be18934f9904ce
 
 PACKAGES_ROUTING_REPO=https://github.com/openwrt/routing.git
 PACKAGES_ROUTING_BRANCH=openwrt-24.10
diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless b/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless
index 9550a887d3d2015450918b702915d8d87f5ad430..2bbe1a8f2e99eba8a6cc179e39ce8522762afe62 100755
--- a/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless
+++ b/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless
@@ -138,6 +138,7 @@ local function configure_mesh(config, radio, index, suffix, disabled)
 		mesh_id = config.id,
 		mesh_fwding = false,
 		macaddr = macaddr,
+		basic_rate = { config.mcast_rate },
 		mcast_rate = config.mcast_rate,
 		ifname = suffix and 'mesh' .. suffix,
 		disabled = disabled,
diff --git a/patches/openwrt/0005-kernel-bridge-Implement-MLD-Querier-wake-up-calls-Android-bug-workaround.patch b/patches/openwrt/0005-kernel-bridge-Implement-MLD-Querier-wake-up-calls-Android-bug-workaround.patch
index 5f90ad3f6531d2901d7d683bf3fdbded78e11241..2b4bd1d2f02cef52fb18ad6d40d8246489075483 100644
--- a/patches/openwrt/0005-kernel-bridge-Implement-MLD-Querier-wake-up-calls-Android-bug-workaround.patch
+++ b/patches/openwrt/0005-kernel-bridge-Implement-MLD-Querier-wake-up-calls-Android-bug-workaround.patch
@@ -174,7 +174,7 @@ index 0000000000000000000000000000000000000000..077a563b6066cd1d3aee4b1e82328e8c
 + 
 + int system_bridge_addif(struct device *bridge, struct device *dev)
 diff --git a/target/linux/generic/config-6.6 b/target/linux/generic/config-6.6
-index 2ea1b7910388f57a7ba3e5868a323618c0838d9c..cf46bf89de743c83410ea0ebd856ce13a8d38ed4 100644
+index c8ebee70278022e6816a06cd72cc655e4a71a1e3..c9dbee54395fa023021b1fe28fd8800473abf16e 100644
 --- a/target/linux/generic/config-6.6
 +++ b/target/linux/generic/config-6.6
 @@ -716,6 +716,7 @@ CONFIG_BRIDGE=y
diff --git a/patches/openwrt/0007-net-mac80211-override-incompatible-basic-rates-for-mesh.patch b/patches/openwrt/0007-net-mac80211-override-incompatible-basic-rates-for-mesh.patch
new file mode 100644
index 0000000000000000000000000000000000000000..cb9bfe8b6f938a84bcfa1ef63277412b4fc96bc8
--- /dev/null
+++ b/patches/openwrt/0007-net-mac80211-override-incompatible-basic-rates-for-mesh.patch
@@ -0,0 +1,58 @@
+From: David Bauer <mail@david-bauer.net>
+Date: Mon, 6 Jan 2025 08:30:35 +0100
+Subject: net: mac80211: override incompatible basic-rates for mesh
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+
+diff --git a/package/kernel/mac80211/patches/subsys/995-net-mac80211-override-incompatible-basic-rates-for-m.patch b/package/kernel/mac80211/patches/subsys/995-net-mac80211-override-incompatible-basic-rates-for-m.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..19ca64d5012d2974ab2a48e9363ecaa3b60aed4c
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/995-net-mac80211-override-incompatible-basic-rates-for-m.patch
+@@ -0,0 +1,46 @@
++From 091e1eea9e34db7cbf84379021fcbff82887e09a Mon Sep 17 00:00:00 2001
++From: David Bauer <mail@david-bauer.net>
++Date: Mon, 6 Jan 2025 08:23:54 +0100
++Subject: [PATCH] net: mac80211: override incompatible basic-rates for mesh
++
++This is a dirty hack for Gluon.
++
++We assume basic rate setup only affects the rate-controller on the TX
++side. As all devices we support have at least a 802.11n radio and thus
++cover 802.11b as well as 802.11g on 2.4 GHz, they are compatible with
++each other.
++
++As the basic rate was incorrectly set for mesh interfaces in the past,
++connections between mesh neighbors would fail when altering the basic
++rate.
++
++This patch ignores mismatches in the basic-rate field. By doing so, we
++avoid implementing some sort of scheduled switch between wireless
++configurations.
++
++Signed-off-by: David Bauer <mail@david-bauer.net>
++---
++ net/mac80211/mesh.c | 7 +++++--
++ 1 file changed, 5 insertions(+), 2 deletions(-)
++
++diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
++index 25223184d6e5..53b5339be5d0 100644
++--- a/net/mac80211/mesh.c
+++++ b/net/mac80211/mesh.c
++@@ -92,8 +92,11 @@ bool mesh_matches_local(struct ieee80211_sub_if_data *sdata,
++ 	ieee80211_sta_get_rates(sdata, ie, sband->band,
++ 				&basic_rates);
++ 
++-	if (sdata->vif.bss_conf.basic_rates != basic_rates)
++-		return false;
+++	if (sdata->vif.bss_conf.basic_rates != basic_rates) {
+++		wiphy_warn(sdata->wdev.wiphy,
+++			   "ignoring basic rate mismatch for peer (local=%x peer=%x)\n",
+++			   sdata->vif.bss_conf.basic_rates, basic_rates);
+++	}
++ 
++ 	cfg80211_chandef_create(&sta_chan_def, sdata->vif.bss_conf.chandef.chan,
++ 				NL80211_CHAN_NO_HT);
++-- 
++2.45.2
++
diff --git a/patches/openwrt/0008-net-mac80211-always-pretend-1-Mbit-s-as-mesh-basic-rate.patch b/patches/openwrt/0008-net-mac80211-always-pretend-1-Mbit-s-as-mesh-basic-rate.patch
new file mode 100644
index 0000000000000000000000000000000000000000..274f002c3e8c54f4120ddf308f8c5d9eeeb60f14
--- /dev/null
+++ b/patches/openwrt/0008-net-mac80211-always-pretend-1-Mbit-s-as-mesh-basic-rate.patch
@@ -0,0 +1,60 @@
+From: David Bauer <mail@david-bauer.net>
+Date: Tue, 7 Jan 2025 00:49:41 +0100
+Subject: net: mac80211: always pretend 1 Mbit/s as mesh basic rate
+
+In order to be backwards-compatible, pretend to have 1 Mbit/s 802.11b as
+basic rate regardless of the actual setting. This is required to keep
+compatibility with other non-patched mesh neighbors.
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+
+diff --git a/package/kernel/mac80211/patches/subsys/996-net-mac80211-always-pretend-1-Mbit-s-as-mesh-basic-r.patch b/package/kernel/mac80211/patches/subsys/996-net-mac80211-always-pretend-1-Mbit-s-as-mesh-basic-r.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..becb17317abb9782d4827a38c232b58939246ae1
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/996-net-mac80211-always-pretend-1-Mbit-s-as-mesh-basic-r.patch
+@@ -0,0 +1,44 @@
++From 70c1812fa170ee35cdc576c886bed4bfaae1d23c Mon Sep 17 00:00:00 2001
++From: David Bauer <mail@david-bauer.net>
++Date: Tue, 7 Jan 2025 00:47:33 +0100
++Subject: [PATCH] net: mac80211: always pretend 1 Mbit/s as mesh basic rate
++
++In order to be backwards-compatible, pretend to have 1 Mbit/s 802.11b as
++basic rate regardless of the actual setting. This is required to keep
++compatibility with other non-patched mesh neighbors.
++
++Signed-off-by: David Bauer <mail@david-bauer.net>
++---
++ net/mac80211/util.c | 4 ++--
++ 1 file changed, 2 insertions(+), 2 deletions(-)
++
++--- a/net/mac80211/mesh.c
+++++ b/net/mac80211/mesh.c
++@@ -1093,7 +1093,7 @@ ieee80211_mesh_build_beacon(struct ieee8
++ 	rcu_read_unlock();
++ 
++ 	if (ieee80211_put_srates_elem(skb, sband,
++-				      sdata->vif.bss_conf.basic_rates,
+++				      BIT(0),
++ 				      rate_flags, 0, WLAN_EID_SUPP_RATES) ||
++ 	    mesh_add_ds_params_ie(sdata, skb))
++ 		goto out_free;
++@@ -1106,7 +1106,7 @@ ieee80211_mesh_build_beacon(struct ieee8
++ 	bcn->tail = bcn->head + bcn->head_len;
++ 
++ 	if (ieee80211_put_srates_elem(skb, sband,
++-				      sdata->vif.bss_conf.basic_rates,
+++				      BIT(0),
++ 				      rate_flags, 0, WLAN_EID_EXT_SUPP_RATES) ||
++ 	    mesh_add_rsn_ie(sdata, skb) ||
++ 	    mesh_add_ht_cap_ie(sdata, skb) ||
++--- a/net/mac80211/mesh_plink.c
+++++ b/net/mac80211/mesh_plink.c
++@@ -283,6 +283,7 @@ static int mesh_plink_frame_tx(struct ie
++ 		rate_flags =
++ 			ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chanreq.oper);
++ 		basic_rates = sdata->vif.bss_conf.basic_rates;
+++		basic_rates = BIT(0); /* mandatory rate */
++ 
++ 		if (ieee80211_put_srates_elem(skb, sband, basic_rates,
++ 					      rate_flags, 0,
diff --git a/patches/openwrt/0009-wifi-scripts-allow-per-IF-mesh-basic-rate-selection.patch b/patches/openwrt/0009-wifi-scripts-allow-per-IF-mesh-basic-rate-selection.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9b6b2d98af68ca3e616e3a078b5b97a5252c2b30
--- /dev/null
+++ b/patches/openwrt/0009-wifi-scripts-allow-per-IF-mesh-basic-rate-selection.patch
@@ -0,0 +1,35 @@
+From: David Bauer <mail@david-bauer.net>
+Date: Tue, 7 Jan 2025 11:43:36 +0100
+Subject: wifi-scripts: allow per-IF mesh basic rate selection
+
+Bringing up a mesh interface using wpa_supplicant already supports a
+per-VIF basic rate selection. Add the same ability when creating a mesh
+VIF without wpa_supplicant.
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+
+diff --git a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+index 368885246a73b14153ffe3c7d83627f873111742..5b5a7fabda896c978b685b89163a36bae33fcdb6 100755
+--- a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
++++ b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+@@ -841,13 +841,19 @@ mac80211_setup_adhoc() {
+ 
+ mac80211_setup_mesh() {
+ 	json_get_vars ssid mesh_id mcast_rate
++	json_get_values iface_basic_rate_list basic_rate
+ 
+ 	mcval=
+ 	[ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate"
+ 	[ -n "$mesh_id" ] && ssid="$mesh_id"
+ 
++	brlist="$basic_rate_list"
++	if [ -n "$iface_basic_rate_list" ]; then
++		brlist="$iface_basic_rate_list"
++	fi
++
+ 	brstr=
+-	for br in $basic_rate_list; do
++	for br in $brlist; do
+ 		wpa_supplicant_add_rate brstr "$br"
+ 	done
+ 
diff --git a/targets/generic b/targets/generic
index 6db126515dc5a3cb9c92410696cf1cf2a376fb7e..7de3660a330327fc40a051287eddedf942e436e0 100644
--- a/targets/generic
+++ b/targets/generic
@@ -70,7 +70,7 @@ config('KERNEL_IP_MROUTE', false)
 config('KERNEL_IPV6_MROUTE', false)
 config('KERNEL_IPV6_SEG6_LWTUNNEL', false)
 config('KERNEL_SWAP', false)
-config('SECCOMP', false)
+config('USE_SECCOMP', false)
 config('KERNEL_SECCOMP', false)
 -- kmod-mt7915e pulls in CONFIG_KERNEL_RELAY
 -- use try_config, so enabling the package is still possible