All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv2 1/4] nl80211: allow sending CMD_FRAME without specifying any frequency
@ 2013-06-05 11:53 Antonio Quartulli
  2013-06-05 11:53 ` [PATCHv2 2/4] mac80211: make mgmt_tx accept a NULL channel Antonio Quartulli
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Antonio Quartulli @ 2013-06-05 11:53 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, Antonio Quartulli

From: Antonio Quartulli <antonio@open-mesh.com>

Users may want to send a frame on the current channel
without specifying it.

This is particularly useful for the correct implementation
of the IBSS/RSN support in wpa_supplicant which requires to
receive and send AUTH frames.

Make mgmt_tx pass a NULL channel to the driver if none has
been specified by the user.

Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
---
 net/wireless/nl80211.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 88e820b..06af395 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -7139,6 +7139,9 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
 		return -EOPNOTSUPP;
 
 	switch (wdev->iftype) {
+	case NL80211_IFTYPE_P2P_DEVICE:
+		if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
+			return -EINVAL;
 	case NL80211_IFTYPE_STATION:
 	case NL80211_IFTYPE_ADHOC:
 	case NL80211_IFTYPE_P2P_CLIENT:
@@ -7146,7 +7149,6 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
 	case NL80211_IFTYPE_AP_VLAN:
 	case NL80211_IFTYPE_MESH_POINT:
 	case NL80211_IFTYPE_P2P_GO:
-	case NL80211_IFTYPE_P2P_DEVICE:
 		break;
 	default:
 		return -EOPNOTSUPP;
@@ -7174,9 +7176,15 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
 
 	no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
 
-	err = nl80211_parse_chandef(rdev, info, &chandef);
-	if (err)
-		return err;
+	/* get the channel if any has been specified, otherwise pass NULL to
+	 * the driver. The latter will use the current one
+	 */
+	chandef.chan = NULL;
+	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
+		err = nl80211_parse_chandef(rdev, info, &chandef);
+		if (err)
+			return err;
+	}
 
 	if (!dont_wait_for_ack) {
 		msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
-- 
1.8.1.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCHv2 2/4] mac80211: make mgmt_tx accept a NULL channel
  2013-06-05 11:53 [PATCHv2 1/4] nl80211: allow sending CMD_FRAME without specifying any frequency Antonio Quartulli
@ 2013-06-05 11:53 ` Antonio Quartulli
  2013-06-05 11:53 ` [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac " Antonio Quartulli
  2013-06-05 11:53 ` [PATCHv2 4/4] ath6kl: make mgmt_tx " Antonio Quartulli
  2 siblings, 0 replies; 8+ messages in thread
From: Antonio Quartulli @ 2013-06-05 11:53 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, Antonio Quartulli

From: Antonio Quartulli <antonio@open-mesh.com>

cfg80211 passes a NULL channel to mgmt_tx if the frame has
to be sent on the one currently in use by the device.
Make the implementation of mgmt_tx correctly handle this
case. Fail if offchan is required.

Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
---
 net/mac80211/cfg.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 3062210..617c5c8 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -2838,6 +2838,12 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 		return -EOPNOTSUPP;
 	}
 
+	/* configurations requiring offchan cannot work if no channel has been
+	 * specified
+	 */
+	if (need_offchan && !chan)
+		return -EINVAL;
+
 	mutex_lock(&local->mtx);
 
 	/* Check if the operating channel is the requested channel */
@@ -2847,10 +2853,14 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 		rcu_read_lock();
 		chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 
-		if (chanctx_conf)
-			need_offchan = chan != chanctx_conf->def.chan;
-		else
+		if (chanctx_conf) {
+			need_offchan = chan && (chan != chanctx_conf->def.chan);
+		} else if (!chan) {
+			ret = -EINVAL;
+			goto out_unlock;
+		} else {
 			need_offchan = true;
+		}
 		rcu_read_unlock();
 	}
 
-- 
1.8.1.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac accept a NULL channel
  2013-06-05 11:53 [PATCHv2 1/4] nl80211: allow sending CMD_FRAME without specifying any frequency Antonio Quartulli
  2013-06-05 11:53 ` [PATCHv2 2/4] mac80211: make mgmt_tx accept a NULL channel Antonio Quartulli
@ 2013-06-05 11:53 ` Antonio Quartulli
  2013-06-05 13:53   ` Arend van Spriel
  2013-06-05 11:53 ` [PATCHv2 4/4] ath6kl: make mgmt_tx " Antonio Quartulli
  2 siblings, 1 reply; 8+ messages in thread
