From patchwork Fri Jun 12 14:00:41 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Coelho X-Patchwork-Id: 6598891 X-Patchwork-Delegate: kvalo@adurom.com Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 4E03CC0020 for ; Fri, 12 Jun 2015 14:01:11 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4A7C32066D for ; Fri, 12 Jun 2015 14:01:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3F5F52034A for ; Fri, 12 Jun 2015 14:01:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752013AbbFLOBD (ORCPT ); Fri, 12 Jun 2015 10:01:03 -0400 Received: from paleale.coelho.fi ([176.9.41.70]:59247 "EHLO farmhouse.coelho.fi" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753338AbbFLOA7 (ORCPT ); Fri, 12 Jun 2015 10:00:59 -0400 Received: from a88-113-225-236.elisa-laajakaista.fi ([88.113.225.236] helo=localhost.localdomain) by farmhouse.coelho.fi with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_CBC_SHA256:128) (Exim 4.85) (envelope-from ) id 1Z3PVw-00057K-Uq; Fri, 12 Jun 2015 17:00:57 +0300 From: Luca Coelho To: aspriel@gmail.com Cc: linux-wireless@vger.kernel.org Date: Fri, 12 Jun 2015 17:00:41 +0300 Message-Id: <1434117644-3033-2-git-send-email-luca@coelho.fi> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1434117644-3033-1-git-send-email-luca@coelho.fi> References: <1434117644-3033-1-git-send-email-luca@coelho.fi> X-SA-Exim-Connect-IP: 88.113.225.236 X-SA-Exim-Mail-From: luca@coelho.fi X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Subject: [PATCH py80211 1/4] py80211: scan: spin base scan classes off scan_request X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:24:06 +0000) X-SA-Exim-Scanned: Yes (on farmhouse.coelho.fi) Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Luciano Coelho Most of the scan_request code can be reused for scheduled scan, so spin the common part off the regular scan class. Additionally, add one extra class that is able to send scan commands (for sched_scan stop, for instance) without adding any scan attributes. Signed-off-by: Luciano Coelho --- lib/scan.py | 106 ++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 42 deletions(-) diff --git a/lib/scan.py b/lib/scan.py index 491c0b7..5ccae55 100644 --- a/lib/scan.py +++ b/lib/scan.py @@ -84,14 +84,65 @@ class bss_list(custom_handler): traceback.print_tb(tb) return nl.NL_SKIP -class scan_request(custom_handler): +class scan_cmd_base(custom_handler): def __init__(self, ifidx, level=nl.NL_CB_DEFAULT): - self._ifidx = ifidx self._access = access80211(level) + self._nl_cmd = None + self._ifidx = ifidx + + def _wait_for_completion(self): + while self.scan_busy: + self._access._sock.recvmsgs(self._access._rx_cb) + + def _prepare_cmd(self): + if self._nl_cmd == None: + raise Exception("sub-class must set _nl_cmd") + + flags = nlc.NLM_F_REQUEST | nlc.NLM_F_ACK + self._nl_msg = self._access.alloc_genlmsg(self._nl_cmd, flags) + nl.nla_put_u32(self._nl_msg._msg, nl80211.ATTR_IFINDEX, self._ifidx) + + def _send_and_wait(self): + self.scan_busy = True + self._access.disable_seq_check() + mcid = self._access.subscribe_multicast('scan') + ret = self._access.send(self._nl_msg, self) + if ret < 0: + self.scan_busy = False + return ret + + self._wait_for_completion() + self._access.drop_multicast(mcid) + return 0 + +class scan_start_base(scan_cmd_base): + def __init__(self, ifidx, level=nl.NL_CB_DEFAULT): + super(scan_start_base, self).__init__(ifidx, level) self._ssids = None self._freqs = None self._flags = 0 self._ies = None + self._nl_cmd = None + + def _add_scan_attrs(self): + if self._ssids: + i = 0 + nest = nl.nla_nest_start(self._nl_msg._msg, nl80211.ATTR_SCAN_SSIDS) + for ssid in self._ssids: + nl.nla_put(self._nl_msg._msg, i, ssid) + i += 1 + nl.nla_nest_end(self._nl_msg._msg, nest) + if self._freqs: + i = 0 + nest = nl.nla_nest_start(self._nl_msg._msg, nl80211.ATTR_SCAN_FREQUENCIES) + for freq in self._freqs: + nl.nla_put_u32(self._nl_msg._msg, i, freq) + i += 1 + nl.nla_nest_end(self._nl_msg._msg, nest) + if self._flags != 0: + nl.nla_put_u32(self._nl_msg._msg, nl80211.ATTR_SCAN_FLAGS, self._flags) + if self._ies: + nl.nla_put(self._nl_msg._msg, nl80211.ATTR_IE, self._ies) def add_ssids(self, ssids): if self._ssids == None: @@ -115,49 +166,20 @@ class scan_request(custom_handler): def set_flags(self, flags): self._flags = flags - def wait_for_scan_completion(self): - while self.scan_busy: - self._access._sock.recvmsgs(self._access._rx_cb) - - def send(self): - flags = nlc.NLM_F_REQUEST | nlc.NLM_F_ACK - m = self._access.alloc_genlmsg(nl80211.CMD_TRIGGER_SCAN, flags) - nl.nla_put_u32(m._msg, nl80211.ATTR_IFINDEX, self._ifidx) + def send(self): + self._prepare_cmd() + self._add_scan_attrs() + self._send_and_wait() - if self._ssids: - i = 0 - nest = nl.nla_nest_start(m._msg, nl80211.ATTR_SCAN_SSIDS) - for ssid in self._ssids: - nl.nla_put(m._msg, i, ssid) - i += 1 - nl.nla_nest_end(m._msg, nest) - if self._freqs: - i = 0 - nest = nl.nla_nest_start(m._msg, nl80211.ATTR_SCAN_FREQUENCIES) - for freq in self._freqs: - nl.nla_put_u32(m._msg, i, freq) - i += 1 - nl.nla_nest_end(m._msg, nest) - if self._flags != 0: - nl.nla_put_u32(m._msg, nl80211.ATTR_SCAN_FLAGS, self._flags) - if self._ies: - nl.nla_put(m._msg, nl80211.ATTR_IE, self._ies) - - self.scan_busy = True - self._access.disable_seq_check() - mcid = self._access.subscribe_multicast('scan') - ret = self._access.send(m, self) - if ret < 0: - self.scan_busy = False - return ret - - self.wait_for_scan_completion() - self._access.drop_multicast(mcid) - return 0 +class scan_request(scan_start_base): + def __init__(self, ifidx, level=nl.NL_CB_DEFAULT): + super(scan_request, self).__init__(ifidx, level) + self._nl_cmd = nl80211.CMD_TRIGGER_SCAN - def handle(self, msg, arg): + def handle(self, msg, arg): genlh = genl.genlmsg_hdr(nl.nlmsg_hdr(msg)) + + # A regular scan is complete when we get scan results if genlh.cmd in [ nl80211.CMD_SCAN_ABORTED, nl80211.CMD_NEW_SCAN_RESULTS ]: self.scan_busy = False return nl.NL_SKIP -