Linux wireless drivers development
 help / color / mirror / Atom feed
* [PATCH] cfg80211: fix cmp_hidden_bss
@ 2012-11-28 21:44 Johannes Berg
  2012-11-28 23:53 ` Eliad Peller
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Johannes Berg @ 2012-11-28 21:44 UTC (permalink / raw)
  To: linux-wireless; +Cc: Dmitry Tarnyagin, Johannes Berg

From: Johannes Berg <johannes.berg@intel.com>

The cmp_bss() comparator function uses memcmp() to
compare the SSID. This means that cmp_hidden_bss()
needs to similarly return a number bigger than zero
(use 1) instead of -1 when ie1 is bigger than ie2,
which is the case if an ie2 byte is non-zero.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/wireless/scan.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 9233910..57855bc 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -472,7 +472,7 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
 	/* zeroed SSID ie is another indication of a hidden bss */
 	for (i = 0; i < ie2[1]; i++)
 		if (ie2[i + 2])
-			return -1;
+			return 1;
 
 	return 0;
 }
-- 
1.8.0


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

* Re: [PATCH] cfg80211: fix cmp_hidden_bss
  2012-11-28 21:44 [PATCH] cfg80211: fix cmp_hidden_bss Johannes Berg
@ 2012-11-28 23:53 ` Eliad Peller
  2012-11-29  0:00   ` Johannes Berg
  2012-11-29  9:01 ` [PATCH v2] " Johannes Berg
  2012-11-29 10:48 ` [PATCH v3] " Johannes Berg
  2 siblings, 1 reply; 9+ messages in thread
From: Eliad Peller @ 2012-11-28 23:53 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless@vger.kernel.org, Dmitry Tarnyagin, Johannes Berg

On Wed, Nov 28, 2012 at 11:44 PM, Johannes Berg
<johannes@sipsolutions.net> wrote:
> From: Johannes Berg <johannes.berg@intel.com>
>
> The cmp_bss() comparator function uses memcmp() to
> compare the SSID. This means that cmp_hidden_bss()
> needs to similarly return a number bigger than zero
> (use 1) instead of -1 when ie1 is bigger than ie2,
> which is the case if an ie2 byte is non-zero.
>
> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
> ---
>  net/wireless/scan.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/net/wireless/scan.c b/net/wireless/scan.c
> index 9233910..57855bc 100644
> --- a/net/wireless/scan.c
> +++ b/net/wireless/scan.c
> @@ -472,7 +472,7 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
>         /* zeroed SSID ie is another indication of a hidden bss */
>         for (i = 0; i < ie2[1]; i++)
>                 if (ie2[i + 2])
> -                       return -1;
> +                       return 1;
>
>         return 0;
>  }

maybe i'm misreading it, but there is still no comparison here at all,
so it seems wrong as well :)
(practically, i guess it doesn't really matter, because if there is
some non-null char, this is not a hidden ssid anyway)

Eliad.

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

* Re: [PATCH] cfg80211: fix cmp_hidden_bss
  2012-11-28 23:53 ` Eliad Peller
@ 2012-11-29  0:00   ` Johannes Berg
  2012-11-29  0:07     ` Eliad Peller
  0 siblings, 1 reply; 9+ messages in thread
From: Johannes Berg @ 2012-11-29  0:00 UTC (permalink / raw)
  To: Eliad Peller; +Cc: linux-wireless@vger.kernel.org, Dmitry Tarnyagin

On Thu, 2012-11-29 at 01:53 +0200, Eliad Peller wrote:
> On Wed, Nov 28, 2012 at 11:44 PM, Johannes Berg
> <johannes@sipsolutions.net> wrote:
> > From: Johannes Berg <johannes.berg@intel.com>
> >
> > The cmp_bss() comparator function uses memcmp() to
> > compare the SSID. This means that cmp_hidden_bss()
> > needs to similarly return a number bigger than zero
> > (use 1) instead of -1 when ie1 is bigger than ie2,
> > which is the case if an ie2 byte is non-zero.

