2009-08-26 12:53:01

by Jussi Kivilinna

[permalink] [raw]
Subject: [PATCH] rndis_wlan: set cipher suites for cfg80211

rndis_wlan does not set cipher suites list for cfg80211 which causes
wext-compat-range to report rndis_wlan not supporting WPA. Patch adds
cipher suites list and fixes NetworkManager not being able to connect to
WPA encrypted APs.

Signed-off-by: Jussi Kivilinna <[email protected]>
---

drivers/net/wireless/rndis_wlan.c | 15 ++++++++++++++-
1 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
index c5b921b..f181b00 100644
--- a/drivers/net/wireless/rndis_wlan.c
+++ b/drivers/net/wireless/rndis_wlan.c
@@ -413,6 +413,13 @@ static const struct ieee80211_rate rndis_rates[] = {
{ .bitrate = 540 }
};

+static const u32 rndis_cipher_suites[] = {
+ WLAN_CIPHER_SUITE_WEP40,
+ WLAN_CIPHER_SUITE_WEP104,
+ WLAN_CIPHER_SUITE_TKIP,
+ WLAN_CIPHER_SUITE_CCMP,
+};
+
struct rndis_wlan_encr_key {
int len;
int cipher;
@@ -441,6 +448,7 @@ struct rndis_wlan_private {
struct ieee80211_supported_band band;
struct ieee80211_channel channels[ARRAY_SIZE(rndis_channels)];
struct ieee80211_rate rates[ARRAY_SIZE(rndis_rates)];
+ u32 cipher_suites[ARRAY_SIZE(rndis_cipher_suites)];

struct iw_statistics iwstats;
struct iw_statistics privstats;
@@ -2892,7 +2900,7 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf)
| BIT(NL80211_IFTYPE_ADHOC);
wiphy->max_scan_ssids = 1;

- /* TODO: fill-out band information based on priv->caps */
+ /* TODO: fill-out band/encr information based on priv->caps */
rndis_wlan_get_caps(usbdev);

memcpy(priv->channels, rndis_channels, sizeof(rndis_channels));
@@ -2904,6 +2912,11 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf)
wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band;
wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC;

+ memcpy(priv->cipher_suites, rndis_cipher_suites,
+ sizeof(rndis_cipher_suites));
+ wiphy->cipher_suites = priv->cipher_suites;
+ wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites);
+
set_wiphy_dev(wiphy, &usbdev->udev->dev);

if (wiphy_register(wiphy)) {



2009-08-26 18:15:51

by Jussi Kivilinna

[permalink] [raw]
Subject: Re: [PATCH] rndis_wlan: set cipher suites for cfg80211

Quoting "Holger Schurig" <[email protected]>:

>> +static const u32 rndis_cipher_suites[] = {
>> + WLAN_CIPHER_SUITE_WEP40,
>> + WLAN_CIPHER_SUITE_WEP104,
>> + WLAN_CIPHER_SUITE_TKIP,
>> + WLAN_CIPHER_SUITE_CCMP,
>> +};
>> +
>
> Okay, this is static, a.k.a. set-in-stone. Then why ...
>
>> + memcpy(priv->cipher_suites, rndis_cipher_suites,
>> + sizeof(rndis_cipher_suites));
>
> ... copy this to priv?
>
>> + wiphy->cipher_suites = priv->cipher_suites;
>> + wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites);
>
> Wouldn't
>
> + wiphy->cipher_suide = rndis_cipher_suites;
> + wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites);
>
> do the job? That way you can drop priv->cipher_suites.
>

Yes, that works just fine, and first version was that way. Reason is
that rndis_wlan should really check device capabilities and set cipher
suites
depending by theim (so then per device priv->cipher_suite is needed).
Current static array is not problem as currently there is only one
chip that uses rndis_wlan and array matches its capabilities.
priv->channel/rndis_channels and priv->rate/rndis_rates are the same
and I plan to add caps checking code later.

-Jussi


2009-08-26 13:22:08

by Holger Schurig

[permalink] [raw]
Subject: Re: [PATCH] rndis_wlan: set cipher suites for cfg80211

> +static const u32 rndis_cipher_suites[] = {
> + WLAN_CIPHER_SUITE_WEP40,
> + WLAN_CIPHER_SUITE_WEP104,
> + WLAN_CIPHER_SUITE_TKIP,
> + WLAN_CIPHER_SUITE_CCMP,
> +};
> +

Okay, this is static, a.k.a. set-in-stone. Then why ...

> + memcpy(priv->cipher_suites, rndis_cipher_suites,
> + sizeof(rndis_cipher_suites));

... copy this to priv?

> + wiphy->cipher_suites = priv->cipher_suites;
> + wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites);

Wouldn't

+ wiphy->cipher_suide = rndis_cipher_suites;
+ wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites);

do the job? That way you can drop priv->cipher_suites.


--
http://www.holgerschurig.de

2009-08-27 06:52:42

by Holger Schurig

[permalink] [raw]
Subject: Re: [PATCH] rndis_wlan: set cipher suites for cfg80211

On Wednesday 26 August 2009 20:15:51 Jussi Kivilinna wrote:
> Reason is that rndis_wlan should really check device
> capabilities and set cipher suites
> depending by theim

Ahh. I was under the impression that chips since two or three
year always support WEP, WPA and WPA2. And that only the orinoco
driver (or drivers for similar old chips) need to check the
firmware/chip to see what is available.

--
http://www.holgerschurig.de