wlan: Avoid race between IP notifier register unregister
Avoid race condition between IP notifier registration and
de-registration by moving the registration out into the
initialization path.
Change-Id: I835f19290d55aed18d2bea2dc39ca95aac557e4a
CRs-Fixed: 750261
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 7ddcf39..73056cc 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -6476,6 +6476,7 @@
const char *iface_name, tSirMacAddr macAddr,
tANI_U8 rtnl_held )
{
+ int ret = 0;
hdd_adapter_t *pAdapter = NULL;
hdd_adapter_list_node_t *pHddAdapterNode = NULL;
VOS_STATUS status = VOS_STATUS_E_FAILURE;
@@ -6547,10 +6548,36 @@
// Workqueue which gets scheduled in IPv4 notification callback.
INIT_WORK(&pAdapter->ipv4NotifierWorkQueue, hdd_ipv4_notifier_work_queue);
+ // Register IPv4 notifier to notify if any change in IP
+ // So that we can reconfigure the offload parameters
+ pAdapter->ipv4_notifier.notifier_call = wlan_hdd_ipv4_changed;
+ ret = register_inetaddr_notifier(&pAdapter->ipv4_notifier);
+ if (ret)
+ {
+ hddLog(LOGE, FL("Failed to register IPv4 notifier"));
+ }
+ else
+ {
+ hddLog(LOG1, FL("Registered IPv4 notifier"));
+ pAdapter->ipv4_notifier_registered = true;
+ }
#ifdef WLAN_NS_OFFLOAD
// Workqueue which gets scheduled in IPv6 notification callback.
INIT_WORK(&pAdapter->ipv6NotifierWorkQueue, hdd_ipv6_notifier_work_queue);
+ // 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;
+ }
#endif
//Stop the Interface TX queue.
netif_tx_disable(pAdapter->dev);