From patchwork Fri Aug 16 19:27:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Kenzior X-Patchwork-Id: 11098133 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-2.web.codeaurora.org (Postfix) with ESMTP id 4706D112C for ; Fri, 16 Aug 2019 19:27:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3748E28978 for ; Fri, 16 Aug 2019 19:27:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2B4D728AFA; Fri, 16 Aug 2019 19:27:14 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 C037528978 for ; Fri, 16 Aug 2019 19:27:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727607AbfHPT1M (ORCPT ); Fri, 16 Aug 2019 15:27:12 -0400 Received: from mail-ot1-f46.google.com ([209.85.210.46]:40592 "EHLO mail-ot1-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727545AbfHPT1M (ORCPT ); Fri, 16 Aug 2019 15:27:12 -0400 Received: by mail-ot1-f46.google.com with SMTP id c34so10604276otb.7 for ; Fri, 16 Aug 2019 12:27:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=XJkdZ2Mqjb4Vj1N2P/9YdW2gUhcT57fOyzLmxjy2JZU=; b=iBrLHFBgzp8Yw7efsIjYcD5F1BqaE4zcS3YB0qD5u0tf2VZEHHFEWltxxHB6BPx6FP hRXXvxSR19ZW4UiMZk7giuob3iD2g/EizMwmAqeE4iWY2FLqX82oTIdWp2zHQDWPvUtM JfPfp7SPSKn2n11Ro95NWprvekyI3oWDLtlszl7RjtFUQuHUBQgJ7PyTxxiuLjrz5qUE 8wk9p4TsIbLNWE+8qpINK20qqQYAljVq3X2BK5CbHMtSUzRyPv991ZZk/mum4D1AU2Os EN2LhnHcRJ00ueglzyQHVMPlLDLbXbWg+71JuX2B2FjxyMAui7X4wXQsOmTUbr6z253x bkKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=XJkdZ2Mqjb4Vj1N2P/9YdW2gUhcT57fOyzLmxjy2JZU=; b=Cgqr/7TF6SXPyXUu7loCctVOBiQHcFq4zxx81QfYW/VpSlwCYDYL84x0jaiMBH64ur 9Di3KgX6GDV6QZZ8ERrEgaHTfxfV4N0lLV05bBQF5uvv60KeOFvOpLbWi41/F2LjqpgA VxEDcrwSMr8WGr8VLzsx1zA2l4DsB43JxuC2Duwnbd4bQtYQCrOUOzxUVr4aBVWpjX+s T9+TnrD9T9Lhi/3wDRJfVcSnXONQzJyhLNNs47KBi0MQ5uAhVJR21f9xpqJ5tL9TYtwT sWjj4bNTtJVN3O18NZA0e0gTIy8VIXhBi8PxCgCYicHCPhc+lVvDPZCuonl0Pu7SvGUi y+jQ== X-Gm-Message-State: APjAAAVR6gimPUG7KN7jwdWjykVM+eIeh/kLHyPzZ4JwHw8yx5JkYV6y h+UmW7R4zQ0uJNyTZk/6iCrU9Gmj X-Google-Smtp-Source: APXvYqzWWiUt15MTvK7WWu7MWHHIXPcHWHMKjadL1uSkBTEWpT07JBM2ZFGZQpeIMryGO6y1aB8h3Q== X-Received: by 2002:a05:6830:15cc:: with SMTP id j12mr8253426otr.64.1565983630939; Fri, 16 Aug 2019 12:27:10 -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 b10sm2452246oti.61.2019.08.16.12.27.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Aug 2019 12:27:10 -0700 (PDT) From: Denis Kenzior To: linux-wireless@vger.kernel.org, johannes@sipsolutions.net Cc: Denis Kenzior Subject: [RFCv2 1/4] nl80211: Fix broken non-split wiphy dumps Date: Fri, 16 Aug 2019 14:27:00 -0500 Message-Id: <20190816192703.12445-1-denkenz@gmail.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 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 If a (legacy) client requested a wiphy dump but did not provide the NL80211_ATTR_SPLIT_WIPHY_DUMP attribute, the dump was supposed to be composed of purely non-split NEW_WIPHY messages, with 1 wiphy per message. At least this was the intent after commit: 3713b4e364ef ("nl80211: allow splitting wiphy information in dumps") However, in reality the non-split dumps were broken very shortly after. Perhaps around commit: fe1abafd942f ("nl80211: re-add channel width and extended capa advertising") The reason for the bug is a missing setting of split_start to 0 in the case of a non-split dump. Here is a sample non-split dump performed on kernel 4.19, some parts were cut for brevity: < Request: Get Wiphy (0x01) len 0 [ack,0x300] > Result: New Wiphy (0x03) len 3496 [multi] Wiphy: 0 (0x00000000) Wiphy Name: phy0 Generation: 1 (0x00000001) > Result: New Wiphy (0x03) len 68 [multi] Wiphy: 0 (0x00000000) Wiphy Name: phy0 Generation: 1 (0x00000001) Extended Capabilities: len 8 Capability: bit 2: Extended channel switching Capability: bit 62: Opmode Notification Extended Capabilities Mask: len 8 04 00 00 00 00 00 00 40 .......@ VHT Capability Mask: len 12 f0 1f 80 33 ff ff 00 00 ff ff 00 00 ...3........ > Result: New Wiphy (0x03) len 28 [multi] Wiphy: 0 (0x00000000) Wiphy Name: phy0 Generation: 1 (0x00000001) > Result: New Wiphy (0x03) len 28 [multi] Wiphy: 0 (0x00000000) Wiphy Name: phy0 Generation: 1 (0x00000001) > Result: New Wiphy (0x03) len 52 [multi] Wiphy: 0 (0x00000000) Wiphy Name: phy0 Generation: 1 (0x00000001) Max CSA Counters: len 1 02 . Scheduled Scan Maximum Requests: len 4 01 00 00 00 .... Extended Features: len 4 02 02 00 04 .... > Result: New Wiphy (0x03) len 36 [multi] Wiphy: 0 (0x00000000) Wiphy Name: phy0 Generation: 1 (0x00000001) Reserved: len 4 00 00 00 00 .... > Complete: Get Wiphy (0x01) len 4 [multi] Status: 0 Signed-off-by: Denis Kenzior --- net/wireless/nl80211.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 1a107f29016b..b9b0199b5ec6 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -2173,6 +2173,9 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, * but break unconditionally so unsplit data stops here. */ state->split_start++; + + if (!state->split) + state->split_start = 0; break; case 9: if (rdev->wiphy.extended_capabilities && From patchwork Fri Aug 16 19:27:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Kenzior X-Patchwork-Id: 11098135 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-2.web.codeaurora.org (Postfix) with ESMTP id 9ABC218EC for ; Fri, 16 Aug 2019 19:27:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 89D7A28768 for ; Fri, 16 Aug 2019 19:27:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7E4BB28B38; Fri, 16 Aug 2019 19:27:15 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 CD59E28B54 for ; Fri, 16 Aug 2019 19:27:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727611AbfHPT1O (ORCPT ); Fri, 16 Aug 2019 15:27:14 -0400 Received: from mail-oi1-f196.google.com ([209.85.167.196]:39932 "EHLO mail-oi1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727605AbfHPT1N (ORCPT ); Fri, 16 Aug 2019 15:27:13 -0400 Received: by mail-oi1-f196.google.com with SMTP id 16so5602453oiq.6 for ; Fri, 16 Aug 2019 12:27:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lV6b4NFPt1H5Uz0Gj9pMlQD51ObVB2EGvGiPBfGimzI=; b=Ftkevl+sGbaIBrJ8p+3FkoBYLVXm3QiCIH1NSGQ1PKDJWg+jHF55shpJjklzSv3XjZ LL7kFiipln+pZWRFXDca7joUuxi58MLNZH/0HgKktYmn4hfosvEyj5MkvSyGipsJNz/h YlcB1g8cBiOCdAw9nEZpA8z6AFuX+ToSCQfKQwT5o5ofxko9cbfPH0tUf3kEP1c5cRQL A+zumO33dF/3RgeRYQyUEjVBMkaWbfDAmCXOSOx1f38ZZvMa5pbF/PSP/IWYWLUSYm4E Wd0lrI5vY3BhQozSjEp9lBdETRPswwq0suAMqu9e/UJKOTBdjYVRXOY9cLNvYtgPBgzv fKUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lV6b4NFPt1H5Uz0Gj9pMlQD51ObVB2EGvGiPBfGimzI=; b=ObB0CTO7mKP0VZt2jmE4w5xH19UfFP3yMvOiT9M26lzah2Rdkg0nRiTLINSSmypRif vVWY2zHqG3rnz9LjP3X7HKch/rhrfxd4id9A8sgCI2LAYFp8YULArGlzIp3AK1qbVMr9 oF5osiuYGZrcJFokQ6nO9d6KY4Z7gdPpbk/5DM9Jf0l9PDJhO9H2DsqbEXgiNNWJtDUA EI2LxPO1k9GmsEbUqeOVXBo8NsKsEMvuSELuPEM9aRCarQiGnTM4cvkOhNFTaGWCP+Zi VR8zMq0DtH1BNGIxFc1kSXcsz++moF66Rn9PvIMzlLtv4ee25nFnGAt8uumNuGqWaepi gSbQ== X-Gm-Message-State: APjAAAX+plsH8dfs4lGNB+YgQP/l7RyLIcMM07kyyOAVLF/DZ4ixPZ64 rrUBXBLY4He0vdn1PoKL9UBrcUk3 X-Google-Smtp-Source: APXvYqxSE+H8ByDMP7+JbmwIPKqaL0x5ZwkJjILDKPbW+gNEz/R1xlmVA+uaqbxC4iagW9qaPda9wQ== X-Received: by 2002:aca:bfd4:: with SMTP id p203mr6269269oif.95.1565983632224; Fri, 16 Aug 2019 12:27:12 -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 b10sm2452246oti.61.2019.08.16.12.27.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Aug 2019 12:27:11 -0700 (PDT) From: Denis Kenzior To: linux-wireless@vger.kernel.org, johannes@sipsolutions.net Cc: Denis Kenzior Subject: [RFCv2 2/4] nl80211: Support >4096 byte NEW_WIPHY event nlmsg Date: Fri, 16 Aug 2019 14:27:01 -0500 Message-Id: <20190816192703.12445-2-denkenz@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190816192703.12445-1-denkenz@gmail.com> References: <20190816192703.12445-1-denkenz@gmail.com> MIME-Version: 1.0 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 For historical reasons, NEW_WIPHY messages generated by dumps or GET_WIPHY commands were limited to 4096 bytes due to userspace tools using limited buffers. Once the sizes NEW_WIPHY messages exceeded these sizes, split dumps were introduced. All any non-legacy data was added only to messages using split-dumps (including filtered dumps). However, split-dumping has quite a significant overhead. On cards tested, split dumps generated message sizes 1.7-1.8x compared to non-split dumps, while still comfortably fitting into an 8k buffer. The kernel now expects userspace to provide 16k buffers by default, and 32k buffers are possible. Introduce a concept of a large message, so that if the kernel detects that userspace has provided a buffer of sufficient size, a non-split message could be generated. Signed-off-by: Denis Kenzior --- net/wireless/nl80211.c | 51 ++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index b9b0199b5ec6..682a095415eb 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -1839,6 +1839,7 @@ struct nl80211_dump_wiphy_state { long start; long split_start, band_start, chan_start, capa_start; bool split; + bool large_message; }; static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, @@ -2027,7 +2028,8 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, if (nl80211_msg_put_channel( msg, &rdev->wiphy, chan, - state->split)) + state->split || + state->large_message)) goto nla_put_failure; nla_nest_end(msg, nl_freq); @@ -2072,7 +2074,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, i = nl80211_add_commands_unsplit(rdev, msg); if (i < 0) goto nla_put_failure; - if (state->split) { + if (state->split || state->large_message) { CMD(crit_proto_start, CRIT_PROTOCOL_START); CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) @@ -2111,7 +2113,8 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, /* fall through */ case 6: #ifdef CONFIG_PM - if (nl80211_send_wowlan(msg, rdev, state->split)) + if (nl80211_send_wowlan(msg, rdev, + state->split || state->large_message)) goto nla_put_failure; state->split_start++; if (state->split) @@ -2126,7 +2129,8 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, goto nla_put_failure; if (nl80211_put_iface_combinations(&rdev->wiphy, msg, - state->split)) + state->split || + state->large_message)) goto nla_put_failure; state->split_start++; @@ -2145,7 +2149,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, * dump is split, otherwise it makes it too big. Therefore * only advertise it in that case. */ - if (state->split) + if (state->split || state->large_message) features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) goto nla_put_failure; @@ -2170,13 +2174,20 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, * * We still increment split_start so that in the split * case we'll continue with more data in the next round, - * but break unconditionally so unsplit data stops here. + * but break unless large_messages are requested, so + * legacy unsplit data stops here. */ state->split_start++; - if (!state->split) + if (state->split) + break; + + if (!state->large_message) { state->split_start = 0; - break; + break; + } + + /* Fall through */ case 9: if (rdev->wiphy.extended_capabilities && (nla_put(msg, NL80211_ATTR_EXT_CAPA, @@ -2218,7 +2229,9 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, } state->split_start++; - break; + if (state->split) + break; + /* Fall through */ case 10: if (nl80211_send_coalesce(msg, rdev)) goto nla_put_failure; @@ -2234,7 +2247,9 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, goto nla_put_failure; state->split_start++; - break; + if (state->split) + break; + /* Fall through */ case 11: if (rdev->wiphy.n_vendor_commands) { const struct nl80211_vendor_cmd_info *info; @@ -2270,7 +2285,9 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, nla_nest_end(msg, nested); } state->split_start++; - break; + if (state->split) + break; + /* Fall through */ case 12: if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS, @@ -2312,7 +2329,9 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, } state->split_start++; - break; + if (state->split) + break; + /* Fall through */ case 13: if (rdev->wiphy.num_iftype_ext_capab && rdev->wiphy.iftype_ext_capab) { @@ -2380,13 +2399,17 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, } state->split_start++; - break; + if (state->split) + break; + /* Fall through */ case 14: if (nl80211_send_pmsr_capa(rdev, msg)) goto nla_put_failure; state->split_start++; - break; + if (state->split) + break; + /* Fall through */ case 15: if (rdev->wiphy.akm_suites && nla_put(msg, NL80211_ATTR_AKM_SUITES, From patchwork Fri Aug 16 19:27:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Kenzior X-Patchwork-Id: 11098137 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-2.web.codeaurora.org (Postfix) with ESMTP id 1309356FE for ; Fri, 16 Aug 2019 19:27:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 03BF628B01 for ; Fri, 16 Aug 2019 19:27:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EAEC328B38; Fri, 16 Aug 2019 19:27:15 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 8CDDB28B55 for ; Fri, 16 Aug 2019 19:27:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727617AbfHPT1P (ORCPT ); Fri, 16 Aug 2019 15:27:15 -0400 Received: from mail-ot1-f66.google.com ([209.85.210.66]:38492 "EHLO mail-ot1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727545AbfHPT1O (ORCPT ); Fri, 16 Aug 2019 15:27:14 -0400 Received: by mail-ot1-f66.google.com with SMTP id r20so10624992ota.5 for ; Fri, 16 Aug 2019 12:27:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=exNpvN0pQHXYSl/nDCeQwqAVMdLSgpwL7PY4nJgIlNo=; b=ecQNDbzr6Gu09g1Akx6yEsvqTztL4uzMMsZ7U7D6OmExRvUCrtJYMG1DgZLV5HYSBF M/puNL5KmOmKAqsVZvQJGVXedC5PIgRONKRabwVLwSwEv1s9G15votnDK9V6jRvCJT8R K+VF/M9v0ZihOvSgnqIT4cwqLL1yNQEZaY5Q6aepF6uWnsIEsM8ePGYst9bwn2D4La2p X6VlGa3dhCr/NZWJcEYWNzaLfjZ6hIaQ4Z8l1F4QqAgUA0NHgORlG8ImRIW8OA7KnF62 ZQ/c5EDxl4RTIowCFNkDcDmzBy2t3MLoSZp6k7j0g5vOB+OXDKsi22LmMGmLcwtXPs0A Gb+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=exNpvN0pQHXYSl/nDCeQwqAVMdLSgpwL7PY4nJgIlNo=; b=J2j1TiLBPXkFwxNXK1GuUf+4wrKiI7haqKAK0aUaP81v5EHLXfxYTsXcim4Alkb5ED hJtWc45mDHtJ8uQPWuBqG6s88K2BaAiuFDosmlxeyA5WH9HN4daBNxIbojZIIOJqPffs EM5YXd8M1REYGs6xBunbmFGetihUnPx9jwOuzz2GPgWjT+lrnqjVdCqZlOo2uWpVp0kV TbzIckP0aLLW/acnlTlvzKt78Szu0smsCazS+mtk8s0hI3uuk6lyPZiem4vYtAML+0RU r4f4ltRuXBMYfTiNRXOalyAb7YBOZdaq3SbNJFTB5k8NYA31HZBJlLO1i9P0Si3y1uY8 JoWA== X-Gm-Message-State: APjAAAVHVjrztQzskkd6udQ3uKdxVWnxko4/BqA9Yf5IkuLEm/SwpT1j +pFoF7rcsnHWYYzCzKe+y5E8nSlX X-Google-Smtp-Source: APXvYqwmVix8cVbkG3xS2IG0Nq8QsExnuTlRtZjh+imFqtXE+P6XSitrqXQ4i2XmIBSE8xXxwX9cSA== X-Received: by 2002:a05:6830:16:: with SMTP id c22mr8818596otp.116.1565983633125; Fri, 16 Aug 2019 12:27:13 -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 b10sm2452246oti.61.2019.08.16.12.27.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Aug 2019 12:27:12 -0700 (PDT) From: Denis Kenzior To: linux-wireless@vger.kernel.org, johannes@sipsolutions.net Cc: Denis Kenzior Subject: [RFCv2 3/4] nl80211: Don't split-dump for clients with large buffers Date: Fri, 16 Aug 2019 14:27:02 -0500 Message-Id: <20190816192703.12445-3-denkenz@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190816192703.12445-1-denkenz@gmail.com> References: <20190816192703.12445-1-denkenz@gmail.com> MIME-Version: 1.0 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 Signed-off-by: Denis Kenzior --- net/wireless/nl80211.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 682a095415eb..24b67de99f3a 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -2498,6 +2498,22 @@ static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) rtnl_unlock(); return ret; } + + /* + * auto-detect support for large buffer sizes: af_netlink + * will allocate skbufs larger than 4096 in cases where + * it detects that the client receive buffer (given to + * recvmsg) is bigger. In such cases we can assume that + * performing split dumps is wasteful since the client + * can likely safely consume the entire un-split wiphy + * message in one go without the extra message header + * overhead. + */ + if (skb_tailroom(skb) > 4096) { + state->large_message = true; + state->split = false; + } + cb->args[0] = (long)state; } @@ -2531,6 +2547,7 @@ static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) * We can then retry with the larger buffer. */ if ((ret == -ENOBUFS || ret == -EMSGSIZE) && + !state->large_message && !skb->len && !state->split && cb->min_dump_alloc < 4096) { cb->min_dump_alloc = 4096; From patchwork Fri Aug 16 19:27:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Kenzior X-Patchwork-Id: 11098139 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-2.web.codeaurora.org (Postfix) with ESMTP id BACC5112C for ; Fri, 16 Aug 2019 19:27:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AB0E228B56 for ; Fri, 16 Aug 2019 19:27:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9F1C128B54; Fri, 16 Aug 2019 19:27:16 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 3979D28B38 for ; Fri, 16 Aug 2019 19:27:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727619AbfHPT1P (ORCPT ); Fri, 16 Aug 2019 15:27:15 -0400 Received: from mail-oi1-f194.google.com ([209.85.167.194]:32885 "EHLO mail-oi1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727605AbfHPT1P (ORCPT ); Fri, 16 Aug 2019 15:27:15 -0400 Received: by mail-oi1-f194.google.com with SMTP id q10so2069330oij.0 for ; Fri, 16 Aug 2019 12:27:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3MGczJpJnhYpOa70SoGTinK2q8+c9qBiRlOOViZ2kQ4=; b=n8JXShHDgdiEvEqUov+OVLrPqMr2OSrPGUsvMPuI/Hp/MMhtUCU+nm0W9stJ5DHK3R 54/61w1dLc8OtrOE5llf/B0Ogj+fnilOQ6+kRyiNxVTfd3hhSA3LyOh7K/AjzeO9VD3n jpntvSwi3QfN9bxCa9pFFOO2ZZV+3FTdymckFBKcWMo4x14VU+v3yY/0KiKCSy1yGFSi 3kemrSMwk+uBYtuBDybV8CEl5oEOqyXrTbanCg+FPuobZUIv5V1bEAxVKVTBgcQfZDSy ffGun6UaBzfv9KNZeMslvsOrGop9NbmgShyTeSSGBlcITIHdvfXFWjrCNR0dVw7ciHY+ 1fIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3MGczJpJnhYpOa70SoGTinK2q8+c9qBiRlOOViZ2kQ4=; b=NC73cTGD+DKc52X0Q5NX1fcl5VnfdWNakv6UdmteSC/t9eT7MT74JzJhJ/20WUyfZH FNt7rXkWGyP6zjEnWZWJnZYw4X4xa7bYvPaqOpxC8r6hzziendV7cRpn/07yS9Yc4mlM QIEKzonBn9M9XI9W87xTrKIrfkjKZTz7bch3RRvqSnOiKQUDhbBvO0yg0f929cRJ3B1b xTsljvr8Q2rMS0i6oEe2eLJFn+fFnT2nfPUagLbefBqtLInC1xsWoIaglc8/30Ky6eZs Vi3c7Ilu9JP+kE84D5DWoJJlIwrObS0uP9ZJ3knCs1ztugSDnhIJSgUT9oIBsRfcs3fV Gziw== X-Gm-Message-State: APjAAAVP3FJl1XigUTv+BwvmJtG6+TJbUIRJKazm/QMy1QlwDxXySlQy niqARfdolAhFKh69YZOMzuXVI3Da X-Google-Smtp-Source: APXvYqzKC+zLnQVQjGaXXx/NcIrcmIDLRMV5uMIUr+1yl1NZ3hANjFsIHC3znu3RmGRiCFfGNk4ARQ== X-Received: by 2002:aca:55d8:: with SMTP id j207mr6085381oib.38.1565983633830; Fri, 16 Aug 2019 12:27:13 -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 b10sm2452246oti.61.2019.08.16.12.27.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Aug 2019 12:27:13 -0700 (PDT) From: Denis Kenzior To: linux-wireless@vger.kernel.org, johannes@sipsolutions.net Cc: Denis Kenzior Subject: [RFCv2 4/4] nl80211: Send large new_wiphy events Date: Fri, 16 Aug 2019 14:27:03 -0500 Message-Id: <20190816192703.12445-4-denkenz@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190816192703.12445-1-denkenz@gmail.com> References: <20190816192703.12445-1-denkenz@gmail.com> MIME-Version: 1.0 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 Send large NEW_WIPHY events on a new multicast group so that clients that can accept larger messages do not need to round-trip to the kernel and perform extra filtered wiphy dumps. A new multicast group is introduced and the large message is sent before the legacy message. This way clients that listen on both multicast groups can ignore duplicate legacy messages if needed. Signed-off-by: Denis Kenzior --- include/uapi/linux/nl80211.h | 1 + net/wireless/nl80211.c | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 822851d369ab..b9c1cf29cf09 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -50,6 +50,7 @@ #define NL80211_MULTICAST_GROUP_MLME "mlme" #define NL80211_MULTICAST_GROUP_VENDOR "vendor" #define NL80211_MULTICAST_GROUP_NAN "nan" +#define NL80211_MULTICAST_GROUP_CONFIG2 "config2" #define NL80211_MULTICAST_GROUP_TESTMODE "testmode" /** diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 24b67de99f3a..9ba9e1938d6b 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -46,6 +46,7 @@ enum nl80211_multicast_groups { NL80211_MCGRP_MLME, NL80211_MCGRP_VENDOR, NL80211_MCGRP_NAN, + NL80211_MCGRP_CONFIG2, NL80211_MCGRP_TESTMODE /* keep last - ifdef! */ }; @@ -56,6 +57,7 @@ static const struct genl_multicast_group nl80211_mcgrps[] = { [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME }, [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR }, [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN }, + [NL80211_MCGRP_CONFIG2] = { .name = NL80211_MULTICAST_GROUP_CONFIG2 }, #ifdef CONFIG_NL80211_TESTMODE [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE } #endif @@ -14730,12 +14732,34 @@ void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, enum nl80211_commands cmd) { struct sk_buff *msg; + size_t alloc_size; struct nl80211_dump_wiphy_state state = {}; WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && cmd != NL80211_CMD_DEL_WIPHY); - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (cmd == NL80211_CMD_NEW_WIPHY) { + state.large_message = true; + alloc_size = 8192UL; + } else + alloc_size = NLMSG_DEFAULT_SIZE; + + msg = nlmsg_new(alloc_size, GFP_KERNEL); + if (!msg) + goto legacy; + + if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { + nlmsg_free(msg); + goto legacy; + } + + genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, + NL80211_MCGRP_CONFIG2, GFP_KERNEL); + +legacy: + state.large_message = false; + alloc_size = NLMSG_DEFAULT_SIZE; + msg = nlmsg_new(alloc_size, GFP_KERNEL); if (!msg) return; @@ -14763,6 +14787,8 @@ void nl80211_notify_iface(struct cfg80211_registered_device *rdev, return; } + genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, + NL80211_MCGRP_CONFIG2, GFP_KERNEL); genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, NL80211_MCGRP_CONFIG, GFP_KERNEL); }