Skip to contentSkip to conversation

rndis_wlan: set cipher suites for cfg80211

PATCH In review Jussi Kivilinna 2 participants 4 messages Aug 26, 2009 – Aug 27, 2009 Networking drivers (wireless)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

---

 drivers/net/wireless/rndis_wlan.c |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletions(-)
drivers/net/wireless/rndis_wlan.c +14 -1
index c5b921b..f181b00 100644
@@ -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)) {
#1 lore raw

drivers/net/wireless/rndis_wlan.c static const struct ieee80211_rate rndis_rates[] = { · line 422

Quoted 7 lines
drivers/net/wireless/rndis_wlan.c +7 -0
+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 ...

drivers/net/wireless/rndis_wlan.c static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) · line 2916

Quoted 2 lines
drivers/net/wireless/rndis_wlan.c +2 -0
+	memcpy(priv->cipher_suites, rndis_cipher_suites,
+						sizeof(rndis_cipher_suites));

... copy this to priv?

drivers/net/wireless/rndis_wlan.c static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) · line 2918

Quoted 2 lines
drivers/net/wireless/rndis_wlan.c +2 -0
+	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.

Signature · 1 line
http://www.holgerschurig.de
#2 lore raw

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

Quoted 23 lines

drivers/net/wireless/rndis_wlan.c static const struct ieee80211_rate rndis_rates[] = { · line 422

Quoted 7 lines
drivers/net/wireless/rndis_wlan.c +7 -0
+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 ...

drivers/net/wireless/rndis_wlan.c static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) · line 2916

Quoted 2 lines
drivers/net/wireless/rndis_wlan.c +2 -0
+	memcpy(priv->cipher_suites, rndis_cipher_suites,
+						sizeof(rndis_cipher_suites));

... copy this to priv?

drivers/net/wireless/rndis_wlan.c static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) · line 2918

Quoted 2 lines
drivers/net/wireless/rndis_wlan.c +2 -0
+	wiphy->cipher_suites = priv->cipher_suites;
+	wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites);

Wouldn't

(quoted diff) +2 -0
+   wiphy->cipher_suide = rndis_cipher_suites;
+   wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites);
Quoted 2 lines

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

#3 lore raw
Quoted 3 lines · 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.

Signature · 1 line
http://www.holgerschurig.de