#define WCN36XX_HAL_OFFLOAD_BCAST_FILTER_ENABLE             0x2
 #define WCN36XX_HAL_OFFLOAD_ARP_AND_BCAST_FILTER_ENABLE        \
        (WCN36XX_HAL_OFFLOAD_ENABLE | WCN36XX_HAL_OFFLOAD_BCAST_FILTER_ENABLE)
+#define WCN36XX_HAL_IPV6_OFFLOAD_ADDR_MAX              0x02
 
 struct wcn36xx_hal_ns_offload_params {
        u8 src_ipv6_addr[WCN36XX_HAL_IPV6_ADDR_LEN];
 
 #include <linux/rpmsg.h>
 #include <linux/soc/qcom/smem_state.h>
 #include <linux/soc/qcom/wcnss_ctrl.h>
+#include <net/ipv6.h>
 #include "wcn36xx.h"
 #include "testmode.h"
 
        return ret;
 }
 
+#if IS_ENABLED(CONFIG_IPV6)
+static void wcn36xx_ipv6_addr_change(struct ieee80211_hw *hw,
+                                    struct ieee80211_vif *vif,
+                                    struct inet6_dev *idev)
+{
+       struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif);
+       struct inet6_ifaddr *ifa;
+       int idx = 0;
+
+       memset(vif_priv->tentative_addrs, 0, sizeof(vif_priv->tentative_addrs));
+
+       read_lock_bh(&idev->lock);
+       list_for_each_entry(ifa, &idev->addr_list, if_list) {
+               vif_priv->target_ipv6_addrs[idx] = ifa->addr;
+               if (ifa->flags & IFA_F_TENTATIVE)
+                       __set_bit(idx, vif_priv->tentative_addrs);
+               idx++;
+               if (idx >= WCN36XX_HAL_IPV6_OFFLOAD_ADDR_MAX)
+                       break;
+               wcn36xx_dbg(WCN36XX_DBG_MAC, "%pI6 %s\n", &ifa->addr,
+                           (ifa->flags & IFA_F_TENTATIVE) ? "tentative" : NULL);
+       }
+       read_unlock_bh(&idev->lock);
+
+       vif_priv->num_target_ipv6_addrs = idx;
+}
+#endif
+
 static const struct ieee80211_ops wcn36xx_ops = {
        .start                  = wcn36xx_start,
        .stop                   = wcn36xx_stop,
        .sta_add                = wcn36xx_sta_add,
        .sta_remove             = wcn36xx_sta_remove,
        .ampdu_action           = wcn36xx_ampdu_action,
+#if IS_ENABLED(CONFIG_IPV6)
+       .ipv6_addr_change       = wcn36xx_ipv6_addr_change,
+#endif
 
        CFG80211_TESTMODE_CMD(wcn36xx_tm_cmd)
 };
 
 #define _WCN36XX_H_
 
 #include <linux/completion.h>
+#include <linux/in6.h>
 #include <linux/printk.h>
 #include <linux/spinlock.h>
 #include <net/mac80211.h>
        u8 self_dpu_desc_index;
        u8 self_ucast_dpu_sign;
 
+#if IS_ENABLED(CONFIG_IPV6)
+       /* IPv6 addresses for WoWLAN */
+       struct in6_addr target_ipv6_addrs[WCN36XX_HAL_IPV6_OFFLOAD_ADDR_MAX];
+       unsigned long tentative_addrs[BITS_TO_LONGS(WCN36XX_HAL_IPV6_OFFLOAD_ADDR_MAX)];
+       int num_target_ipv6_addrs;
+#endif
+
        struct list_head sta_list;
 };