From: Antonio Quartulli @ 2013-06-05 11:53 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless, Antonio Quartulli, Arend van Spriel,
	brcm80211-dev-list

From: Antonio Quartulli <antonio@open-mesh.com>

cfg80211 passes a NULL channel to mgmt_tx if the frame has
to be sent on the one currently in use by the device.
Make the implementation of mgmt_tx correctly handle this
case

Cc: Arend van Spriel <arend@broadcom.com>
Cc: brcm80211-dev-list@broadcom.com
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 6d758f2..dcb0c00 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -3917,6 +3917,7 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 	struct brcmf_fil_af_params_le *af_params;
 	bool ack;
 	s32 chan_nr;
+	u32 freq;
 
 	brcmf_dbg(TRACE, "Enter\n");
 
@@ -3968,8 +3969,13 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 		memcpy(&af_params->bssid[0], &mgmt->bssid[0], ETH_ALEN);
 		/* Add the length exepted for 802.11 header  */
 		action_frame->len = cpu_to_le16(len - DOT11_MGMT_HDR_LEN);
-		/* Add the channel */
-		chan_nr = ieee80211_frequency_to_channel(chan->center_freq);
+		/* Add the channel. Default to the current one, but use the one
+		 * specified as parameter if any
+		 */
+		freq = cfg->channel;
+		if (chan)
+			freq = chan->center_freq;
+		chan_nr = ieee80211_frequency_to_channel(freq);
 		af_params->channel = cpu_to_le32(chan_nr);
 
 		memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN],
