From: Johannes Berg <[email protected]>
Before allowing userspace to initiate a channel switch, check
that it's actually connected in some sense. Also use a more
appropriate error code for the not connected case.
Signed-off-by: Johannes Berg <[email protected]>
---
net/wireless/nl80211.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 6e78c62..0c2ef08 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5799,10 +5799,15 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
/* useless if AP is not running */
if (!wdev->beacon_interval)
- return -EINVAL;
+ return -ENOTCONN;
break;
case NL80211_IFTYPE_ADHOC:
+ if (!wdev->ssid_len)
+ return -ENOTCONN;
+ break;
case NL80211_IFTYPE_MESH_POINT:
+ if (!wdev->mesh_id_len)
+ return -ENOTCONN;
break;
default:
return -EOPNOTSUPP;
--
1.8.5.1
On Wed, Jan 22, 2014 at 10:28 AM, Johannes Berg
<[email protected]> wrote:
> On Wed, 2014-01-22 at 10:02 -0800, Thomas Pedersen wrote:
>
>> > --- a/net/wireless/nl80211.c
>> > +++ b/net/wireless/nl80211.c
>> > @@ -5799,10 +5799,15 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
>
>> > case NL80211_IFTYPE_MESH_POINT:
>> > + if (!wdev->mesh_id_len)
>> > + return -ENOTCONN;
>>
>> Hmmm. I'm pretty sure there are some users which set the channel prior
>> to mesh join. This would break that and only allow sending the channel
>> with mesh join?
>
> I don't think channel_switch() is invoked for that? That's done only for
> run-time switching of the channel with CSA etc.
Oh right, that was a special case then.
Thanks,
Thomas
On Wed, 2014-01-22 at 10:02 -0800, Thomas Pedersen wrote:
> > --- a/net/wireless/nl80211.c
> > +++ b/net/wireless/nl80211.c
> > @@ -5799,10 +5799,15 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
> > case NL80211_IFTYPE_MESH_POINT:
> > + if (!wdev->mesh_id_len)
> > + return -ENOTCONN;
>
> Hmmm. I'm pretty sure there are some users which set the channel prior
> to mesh join. This would break that and only allow sending the channel
> with mesh join?
I don't think channel_switch() is invoked for that? That's done only for
run-time switching of the channel with CSA etc.
johannes
On Wed, Jan 22, 2014 at 1:16 AM, Johannes Berg
<[email protected]> wrote:
> From: Johannes Berg <[email protected]>
>
> Before allowing userspace to initiate a channel switch, check
> that it's actually connected in some sense. Also use a more
> appropriate error code for the not connected case.
>
> Signed-off-by: Johannes Berg <[email protected]>
> ---
> net/wireless/nl80211.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index 6e78c62..0c2ef08 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -5799,10 +5799,15 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
>
> /* useless if AP is not running */
> if (!wdev->beacon_interval)
> - return -EINVAL;
> + return -ENOTCONN;
> break;
> case NL80211_IFTYPE_ADHOC:
> + if (!wdev->ssid_len)
> + return -ENOTCONN;
> + break;
> case NL80211_IFTYPE_MESH_POINT:
> + if (!wdev->mesh_id_len)
> + return -ENOTCONN;
Hmmm. I'm pretty sure there are some users which set the channel prior
to mesh join. This would break that and only allow sending the channel
with mesh join?
Thomas