From patchwork Fri Jul 3 19:41:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bob Copeland X-Patchwork-Id: 6716621 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 425069F52D for ; Fri, 3 Jul 2015 19:42:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 49F152083B for ; Fri, 3 Jul 2015 19:42:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4D57720844 for ; Fri, 3 Jul 2015 19:42:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754153AbbGCTmW (ORCPT ); Fri, 3 Jul 2015 15:42:22 -0400 Received: from mail-ig0-f178.google.com ([209.85.213.178]:36765 "EHLO mail-ig0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753913AbbGCTmQ (ORCPT ); Fri, 3 Jul 2015 15:42:16 -0400 Received: by igrv9 with SMTP id v9so122229841igr.1 for ; Fri, 03 Jul 2015 12:42:16 -0700 (PDT) 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:in-reply-to :references; bh=tfRJHl4ayhUiRDL/JaKDNRAmlabjjZJ6eO/Gk6QxKJQ=; b=XGYQZstv5viNrWmLvn395MdTVir+Zyw44+9xwWJrE1MngmL0bHTZnWsLZ6UsI9OfJ0 2YdVMYjT8BpVNoCVLxg4Zwhz7sTjorDbZvxDx0KnpXUsCr80zqeYs7MgR6ej9jjT2VIB 0dVc5BYozbUuzO6oEoCrA0Mpp9VobWjlga5GYZY0/AsdkohXvWINtJ+cj0lHNaqc3lKi r9J8OtKG3jeEwuAl/WeMBYm0/w1XzZwmIeguhmCuJucTQhtQxEtrrfX32Eg0NayLR0Gu G0D6/qwYRd90tUjacMtaaeqRU9TRN7jsSOK+8vXnsX9q/tYPtPmGyP66+mkmtDqgYnwE BNOw== X-Gm-Message-State: ALoCoQkg7PCmAe9Zm6lHtPSI7TSknPtwV0tv2LN6CeVLN8evln1vuIHbf9i3A3ZNYRnihhNqBO68 X-Received: by 10.42.189.201 with SMTP id df9mr20093646icb.79.1435952536153; Fri, 03 Jul 2015 12:42:16 -0700 (PDT) Received: from hash ([2001:470:1d:6db:230:48ff:fe9d:9c89]) by mx.google.com with ESMTPSA id 196sm6793762ioe.23.2015.07.03.12.42.12 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Jul 2015 12:42:13 -0700 (PDT) Received: from bob by hash with local (Exim 4.84) (envelope-from ) id 1ZB6qP-0005vv-VM; Fri, 03 Jul 2015 15:41:53 -0400 From: Bob Copeland To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, devel@lists.open80211s.org, Bob Copeland Subject: [PATCH v2 3/3] mac80211: select an AID when creating new mesh STAs Date: Fri, 3 Jul 2015 15:41:12 -0400 Message-Id: <1435952472-22752-4-git-send-email-me@bobcopeland.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1435952472-22752-1-git-send-email-me@bobcopeland.com> References: <1435952472-22752-1-git-send-email-me@bobcopeland.com> 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.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, 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 Instead of using peer link id for AID, generate a new AID when creating mesh STAs in the kernel peering manager. This enables smaller TIM elements and more closely follows the standard, and it also enables mesh to work on drivers that require a valid AID when the STA is inserted (ath10k firmware has this requirement, for example). In the case of userspace-managed stations, we use the AID from NL80211_CMD_NEW_STATION. Signed-off-by: Bob Copeland --- v2: generate the bitmap as needed inside mesh_allocate_aid rather than maintaining the whole time (Johannes) [generating a bitmap is not really required, but I guess it would be better than a nested loop here.] net/mac80211/mesh_plink.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c index 9dca16bd3eb9..9619159f3dbe 100644 --- a/net/mac80211/mesh_plink.c +++ b/net/mac80211/mesh_plink.c @@ -421,20 +421,54 @@ out: spin_unlock_bh(&sta->mesh->plink_lock); } +static int mesh_allocate_aid(struct ieee80211_sub_if_data *sdata) +{ + struct sta_info *sta; + unsigned long *aid_map; + int aid; + + aid_map = kcalloc(BITS_TO_LONGS(IEEE80211_MAX_AID + 1), + sizeof(*aid_map), GFP_KERNEL); + if (!aid_map) + return -ENOMEM; + + /* reserve aid 0 for mcast indication */ + __set_bit(0, aid_map); + + rcu_read_lock(); + list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) + __set_bit(sta->sta.aid, aid_map); + rcu_read_unlock(); + + aid = find_first_zero_bit(aid_map, IEEE80211_MAX_AID + 1); + kfree(aid_map); + + if (aid > IEEE80211_MAX_AID) + return -ENOBUFS; + + return aid; +} + static struct sta_info * __mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *hw_addr) { struct sta_info *sta; + int aid; if (sdata->local->num_sta >= MESH_MAX_PLINKS) return NULL; + aid = mesh_allocate_aid(sdata); + if (aid < 0) + return NULL; + sta = sta_info_alloc(sdata, hw_addr, GFP_KERNEL); if (!sta) return NULL; sta->mesh->plink_state = NL80211_PLINK_LISTEN; sta->sta.wme = true; + sta->sta.aid = aid; sta_info_pre_move_state(sta, IEEE80211_STA_AUTH); sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC); @@ -658,8 +692,6 @@ static u16 mesh_get_new_llid(struct ieee80211_sub_if_data *sdata) do { get_random_bytes(&llid, sizeof(llid)); - /* for mesh PS we still only have the AID range for TIM bits */ - llid = (llid % IEEE80211_MAX_AID) + 1; } while (llid_in_use(sdata, llid)); return llid; @@ -1068,7 +1100,6 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata, goto unlock_rcu; } sta->mesh->plid = plid; - sta->sta.aid = plid; } else if (!sta && event == OPN_RJCT) { mesh_plink_frame_tx(sdata, NULL, WLAN_SP_MESH_PEERING_CLOSE, mgmt->sa, 0, plid, @@ -1080,10 +1111,8 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata, } /* 802.11-2012 13.3.7.2 - update plid on CNF if not set */ - if (!sta->mesh->plid && event == CNF_ACPT) { + if (!sta->mesh->plid && event == CNF_ACPT) sta->mesh->plid = plid; - sta->sta.aid = sta->mesh->plid; - } changed |= mesh_plink_fsm(sdata, sta, event);