From patchwork Thu Feb 13 09:23:59 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilan Peer X-Patchwork-Id: 319933 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from maxx.maxx.shmoo.com (maxx.shmoo.com [205.134.188.171]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 03AE92C0090 for ; Thu, 13 Feb 2014 20:22:03 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id B7F6C17C009; Thu, 13 Feb 2014 04:22:00 -0500 (EST) X-Virus-Scanned: amavisd-new at maxx.shmoo.com Received: from maxx.maxx.shmoo.com ([127.0.0.1]) by localhost (maxx.shmoo.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id cv3nx+rBdx+p; Thu, 13 Feb 2014 04:22:00 -0500 (EST) Received: from maxx.shmoo.com (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id 47E459C0F1; Thu, 13 Feb 2014 04:21:55 -0500 (EST) X-Original-To: mailman-post+hostap@maxx.shmoo.com Delivered-To: mailman-post+hostap@maxx.shmoo.com Received: from localhost (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id D384317C009 for ; Thu, 13 Feb 2014 04:21:54 -0500 (EST) X-Virus-Scanned: amavisd-new at maxx.shmoo.com Received: from maxx.maxx.shmoo.com ([127.0.0.1]) by localhost (maxx.shmoo.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Gey-pcyWAjJR for ; Thu, 13 Feb 2014 04:21:49 -0500 (EST) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id 6151717C003 for ; Thu, 13 Feb 2014 04:21:49 -0500 (EST) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga102.jf.intel.com with ESMTP; 13 Feb 2014 01:17:30 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.95,837,1384329600"; d="scan'208";a="454767028" Received: from unknown (HELO ipeer-e6430-1.jer.intel.com) ([10.12.217.169]) by orsmga001.jf.intel.com with ESMTP; 13 Feb 2014 01:21:44 -0800 From: Ilan Peer To: hostap@lists.shmoo.com Subject: [PATCH 1/3] pno: Change sched_scan_stopped event to handle pending PNO properly Date: Thu, 13 Feb 2014 11:23:59 +0200 Message-Id: <1392283441-13612-1-git-send-email-ilan.peer@intel.com> X-Mailer: git-send-email 1.7.10.4 X-BeenThere: hostap@lists.shmoo.com X-Mailman-Version: 2.1.11 Precedence: list List-Id: HostAP Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: hostap-bounces@lists.shmoo.com Errors-To: hostap-bounces@lists.shmoo.com From: Alexander Bondar 1. Move pno_start and pno_stop to scan.c as more relevant location. Rename them to wpa_supplicant_start_pno/stop_pno. 2. Change wpa_supplicant_stop_pno so that nothing will be done if PNO is not in progress. 3. When a sched_scan_stopped event is received and there is a pending PNO, it uses regular scheduled scan parameters instead of PNO specific parameters. Change it by calling wpa_supplicant_start_pno. Signed-hostap: Alexander Bondar --- wpa_supplicant/ctrl_iface.c | 106 +------------------------------------------ wpa_supplicant/events.c | 15 ++---- wpa_supplicant/scan.c | 106 +++++++++++++++++++++++++++++++++++++++++++ wpa_supplicant/scan.h | 2 + 4 files changed, 115 insertions(+), 114 deletions(-) diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index ddddad3..4047b64 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -46,108 +46,6 @@ static int wpa_supplicant_global_iface_list(struct wpa_global *global, static int wpa_supplicant_global_iface_interfaces(struct wpa_global *global, char *buf, int len); - -static int pno_start(struct wpa_supplicant *wpa_s) -{ - int ret, interval; - size_t i, num_ssid; - struct wpa_ssid *ssid; - struct wpa_driver_scan_params params; - - if (wpa_s->pno || wpa_s->pno_sched_pending) - return 0; - - if ((wpa_s->wpa_state > WPA_SCANNING) && - (wpa_s->wpa_state <= WPA_COMPLETED)) { - wpa_printf(MSG_ERROR, "PNO: In assoc process"); - return -EAGAIN; - } - - if (wpa_s->wpa_state == WPA_SCANNING) { - wpa_supplicant_cancel_scan(wpa_s); - if (wpa_s->sched_scanning) { - wpa_printf(MSG_DEBUG, "Schedule PNO on completion of " - "ongoing sched scan"); - wpa_supplicant_cancel_sched_scan(wpa_s); - wpa_s->pno_sched_pending = 1; - return 0; - } - } - - os_memset(¶ms, 0, sizeof(params)); - - num_ssid = 0; - ssid = wpa_s->conf->ssid; - while (ssid) { - if (!wpas_network_disabled(wpa_s, ssid)) - num_ssid++; - ssid = ssid->next; - } - if (num_ssid > WPAS_MAX_SCAN_SSIDS) { - wpa_printf(MSG_DEBUG, "PNO: Use only the first %u SSIDs from " - "%u", WPAS_MAX_SCAN_SSIDS, (unsigned int) num_ssid); - num_ssid = WPAS_MAX_SCAN_SSIDS; - } - - if (num_ssid == 0) { - wpa_printf(MSG_DEBUG, "PNO: No configured SSIDs"); - return -1; - } - - params.filter_ssids = os_malloc(sizeof(struct wpa_driver_scan_filter) * - num_ssid); - if (params.filter_ssids == NULL) - return -1; - i = 0; - ssid = wpa_s->conf->ssid; - while (ssid) { - if (!wpas_network_disabled(wpa_s, ssid)) { - params.ssids[i].ssid = ssid->ssid; - params.ssids[i].ssid_len = ssid->ssid_len; - params.num_ssids++; - os_memcpy(params.filter_ssids[i].ssid, ssid->ssid, - ssid->ssid_len); - params.filter_ssids[i].ssid_len = ssid->ssid_len; - params.num_filter_ssids++; - i++; - if (i == num_ssid) - break; - } - ssid = ssid->next; - } - - if (wpa_s->conf->filter_rssi) - params.filter_rssi = wpa_s->conf->filter_rssi; - - interval = wpa_s->conf->sched_scan_interval ? - wpa_s->conf->sched_scan_interval : 10; - - ret = wpa_supplicant_start_sched_scan(wpa_s, ¶ms, interval); - os_free(params.filter_ssids); - if (ret == 0) - wpa_s->pno = 1; - return ret; -} - - -static int pno_stop(struct wpa_supplicant *wpa_s) -{ - int ret = 0; - - if (wpa_s->pno || wpa_s->sched_scanning) { - wpa_s->pno = 0; - ret = wpa_supplicant_stop_sched_scan(wpa_s); - } - - wpa_s->pno_sched_pending = 0; - - if (wpa_s->wpa_state == WPA_SCANNING) - wpa_supplicant_req_scan(wpa_s, 0, 0); - - return ret; -} - - static int set_bssid_filter(struct wpa_supplicant *wpa_s, char *val) { char *pos; @@ -391,9 +289,9 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s, #endif /* CONFIG_TDLS */ } else if (os_strcasecmp(cmd, "pno") == 0) { if (atoi(value)) - ret = pno_start(wpa_s); + ret = wpa_supplicant_start_pno(wpa_s); else - ret = pno_stop(wpa_s); + ret = wpa_supplicant_stop_pno(wpa_s); } else if (os_strcasecmp(cmd, "radio_disabled") == 0) { int disabled = atoi(value); if (wpa_drv_radio_disable(wpa_s, disabled) < 0) diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index a72f2fa..182b473 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -3300,17 +3300,12 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, * Start a new sched scan to continue searching for more SSIDs * either if timed out or PNO schedule scan is pending. */ - if (wpa_s->sched_scan_timed_out || wpa_s->pno_sched_pending) { - - if (wpa_supplicant_req_sched_scan(wpa_s) < 0 && - wpa_s->pno_sched_pending) { - wpa_msg(wpa_s, MSG_ERROR, "Failed to schedule PNO"); - } else if (wpa_s->pno_sched_pending) { - wpa_s->pno_sched_pending = 0; - wpa_s->pno = 1; - } + if (wpa_s->sched_scan_timed_out) + wpa_supplicant_req_sched_scan(wpa_s); + else if (wpa_s->pno_sched_pending) { + wpa_s->pno_sched_pending = 0; + wpa_supplicant_start_pno(wpa_s); } - break; case EVENT_WPS_BUTTON_PUSHED: #ifdef CONFIG_WPS diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c index 18d243e..2d1eb2a 100644 --- a/wpa_supplicant/scan.c +++ b/wpa_supplicant/scan.c @@ -1801,3 +1801,109 @@ void wpa_scan_free_params(struct wpa_driver_scan_params *params) os_free(params->filter_ssids); os_free(params); } + +int wpa_supplicant_start_pno(struct wpa_supplicant *wpa_s) +{ + int ret, interval; + size_t i, num_ssid; + struct wpa_ssid *ssid; + struct wpa_driver_scan_params params; + + if (!wpa_s->sched_scan_supported) + return -1; + + if (wpa_s->pno || wpa_s->pno_sched_pending) + return 0; + + if ((wpa_s->wpa_state > WPA_SCANNING) && + (wpa_s->wpa_state <= WPA_COMPLETED)) { + wpa_printf(MSG_ERROR, "PNO: In assoc process"); + return -EAGAIN; + } + + if (wpa_s->wpa_state == WPA_SCANNING) { + wpa_supplicant_cancel_scan(wpa_s); + if (wpa_s->sched_scanning) { + wpa_printf(MSG_DEBUG, "Schedule PNO on completion of " + "ongoing sched scan"); + wpa_supplicant_cancel_sched_scan(wpa_s); + wpa_s->pno_sched_pending = 1; + return 0; + } + } + + os_memset(¶ms, 0, sizeof(params)); + + num_ssid = 0; + ssid = wpa_s->conf->ssid; + while (ssid) { + if (!wpas_network_disabled(wpa_s, ssid)) + num_ssid++; + ssid = ssid->next; + } + if (num_ssid > WPAS_MAX_SCAN_SSIDS) { + wpa_printf(MSG_DEBUG, "PNO: Use only the first %u SSIDs from " + "%u", WPAS_MAX_SCAN_SSIDS, (unsigned int) num_ssid); + num_ssid = WPAS_MAX_SCAN_SSIDS; + } + + if (num_ssid == 0) { + wpa_printf(MSG_DEBUG, "PNO: No configured SSIDs"); + return -1; + } + + params.filter_ssids = os_malloc(sizeof(struct wpa_driver_scan_filter) * + num_ssid); + if (params.filter_ssids == NULL) + return -1; + i = 0; + ssid = wpa_s->conf->ssid; + while (ssid) { + if (!wpas_network_disabled(wpa_s, ssid)) { + params.ssids[i].ssid = ssid->ssid; + params.ssids[i].ssid_len = ssid->ssid_len; + params.num_ssids++; + os_memcpy(params.filter_ssids[i].ssid, ssid->ssid, + ssid->ssid_len); + params.filter_ssids[i].ssid_len = ssid->ssid_len; + params.num_filter_ssids++; + i++; + if (i == num_ssid) + break; + } + ssid = ssid->next; + } + + if (wpa_s->conf->filter_rssi) + params.filter_rssi = wpa_s->conf->filter_rssi; + + interval = wpa_s->conf->sched_scan_interval ? + wpa_s->conf->sched_scan_interval : 10; + + ret = wpa_supplicant_start_sched_scan(wpa_s, ¶ms, interval); + os_free(params.filter_ssids); + if (ret == 0) + wpa_s->pno = 1; + else + wpa_msg(wpa_s, MSG_ERROR, "Failed to schedule PNO"); + return ret; +} + + +int wpa_supplicant_stop_pno(struct wpa_supplicant *wpa_s) +{ + int ret = 0; + + if (!wpa_s->pno) + return 0; + + ret = wpa_supplicant_stop_sched_scan(wpa_s); + + wpa_s->pno = 0; + wpa_s->pno_sched_pending = 0; + + if (wpa_s->wpa_state == WPA_SCANNING) + wpa_supplicant_req_scan(wpa_s, 0, 0); + + return ret; +} diff --git a/wpa_supplicant/scan.h b/wpa_supplicant/scan.h index e4c8989..aae0b62 100644 --- a/wpa_supplicant/scan.h +++ b/wpa_supplicant/scan.h @@ -46,5 +46,7 @@ int wpa_supplicant_stop_sched_scan(struct wpa_supplicant *wpa_s); struct wpa_driver_scan_params * wpa_scan_clone_params(const struct wpa_driver_scan_params *src); void wpa_scan_free_params(struct wpa_driver_scan_params *params); +int wpa_supplicant_start_pno(struct wpa_supplicant *wpa_s); +int wpa_supplicant_stop_pno(struct wpa_supplicant *wpa_s); #endif /* SCAN_H */