prima: Configure MC add. list in f/w after new IPV6 address.
when a new ipv6 address is generated the callback is invoked
we need to reconfigure the ns offload as well as the multicast
address list in f/w. The registeration of callback is done
independent of ns offload and must be done only once so moving
it to suspend path.
Change-Id: Iae1fa13d915d9879a5ec8206986b98905c3d4d72
CRs-fixed: 635149
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index 8b98b1e..f125bf8 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -486,6 +486,122 @@
}
+void hdd_ipv6_notifier_work_queue(struct work_struct *work)
+{
+ hdd_adapter_t* pAdapter =
+ container_of(work, hdd_adapter_t, ipv6NotifierWorkQueue);
+ hdd_context_t *pHddCtx;
+ int status;
+
+ hddLog(LOG1, FL("Reconfiguring NS Offload"));
+
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ status = wlan_hdd_validate_context(pHddCtx);
+ if (0 != status)
+ {
+ hddLog(LOGE, FL("HDD context is invalid"));
+ return;
+ }
+
+ if ( VOS_FALSE == pHddCtx->sus_res_mcastbcast_filter_valid)
+ {
+ pHddCtx->sus_res_mcastbcast_filter =
+ pHddCtx->configuredMcastBcastFilter;
+ pHddCtx->sus_res_mcastbcast_filter_valid = VOS_TRUE;
+ }
+
+ if ((eConnectionState_Associated ==
+ (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState)
+ && (pHddCtx->hdd_wlan_suspended))
+ {
+ // This invocation being part of the IPv6 registration callback,
+ // set the newly generated ip address to f/w in suspend mode.
+#ifdef WLAN_NS_OFFLOAD
+ //Disable NSOFFLOAD
+ if (pHddCtx->cfg_ini->fhostNSOffload)
+ {
+ hdd_conf_ns_offload(pAdapter, 1);
+ }
+#endif
+ }
+#ifdef WLAN_FEATURE_PACKET_FILTERING
+ /* wlan_hdd_set_mc_addr_list() is called from the early susspend
+ * only so when new ipv6 address is generated the screen may not
+ * on so we need to call it here to update the list in f/w.
+ */
+ wlan_hdd_set_mc_addr_list(pAdapter, TRUE);
+#endif
+
+}
+
+
+static int wlan_hdd_ipv6_changed(struct notifier_block *nb,
+ unsigned long data, void *arg)
+{
+ struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)arg;
+ struct net_device *ndev = ifa->idev->dev;
+ hdd_adapter_t *pAdapter =
+ container_of(nb, struct hdd_adapter_s, ipv6_notifier);
+ hdd_context_t *pHddCtx;
+ int status;
+
+ if (pAdapter && pAdapter->dev == ndev)
+ {
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ status = wlan_hdd_validate_context(pHddCtx);
+ if (0 != status)
+ {
+ hddLog(LOGE, FL("HDD context is invalid"));
+ return NOTIFY_DONE;
+ }
+
+ schedule_work(&pAdapter->ipv6NotifierWorkQueue);
+ }
+
+ return NOTIFY_DONE;
+}
+
+void hdd_ipv6_callback_register(hdd_adapter_t *pAdapter, int fenable)
+{
+
+ int ret = 0;
+
+ if (fenable)
+ {
+
+ if(!pAdapter->ipv6_notifier_registered)
+ {
+
+ // Register IPv6 notifier to notify if any change in IP
+ // So that we can reconfigure the offload parameters
+ pAdapter->ipv6_notifier.notifier_call =
+ wlan_hdd_ipv6_changed;
+ ret = register_inet6addr_notifier(&pAdapter->ipv6_notifier);
+ if (ret)
+ {
+ hddLog(LOGE, FL("Failed to register IPv6 notifier"));
+ }
+ else
+ {
+ hddLog(LOG1, FL("Registered IPv6 notifier"));
+ pAdapter->ipv6_notifier_registered = true;
+ }
+ }
+ }
+ else
+ {
+
+ if (pAdapter->ipv6_notifier_registered)
+ {
+ hddLog(LOG1, FL("Unregistered IPv6 notifier"));
+ unregister_inet6addr_notifier(&pAdapter->ipv6_notifier);
+ pAdapter->ipv6_notifier_registered = false;
+ }
+
+ }
+
+}
+
/*
* Function: hdd_conf_hostoffload
* Central function to configure the supported offloads,
@@ -567,7 +683,9 @@
~(HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST);
}
#endif
+
}
+ hdd_ipv6_callback_register(pAdapter, fenable);
}
else
{
@@ -593,73 +711,14 @@
hdd_conf_ns_offload(pAdapter, fenable);
}
#endif
+ hdd_ipv6_callback_register(pAdapter, fenable);
}
}
return;
}
+
#ifdef WLAN_NS_OFFLOAD
-void hdd_ipv6_notifier_work_queue(struct work_struct *work)
-{
- hdd_adapter_t* pAdapter =
- container_of(work, hdd_adapter_t, ipv6NotifierWorkQueue);
- hdd_context_t *pHddCtx;
- int status;
-
- hddLog(LOG1, FL("Reconfiguring NS Offload"));
-
- pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
- hddLog(LOGE, FL("HDD context is invalid"));
- return;
- }
-
- if ( VOS_FALSE == pHddCtx->sus_res_mcastbcast_filter_valid)
- {
- pHddCtx->sus_res_mcastbcast_filter =
- pHddCtx->configuredMcastBcastFilter;
- pHddCtx->sus_res_mcastbcast_filter_valid = VOS_TRUE;
- }
-
- if ((eConnectionState_Associated ==
- (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState)
- && (pHddCtx->hdd_wlan_suspended))
- {
- // This invocation being part of the IPv6 registration callback,
- // we are passing second parameter as 2 to avoid registration
- // of IPv6 notifier again.
- hdd_conf_ns_offload(pAdapter, 2);
- }
-}
-
-static int wlan_hdd_ipv6_changed(struct notifier_block *nb,
- unsigned long data, void *arg)
-{
- struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)arg;
- struct net_device *ndev = ifa->idev->dev;
- hdd_adapter_t *pAdapter =
- container_of(nb, struct hdd_adapter_s, ipv6_notifier);
- hdd_context_t *pHddCtx;
- int status;
-
- if (pAdapter && pAdapter->dev == ndev)
- {
- pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
- hddLog(LOGE, FL("HDD context is invalid"));
- return NOTIFY_DONE;
- }
-
- schedule_work(&pAdapter->ipv6NotifierWorkQueue);
- }
-
- return NOTIFY_DONE;
-}
-
/**----------------------------------------------------------------------------
\brief hdd_conf_ns_offload() - Configure NS offload
@@ -884,23 +943,6 @@
vos_mem_zero(&offLoadRequest, sizeof(offLoadRequest));
}
}
- if (fenable == 1 && !pAdapter->ipv6_notifier_registered)
- {
- // Register IPv6 notifier to notify if any change in IP
- // So that we can reconfigure the offload parameters
- pAdapter->ipv6_notifier.notifier_call =
- wlan_hdd_ipv6_changed;
- ret = register_inet6addr_notifier(&pAdapter->ipv6_notifier);
- if (ret)
- {
- hddLog(LOGE, FL("Failed to register IPv6 notifier"));
- }
- else
- {
- hddLog(LOG1, FL("Registered IPv6 notifier"));
- pAdapter->ipv6_notifier_registered = true;
- }
- }
}
else
{
@@ -912,12 +954,6 @@
else
{
//Disable NSOffload
- if (pAdapter->ipv6_notifier_registered)
- {
- hddLog(LOG1, FL("Unregistered IPv6 notifier"));
- unregister_inet6addr_notifier(&pAdapter->ipv6_notifier);
- pAdapter->ipv6_notifier_registered = false;
- }
vos_mem_zero((void *)&offLoadRequest, sizeof(tSirHostOffloadReq));
offLoadRequest.enableOrDisable = SIR_OFFLOAD_DISABLE;
offLoadRequest.offloadType = SIR_IPV6_NS_OFFLOAD;