From patchwork Wed Aug 3 22:02:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Kenzior X-Patchwork-Id: 9261561 X-Patchwork-Delegate: johannes@sipsolutions.net Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B02266089F for ; Wed, 3 Aug 2016 16:06:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A1C42228C8 for ; Wed, 3 Aug 2016 16:06:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9669F28138; Wed, 3 Aug 2016 16:06:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.8 required=2.0 tests=BAYES_00, DATE_IN_FUTURE_03_06, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,FREEMAIL_FROM,RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 362AF27FB7 for ; Wed, 3 Aug 2016 16:06:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754814AbcHCQGL (ORCPT ); Wed, 3 Aug 2016 12:06:11 -0400 Received: from mail-oi0-f67.google.com ([209.85.218.67]:35218 "EHLO mail-oi0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751571AbcHCQGI (ORCPT ); Wed, 3 Aug 2016 12:06:08 -0400 Received: by mail-oi0-f67.google.com with SMTP id w143so20364167oiw.2 for ; Wed, 03 Aug 2016 09:04:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=PLkGHr6NgYJRMeI9/RTwCdX/K3MbIVUE2tSs+oKclM8=; b=xY6pU6qzm5641F7ACquoJJInN+gpokFi/PHCnq5QhjbvShUaIZ+vyR9sDti/aDDPX3 7xQ3UpqC/XFHmK1DRzERob6uoBCugWypswQWIUNAJsuY6PYFisepdU3qDqLmMxvYXdag 92tzRDuKro6kXiraeXY0t4k//9JhVcqK2x+ZSO19x8DOipZnSR+wXCE884sgbDXEGTS/ iDZahvDfqrDZxEm4k8LcgFRH/jVsRjfpd+H25yVt3d3eiWG/UFlsljweQKxiEAjcJgnz f8EmihO/3RZdrcqb4xVvWAhIM8VM89M5bMPf2LQCuPZibTKAyeHOUub5BeBWjMUzygPr wOuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=PLkGHr6NgYJRMeI9/RTwCdX/K3MbIVUE2tSs+oKclM8=; b=EkoaCqEKknq332gsRSO7xgaDlJmEa/EdF5ChZD4xOA4zR2jmjCpyB57wH5cZNpn0M9 iGPuGXVuamd+0j1fvx2KXk9QWpEx0xVGicYe8zht5UabhEMyOpd/y5xG7CUL7QN9Q8lS udhwGFsKgsU4VUqzzX4vGt1Lw8rt/hbJglbgZ9MqlnQFanr3+sCi/D6cFChyqDS5JAjE KlAFPohPLN3P577I76LgH20w2FwWbHTtvG74o6LT7mm3I42v0GR8lhJEwQRQ03hylPY5 V+WvmN//YmqlTYA0GGOCt3I9sEycgCldZqn7DcGT9T66Qboi39HXR1h0lfjCuCfEBjQM /YBg== X-Gm-Message-State: AEkoouufmLwUdJSFtd/WSxtMwu59GMSDBcBxjVvSc0XjyCEmW86XGf27y6kqDiYS5GfkFw== X-Received: by 10.157.48.112 with SMTP id w45mr43472678otd.153.1470232901444; Wed, 03 Aug 2016 07:01:41 -0700 (PDT) Received: from localhost.localdomain (cpe-70-114-247-242.austin.res.rr.com. [70.114.247.242]) by smtp.gmail.com with ESMTPSA id x143sm3799131oix.22.2016.08.03.07.01.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 03 Aug 2016 07:01:40 -0700 (PDT) From: Denis Kenzior To: linux-wireless@vger.kernel.org Cc: Denis Kenzior Subject: [RESEND PATCH] nl80211: Allow GET_INTERFACE dumps to be filtered Date: Wed, 3 Aug 2016 17:02:15 -0500 Message-Id: <1470261735-2977-1-git-send-email-denkenz@gmail.com> X-Mailer: git-send-email 2.7.3 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 This patch allows GET_INTERFACE dumps to be filtered based on NL80211_ATTR_WIPHY or NL80211_ATTR_WDEV. The documentation for GET_INTERFACE mentions that this is possible: "Request an interface's configuration; either a dump request on a %NL80211_ATTR_WIPHY or ..." However, this behavior has not been implemented until now. Signed-off-by: Denis Kenzior --- net/wireless/nl80211.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 46417f9..ac19eb8 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -2519,15 +2519,47 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag return -EMSGSIZE; } +static int nl80211_dump_interface_parse(struct sk_buff *skb, + struct netlink_callback *cb, + int *filter_wiphy) +{ + struct nlattr **tb = nl80211_fam.attrbuf; + int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, + tb, nl80211_fam.maxattr, nl80211_policy); + /* ignore parse errors for backward compatibility */ + if (ret) + return 0; + + if (tb[NL80211_ATTR_WIPHY]) + *filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); + if (tb[NL80211_ATTR_WDEV]) + *filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; + + return 0; +} + static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) { int wp_idx = 0; int if_idx = 0; int wp_start = cb->args[0]; int if_start = cb->args[1]; + int filter_wiphy = cb->args[2]; struct cfg80211_registered_device *rdev; struct wireless_dev *wdev; + if (!wp_start && !if_start && !filter_wiphy) { + int ret; + + filter_wiphy = -1; + + ret = nl80211_dump_interface_parse(skb, cb, &filter_wiphy); + if (ret) + return ret; + + cb->args[2] = filter_wiphy; + } + rtnl_lock(); list_for_each_entry(rdev, &cfg80211_rdev_list, list) { if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) @@ -2536,6 +2568,10 @@ static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback * wp_idx++; continue; } + + if (filter_wiphy != -1 && filter_wiphy != rdev->wiphy_idx) + continue; + if_idx = 0; list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {