All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.