> > +++ b/net/wireless/scan.c
> > @@ -472,7 +472,7 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
> >         /* zeroed SSID ie is another indication of a hidden bss */
> >         for (i = 0; i < ie2[1]; i++)
> >                 if (ie2[i + 2])
> > -                       return -1;
> > +                       return 1;
> >
> >         return 0;
> >  }
> 
> maybe i'm misreading it, but there is still no comparison here at all,
> so it seems wrong as well :)
> (practically, i guess it doesn't really matter, because if there is
> some non-null char, this is not a hidden ssid anyway)

Hmm yeah you're right, it should be
	return ie2[i + 1] - ie1[i + 1];

(or the other way around? need to sleep on that first...)

johannes


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

* Re: [PATCH] cfg80211: fix cmp_hidden_bss
  2012-11-29  0:00   ` Johannes Berg
@ 2012-11-29  0:07     ` Eliad Peller
  2012-11-29  0:28       ` Johannes Berg
  0 siblings, 1 reply; 9+ messages in thread
From: Eliad Peller @ 2012-11-29  0:07 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org, Dmitry Tarnyagin

On Thu, Nov 29, 2012 at 2:00 AM, Johannes Berg
<johannes@sipsolutions.net> wrote:
> On Thu, 2012-11-29 at 01:53 +0200, Eliad Peller wrote:
>> On Wed, Nov 28, 2012 at 11:44 PM, Johannes Berg
>> <johannes@sipsolutions.net> wrote:
>> > From: Johannes Berg <johannes.berg@intel.com>
>> >
>> > The cmp_bss() comparator function uses memcmp() to
>> > compare the SSID. This means that cmp_hidden_bss()
>> > needs to similarly return a number bigger than zero
>> > (use 1) instead of -1 when ie1 is bigger than ie2,
>> > which is the case if an ie2 byte is non-zero.
>
>> > +++ b/net/wireless/scan.c
>> > @@ -472,7 +472,7 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
>> >         /* zeroed SSID ie is another indication of a hidden bss */
>> >         for (i = 0; i < ie2[1]; i++)
>> >                 if (ie2[i + 2])
>> > -                       return -1;
>> > +                       return 1;
>> >
>> >         return 0;
>> >  }
>>
>> maybe i'm misreading it, but there is still no comparison here at all,
>> so it seems wrong as well :)
>> (practically, i guess it doesn't really matter, because if there is
>> some non-null char, this is not a hidden ssid anyway)
>
> Hmm yeah you're right, it should be
>         return ie2[i + 1] - ie1[i + 1];
>
> (or the other way around? need to sleep on that first...)
>
that's also not enough, because you ignore the previous chars.
("A" < "B" vs. "AA" > "\x00B")

i think returning memcmp() is the easiest solution, but sleeping on
that is definitely a good idea :)

Eliad.

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

* Re: [PATCH] cfg80211: fix cmp_hidden_bss
  2012-11-29  0:07     ` Eliad Peller
@ 2012-11-29  0:28       ` Johannes Berg
  0 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2012-11-29  0:28 UTC (permalink / raw)
  To: Eliad Peller; +Cc: linux-wireless@vger.kernel.org, Dmitry Tarnyagin

On Thu, 2012-11-29 at 02:07 +0200, Eliad Peller wrote:
> On Thu, Nov 29, 2012 at 2:00 AM, Johannes Berg
> <johannes@sipsolutions.net> wrote:
> > On Thu, 2012-11-29 at 01:53 +0200, Eliad Peller wrote:
> >> On Wed, Nov 28, 2012 at 11:44 PM, Johannes Berg
> >> <johannes@sipsolutions.net> wrote:
> >> > From: Johannes Berg <johannes.berg@intel.com>
> >> >
> >> > The cmp_bss() comparator function uses memcmp() to
> >> > compare the SSID. This means that cmp_hidden_bss()
> >> > needs to similarly return a number bigger than zero
> >> > (use 1) instead of -1 when ie1 is bigger than ie2,
> >> > which is the case if an ie2 byte is non-zero.
> >
> >> > +++ b/net/wireless/scan.c
> >> > @@ -472,7 +472,7 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
> >> >         /* zeroed SSID ie is another indication of a hidden bss */
> >> >         for (i = 0; i < ie2[1]; i++)
> >> >                 if (ie2[i + 2])
> >> > -                       return -1;
> >> > +                       return 1;
> >> >
> >> >         return 0;
> >> >  }
> >>
> >> maybe i'm misreading it, but there is still no comparison here at all,
> >> so it seems wrong as well :)
> >> (practically, i guess it doesn't really matter, because if there is
> >> some non-null char, this is not a hidden ssid anyway)
> >
> > Hmm yeah you're right, it should be
> >         return ie2[i + 1] - ie1[i + 1];
> >
> > (or the other way around? need to sleep on that first...)
> >
> that's also not enough, because you ignore the previous chars.
> ("A" < "B" vs. "AA" > "\x00B")
> 
> i think returning memcmp() is the easiest solution, but sleeping on
> that is definitely a good idea :)

Hmm, yeah, indeed. If we find a non-zero byte we should return memcmp().
I'll fix it in the morning :)

johannes


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

* [PATCH v2] cfg80211: fix cmp_hidden_bss
  2012-11-28 21:44 [PATCH] cfg80211: fix cmp_hidden_bss Johannes Berg
  2012-11-28 23:53 ` Eliad Peller
@ 2012-11-29  9:01 ` Johannes Berg
  2012-11-29  9:42   ` Eliad Peller
  2012-11-29 10:48 ` [PATCH v3] " Johannes Berg
  2 siblings, 1 reply; 9+ messages in thread
From: Johannes Berg @ 2012-11-29  9:01 UTC (permalink / raw)
  To: linux-wireless; +Cc: Dmitry Tarnyagin, Johannes Berg

From: Johannes Berg <johannes.berg@intel.com>

The cmp_bss() comparator function uses memcmp() to
compare the SSID. This means that cmp_hidden_bss()
needs to similarly return a number bigger than zero
(use 1) instead of -1 when ie1 is bigger than ie2,
which is the case if an ie2 byte is non-zero.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/wireless/scan.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 9233910..456c342 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -469,10 +469,14 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
 	if (ie1[1] != ie2[1])
 		return ie2[1] - ie1[1];
 
-	/* zeroed SSID ie is another indication of a hidden bss */
+	/*
+	 * zeroed SSID ie is another indication of a hidden bss;
+	 * if it isn't zeroed just return the regular sort value
+	 * to find the next candidate
+	 */
 	for (i = 0; i < ie2[1]; i++)
 		if (ie2[i + 2])
-			return -1;
+			return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
 
 	return 0;
 }
-- 
1.8.0


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

* Re: [PATCH v2] cfg80211: fix cmp_hidden_bss
  2012-11-29  9:01 ` [PATCH v2] " Johannes Berg
