if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)
sme_event_assoc_reject(wpa_s, data);
else {
+#ifdef ANDROID_P2P
+ 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++ < 10) {
+ wpa_printf(MSG_ERROR, "Retrying assoc: %d ",
+ wpa_s->current_ssid->assoc_retry);
+
+ wpa_supplicant_cancel_auth_timeout(wpa_s);
+
+ /* Clear the states */
+ wpa_sm_notify_disassoc(wpa_s->wpa);
+ wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
+
+ wpa_s->reassociate = 1;
+ if (wpa_s->p2p_group_interface == NOT_P2P_GROUP_INTERFACE) {
+ const u8 *bl_bssid = data->assoc_reject.bssid;
+ if (!bl_bssid || is_zero_ether_addr(bl_bssid))
+ bl_bssid = wpa_s->pending_bssid;
+ wpa_blacklist_add(wpa_s, bl_bssid);
+ wpa_supplicant_req_scan(wpa_s, 0, 0);
+ } else {
+ wpa_supplicant_req_scan(wpa_s, 1, 0);
+ }
+ } else if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) {
+ /* 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);
+ }
+#else
const u8 *bssid = data->assoc_reject.bssid;
if (bssid == NULL || is_zero_ether_addr(bssid))
bssid = wpa_s->pending_bssid;
wpas_connection_failed(wpa_s, bssid);
wpa_supplicant_mark_disassoc(wpa_s);
+#endif /* ANDROID_P2P */
}
break;
case EVENT_AUTH_TIMED_OUT: