Commit a0f6d6ca authored by Amitkumar Karwar's avatar Amitkumar Karwar Committed by John W. Linville

mwifiex: handle auto authentication mode correctly

When authentication type is configured to NL80211_AUTHTYPE_AUTOMATIC,
driver tries to connect using open mode. The association is failed
if AP is configured in shared mode.

This patch adds code to try association using shared mode as well if
open mode association fails.

Now since we returned exact error code in association response handler
(instead of -1), corresponding changes are done in
mwifiex_process_cmdresp().
Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: default avatarBing Zhao <bzhao@marvell.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c288ec61
...@@ -873,6 +873,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, ...@@ -873,6 +873,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
priv->sec_info.wpa2_enabled = false; priv->sec_info.wpa2_enabled = false;
priv->wep_key_curr_index = 0; priv->wep_key_curr_index = 0;
priv->sec_info.encryption_mode = 0; priv->sec_info.encryption_mode = 0;
priv->sec_info.is_authtype_auto = 0;
ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); ret = mwifiex_set_encode(priv, NULL, 0, 0, 1);
if (mode == NL80211_IFTYPE_ADHOC) { if (mode == NL80211_IFTYPE_ADHOC) {
...@@ -894,11 +895,12 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, ...@@ -894,11 +895,12 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
} }
/* Now handle infra mode. "sme" is valid for infra mode only */ /* Now handle infra mode. "sme" is valid for infra mode only */
if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) {
|| sme->auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM)
auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM; auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM;
else if (sme->auth_type == NL80211_AUTHTYPE_SHARED_KEY) priv->sec_info.is_authtype_auto = 1;
auth_type = NL80211_AUTHTYPE_SHARED_KEY; } else {
auth_type = sme->auth_type;
}
if (sme->crypto.n_ciphers_pairwise) { if (sme->crypto.n_ciphers_pairwise) {
priv->sec_info.encryption_mode = priv->sec_info.encryption_mode =
......
...@@ -771,7 +771,7 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter) ...@@ -771,7 +771,7 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
/* Check init command response */ /* Check init command response */
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) { if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) {
if (ret == -1) { if (ret) {
dev_err(adapter->dev, "%s: cmd %#x failed during " dev_err(adapter->dev, "%s: cmd %#x failed during "
"initialization\n", __func__, cmdresp_no); "initialization\n", __func__, cmdresp_no);
mwifiex_init_fw_complete(adapter); mwifiex_init_fw_complete(adapter);
...@@ -781,10 +781,8 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter) ...@@ -781,10 +781,8 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
} }
if (adapter->curr_cmd) { if (adapter->curr_cmd) {
if (adapter->curr_cmd->wait_q_enabled && (!ret)) if (adapter->curr_cmd->wait_q_enabled)
adapter->cmd_wait_q.status = 0; adapter->cmd_wait_q.status = ret;
else if (adapter->curr_cmd->wait_q_enabled && (ret == -1))
adapter->cmd_wait_q.status = -1;
/* Clean up and put current command back to cmd_free_q */ /* Clean up and put current command back to cmd_free_q */
mwifiex_insert_cmd_to_free_q(adapter, adapter->curr_cmd); mwifiex_insert_cmd_to_free_q(adapter, adapter->curr_cmd);
......
...@@ -585,7 +585,7 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, ...@@ -585,7 +585,7 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
le16_to_cpu(assoc_rsp->cap_info_bitmap), le16_to_cpu(assoc_rsp->cap_info_bitmap),
le16_to_cpu(assoc_rsp->a_id)); le16_to_cpu(assoc_rsp->a_id));
ret = -1; ret = le16_to_cpu(assoc_rsp->status_code);
goto done; goto done;
} }
......
...@@ -219,6 +219,7 @@ struct mwifiex_802_11_security { ...@@ -219,6 +219,7 @@ struct mwifiex_802_11_security {
u8 wapi_key_on; u8 wapi_key_on;
u8 wep_enabled; u8 wep_enabled;
u32 authentication_mode; u32 authentication_mode;
u8 is_authtype_auto;
u32 encryption_mode; u32 encryption_mode;
}; };
......
...@@ -249,6 +249,17 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss, ...@@ -249,6 +249,17 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
* application retrieval */ * application retrieval */
priv->assoc_rsp_size = 0; priv->assoc_rsp_size = 0;
ret = mwifiex_associate(priv, bss_desc); ret = mwifiex_associate(priv, bss_desc);
/* If auth type is auto and association fails using open mode,
* try to connect using shared mode */
if (ret == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG &&
priv->sec_info.is_authtype_auto &&
priv->sec_info.wep_enabled) {
priv->sec_info.authentication_mode =
NL80211_AUTHTYPE_SHARED_KEY;
ret = mwifiex_associate(priv, bss_desc);
}
if (bss) if (bss)
cfg80211_put_bss(bss); cfg80211_put_bss(bss);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment