wil6210: support WSC for STA mode
authorVladimir Kondratiev <QCA_vkondrat@QCA.qualcomm.com>
Thu, 30 Apr 2015 13:25:11 +0000 (16:25 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 4 May 2015 17:57:31 +0000 (20:57 +0300)
WSC connection is secure (privacy bit set in various frames)
but authentication suite, keys etc. are absent.

Support this mode in the connect WMI command. Detect WSC by
having 'sme->privacy' and no RSN IE. Inform firmware about WSC
session by setting dot11_auth_mode to WMI_AUTH11_WSC.

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/cfg80211.c

index 1b02b73..dbfcdd1 100644 (file)
@@ -402,11 +402,8 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
        rsn_eid = sme->ie ?
                        cfg80211_find_ie(WLAN_EID_RSN, sme->ie, sme->ie_len) :
                        NULL;
-
-       if (sme->privacy && !rsn_eid) {
-               wil_err(wil, "Missing RSN IE for secure connection\n");
-               return -EINVAL;
-       }
+       if (sme->privacy && !rsn_eid)
+               wil_info(wil, "WSC connection\n");
 
        bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid,
                               sme->ssid, sme->ssid_len,
@@ -465,13 +462,18 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
                goto out;
        }
        if (wil->privacy) {
-               conn.dot11_auth_mode = WMI_AUTH11_SHARED;
-               conn.auth_mode = WMI_AUTH_WPA2_PSK;
-               conn.pairwise_crypto_type = WMI_CRYPT_AES_GCMP;
-               conn.pairwise_crypto_len = 16;
-               conn.group_crypto_type = WMI_CRYPT_AES_GCMP;
-               conn.group_crypto_len = 16;
-       } else {
+               if (rsn_eid) { /* regular secure connection */
+                       conn.dot11_auth_mode = WMI_AUTH11_SHARED;
+                       conn.auth_mode = WMI_AUTH_WPA2_PSK;
+                       conn.pairwise_crypto_type = WMI_CRYPT_AES_GCMP;
+                       conn.pairwise_crypto_len = 16;
+                       conn.group_crypto_type = WMI_CRYPT_AES_GCMP;
+                       conn.group_crypto_len = 16;
+               } else { /* WSC */
+                       conn.dot11_auth_mode = WMI_AUTH11_WSC;
+                       conn.auth_mode = WMI_AUTH_NONE;
+               }
+       } else { /* insecure connection */
                conn.dot11_auth_mode = WMI_AUTH11_OPEN;
                conn.auth_mode = WMI_AUTH_NONE;
        }