-- 
1.8.1.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCHv2 4/4] ath6kl: make mgmt_tx accept a NULL channel
  2013-06-05 11:53 [PATCHv2 1/4] nl80211: allow sending CMD_FRAME without specifying any frequency Antonio Quartulli
  2013-06-05 11:53 ` [PATCHv2 2/4] mac80211: make mgmt_tx accept a NULL channel Antonio Quartulli
  2013-06-05 11:53 ` [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac " Antonio Quartulli
@ 2013-06-05 11:53 ` Antonio Quartulli
  2 siblings, 0 replies; 8+ messages in thread
From: Antonio Quartulli @ 2013-06-05 11:53 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless, Antonio Quartulli, Kalle Valo, Nicolas Cavallari

From: Antonio Quartulli <antonio@open-mesh.com>

cfg80211 passes a NULL channel to mgmt_tx if the frame has
to be sent on the one currently in use by the device.
Make the implementation of mgmt_tx correctly handle this
case

Cc: Kalle Valo <kvalo@qca.qualcomm.com>
Cc: Nicolas Cavallari <Nicolas.Cavallari@lri.fr>
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
---
 drivers/net/wireless/ath/ath6kl/cfg80211.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index f7995b2..b542203 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -3175,10 +3175,17 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 {
 	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
 	struct ath6kl *ar = ath6kl_priv(vif->ndev);
-	u32 id;
+	u32 id, freq;
 	const struct ieee80211_mgmt *mgmt;
 	bool more_data, queued;
 
+	/* default to the current channel, but use the one specified as argument
+	 * if any
+	 */
+	freq = vif->ch_hint;
+	if (chan)
+		freq = chan->center_freq;
+
 	mgmt = (const struct ieee80211_mgmt *) buf;
 	if (vif->nw_type == AP_NETWORK && test_bit(CONNECTED, &vif->flags) &&
 	    ieee80211_is_probe_resp(mgmt->frame_control) &&
@@ -3188,8 +3195,7 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 		 * command to allow the target to fill in the generic IEs.
 		 */
 		*cookie = 0; /* TX status not supported */
-		return ath6kl_send_go_probe_resp(vif, buf, len,
-						 chan->center_freq);
+		return ath6kl_send_go_probe_resp(vif, buf, len, freq);
 	}
 
 	id = vif->send_action_id++;
@@ -3205,17 +3211,14 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 
 	/* AP mode Power saving processing */
 	if (vif->nw_type == AP_NETWORK) {
-		queued = ath6kl_mgmt_powersave_ap(vif,
-					id, chan->center_freq,
-					wait, buf,
-					len, &more_data, no_cck);
+		queued = ath6kl_mgmt_powersave_ap(vif, id, freq, wait, buf, len,
+						  &more_data, no_cck);
 		if (queued)
 			return 0;
 	}
 
-	return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id,
-					chan->center_freq, wait,
-					buf, len, no_cck);
+	return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id, freq,
+					wait, buf, len, no_cck);
 }
 
 static void ath6kl_mgmt_frame_register(struct wiphy *wiphy,
-- 
1.8.1.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac accept a NULL channel
  2013-06-05 11:53 ` [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac " Antonio Quartulli
@ 2013-06-05 13:53   ` Arend van Spriel
  2013-06-05 13:57     ` Antonio Quartulli
  0 siblings, 1 reply; 8+ messages in thread
From: Arend van Spriel @ 2013-06-05 13:53 UTC (permalink / raw)
  To: Antonio Quartulli
  Cc: Johannes Berg, linux-wireless, Antonio Quartulli,
	brcm80211-dev-list

On 06/05/2013 01:53 PM, Antonio Quartulli wrote:
> From: Antonio Quartulli <antonio@open-mesh.com>
>
> cfg80211 passes a NULL channel to mgmt_tx if the frame has
> to be sent on the one currently in use by the device.
> Make the implementation of mgmt_tx correctly handle this
> case
>
> Cc: Arend van Spriel <arend@broadcom.com>
> Cc: brcm80211-dev-list@broadcom.com
> Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
> ---
>   drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 10 ++++++++--
>   1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> index 6d758f2..dcb0c00 100644
> --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> @@ -3917,6 +3917,7 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
>   	struct brcmf_fil_af_params_le *af_params;
>   	bool ack;
>   	s32 chan_nr;
> +	u32 freq;
>
>   	brcmf_dbg(TRACE, "Enter\n");
>
> @@ -3968,8 +3969,13 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
>   		memcpy(&af_params->bssid[0], &mgmt->bssid[0], ETH_ALEN);
>   		/* Add the length exepted for 802.11 header  */
>   		action_frame->len = cpu_to_le16(len - DOT11_MGMT_HDR_LEN);
> -		/* Add the channel */
> -		chan_nr = ieee80211_frequency_to_channel(chan->center_freq);
> +		/* Add the channel. Default to the current one, but use the one
> +		 * specified as parameter if any
> +		 */
> +		freq = cfg->channel;
> +		if (chan)
> +			freq = chan->center_freq;
> +		chan_nr = ieee80211_frequency_to_channel(freq);

Could you get rid of 'freq' variable and use 
ieee80211_frequency_to_channel() on cfg->channel or chan->center_freq.

Another thing is that cfg->channel can be zero resulting in chan_nr 
being zero. I had a quick look whether the device firmware can handle 
this. I suspect not, but I will need to ask to be sure.

Regards,
Arend



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac accept a NULL channel
  2013-06-05 13:53   ` Arend van Spriel
@ 2013-06-05 13:57     ` Antonio Quartulli
  2013-06-05 14:14       ` Arend van Spriel
  0 siblings, 1 reply; 8+ messages in thread
From: Antonio Quartulli @ 2013-06-05 13:57 UTC (permalink / raw)
  To: Arend van Spriel
  Cc: Antonio Quartulli, Johannes Berg, linux-wireless@vger.kernel.org,
	brcm80211-dev-list@broadcom.com

[-- Attachment #1: Type: text/plain, Size: 846 bytes --]

On Wed, Jun 05, 2013 at 06:53:32AM -0700, Arend van Spriel wrote:

[...]

> > +		freq = cfg->channel;
> > +		if (chan)
> > +			freq = chan->center_freq;
> > +		chan_nr = ieee80211_frequency_to_channel(freq);
> 
> Could you get rid of 'freq' variable and use 
> ieee80211_frequency_to_channel() on cfg->channel or chan->center_freq.
> 

I tried that, but the line indented below the if would be longer than 80 chars
and breaking it is quite ugly.

> Another thing is that cfg->channel can be zero resulting in chan_nr 
> being zero. I had a quick look whether the device firmware can handle 
> this. I suspect not, but I will need to ask to be sure.
> 

ok. But when cfg->channel is zero, where is the current freq stored?

Regards,

-- 
Antonio Quartulli

..each of us alone is worth nothing..
Ernesto "Che" Guevara

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac accept a NULL channel
  2013-06-05 13:57     ` Antonio Quartulli
@ 2013-06-05 14:14       ` Arend van Spriel
  2013-06-05 14:17         ` Antonio Quartulli
  0 siblings, 1 reply; 8+ messages in thread
From: Arend van Spriel @ 2013-06-05 14:14 UTC (permalink / raw)
  To: Antonio Quartulli
  Cc: Antonio Quartulli, Johannes Berg, linux-wireless@vger.kernel.org,
	brcm80211-dev-list@broadcom.com

On 06/05/2013 03:57 PM, Antonio Quartulli wrote:
> On Wed, Jun 05, 2013 at 06:53:32AM -0700, Arend van Spriel wrote:
>
> [...]
>
>>> +		freq = cfg->channel;
>>> +		if (chan)
>>> +			freq = chan->center_freq;
>>> +		chan_nr = ieee80211_frequency_to_channel(freq);
>>
>> Could you get rid of 'freq' variable and use
>> ieee80211_frequency_to_channel() on cfg->channel or chan->center_freq.
>>
>
> I tried that, but the line indented below the if would be longer than 80 chars
> and breaking it is quite ugly.
>
>> Another thing is that cfg->channel can be zero resulting in chan_nr
>> being zero. I had a quick look whether the device firmware can handle
>> this. I suspect not, but I will need to ask to be sure.
>>
>
> ok. But when cfg->channel is zero, where is the current freq stored?

It is not. The rf on the device is set to a certain channel so it can be 
retrieved from the device:

brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL, &freq);

The vif pointer can be obtained using container_of() on the wdev. That 
is done in mgmt_tx() already some lines above. May you should move 
determining the vif pointer and do it unconditional.

Regards,
Arend



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac accept a NULL channel
  2013-06-05 14:14       ` Arend van Spriel
@ 2013-06-05 14:17         ` Antonio Quartulli
  0 siblings, 0 replies; 8+ messages in thread
From: Antonio Quartulli @ 2013-06-05 14:17 UTC (permalink / raw)
  To: Arend van Spriel
  Cc: Antonio Quartulli, Johannes Berg, linux-wireless@vger.kernel.org,
	brcm80211-dev-list@broadcom.com

[-- Attachment #1: Type: text/plain, Size: 1581 bytes --]

On Wed, Jun 05, 2013 at 07:14:07AM -0700, Arend van Spriel wrote:
> On 06/05/2013 03:57 PM, Antonio Quartulli wrote:
> > On Wed, Jun 05, 2013 at 06:53:32AM -0700, Arend van Spriel wrote:
> >
> > [...]
> >
> >>> +		freq = cfg->channel;
> >>> +		if (chan)
> >>> +			freq = chan->center_freq;
> >>> +		chan_nr = ieee80211_frequency_to_channel(freq);
> >>
> >> Could you get rid of 'freq' variable and use
> >> ieee80211_frequency_to_channel() on cfg->channel or chan->center_freq.
> >>
> >
> > I tried that, but the line indented below the if would be longer than 80 chars
> > and breaking it is quite ugly.
> >
> >> Another thing is that cfg->channel can be zero resulting in chan_nr
> >> being zero. I had a quick look whether the device firmware can handle
> >> this. I suspect not, but I will need to ask to be sure.
> >>
> >
> > ok. But when cfg->channel is zero, where is the current freq stored?
> 
> It is not. The rf on the device is set to a certain channel so it can be 
> retrieved from the device:
> 
> brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL, &freq);
> 
> The vif pointer can be obtained using container_of() on the wdev. That 
> is done in mgmt_tx() already some lines above. May you should move 
> determining the vif pointer and do it unconditional.
> 

Yeah, I like this approach.

I'll send v3 of this patchset with this change in it.
@johannes: I'll also revert the order of the patches.

Thanks a lot Arend.

Regards,

-- 
Antonio Quartulli

..each of us alone is worth nothing..
Ernesto "Che" Guevara

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-06-05 14:19 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-05 11:53 [PATCHv2 1/4] nl80211: allow sending CMD_FRAME without specifying any frequency Antonio Quartulli
2013-06-05 11:53 ` [PATCHv2 2/4] mac80211: make mgmt_tx accept a NULL channel Antonio Quartulli
2013-06-05 11:53 ` [PATCHv2 3/4] brcm80211: make mgmt_tx in brcmfmac " Antonio Quartulli
2013-06-05 13:53   ` Arend van Spriel
2013-06-05 13:57     ` Antonio Quartulli
2013-06-05 14:14       ` Arend van Spriel
2013-06-05 14:17         ` Antonio Quartulli
2013-06-05 11:53 ` [PATCHv2 4/4] ath6kl: make mgmt_tx " Antonio Quartulli

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.