|
@@ -3762,6 +3762,7 @@ lim_fill_session_params(struct mac_context *mac_ctx,
|
|
uint32_t bss_len;
|
|
uint32_t bss_len;
|
|
struct join_req *pe_join_req;
|
|
struct join_req *pe_join_req;
|
|
int32_t akm;
|
|
int32_t akm;
|
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
|
|
|
ie_len = util_scan_entry_ie_len(req->entry);
|
|
ie_len = util_scan_entry_ie_len(req->entry);
|
|
bss_len = (uint16_t)(offsetof(struct bss_description,
|
|
bss_len = (uint16_t)(offsetof(struct bss_description,
|
|
@@ -3833,6 +3834,49 @@ lim_fill_session_params(struct mac_context *mac_ctx,
|
|
req->scan_ie.ptr, req->scan_ie.len);
|
|
req->scan_ie.ptr, req->scan_ie.len);
|
|
pe_join_req->addIEScan.length = req->scan_ie.len;
|
|
pe_join_req->addIEScan.length = req->scan_ie.len;
|
|
|
|
|
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(session->vdev);
|
|
|
|
+ if (!mlme_priv) {
|
|
|
|
+ pe_err("Invalid mlme priv object");
|
|
|
|
+ qdf_mem_free(session->lim_join_req);
|
|
|
|
+ session->lim_join_req = NULL;
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+ qdf_mem_zero(mlme_priv->connect_info.ext_cap_ie,
|
|
|
|
+ DOT11F_IE_EXTCAP_MAX_LEN + 2);
|
|
|
|
+
|
|
|
|
+ if (session->lim_join_req->addIEAssoc.length) {
|
|
|
|
+ uint8_t *add_ie = NULL;
|
|
|
|
+ uint16_t add_ie_len;
|
|
|
|
+
|
|
|
|
+ add_ie_len = session->lim_join_req->addIEAssoc.length;
|
|
|
|
+ add_ie = qdf_mem_malloc(add_ie_len);
|
|
|
|
+ if (!add_ie) {
|
|
|
|
+ qdf_mem_free(session->lim_join_req);
|
|
|
|
+ session->lim_join_req = NULL;
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+ qdf_mem_copy(add_ie,
|
|
|
|
+ session->lim_join_req->addIEAssoc.addIEdata,
|
|
|
|
+ add_ie_len);
|
|
|
|
+
|
|
|
|
+ status = lim_strip_ie(mac_ctx, add_ie, &add_ie_len,
|
|
|
|
+ DOT11F_EID_EXTCAP, ONE_BYTE,
|
|
|
|
+ NULL, 0,
|
|
|
|
+ mlme_priv->connect_info.ext_cap_ie,
|
|
|
|
+ DOT11F_IE_EXTCAP_MAX_LEN);
|
|
|
|
+ qdf_mem_free(add_ie);
|
|
|
|
+
|
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
|
+ pe_err("Parsing of ext cap failed with status : %d",
|
|
|
|
+ status);
|
|
|
|
+ qdf_mem_zero(mlme_priv->connect_info.ext_cap_ie,
|
|
|
|
+ DOT11F_IE_EXTCAP_MAX_LEN + 2);
|
|
|
|
+ qdf_mem_free(session->lim_join_req);
|
|
|
|
+ session->lim_join_req = NULL;
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (wlan_reg_is_6ghz_chan_freq(session->curr_op_freq)) {
|
|
if (wlan_reg_is_6ghz_chan_freq(session->curr_op_freq)) {
|
|
if (!lim_is_session_he_capable(session)) {
|
|
if (!lim_is_session_he_capable(session)) {
|
|
pe_err("JOIN_REQ with invalid 6G security");
|
|
pe_err("JOIN_REQ with invalid 6G security");
|
|
@@ -8842,9 +8886,10 @@ static void lim_process_set_ie_req(struct mac_context *mac_ctx, uint32_t *msg_bu
|
|
struct send_extcap_ie *msg;
|
|
struct send_extcap_ie *msg;
|
|
QDF_STATUS status;
|
|
QDF_STATUS status;
|
|
tDot11fIEExtCap extra_ext_cap = {0};
|
|
tDot11fIEExtCap extra_ext_cap = {0};
|
|
- struct pe_session *pe_session;
|
|
|
|
- uint8_t *add_ie = NULL;
|
|
|
|
- uint16_t add_ie_len, vdev_id;
|
|
|
|
|
|
+ uint16_t vdev_id;
|
|
|
|
+ struct wlan_objmgr_vdev *vdev = NULL;
|
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
|
+ struct s_ext_cap *p_ext_cap;
|
|
|
|
|
|
if (!msg_buf) {
|
|
if (!msg_buf) {
|
|
pe_err("Buffer is Pointing to NULL");
|
|
pe_err("Buffer is Pointing to NULL");
|
|
@@ -8854,41 +8899,35 @@ static void lim_process_set_ie_req(struct mac_context *mac_ctx, uint32_t *msg_bu
|
|
msg = (struct send_extcap_ie *)msg_buf;
|
|
msg = (struct send_extcap_ie *)msg_buf;
|
|
vdev_id = msg->session_id;
|
|
vdev_id = msg->session_id;
|
|
|
|
|
|
- pe_session = pe_find_session_by_vdev_id(mac_ctx, vdev_id);
|
|
|
|
- if (pe_session) {
|
|
|
|
- if (!pe_session->lim_join_req ||
|
|
|
|
- !pe_session->lim_join_req->addIEAssoc.length)
|
|
|
|
- goto send_ie;
|
|
|
|
-
|
|
|
|
- add_ie_len = pe_session->lim_join_req->addIEAssoc.length;
|
|
|
|
- add_ie = qdf_mem_malloc(add_ie_len);
|
|
|
|
- if (!add_ie)
|
|
|
|
- goto send_ie;
|
|
|
|
-
|
|
|
|
- qdf_mem_copy(add_ie,
|
|
|
|
- pe_session->lim_join_req->addIEAssoc.addIEdata,
|
|
|
|
- add_ie_len);
|
|
|
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
|
|
|
|
+ vdev_id,
|
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
|
+ if (!vdev)
|
|
|
|
+ return;
|
|
|
|
|
|
- status = lim_strip_extcap_update_struct(mac_ctx, add_ie,
|
|
|
|
- &add_ie_len,
|
|
|
|
- &extra_ext_cap);
|
|
|
|
- if (QDF_IS_STATUS_SUCCESS(status)) {
|
|
|
|
- struct s_ext_cap *p_ext_cap =
|
|
|
|
- (struct s_ext_cap *)extra_ext_cap.bytes;
|
|
|
|
- if (p_ext_cap->interworking_service)
|
|
|
|
- p_ext_cap->qos_map = 1;
|
|
|
|
-
|
|
|
|
- extra_ext_cap.num_bytes =
|
|
|
|
- lim_compute_ext_cap_ie_length(&extra_ext_cap);
|
|
|
|
- }
|
|
|
|
- qdf_mem_free(add_ie);
|
|
|
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
|
+ if (!mlme_priv) {
|
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (!mlme_priv->connect_info.ext_cap_ie[0])
|
|
|
|
+ goto send_ie;
|
|
|
|
+
|
|
|
|
+ lim_update_extcap_struct(mac_ctx,
|
|
|
|
+ mlme_priv->connect_info.ext_cap_ie,
|
|
|
|
+ &extra_ext_cap);
|
|
|
|
+ p_ext_cap = (struct s_ext_cap *)extra_ext_cap.bytes;
|
|
|
|
+ if (p_ext_cap->interworking_service)
|
|
|
|
+ p_ext_cap->qos_map = 1;
|
|
|
|
+ extra_ext_cap.num_bytes =
|
|
|
|
+ lim_compute_ext_cap_ie_length(&extra_ext_cap);
|
|
send_ie:
|
|
send_ie:
|
|
status = lim_send_ext_cap_ie(mac_ctx, msg->session_id, &extra_ext_cap,
|
|
status = lim_send_ext_cap_ie(mac_ctx, msg->session_id, &extra_ext_cap,
|
|
true);
|
|
true);
|
|
if (QDF_IS_STATUS_ERROR(status))
|
|
if (QDF_IS_STATUS_ERROR(status))
|
|
pe_err("Unable to send ExtCap to FW");
|
|
pe_err("Unable to send ExtCap to FW");
|
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef WLAN_FEATURE_11AX_BSS_COLOR
|
|
#ifdef WLAN_FEATURE_11AX_BSS_COLOR
|