From: Johannes Berg <johannes@sipsolutions.net>
To: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Cc: linux-wireless@vger.kernel.org,
Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Subject: Re: [PATCHv3 RESEND 09/11] mac80211: Implement add_nan_func and rm_nan_func
Date: Wed, 06 Apr 2016 11:22:22 +0200 [thread overview]
Message-ID: <1459934542.17504.64.camel@sipsolutions.net> (raw)
In-Reply-To: <1459244109-16038-9-git-send-email-emmanuel.grumbach@intel.com>
On Tue, 2016-03-29 at 12:35 +0300, Emmanuel Grumbach wrote:
> + * @rm_nan_func: Remove a nan function. The driver must call
> + * ieee80211_nan_func_terminated() with
> + * NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST reason code upon
> removal.
bad indentation.
Also here: nan -> NAN.
> + /* Only set max_nan_de_entries as available to honor the
> device's
> + * limitations
> + */
> + bitmap_set(sdata->u.nan.func_ids, 1,
> + sdata->local->hw.max_nan_de_entries);
That doesn't make a lot of sense to me. What are you trying to do?
> + inst_id = find_first_bit(sdata->u.nan.func_ids,
> + IEEE80211_MAX_NAN_INSTANCE_ID + 1);
> + if (inst_id == IEEE80211_MAX_NAN_INSTANCE_ID + 1)
> + return -ENOBUFS;
Wouldn't you use max_nan_de_entries here instead of
MAX_NAN_INSTANCE_ID, after validating that the former is actually
smaller than or equal to the latter?
Also, the logic says that the variable should be called
"available_func_ids", although I'd prefer "used_func_ids" after
adjusting the logic according to the comments above.
> + cfg80211_clone_nan_func_members(&func->func, nan_func);
This is quite obviously missing error checking, but see the discussion
in the patch that introduced it.
> + spin_lock_bh(&sdata->u.nan.func_lock);
> + clear_bit(inst_id, sdata->u.nan.func_ids);
> + list_add(&func->list, &sdata->u.nan.functions_list);
> + spin_unlock_bh(&sdata->u.nan.func_lock);
> +
> + ret = drv_add_nan_func(sdata->local, sdata, nan_func);
> + if (ret) {
> + spin_lock_bh(&sdata->u.nan.func_lock);
> + set_bit(inst_id, sdata->u.nan.func_ids);
> + list_del(&func->list);
> + spin_unlock_bh(&sdata->u.nan.func_lock);
> +
> + cfg80211_free_nan_func_members(&func->func);
> + kfree(func);
> + }
> +
> + return ret;
> +}
> +static struct ieee80211_nan_func *
> +ieee80211_find_nan_func(struct ieee80211_sub_if_data *sdata, u8
> instance_id)
> +{
> + struct ieee80211_nan_func *func;
> +
> + lockdep_assert_held(&sdata->u.nan.func_lock);
> +
> + list_for_each_entry(func, &sdata->u.nan.functions_list,
> list) {
> + if (func->func.instance_id == instance_id)
> + return func;
> + }
> +
> + return NULL;
> +}
Arguably though, this whole thing just screams "idr" [1] and then you
don't even need the list_head in the cfg80211 struct.
[1] include/linux/idr.h
> +static struct ieee80211_nan_func *
> +ieee80211_find_nan_func_by_cookie(struct ieee80211_sub_if_data
> *sdata,
> + u64 cookie)
> +{
> + struct ieee80211_nan_func *func;
> +
> + lockdep_assert_held(&sdata->u.nan.func_lock);
> +
> + list_for_each_entry(func, &sdata->u.nan.functions_list,
> list) {
> + if (func->func.cookie == cookie)
> + return func;
> + }
> +
> + return NULL;
> +}
Although this might be more difficult then, but you always
have idr_for_each_entry().
> + case NL80211_IFTYPE_NAN:
> + /* clean all the functions */
> + spin_lock_bh(&sdata->u.nan.func_lock);
> + list_for_each_entry_safe(func, tmp_func,
> + &sdata-
> >u.nan.functions_list, list) {
> + list_del(&func->list);
> + cfg80211_free_nan_func_members(&func->func);
> + kfree(func);
> + }
> + spin_unlock_bh(&sdata->u.nan.func_lock);
> + break;
> case NL80211_IFTYPE_P2P_DEVICE:
> /* relies on synchronize_rcu() below */
> RCU_INIT_POINTER(local->p2p_sdata, NULL);
> /* fall through */
> - case NL80211_IFTYPE_NAN:
any particular reason you're moving the case label?
> default:
> cancel_work_sync(&sdata->work);
> /*
> @@ -1453,9 +1464,15 @@ static void ieee80211_setup_sdata(struct
> ieee80211_sub_if_data *sdata,
> case NL80211_IFTYPE_WDS:
> sdata->vif.bss_conf.bssid = NULL;
> break;
> + case NL80211_IFTYPE_NAN:
> + bitmap_zero(sdata->u.nan.func_ids,
> + IEEE80211_MAX_NAN_INSTANCE_ID + 1);
> + INIT_LIST_HEAD(&sdata->u.nan.functions_list);
> + spin_lock_init(&sdata->u.nan.func_lock);
> + sdata->vif.bss_conf.bssid = sdata->vif.addr;
> + break;
> case NL80211_IFTYPE_AP_VLAN:
> case NL80211_IFTYPE_P2P_DEVICE:
> - case NL80211_IFTYPE_NAN:
also here?
> + if (!local->hw.max_nan_de_entries)
> + local->hw.max_nan_de_entries =
> IEEE80211_MAX_NAN_INSTANCE_ID;
Need a max check also, I guess?
> +/* TODO: record more fields */
...
but isn't cfg80211 recording them anyway?
> +static int ieee80211_reconfig_nan(struct ieee80211_sub_if_data
> *sdata)
> +{
> + struct ieee80211_nan_func *func, *ftmp;
> + LIST_HEAD(tmp_list);
> + int res;
> +
> + res = drv_start_nan(sdata->local, sdata,
> + &sdata->u.nan.nan_conf);
> + if (WARN_ON(res))
> + return res;
> +
> + /* Add all the functions:
> + * This is a little bit ugly. We need to call a potentially
> sleeping
> + * callback for each entry in the list, so we can't hold the
> spinlock.
Nobody forced you to use a spinlock though??
johannes
next prev parent reply other threads:[~2016-04-06 9:22 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-29 9:34 [PATCHv3 RESEND 01/11] cfg80211: add start / stop NAN commands Emmanuel Grumbach
2016-03-29 9:35 ` [PATCHv3 RESEND 02/11] mac80211: add boilerplate code for start / stop NAN Emmanuel Grumbach
2016-04-06 8:27 ` Johannes Berg
2016-03-29 9:35 ` [PATCHv3 RESEND 03/11] cfg80211: add add_nan_func / rm_nan_func Emmanuel Grumbach
2016-04-06 8:40 ` Johannes Berg
2016-04-06 8:47 ` Johannes Berg
2016-03-29 9:35 ` [PATCHv3 RESEND 04/11] cfg80211: allow the user space to change current NAN configuration Emmanuel Grumbach
2016-04-06 8:44 ` Johannes Berg
2016-03-29 9:35 ` [PATCHv3 RESEND 05/11] cfg80211: provide a function to report a match for NAN Emmanuel Grumbach
2016-04-06 8:51 ` Johannes Berg
2016-04-06 9:38 ` Malinen, Jouni
2016-04-06 9:40 ` Johannes Berg
2016-03-29 9:35 ` [PATCHv3 RESEND 06/11] cfg80211: Provide an API to report NAN function termination Emmanuel Grumbach
2016-04-06 8:52 ` Johannes Berg
2016-04-06 9:40 ` Malinen, Jouni
2016-04-06 10:43 ` Otcheretianski, Andrei
2016-03-29 9:35 ` [PATCHv3 RESEND 07/11] cfg80211: add utility functions to clone and free nan_func Emmanuel Grumbach
2016-04-06 9:02 ` Johannes Berg
2016-03-29 9:35 ` [PATCHv3 RESEND 08/11] mac80211: implement nan_change_conf Emmanuel Grumbach
2016-04-06 9:07 ` Johannes Berg
2016-03-29 9:35 ` [PATCHv3 RESEND 09/11] mac80211: Implement add_nan_func and rm_nan_func Emmanuel Grumbach
2016-04-06 9:22 ` Johannes Berg [this message]
2016-03-29 9:35 ` [PATCHv3 RESEND 10/11] mac80211: Add API to report nan function match Emmanuel Grumbach
2016-04-06 9:24 ` Johannes Berg
2016-03-29 9:35 ` [PATCHv3 RESEND 11/11] cfg80211: allow to tie the NAN instance to the owner Emmanuel Grumbach
2016-04-06 8:24 ` [PATCHv3 RESEND 01/11] cfg80211: add start / stop NAN commands Johannes Berg
2016-04-06 9:34 ` Malinen, Jouni
2016-04-06 9:43 ` Johannes Berg
2016-04-06 9:44 ` Grumbach, Emmanuel
2016-04-06 10:14 ` Otcheretianski, Andrei
2016-04-06 9:55 ` Malinen, Jouni
2016-04-06 10:01 ` Grumbach, Emmanuel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1459934542.17504.64.camel@sipsolutions.net \
--to=johannes@sipsolutions.net \
--cc=andrei.otcheretianski@intel.com \
--cc=emmanuel.grumbach@intel.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).