@ 2012-11-29  9:42   ` Eliad Peller
  0 siblings, 0 replies; 9+ messages in thread
From: Eliad Peller @ 2012-11-29  9:42 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless@vger.kernel.org, Dmitry Tarnyagin, Johannes Berg

On Thu, Nov 29, 2012 at 11:01 AM, Johannes Berg
<johannes@sipsolutions.net> wrote:
> From: Johannes Berg <johannes.berg@intel.com>
>
> The cmp_bss() comparator function uses memcmp() to
> compare the SSID. This means that cmp_hidden_bss()
> needs to similarly return a number bigger than zero
> (use 1) instead of -1 when ie1 is bigger than ie2,
> which is the case if an ie2 byte is non-zero.
>
> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
> ---
>  net/wireless/scan.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/net/wireless/scan.c b/net/wireless/scan.c
> index 9233910..456c342 100644
> --- a/net/wireless/scan.c
> +++ b/net/wireless/scan.c
> @@ -469,10 +469,14 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
>         if (ie1[1] != ie2[1])
>                 return ie2[1] - ie1[1];
>
> -       /* zeroed SSID ie is another indication of a hidden bss */
> +       /*
> +        * zeroed SSID ie is another indication of a hidden bss;
> +        * if it isn't zeroed just return the regular sort value
> +        * to find the next candidate
> +        */
>         for (i = 0; i < ie2[1]; i++)
>                 if (ie2[i + 2])
> -                       return -1;
> +                       return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
>
>         return 0;
>  }

btw, it might be worth noting that this comparator works correctly
only in one way (if hidden ssid is in "b")...

Eliad.

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

* [PATCH v3] cfg80211: fix cmp_hidden_bss
  2012-11-28 21:44 [PATCH] cfg80211: fix cmp_hidden_bss Johannes Berg
  2012-11-28 23:53 ` Eliad Peller
  2012-11-29  9:01 ` [PATCH v2] " Johannes Berg
@ 2012-11-29 10:48 ` Johannes Berg
  2012-11-30 12:43   ` Johannes Berg
  2 siblings, 1 reply; 9+ messages in thread
From: Johannes Berg @ 2012-11-29 10:48 UTC (permalink / raw)
  To: linux-wireless; +Cc: Dmitry Tarnyagin, Johannes Berg

From: Johannes Berg <johannes.berg@intel.com>

The cmp_bss() comparator function uses memcmp() to
compare the SSID. This means that cmp_hidden_bss()
needs to similarly return a number bigger than zero
(use 1) instead of -1 when ie1 is bigger than ie2,
which is the case if an ie2 byte is non-zero.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/wireless/scan.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 9233910..834e0d1 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -450,10 +450,16 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
 			       b->information_elements,
 			       b->len_information_elements);
 
-	/* Key comparator must use same algorithm in any rb-tree
+	/*
+	 * Key comparator must use same algorithm in any rb-tree
 	 * search function (order is important), otherwise ordering
 	 * of items in the tree is broken and search gives incorrect
-	 * results. This code uses same order as cmp_ies() does. */
+	 * results. This code uses same order as cmp_ies() does.
+	 *
+	 * Note that due to the differring behaviour with hidden SSIDs
+	 * this function only works when "b" is the tree element and
+	 * "a" is the key we're looking for.
+	 */
 
 	/* sort missing IE before (left of) present IE */
 	if (!ie1)
@@ -469,10 +475,14 @@ static int cmp_hidden_bss(struct cfg80211_bss *a, struct cfg80211_bss *b)
 	if (ie1[1] != ie2[1])
 		return ie2[1] - ie1[1];
 
-	/* zeroed SSID ie is another indication of a hidden bss */
+	/*
+	 * zeroed SSID ie is another indication of a hidden bss;
+	 * if it isn't zeroed just return the regular sort value
+	 * to find the next candidate
+	 */
 	for (i = 0; i < ie2[1]; i++)
 		if (ie2[i + 2])
-			return -1;
+			return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
 
 	return 0;
 }
-- 
1.8.0


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

* Re: [PATCH v3] cfg80211: fix cmp_hidden_bss
  2012-11-29 10:48 ` [PATCH v3] " Johannes Berg
@ 2012-11-30 12:43   ` Johannes Berg
  0 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2012-11-30 12:43 UTC (permalink / raw)
  To: linux-wireless; +Cc: Dmitry Tarnyagin

On Thu, 2012-11-29 at 11:48 +0100, Johannes Berg wrote:
> From: Johannes Berg <johannes.berg@intel.com>
> 
> The cmp_bss() comparator function uses memcmp() to
> compare the SSID. This means that cmp_hidden_bss()
> needs to similarly return a number bigger than zero
> (use 1) instead of -1 when ie1 is bigger than ie2,
> which is the case if an ie2 byte is non-zero.

applied.

johannes


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

end of thread, other threads:[~2012-11-30 12:43 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-28 21:44 [PATCH] cfg80211: fix cmp_hidden_bss Johannes Berg
2012-11-28 23:53 ` Eliad Peller
2012-11-29  0:00   ` Johannes Berg
2012-11-29  0:07     ` Eliad Peller
2012-11-29  0:28       ` Johannes Berg
2012-11-29  9:01 ` [PATCH v2] " Johannes Berg
2012-11-29  9:42   ` Eliad Peller
2012-11-29 10:48 ` [PATCH v3] " Johannes Berg
2012-11-30 12:43   ` Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox