diff --git a/modules b/modules
index bb94418af0b72fae8eec80638a695d735a7a5327..0b2399f90fae5500d5d7aaec96ce5c8197c2bfc8 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-23.05
-OPENWRT_COMMIT=447eef2063cce1ad472a07af3e368826158b1da3
+OPENWRT_COMMIT=09a8f75077117ca2ab880cbf854cf7a2dae0d494
 
 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-23.05
-PACKAGES_PACKAGES_COMMIT=ade006dc9feded81a13d0d268a2557b594f61b7e
+PACKAGES_PACKAGES_COMMIT=a14bb12dffba451e1b386e2d080997d9293d1481
 
 PACKAGES_ROUTING_REPO=https://github.com/openwrt/routing.git
 PACKAGES_ROUTING_BRANCH=openwrt-23.05
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 53dcbbc8bf3fbb22dcd2f0da49ba9b806dbf7446..78d684890113742e9a734edd7136813285d70ad9 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-5.15 b/target/linux/generic/config-5.15
-index 00977650c7ac26f1c443d684e3f5247022962b3a..2c094533933a798ae0fc36a841ef6e9cfc5df8c7 100644
+index 377553433846b5cec34e5d7036b8109f954aef5a..47c2ca0409654b4bfa08f32ed2869a6d077c8913 100644
 --- a/target/linux/generic/config-5.15
 +++ b/target/linux/generic/config-5.15
 @@ -761,6 +761,7 @@ CONFIG_BRIDGE=y
@@ -187,10 +187,10 @@ index 00977650c7ac26f1c443d684e3f5247022962b3a..2c094533933a798ae0fc36a841ef6e9c
  # CONFIG_BRIDGE_NF_EBTABLES is not set
 diff --git a/target/linux/generic/hack-5.15/602-bridge-Implement-MLD-Querier-wake-up-calls-Android-b.patch b/target/linux/generic/hack-5.15/602-bridge-Implement-MLD-Querier-wake-up-calls-Android-b.patch
 new file mode 100644
-index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855723e5763
+index 0000000000000000000000000000000000000000..91dd13e51549f40aa11a01d53e11be1a70f25d86
 --- /dev/null
 +++ b/target/linux/generic/hack-5.15/602-bridge-Implement-MLD-Querier-wake-up-calls-Android-b.patch
-@@ -0,0 +1,690 @@
+@@ -0,0 +1,663 @@
 +From 4529dcf18d4c5e05d30cd2d6fabfbae201e6c347 Mon Sep 17 00:00:00 2001
 +From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
 +Date: Mon, 29 Jun 2020 19:04:05 +0200
@@ -237,8 +237,6 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + net/ipv6/mcast_snoop.c       |   3 +-
 + 12 files changed, 386 insertions(+), 10 deletions(-)
 +
-+diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h
-+index 18d3b264b754..5ee206fb5ee7 100644
 +--- a/include/linux/if_bridge.h
 ++++ b/include/linux/if_bridge.h
 +@@ -59,6 +59,7 @@ struct br_ip_list {
@@ -249,11 +247,9 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 
 + #define BR_DEFAULT_AGEING_TIME	(300 * HZ)
 + 
-+diff --git a/include/net/addrconf.h b/include/net/addrconf.h
-+index 53627afab104..f31ea1726efa 100644
 +--- a/include/net/addrconf.h
 ++++ b/include/net/addrconf.h
-+@@ -233,6 +233,7 @@ void ipv6_mc_unmap(struct inet6_dev *idev);
++@@ -241,6 +241,7 @@ void ipv6_mc_unmap(struct inet6_dev *ide
 + void ipv6_mc_remap(struct inet6_dev *idev);
 + void ipv6_mc_init_dev(struct inet6_dev *idev);
 + void ipv6_mc_destroy_dev(struct inet6_dev *idev);
@@ -261,8 +257,6 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + int ipv6_mc_check_mld(struct sk_buff *skb);
 + void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp);
 + 
-+diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
-+index be0ad9a79da8..baf07b15e481 100644
 +--- a/include/uapi/linux/if_link.h
 ++++ b/include/uapi/linux/if_link.h
 +@@ -537,6 +537,7 @@ enum {
@@ -273,8 +267,6 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 	__IFLA_BRPORT_MAX
 + };
 + #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
-+diff --git a/net/bridge/Kconfig b/net/bridge/Kconfig
-+index 3c8ded7d3e84..1a11e22c7d51 100644
 +--- a/net/bridge/Kconfig
 ++++ b/net/bridge/Kconfig
 +@@ -48,6 +48,32 @@ config BRIDGE_IGMP_SNOOPING
@@ -310,11 +302,9 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + config BRIDGE_VLAN_FILTERING
 + 	bool "VLAN filtering"
 + 	depends on BRIDGE
-+diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
-+index 46812b659710..eec5f3770ff8 100644
 +--- a/net/bridge/br_fdb.c
 ++++ b/net/bridge/br_fdb.c
-+@@ -84,6 +84,10 @@ static void fdb_rcu_free(struct rcu_head *head)
++@@ -84,6 +84,10 @@ static void fdb_rcu_free(struct rcu_head
 + {
 + 	struct net_bridge_fdb_entry *ent
 + 		= container_of(head, struct net_bridge_fdb_entry, rcu);
@@ -325,7 +315,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 	kmem_cache_free(br_fdb_cache, ent);
 + }
 + 
-+@@ -518,6 +522,12 @@ static struct net_bridge_fdb_entry *fdb_create(struct net_bridge *br,
++@@ -518,6 +522,12 @@ static struct net_bridge_fdb_entry *fdb_
 + 		fdb->key.vlan_id = vid;
 + 		fdb->flags = flags;
 + 		fdb->updated = fdb->used = jiffies;
@@ -338,27 +328,23 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 		if (rhashtable_lookup_insert_fast(&br->fdb_hash_tbl,
 + 						  &fdb->rhnode,
 + 						  br_fdb_rht_params)) {
-+diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
-+index fe80b8e4c2d7..879ae7adb845 100644
 +--- a/net/bridge/br_input.c
 ++++ b/net/bridge/br_input.c
-+@@ -164,8 +164,10 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
++@@ -169,8 +169,10 @@ int br_handle_frame_finish(struct net *n
 + 	if (dst) {
 + 		unsigned long now = jiffies;
 + 
 +-		if (test_bit(BR_FDB_LOCAL, &dst->flags))
 ++		if (test_bit(BR_FDB_LOCAL, &dst->flags)) {
 ++			br_multicast_wakeupcall_rcv(brmctx, pmctx, skb, vid);
-+ 			return br_pass_frame_up(skb);
++ 			return br_pass_frame_up(skb, false);
 ++		}
 + 
 + 		if (now != dst->used)
 + 			dst->used = now;
-+diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
-+index db4f2641d1cd..6822dfbafa71 100644
 +--- a/net/bridge/br_multicast.c
 ++++ b/net/bridge/br_multicast.c
-+@@ -950,15 +950,16 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge_mcast *brm
++@@ -950,15 +950,16 @@ static struct sk_buff *br_ip6_multicast_
 + 						    const struct in6_addr *group,
 + 						    bool with_srcs, bool over_llqt,
 + 						    u8 sflag, u8 *igmp_type,
@@ -377,7 +363,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 	__sum16 *csum = NULL;
 + 	struct ipv6hdr *ip6h;
 + 	struct mld_msg *mldq;
-+@@ -1040,9 +1041,13 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge_mcast *brm
++@@ -1040,9 +1041,13 @@ static struct sk_buff *br_ip6_multicast_
 + 
 + 	/* ICMPv6 */
 + 	skb_set_transport_header(skb, skb->len);
@@ -394,7 +380,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 	*igmp_type = ICMPV6_MGM_QUERY;
 + 	switch (brmctx->multicast_mld_version) {
 + 	case 1:
-+@@ -1050,7 +1055,7 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge_mcast *brm
++@@ -1050,7 +1055,7 @@ static struct sk_buff *br_ip6_multicast_
 + 		mldq->mld_type = ICMPV6_MGM_QUERY;
 + 		mldq->mld_code = 0;
 + 		mldq->mld_cksum = 0;
@@ -403,7 +389,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 		mldq->mld_reserved = 0;
 + 		mldq->mld_mca = *group;
 + 		csum = &mldq->mld_cksum;
-+@@ -1141,7 +1146,7 @@ static struct sk_buff *br_multicast_alloc_query(struct net_bridge_mcast *brmctx,
++@@ -1141,7 +1146,7 @@ static struct sk_buff *br_multicast_allo
 + 						    &ip6_dst, &group->dst.ip6,
 + 						    with_srcs, over_lmqt,
 + 						    sflag, igmp_type,
@@ -412,7 +398,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 	}
 + #endif
 + 	}
-+@@ -1619,6 +1624,169 @@ static void br_multicast_select_own_querier(struct net_bridge_mcast *brmctx,
++@@ -1623,6 +1628,169 @@ static void br_multicast_select_own_quer
 + #endif
 + }
 + 
@@ -582,7 +568,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + static void __br_multicast_send_query(struct net_bridge_mcast *brmctx,
 + 				      struct net_bridge_mcast_port *pmctx,
 + 				      struct net_bridge_port_group *pg,
-+@@ -1651,6 +1819,13 @@ static void __br_multicast_send_query(struct net_bridge_mcast *brmctx,
++@@ -1655,6 +1823,13 @@ again_under_lmqt:
 + 			dev_net(pmctx->port->dev), NULL, skb, NULL, skb->dev,
 + 			br_dev_queue_push_xmit);
 + 
@@ -596,7 +582,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 		if (over_lmqt && with_srcs && sflag) {
 + 			over_lmqt = false;
 + 			goto again_under_lmqt;
-+@@ -3801,6 +3976,99 @@ int br_multicast_rcv(struct net_bridge_mcast **brmctx,
++@@ -3805,6 +3980,99 @@ int br_multicast_rcv(struct net_bridge_m
 + 	return ret;
 + }
 + 
@@ -696,7 +682,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + static void br_multicast_query_expired(struct net_bridge_mcast *brmctx,
 + 				       struct bridge_mcast_own_query *query,
 + 				       struct bridge_mcast_querier *querier)
-+@@ -4325,6 +4593,15 @@ int br_multicast_set_vlan_router(struct net_bridge_vlan *v, u8 mcast_router)
++@@ -4333,6 +4601,15 @@ int br_multicast_set_vlan_router(struct
 + 	return err;
 + }
 + 
@@ -712,21 +698,19 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + static void br_multicast_start_querier(struct net_bridge_mcast *brmctx,
 + 				       struct bridge_mcast_own_query *query)
 + {
-+diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
-+index ae6007309a17..09d4861b7336 100644
 +--- a/net/bridge/br_netlink.c
 ++++ b/net/bridge/br_netlink.c
-+@@ -198,6 +198,9 @@ static inline size_t br_port_info_size(void)
-+ 		+ nla_total_size_64bit(sizeof(u64)) /* IFLA_BRPORT_HOLD_TIMER */
++@@ -199,6 +199,9 @@ static inline size_t br_port_info_size(v
 + #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 + 		+ nla_total_size(sizeof(u8))	/* IFLA_BRPORT_MULTICAST_ROUTER */
-++#endif
++ #endif
 ++#ifdef CONFIG_BRIDGE_IGMP_SNOOPING_WAKEUPCALLS
 ++		+ nla_total_size(sizeof(u8))	/* IFLA_BRPORT_MCAST_WAKEUPCALL */
-+ #endif
+++#endif
 + 		+ nla_total_size(sizeof(u16))	/* IFLA_BRPORT_GROUP_FWD_MASK */
 + 		+ nla_total_size(sizeof(u8))	/* IFLA_BRPORT_MRP_RING_OPEN */
-+@@ -296,6 +299,11 @@ static int br_port_fill_attrs(struct sk_buff *skb,
++ 		+ nla_total_size(sizeof(u8))	/* IFLA_BRPORT_MRP_IN_OPEN */
++@@ -296,6 +299,11 @@ static int br_port_fill_attrs(struct sk_
 + 			p->multicast_eht_hosts_cnt))
 + 		return -EMSGSIZE;
 + #endif
@@ -738,7 +722,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 
 + 	/* we might be called only with br->lock */
 + 	rcu_read_lock();
-+@@ -823,6 +831,7 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = {
++@@ -823,6 +831,7 @@ static const struct nla_policy br_port_p
 + 	[IFLA_BRPORT_PROXYARP_WIFI] = { .type = NLA_U8 },
 + 	[IFLA_BRPORT_MULTICAST_ROUTER] = { .type = NLA_U8 },
 + 	[IFLA_BRPORT_MCAST_TO_UCAST] = { .type = NLA_U8 },
@@ -746,10 +730,12 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 	[IFLA_BRPORT_MCAST_FLOOD] = { .type = NLA_U8 },
 + 	[IFLA_BRPORT_BCAST_FLOOD] = { .type = NLA_U8 },
 + 	[IFLA_BRPORT_VLAN_TUNNEL] = { .type = NLA_U8 },
-+@@ -952,6 +961,16 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[],
++@@ -950,6 +959,16 @@ static int br_setport(struct net_bridge_
++ 		if (err)
++ 			return err;
 + 	}
-+ #endif
-+ 
+++#endif
+++
 ++#ifdef CONFIG_BRIDGE_IGMP_SNOOPING_WAKEUPCALLS
 ++	if (tb[IFLA_BRPORT_MCAST_WAKEUPCALL]) {
 ++		u8 wakeupcall = nla_get_u8(tb[IFLA_BRPORT_MCAST_WAKEUPCALL]);
@@ -758,13 +744,9 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 ++		if (err)
 ++			return err;
 ++	}
-++#endif
-++
-+ 	if (tb[IFLA_BRPORT_GROUP_FWD_MASK]) {
-+ 		u16 fwd_mask = nla_get_u16(tb[IFLA_BRPORT_GROUP_FWD_MASK]);
++ #endif
 + 
-+diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
-+index bd218c2b2cd9..32191519b500 100644
++ 	if (tb[IFLA_BRPORT_GROUP_FWD_MASK]) {
 +--- a/net/bridge/br_private.h
 ++++ b/net/bridge/br_private.h
 +@@ -269,6 +269,10 @@ struct net_bridge_fdb_entry {
@@ -786,7 +768,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + #endif
 + 
 + #ifdef CONFIG_SYSFS
-+@@ -1418,6 +1423,21 @@ br_multicast_ctx_options_equal(const struct net_bridge_mcast *brmctx1,
++@@ -1419,6 +1424,21 @@ br_multicast_ctx_options_equal(const str
 + }
 + #endif
 + 
@@ -808,11 +790,9 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + /* br_vlan.c */
 + #ifdef CONFIG_BRIDGE_VLAN_FILTERING
 + bool br_allowed_ingress(const struct net_bridge *br,
-+diff --git a/net/bridge/br_sysfs_if.c b/net/bridge/br_sysfs_if.c
-+index 9ee9c60738e2..9dcd4a9204db 100644
 +--- a/net/bridge/br_sysfs_if.c
 ++++ b/net/bridge/br_sysfs_if.c
-+@@ -260,6 +260,21 @@ BRPORT_ATTR_FLAG(multicast_fast_leave, BR_MULTICAST_FAST_LEAVE);
++@@ -260,6 +260,21 @@ BRPORT_ATTR_FLAG(multicast_fast_leave, B
 + BRPORT_ATTR_FLAG(multicast_to_unicast, BR_MULTICAST_TO_UNICAST);
 + #endif
 + 
@@ -834,18 +814,16 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + static const struct brport_attribute *brport_attrs[] = {
 + 	&brport_attr_path_cost,
 + 	&brport_attr_priority,
-+@@ -285,6 +300,9 @@ static const struct brport_attribute *brport_attrs[] = {
-+ 	&brport_attr_multicast_router,
++@@ -286,6 +301,9 @@ static const struct brport_attribute *br
 + 	&brport_attr_multicast_fast_leave,
 + 	&brport_attr_multicast_to_unicast,
-++#endif
++ #endif
 ++#ifdef CONFIG_BRIDGE_IGMP_SNOOPING_WAKEUPCALLS
 ++	&brport_attr_multicast_wakeupcall,
-+ #endif
+++#endif
 + 	&brport_attr_proxyarp,
 + 	&brport_attr_proxyarp_wifi,
-+diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
-+index e0fa875832a0..caf454185dc8 100644
++ 	&brport_attr_multicast_flood,
 +--- a/net/core/rtnetlink.c
 ++++ b/net/core/rtnetlink.c
 +@@ -55,7 +55,7 @@
@@ -857,11 +835,9 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 
 + struct rtnl_link {
 + 	rtnl_doit_func		doit;
-+diff --git a/net/ipv6/mcast_snoop.c b/net/ipv6/mcast_snoop.c
-+index 04d5fcdfa6e0..9a5061edbaf3 100644
 +--- a/net/ipv6/mcast_snoop.c
 ++++ b/net/ipv6/mcast_snoop.c
-+@@ -131,7 +131,7 @@ static inline __sum16 ipv6_mc_validate_checksum(struct sk_buff *skb)
++@@ -131,7 +131,7 @@ static inline __sum16 ipv6_mc_validate_c
 + 	return skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo);
 + }
 + 
@@ -870,7 +846,7 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + {
 + 	unsigned int len = skb_transport_offset(skb) + sizeof(struct icmp6hdr);
 + 	unsigned int transport_len = ipv6_transport_len(skb);
-+@@ -150,6 +150,7 @@ static int ipv6_mc_check_icmpv6(struct sk_buff *skb)
++@@ -150,6 +150,7 @@ static int ipv6_mc_check_icmpv6(struct s
 + 
 + 	return 0;
 + }
@@ -878,6 +854,3 @@ index 0000000000000000000000000000000000000000..84f872ddc2433514ca5c210f73b37855
 + 
 + /**
 +  * ipv6_mc_check_mld - checks whether this is a sane MLD packet
-+-- 
-+2.40.1
-+