Restore STA reconnection behavior

Have the customized retry behavior only for P2P & do group failure indication
beyond 5 retries

Bug: 6674338
Change-Id: I58cba356ebdb7fc4eaa9bedfa417b7d5d35bb306
diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
index 2605ae8..3be6c26 100644
--- a/wpa_supplicant/config_ssid.h
+++ b/wpa_supplicant/config_ssid.h
@@ -422,6 +422,12 @@
 	 * WPS or similar so that they may be exported.
 	 */
 	int export_keys;
+#ifdef ANDROID_P2P
+	/**
+	 * assoc_retry - Number of times association should be retried.
+	 */
+	int assoc_retry;
+#endif
 
 #ifdef CONFIG_HT_OVERRIDES
 	/**
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index e729e82..5ce5b72 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -2263,23 +2263,40 @@
 		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)
 			sme_event_assoc_reject(wpa_s, data);
 #ifdef ANDROID_P2P
-		/* If assoc reject is reported by the driver, then avoid
-		 * waiting for  the authentication timeout. Cancel the
-		 * authentication timeout and retry the assoc.
-		 */
-		if(wpa_s->assoc_retries++ < 5) {
-			wpa_printf(MSG_ERROR, "Retrying assoc "
-			"Iteration:%d", wpa_s->assoc_retries);
-			wpa_supplicant_cancel_auth_timeout(wpa_s);
+#ifdef CONFIG_P2P
+		else if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) {
 
-			/* Clear the states */
-			wpa_sm_notify_disassoc(wpa_s->wpa);
-			wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
+			if(!wpa_s->current_ssid) {
+				wpa_printf(MSG_ERROR, "current_ssid == NULL");
+				break;
+			}
+			/* If assoc reject is reported by the driver, then avoid
+			 * waiting for  the authentication timeout. Cancel the
+			 * authentication timeout and retry the assoc.
+			 */
+			if(wpa_s->current_ssid->assoc_retry++ < 5) {
+				wpa_printf(MSG_ERROR, "Retrying assoc: %d ",
+								wpa_s->current_ssid->assoc_retry);
+				wpa_supplicant_cancel_auth_timeout(wpa_s);
 
-			wpa_s->reassociate = 1;
-			wpa_supplicant_req_scan(wpa_s, 1, 0);
-		} else
-			wpa_s->assoc_retries = 0;
+				/* Clear the states */
+				wpa_sm_notify_disassoc(wpa_s->wpa);
+				wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
+
+				wpa_s->reassociate = 1;
+				wpa_supplicant_req_scan(wpa_s, 1, 0);
+			} else {
+				/* If we ASSOC_REJECT's hits threshold, disable the 
+			 	 * network
+			 	 */
+				wpa_printf(MSG_ERROR, "Assoc retry threshold reached. "
+				"Disabling the network");
+				wpa_s->current_ssid->assoc_retry = 0;
+				wpa_supplicant_disable_network(wpa_s, wpa_s->current_ssid);
+				wpas_p2p_group_remove(wpa_s, wpa_s->ifname);
+			}
+		}
+#endif
 #endif /* ANDROID_P2P */
 		break;
 	case EVENT_AUTH_TIMED_OUT:
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index cb5b42f..e1ad4d9 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -582,8 +582,9 @@
 		wpa_supplicant_state_txt(state));
 
 #ifdef ANDROID_P2P
-	if(state == WPA_ASSOCIATED || (state <= WPA_INACTIVE))
-		wpa_s->assoc_retries = 0;
+	if(state == WPA_ASSOCIATED && wpa_s->current_ssid) {
+		wpa_s->current_ssid->assoc_retry = 0;
+	}
 #endif /* ANDROID_P2P */
 
 	if (state != WPA_SCANNING)
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 33b6258..21fe5cc 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -276,9 +276,6 @@
 	struct wpa_bss *current_bss;
 	int ap_ies_from_associnfo;
 	unsigned int assoc_freq;
-#ifdef ANDROID_P2P
-	unsigned int assoc_retries;
-#endif
 
 	/* Selected configuration (based on Beacon/ProbeResp WPA IE) */
 	int pairwise_cipher;