From patchwork Tue Nov 24 17:56:16 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sven Eckelmann X-Patchwork-Id: 7692611 X-Patchwork-Delegate: johannes@sipsolutions.net Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D958B9F1D3 for ; Tue, 24 Nov 2015 17:56:30 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E0D09207DC for ; Tue, 24 Nov 2015 17:56:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B9BDB207DB for ; Tue, 24 Nov 2015 17:56:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753959AbbKXR41 (ORCPT ); Tue, 24 Nov 2015 12:56:27 -0500 Received: from mail-wm0-f50.google.com ([74.125.82.50]:37259 "EHLO mail-wm0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752829AbbKXR40 (ORCPT ); Tue, 24 Nov 2015 12:56:26 -0500 Received: by wmww144 with SMTP id w144so37202061wmw.0 for ; Tue, 24 Nov 2015 09:56:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=open-mesh-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=4ohG9AFk0rupvF24xQAmcSHA5wvXCRME6lrbrSvsLhY=; b=KCkqPrZPhPbNfORYtPhLt+nuKKty4VB50Ied5SRo/6716Rg/ubKDwxEt6ezauFvL+V 7SQ1hqZSUXI7uASrupBl/dMDJ0T9pV+6VOnSpGPoO+tAhpyoUnDDzR7kfm+QMsJw5+AQ zHqDrEW2Z1XDw9uDGyT+1I1sEOj8ZaNhrUZQu8AUaISFq1k5AThbY3QzMOhVhKMA2Fiv w56YpbGGomCO7uFu68ltadkD4LpmWSJx+XoW7rfeDiidcZTKBtFudFJwrSsWpcY9Y8f6 1yFVdu6E2XYWXApfktVeSOpRoI6kHuaKiSrRQzIXmyQQWitvcbCX+7pC355HFERQ34dW uMdQ== 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=4ohG9AFk0rupvF24xQAmcSHA5wvXCRME6lrbrSvsLhY=; b=TQcvZcXPenDYtYiqFhNFhsldQtj0D8lNXLhn0Se4VkpzulotAo60CMJAKBdCT7SNS2 ejwDZ2S5MRbXHnIs3XAT1DCtrau09WM4IikjjpyWl9P4WQPXQZ+8CxZbterSBsHCwlih QyGAA8qLErU3CWK3P4XB14AyW7R2kaFtlWZ1TLJUoGP5IVCzDACgVQp+Di2znHh2mmYM UHLyoBwolT3+C4GJDm6e9MOWS9MtuVJ0+278JvYgtbt/WysFub+eFOtDK78007w+I4WV v8BrFJCYqk5Kom6ac1wJPPtajuwSAls4wtJTx8i4jSZsL0ekrOU6CbA5r8K0p0Uji3pb 3T3Q== X-Gm-Message-State: ALoCoQla0ii1a0T4C8PPl+qJBNTCVdc7CmVBot4Pk77oqi518NogYbxsdMDPZipgA4xlwg1iZYVv X-Received: by 10.194.20.2 with SMTP id j2mr39082913wje.46.1448387785036; Tue, 24 Nov 2015 09:56:25 -0800 (PST) Received: from sven-desktop.home.narfation.org (x4d0d5f44.dyn.telefonica.de. [77.13.95.68]) by smtp.gmail.com with ESMTPSA id o65sm10080727wmg.3.2015.11.24.09.56.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 24 Nov 2015 09:56:24 -0800 (PST) From: Sven Eckelmann To: Johannes Berg Cc: linux-wireless@vger.kernel.org, Sven Eckelmann Subject: [PATCH v2] iw: add VHT80 support for 802.11s Date: Tue, 24 Nov 2015 18:56:16 +0100 Message-Id: <1448387776-26601-1-git-send-email-sven@open-mesh.com> X-Mailer: git-send-email 2.6.2 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP iw mesh supports non-HT and HT channel widths like HT20 or NOHT. But the Linux 802.11s implementation also supports VHT80 which can be specified during the mesh join. iw dev mesh0 mesh join "meshnet" freq 5180 80MHz Signed-off-by: Sven Eckelmann --- v2: rebased from v4.3 to current master ibss.c | 33 --------------------------------- iw.h | 9 +++++++++ mesh.c | 16 ++++++++-------- util.c | 26 ++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 41 deletions(-) diff --git a/ibss.c b/ibss.c index 024981a..a761794 100644 --- a/ibss.c +++ b/ibss.c @@ -16,39 +16,6 @@ SECTION(ibss); -struct chanmode { - const char *name; - unsigned int width; - int freq1_diff; - int chantype; /* for older kernel */ -}; - -static int get_cf1(const struct chanmode *chanmode, unsigned long freq) -{ - unsigned int cf1 = freq, j; - unsigned int vht80[] = { 5180, 5260, 5500, 5580, 5660, 5745 }; - - switch (chanmode->width) { - case NL80211_CHAN_WIDTH_80: - /* setup center_freq1 */ - for (j = 0; j < ARRAY_SIZE(vht80); j++) { - if (freq >= vht80[j] && freq < vht80[j] + 80) - break; - } - - if (j == ARRAY_SIZE(vht80)) - break; - - cf1 = vht80[j] + 30; - break; - default: - cf1 = freq + chanmode->freq1_diff; - break; - } - - return cf1; -} - static int join_ibss(struct nl80211_state *state, struct nl_msg *msg, int argc, char **argv, diff --git a/iw.h b/iw.h index 263e8b1..d91a33e 100644 --- a/iw.h +++ b/iw.h @@ -59,6 +59,13 @@ struct cmd { const struct cmd *parent; }; +struct chanmode { + const char *name; + unsigned int width; + int freq1_diff; + int chantype; /* for older kernel */ +}; + #define ARRAY_SIZE(ar) (sizeof(ar)/sizeof(ar[0])) #define DIV_ROUND_UP(x, y) (((x) + (y - 1)) / (y)) @@ -174,6 +181,8 @@ void print_ies(unsigned char *ie, int ielen, bool unknown, void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen); void iw_hexdump(const char *prefix, const __u8 *data, size_t len); +int get_cf1(const struct chanmode *chanmode, unsigned long freq); + #define SCHED_SCAN_OPTIONS "interval [delay ] " \ "[freqs +] [matches [ssid ]+]] [active [ssid ]+|passive] [randomise[=/]]" int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv); diff --git a/mesh.c b/mesh.c index f2415f3..d674d61 100644 --- a/mesh.c +++ b/mesh.c @@ -448,12 +448,8 @@ static int join_mesh(struct nl80211_state *state, char *end, *value = NULL, *sptr = NULL; unsigned int i; unsigned long freq = 0; - static const struct { - const char *name; - unsigned int width; - int freq1_diff; - int chantype; /* for older kernel */ - } *chanmode_selected = NULL, chanmode[] = { + const struct chanmode *chanmode_selected = NULL; + static const struct chanmode chanmode[] = { { .name = "HT20", .width = NL80211_CHAN_WIDTH_20, .freq1_diff = 0, @@ -470,6 +466,10 @@ static int join_mesh(struct nl80211_state *state, .width = NL80211_CHAN_WIDTH_20_NOHT, .freq1_diff = 0, .chantype = NL80211_CHAN_NO_HT }, + { .name = "80MHz", + .width = NL80211_CHAN_WIDTH_80, + .freq1_diff = 0, + .chantype = -1 }, }; if (argc < 1) @@ -506,7 +506,7 @@ static int join_mesh(struct nl80211_state *state, NLA_PUT_U32(msg, NL80211_ATTR_CHANNEL_WIDTH, chanmode_selected->width); NLA_PUT_U32(msg, NL80211_ATTR_CENTER_FREQ1, - freq + chanmode_selected->freq1_diff); + get_cf1(chanmode_selected, freq)); if (chanmode_selected->chantype != -1) NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, @@ -608,7 +608,7 @@ static int join_mesh(struct nl80211_state *state, nla_put_failure: return -ENOBUFS; } -COMMAND(mesh, join, " [[freq ]" +COMMAND(mesh, join, " [[freq ]" " [basic-rates ]], [mcast-rate ]" " [beacon-interval