diff options
-rw-r--r-- | wpa_supplicant/ctrl_iface.c | 16 | ||||
-rw-r--r-- | wpa_supplicant/p2p_supplicant.c | 17 | ||||
-rw-r--r-- | wpa_supplicant/scan.c | 16 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant.c | 16 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant_i.h | 5 |
5 files changed, 52 insertions, 18 deletions
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index ff3486e..d75b8fb 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -3169,7 +3169,21 @@ static int p2p_ctrl_set(struct wpa_supplicant *wpa_s, char *cmd) } return 0; } - +#ifdef ANDROID_P2P + if (os_strcmp(cmd, "conc_priority") == 0) { + if(os_strncmp(cmd+strlen("conc_priority")+1, "sta", 3) == 0) + os_strncpy(wpa_s->global->conc_priority, "sta", 3); + else if(os_strncmp(cmd+strlen("conc_priority")+1, "p2p", 3) == 0) + os_strncpy(wpa_s->global->conc_priority, "p2p", 3); + else { + wpa_printf(MSG_ERROR, " conc_priority arg should be either sta or p2p"); + return -1; + } + wpa_printf(MSG_DEBUG, "Single Channel Concurrency: Prioritize %s", + wpa_s->global->conc_priority); + return 0; + } +#endif if (os_strcmp(cmd, "force_long_sd") == 0) { wpa_s->force_long_sd = atoi(param); return 0; diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 3aba246..5e7edc8 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -257,6 +257,11 @@ static void wpas_p2p_group_delete(struct wpa_supplicant *wpa_s) case P2P_GROUP_REMOVAL_UNAVAILABLE: reason = " reason=UNAVAILABLE"; break; +#ifdef ANDROID_P2P + case P2P_GROUP_REMOVAL_FREQ_CONFLICT: + reason = " reason=FREQ_CONFLICT"; + break; +#endif default: reason = ""; break; @@ -805,9 +810,6 @@ static void wpas_p2p_clone_config(struct wpa_supplicant *dst, #define C(n) if (s->n) d->n = os_strdup(s->n) C(device_name); -#ifdef ANDROID_P2P - C(prioritize); -#endif C(manufacturer); C(model_name); C(model_number); @@ -4458,10 +4460,13 @@ int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s, int freq) /* If GO cannot be moved or if the conflicting interface is a * P2P Client, remove the interface depending up on the connection * priority */ - if(wpas_is_interface_prioritized(wpa_s)) { - /* Newly requested connection has priority over existing + if(!wpas_is_p2p_prioritized(wpa_s)) { + /* STA connection has priority over existing * P2P connection. So remove the interface */ - wpas_p2p_disconnect(iface); + wpa_printf(MSG_DEBUG, "P2P: Removing P2P connection due to Single channel" + "concurrent mode frequency conflict"); + iface->removal_reason = P2P_GROUP_REMOVAL_FREQ_CONFLICT; + wpas_p2p_group_delete(iface); } else { /* Existing connection has the priority. Disable the newly * selected network and let the application know about it. diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c index 21cde92..5aee7ff 100644 --- a/wpa_supplicant/scan.c +++ b/wpa_supplicant/scan.c @@ -238,13 +238,18 @@ wpa_supplicant_start_sched_scan(struct wpa_supplicant *wpa_s, int interval) { int ret; - +#ifndef ANDROID_P2P wpa_supplicant_notify_scanning(wpa_s, 1); +#endif ret = wpa_drv_sched_scan(wpa_s, params, interval * 1000); if (ret) wpa_supplicant_notify_scanning(wpa_s, 0); - else + else { wpa_s->sched_scanning = 1; +#ifdef ANDROID_P2P + wpa_supplicant_notify_scanning(wpa_s, 1); +#endif + } return ret; } @@ -782,9 +787,11 @@ int wpa_supplicant_req_sched_scan(struct wpa_supplicant *wpa_s) sizeof(struct wpa_driver_scan_filter)); prev_state = wpa_s->wpa_state; +#ifndef ANDROID_P2P if (wpa_s->wpa_state == WPA_DISCONNECTED || wpa_s->wpa_state == WPA_INACTIVE) wpa_supplicant_set_state(wpa_s, WPA_SCANNING); +#endif /* Find the starting point from which to continue scanning */ ssid = wpa_s->conf->ssid; @@ -939,7 +946,12 @@ void wpa_supplicant_notify_scanning(struct wpa_supplicant *wpa_s, int scanning) { if (wpa_s->scanning != scanning) { +#ifdef ANDROID_P2P + if(!wpa_s->sched_scanning) + wpa_s->scanning = scanning; +#else wpa_s->scanning = scanning; +#endif wpas_notify_scanning(wpa_s); } } diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index d5e5000..81d00f3 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -1420,6 +1420,7 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_FREQ_CONFLICT " id=%d", ssid->id); os_memset(wpa_s->pending_bssid, 0, ETH_ALEN); + return; } } #endif @@ -3123,15 +3124,14 @@ int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s) } #ifdef ANDROID_P2P -int wpas_is_interface_prioritized(struct wpa_supplicant *wpa_s) +int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s) { - if(wpa_s->conf->prioritize && - !os_strncmp(wpa_s->conf->prioritize, wpa_s->ifname, sizeof(wpa_s->ifname))) { - /* The given interface is prioritized */ - wpa_printf(MSG_DEBUG, "Given interface (%s) is prioritized" , wpa_s->ifname); + if(os_strncmp(wpa_s->global->conc_priority, "p2p", 3) == 0) return 1; - } - wpa_printf(MSG_DEBUG, "Given interface (%s) is not prioritized" , wpa_s->ifname); - return 0; + else if(os_strncmp(wpa_s->global->conc_priority, "sta", 3) == 0) + return 0; + + /* IF conc_priority is not set, return -1 */ + return -1; } #endif diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 484b650..74a0dde 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -219,6 +219,9 @@ struct wpa_global { struct dl_list p2p_srv_bonjour; /* struct p2p_srv_bonjour */ struct dl_list p2p_srv_upnp; /* struct p2p_srv_upnp */ int p2p_disabled; +#ifdef ANDROID_P2P + char conc_priority[5]; /* "sta" or "p2p" */ +#endif int cross_connection; }; @@ -600,7 +603,7 @@ void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s); void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid); int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s); #ifdef ANDROID_P2P -int wpas_is_interface_prioritized(struct wpa_supplicant *wpa_s); +int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s); #endif /* events.c */ |