summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c36
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.h17
-rw-r--r--core/mac/inc/sir_api.h2
-rw-r--r--core/mac/src/pe/include/lim_session.h1
-rw-r--r--core/mac/src/pe/lim/lim_assoc_utils.c25
-rw-r--r--core/mac/src/pe/lim/lim_process_beacon_frame.c9
-rw-r--r--core/mac/src/pe/lim/lim_process_probe_rsp_frame.c18
-rw-r--r--core/mac/src/pe/lim/lim_process_sme_req_messages.c3
8 files changed, 76 insertions, 35 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 01c4eca68398..fe547cdc7da6 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -4057,16 +4057,16 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
if (access_policy == QCA_ACCESS_POLICY_DENY_UNLESS_LISTED) {
access_policy =
WLAN_HDD_VENDOR_IE_ACCESS_ALLOW_IF_LISTED;
- } else {
+ } else {
access_policy = WLAN_HDD_VENDOR_IE_ACCESS_NONE;
- }
+ }
- hdd_info("calling sme_update_access_policy_vendor_ie");
- status = sme_update_access_policy_vendor_ie(hdd_ctx->hHal,
- adapter->sessionId, &vendor_ie[0],
- access_policy);
- if (QDF_STATUS_SUCCESS != status) {
- hdd_info("Failed to set vendor ie and access policy.");
+ hdd_info("calling sme_update_access_policy_vendor_ie");
+ status = sme_update_access_policy_vendor_ie(hdd_ctx->hHal,
+ adapter->sessionId, &vendor_ie[0],
+ access_policy);
+ if (QDF_STATUS_SUCCESS != status) {
+ hdd_info("Failed to set vendor ie and access policy.");
return -EINVAL;
}
}
@@ -4140,6 +4140,26 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
}
}
+ if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_IGNORE_ASSOC_DISALLOWED]) {
+ uint8_t ignore_assoc_disallowed;
+
+ ignore_assoc_disallowed
+ = nla_get_u8(tb[
+ QCA_WLAN_VENDOR_ATTR_CONFIG_IGNORE_ASSOC_DISALLOWED]);
+ hdd_info("Set ignore_assoc_disallowed value - %d",
+ ignore_assoc_disallowed);
+ if ((ignore_assoc_disallowed <
+ QCA_IGNORE_ASSOC_DISALLOWED_DISABLE) ||
+ (ignore_assoc_disallowed >
+ QCA_IGNORE_ASSOC_DISALLOWED_ENABLE))
+ return -EPERM;
+
+ sme_update_session_param(hdd_ctx->hHal,
+ adapter->sessionId,
+ SIR_PARAM_IGNORE_ASSOC_DISALLOWED,
+ ignore_assoc_disallowed);
+ }
+
return ret_val;
}
diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h
index 37fa4e6ab79a..c8d2f6b5c13f 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.h
+++ b/core/hdd/src/wlan_hdd_cfg80211.h
@@ -2312,6 +2312,20 @@ enum qca_access_policy {
};
/**
+ * enum qca_ignore_assoc_disallowed - Ignore assoc disallowed values
+ *
+ * The valid values for the ignore assoc disallowed
+ *
+ * @QCA_IGNORE_ASSOC_DISALLOWED_DISABLE: Disable ignore assoc disallowed
+ * @QCA_IGNORE_ASSOC_DISALLOWED_ENABLE: Enable ignore assoc disallowed
+ *
+ */
+enum qca_ignore_assoc_disallowed {
+ QCA_IGNORE_ASSOC_DISALLOWED_DISABLE,
+ QCA_IGNORE_ASSOC_DISALLOWED_ENABLE
+};
+
+/**
* enum qca_wlan_vendor_config: wifi config attr
*
* @QCA_WLAN_VENDOR_ATTR_CONFIG_INVALID: invalid config
@@ -2342,6 +2356,8 @@ enum qca_access_policy {
* parameters
* @QCA_WLAN_VENDOR_ATTR_CONFIG_QPOWER: Unsigned 8bit length attribute to update
* power save config to turn off/on qpower
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_IGNORE_ASSOC_DISALLOWED: Ignore Assoc Disallowed
+ * [MBO]
* @QCA_WLAN_VENDOR_ATTR_CONFIG_LAST: last config
* @QCA_WLAN_VENDOR_ATTR_CONFIG_MAX: max config
*/
@@ -2396,6 +2412,7 @@ enum qca_wlan_vendor_config {
QCA_WLAN_VENDOR_ATTR_CONFIG_IFINDEX,
/* Unsigned 8-bit, for setting qpower dynamically */
QCA_WLAN_VENDOR_ATTR_CONFIG_QPOWER = 25,
+ QCA_WLAN_VENDOR_ATTR_CONFIG_IGNORE_ASSOC_DISALLOWED = 26,
/* keep last */
QCA_WLAN_VENDOR_ATTR_CONFIG_LAST,
QCA_WLAN_VENDOR_ATTR_CONFIG_MAX =
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index 9610a2274c47..9d01e419afe6 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -2506,9 +2506,11 @@ typedef struct sSirUpdateAPWPSIEsReq {
/*
* enum sir_update_session_param_type - session param type
* @SIR_PARAM_SSID_HIDDEN: ssidHidden parameter
+ * @SIR_PARAM_IGNORE_ASSOC_DISALLOWED: ignore_assoc_disallowed parameter
*/
enum sir_update_session_param_type {
SIR_PARAM_SSID_HIDDEN,
+ SIR_PARAM_IGNORE_ASSOC_DISALLOWED,
};
/*
diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h
index 4b36c7ee704c..c0d7398e642c 100644
--- a/core/mac/src/pe/include/lim_session.h
+++ b/core/mac/src/pe/include/lim_session.h
@@ -484,6 +484,7 @@ typedef struct sPESession /* Added to Support BT-AMP */
uint8_t beacon_tx_rate;
uint8_t *access_policy_vendor_ie;
uint8_t access_policy;
+ bool ignore_assoc_disallowed;
} tPESession, *tpPESession;
/*-------------------------------------------------------------------------
diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c
index 6fef5dca4475..8d914ee6e11c 100644
--- a/core/mac/src/pe/lim/lim_assoc_utils.c
+++ b/core/mac/src/pe/lim/lim_assoc_utils.c
@@ -3191,6 +3191,31 @@ lim_check_and_announce_join_success(tpAniSirGlobal mac_ctx,
session_entry->defaultAuthFailureTimeout = 0;
}
+
+ /*
+ * Check if MBO Association disallowed subattr is present and post
+ * failure status to LIM if present
+ */
+ if (!session_entry->ignore_assoc_disallowed &&
+ beacon_probe_rsp->assoc_disallowed) {
+ lim_log(mac_ctx, LOGW,
+ FL("Connection fails due to assoc disallowed reason(%d):%pM PESessionID %d"),
+ beacon_probe_rsp->assoc_disallowed_reason,
+ session_entry->bssId,
+ session_entry->peSessionId);
+ mlm_join_cnf.resultCode = eSIR_SME_ASSOC_REFUSED;
+ mlm_join_cnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
+ session_entry->limMlmState = eLIM_MLM_IDLE_STATE;
+ mlm_join_cnf.sessionId = session_entry->peSessionId;
+ if (session_entry->pLimMlmJoinReq) {
+ qdf_mem_free(session_entry->pLimMlmJoinReq);
+ session_entry->pLimMlmJoinReq = NULL;
+ }
+ lim_post_sme_message(mac_ctx, LIM_MLM_JOIN_CNF,
+ (uint32_t *) &mlm_join_cnf);
+ return;
+ }
+
/* Update Beacon Interval at CFG database */
if (beacon_probe_rsp->HTCaps.present)
diff --git a/core/mac/src/pe/lim/lim_process_beacon_frame.c b/core/mac/src/pe/lim/lim_process_beacon_frame.c
index f84c671d9d62..7ff7e61fa9c7 100644
--- a/core/mac/src/pe/lim/lim_process_beacon_frame.c
+++ b/core/mac/src/pe/lim/lim_process_beacon_frame.c
@@ -106,15 +106,6 @@ lim_process_beacon_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info,
return;
}
- if (bcn_ptr->assoc_disallowed) {
- lim_log(mac_ctx, LOG1,
- FL("Association disallowed in AP "MAC_ADDRESS_STR " Reason code %d"),
- MAC_ADDR_ARRAY(mac_hdr->sa),
- bcn_ptr->assoc_disallowed_reason);
- qdf_mem_free(bcn_ptr);
- return;
- }
-
/*
* during scanning, when any session is active, and
* beacon/Pr belongs to one of the session, fill up the
diff --git a/core/mac/src/pe/lim/lim_process_probe_rsp_frame.c b/core/mac/src/pe/lim/lim_process_probe_rsp_frame.c
index c47d7aab9bf0..daf93ffffadd 100644
--- a/core/mac/src/pe/lim/lim_process_probe_rsp_frame.c
+++ b/core/mac/src/pe/lim/lim_process_probe_rsp_frame.c
@@ -171,15 +171,6 @@ lim_process_probe_rsp_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_Packet_info,
return;
}
- if (probe_rsp->assoc_disallowed) {
- lim_log(mac_ctx, LOG1,
- FL("Association disallowed by AP "MAC_ADDRESS_STR " Reason code %d"),
- MAC_ADDR_ARRAY(header->bssId),
- probe_rsp->assoc_disallowed_reason);
- qdf_mem_free(probe_rsp);
- return;
- }
-
lim_check_and_add_bss_description(mac_ctx, probe_rsp,
rx_Packet_info, false, true);
/* To Support BT-AMP */
@@ -404,15 +395,6 @@ lim_process_probe_rsp_frame_no_session(tpAniSirGlobal mac_ctx,
return;
}
- if (probe_rsp->assoc_disallowed) {
- lim_log(mac_ctx, LOG1,
- FL("Association disallowed by AP "MAC_ADDRESS_STR " Reason code %d"),
- MAC_ADDR_ARRAY(header->bssId),
- probe_rsp->assoc_disallowed_reason);
- qdf_mem_free(probe_rsp);
- return;
- }
-
lim_log(mac_ctx, LOG2, FL("Save this probe rsp in LFR cache"));
lim_check_and_add_bss_description(mac_ctx, probe_rsp,
rx_packet_info, false, true);
diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
index df4cd348ad20..9739487e56ef 100644
--- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
@@ -4256,6 +4256,9 @@ static void __lim_process_sme_session_update(tpAniSirGlobal mac_ctx,
case SIR_PARAM_SSID_HIDDEN:
lim_handle_update_ssid_hidden(mac_ctx, session, msg->param_val);
break;
+ case SIR_PARAM_IGNORE_ASSOC_DISALLOWED:
+ session->ignore_assoc_disallowed = msg->param_val;
+ break;
default:
lim_log(mac_ctx, LOGE, FL("Unknown session param"));
break;