wlan: mDNS server offload failure post SSR recovery

Currently Post SSr mdns response pack failed due to
corrupted ini data. ini data gets corrupted when parsed
first time to offload.
To fix the issue ini data is copied to temporary string and
then parsed.

Change-Id: I01aacff1e3139beb80045297ede2f20c1b715db7
CRs-Fixed: 2018341
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index b6867d3..ad84c95 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -2196,4 +2196,5 @@
 	return -ENOTSUPP;
 }
 #endif
+int hdd_dhcp_mdns_offload(hdd_adapter_t *adapter);
 #endif    // end #if !defined( WLAN_HDD_MAIN_H )
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index b95f9b2..fe6267e 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -5116,13 +5116,20 @@
                       uint8_t max_len_entry)
 {
     uint8_t num = 0;
-    char *str = data;
+    char *str = NULL;
     char *field;
     uint16_t len = 0;
 
     if ((data == NULL) || ( datalist == NULL) || (num_entries == NULL))
         return VOS_STATUS_E_INVAL;
 
+    str = vos_mem_malloc(strlen((char *)data));
+    if (!str) {
+       VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+                 "%s str allocation failed",__func__);
+       return -ENOMEM;
+    }
+    vos_mem_copy(str, data, strlen((char *)data));
     /* parse the string */
     while (str && ('\0' != *str) && (num < max_entries)) {
         field = str;
@@ -5146,6 +5153,7 @@
         num++;
     }
     *num_entries = num;
+    vos_mem_free(str);
 
     return 0;
 }
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 119ad01..fa56021 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -10371,32 +10371,57 @@
     /* set dhcp server offload */
     if (iniConfig->enable_dhcp_srv_offload &&
         sme_IsFeatureSupportedByFW(SAP_OFFLOADS)) {
+        vos_event_reset(&pHostapdAdapter->dhcp_status.vos_event);
         status = wlan_hdd_set_dhcp_server_offload(pHostapdAdapter, false);
         if (!VOS_IS_STATUS_SUCCESS(status))
         {
             VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
                       ("HDD DHCP Server Offload Failed!!"));
-            return -EINVAL;
+            vos_event_reset(&pHostapdState->vosEvent);
+            if (VOS_STATUS_SUCCESS == WLANSAP_StopBss(pHddCtx->pvosContext)) {
+                status = vos_wait_single_event(&pHostapdState->vosEvent,
+                                               10000);
+                if (!VOS_IS_STATUS_SUCCESS(status)) {
+                    hddLog(LOGE, FL("SAP Stop Failed"));
+                    return -EINVAL;
+                }
+            }
         }
-        vos_event_reset(&pHostapdAdapter->dhcp_status.vos_event);
         status = vos_wait_single_event(&pHostapdAdapter->dhcp_status.vos_event, 2000);
         if (!VOS_IS_STATUS_SUCCESS(status) || pHostapdAdapter->dhcp_status.dhcp_offload_status)
         {
             VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
                      ("ERROR: DHCP HDD vos wait for single_event failed!! %d"),
                      pHostapdAdapter->dhcp_status.dhcp_offload_status);
-            return -EINVAL;
+            vos_event_reset(&pHostapdState->vosEvent);
+            if (VOS_STATUS_SUCCESS == WLANSAP_StopBss(pHddCtx->pvosContext)) {
+                status = vos_wait_single_event(&pHostapdState->vosEvent,
+                                               10000);
+                if (!VOS_IS_STATUS_SUCCESS(status)) {
+                    hddLog(LOGE, FL("SAP Stop Failed"));
+                    return -EINVAL;
+                }
+            }
         }
 #ifdef MDNS_OFFLOAD
         if (iniConfig->enable_mdns_offload) {
+            vos_event_reset(&pHostapdAdapter->mdns_status.vos_event);
             status = wlan_hdd_set_mdns_offload(pHostapdAdapter);
             if (VOS_IS_STATUS_SUCCESS(status))
             {
                 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
                           ("HDD MDNS Server Offload Failed!!"));
-                return -EINVAL;
+                vos_event_reset(&pHostapdState->vosEvent);
+                if (VOS_STATUS_SUCCESS ==
+                    WLANSAP_StopBss(pHddCtx->pvosContext)) {
+                    status = vos_wait_single_event(&pHostapdState->vosEvent,
+                                                   10000);
+                    if (!VOS_IS_STATUS_SUCCESS(status)) {
+                        hddLog(LOGE, FL("SAP Stop Failed"));
+                        return -EINVAL;
+                    }
+                }
             }
-            vos_event_reset(&pHostapdAdapter->mdns_status.vos_event);
             status = vos_wait_single_event(&pHostapdAdapter->
                                            mdns_status.vos_event, 2000);
             if (!VOS_IS_STATUS_SUCCESS(status) ||
@@ -10409,7 +10434,16 @@
                           pHostapdAdapter->mdns_status.mdns_enable_status,
                           pHostapdAdapter->mdns_status.mdns_fqdn_status,
                           pHostapdAdapter->mdns_status.mdns_resp_status);
-                return -EINVAL;
+                vos_event_reset(&pHostapdState->vosEvent);
+                if (VOS_STATUS_SUCCESS ==
+                    WLANSAP_StopBss(pHddCtx->pvosContext)) {
+                    status = vos_wait_single_event(&pHostapdState->vosEvent,
+                                                   10000);
+                    if (!VOS_IS_STATUS_SUCCESS(status)) {
+                        hddLog(LOGE, FL("SAP Stop Failed"));
+                        return -EINVAL;
+                    }
+                }
             }
         }
 #endif /* MDNS_OFFLOAD */
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index 95cf862..dcf9a4d 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -2376,7 +2376,7 @@
    return VOS_STATUS_SUCCESS;
 }
 
-static int hdd_dhcp_mdns_offload(hdd_adapter_t *adapter)
+int hdd_dhcp_mdns_offload(hdd_adapter_t *adapter)
 {
     hdd_config_t *config;
     int status = VOS_STATUS_SUCCESS;
@@ -2392,6 +2392,7 @@
     /* set dhcp server offload */
     if (config->enable_dhcp_srv_offload &&
         sme_IsFeatureSupportedByFW(SAP_OFFLOADS)) {
+        vos_event_reset(&adapter->dhcp_status.vos_event);
         status = wlan_hdd_set_dhcp_server_offload(adapter, true);
         if (!VOS_IS_STATUS_SUCCESS(status))
         {
@@ -2399,7 +2400,6 @@
                       ("HDD DHCP Server Offload Failed!!"));
             return -EINVAL;
         }
-        vos_event_reset(&adapter->dhcp_status.vos_event);
         status = vos_wait_single_event(&adapter->dhcp_status.vos_event, 2000);
         if (!VOS_IS_STATUS_SUCCESS(status) ||
             adapter->dhcp_status.dhcp_offload_status)
@@ -2411,6 +2411,7 @@
         }
 #ifdef MDNS_OFFLOAD
         if (config->enable_mdns_offload) {
+            vos_event_reset(&adapter->mdns_status.vos_event);
             status = wlan_hdd_set_mdns_offload(adapter);
             if (VOS_IS_STATUS_SUCCESS(status))
             {
@@ -2418,7 +2419,6 @@
                           ("HDD MDNS Server Offload Failed!!"));
                 return -EINVAL;
             }
-            vos_event_reset(&adapter->mdns_status.vos_event);
             status = vos_wait_single_event(&adapter->
                                            mdns_status.vos_event, 2000);
             if (!VOS_IS_STATUS_SUCCESS(status) ||
@@ -2456,6 +2456,7 @@
 	VOS_STATUS       status;
 	hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
 	hdd_adapter_t *adapter;
+	hdd_hostapd_state_t *hostapd_state;
 
 	ENTER();
 
@@ -2463,13 +2464,25 @@
 	while (NULL != adapter_node && VOS_STATUS_SUCCESS == status) {
 		adapter = adapter_node->pAdapter;
 		if (adapter && adapter->device_mode == WLAN_HDD_SOFTAP) {
+			hostapd_state = WLAN_HDD_GET_HOSTAP_STATE_PTR(adapter);
 			hddLog(VOS_TRACE_LEVEL_INFO, FL("in sap mode %p"),
-				adapter);
+			       adapter);
 			wlan_hdd_start_sap(adapter);
-                        if (!VOS_IS_STATUS_SUCCESS(
-                            hdd_dhcp_mdns_offload(adapter)))
-                             hddLog(VOS_TRACE_LEVEL_INFO,
-                                    FL("DHCP/MDNS offload Failed!!"));
+			if (!VOS_IS_STATUS_SUCCESS(
+				hdd_dhcp_mdns_offload(adapter))) {
+			    vos_event_reset(&hostapd_state->vosEvent);
+			    hddLog(VOS_TRACE_LEVEL_ERROR,
+				   FL("DHCP/MDNS offload Failed!!"));
+				if (VOS_STATUS_SUCCESS ==
+				    WLANSAP_StopBss(hdd_ctx->pvosContext)) {
+				    status = vos_wait_single_event(
+					    &hostapd_state->vosEvent, 10000);
+					if (!VOS_IS_STATUS_SUCCESS(status)) {
+						hddLog(LOGE, FL("SAP Stop Failed"));
+						return;
+					}
+				}
+			}
 		}
 		status = hdd_get_next_adapter(hdd_ctx, adapter_node, &next);
 		adapter_node = next;
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index d0acd9a..97410e0 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -9316,6 +9316,18 @@
         set_bit(SOFTAP_BSS_STARTED, &ap_adapter->event_flags);
         wlan_hdd_incr_active_session(pHddCtx, ap_adapter->device_mode);
         pHostapdState->bCommit = TRUE;
+        if (!VOS_IS_STATUS_SUCCESS(hdd_dhcp_mdns_offload(ap_adapter))) {
+            hddLog(VOS_TRACE_LEVEL_ERROR, FL("DHCP/MDNS offload Failed!!"));
+            vos_event_reset(&pHostapdState->vosEvent);
+            if (VOS_STATUS_SUCCESS == WLANSAP_StopBss(pHddCtx->pvosContext)) {
+                vos_status = vos_wait_single_event(&pHostapdState->vosEvent,
+                                                   10000);
+                if (!VOS_IS_STATUS_SUCCESS(vos_status)) {
+                    hddLog(LOGE, FL("SAP Stop Failed"));
+                    goto end;
+                }
+            }
+        }
     }
 end:
     mutex_unlock(&pHddCtx->sap_lock);