|
@@ -538,6 +538,41 @@ lim_send_start_vdev_req(struct pe_session *session, tLimMlmStartReq *mlm_start_r
|
|
|
mlm_start_req);
|
|
|
}
|
|
|
|
|
|
+#ifdef WLAN_FEATURE_11BE
|
|
|
+void lim_strip_eht_ies_from_add_ies(struct mac_context *mac_ctx,
|
|
|
+ struct pe_session *session)
|
|
|
+{
|
|
|
+ struct add_ie_params *add_ie = &session->add_ie_params;
|
|
|
+ QDF_STATUS status;
|
|
|
+ uint8_t eht_cap_buff[DOT11F_IE_EHT_CAP_MAX_LEN + 2];
|
|
|
+ uint8_t eht_op_buff[DOT11F_IE_EHT_OP_MAX_LEN + 2];
|
|
|
+
|
|
|
+ qdf_mem_zero(eht_cap_buff, sizeof(eht_cap_buff));
|
|
|
+ qdf_mem_zero(eht_op_buff, sizeof(eht_op_buff));
|
|
|
+
|
|
|
+ status = lim_strip_ie(mac_ctx, add_ie->probeRespBCNData_buff,
|
|
|
+ &add_ie->probeRespBCNDataLen,
|
|
|
+ DOT11F_EID_EHT_CAP, ONE_BYTE,
|
|
|
+ EHT_CAP_OUI_TYPE, (uint8_t)EHT_CAP_OUI_SIZE,
|
|
|
+ eht_cap_buff, DOT11F_IE_EHT_CAP_MAX_LEN);
|
|
|
+ if (status != QDF_STATUS_SUCCESS)
|
|
|
+ pe_debug("Failed to strip EHT cap IE status: %d", status);
|
|
|
+
|
|
|
+ status = lim_strip_ie(mac_ctx, add_ie->probeRespBCNData_buff,
|
|
|
+ &add_ie->probeRespBCNDataLen,
|
|
|
+ DOT11F_EID_EHT_OP, ONE_BYTE,
|
|
|
+ EHT_OP_OUI_TYPE, (uint8_t)EHT_OP_OUI_SIZE,
|
|
|
+ eht_op_buff, DOT11F_IE_EHT_OP_MAX_LEN);
|
|
|
+ if (status != QDF_STATUS_SUCCESS)
|
|
|
+ pe_debug("Failed to strip EHT op IE status: %d", status);
|
|
|
+}
|
|
|
+#else
|
|
|
+void lim_strip_eht_ies_from_add_ies(struct mac_context *mac_ctx,
|
|
|
+ struct pe_session *session)
|
|
|
+{
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
#ifdef WLAN_FEATURE_11AX
|
|
|
void lim_strip_he_ies_from_add_ies(struct mac_context *mac_ctx,
|
|
|
struct pe_session *session)
|
|
@@ -810,6 +845,11 @@ __lim_handle_sme_start_bss_request(struct mac_context *mac_ctx, uint32_t *msg_bu
|
|
|
lim_strip_he_ies_from_add_ies(mac_ctx, session);
|
|
|
}
|
|
|
|
|
|
+ if (IS_DOT11_MODE_EHT(session->dot11mode)) {
|
|
|
+ lim_update_session_eht_capable(mac_ctx, session);
|
|
|
+ lim_copy_bss_eht_cap(session);
|
|
|
+ }
|
|
|
+
|
|
|
session->txLdpcIniFeatureEnabled =
|
|
|
sme_start_bss_req->txLdpcIniFeatureEnabled;
|
|
|
session->limRmfEnabled = sme_start_bss_req->pmfCapable ? 1 : 0;
|
|
@@ -890,6 +930,7 @@ __lim_handle_sme_start_bss_request(struct mac_context *mac_ctx, uint32_t *msg_bu
|
|
|
session->htRecommendedTxWidthSet =
|
|
|
(session->htSecondaryChannelOffset) ? 1 : 0;
|
|
|
if (lim_is_session_he_capable(session) ||
|
|
|
+ lim_is_session_eht_capable(session) ||
|
|
|
session->vhtCapability || session->htCapability) {
|
|
|
chanwidth = sme_start_bss_req->vht_channel_width;
|
|
|
session->ch_width = chanwidth;
|
|
@@ -898,6 +939,7 @@ __lim_handle_sme_start_bss_request(struct mac_context *mac_ctx, uint32_t *msg_bu
|
|
|
session->ch_center_freq_seg1 =
|
|
|
sme_start_bss_req->center_freq_seg1;
|
|
|
lim_update_he_bw_cap_mcs(session, NULL);
|
|
|
+ lim_update_eht_bw_cap_mcs(session, NULL);
|
|
|
}
|
|
|
|
|
|
/* Delete pre-auth list if any */
|
|
@@ -1496,6 +1538,18 @@ lim_update_he_caps_mcs(struct mac_context *mac, struct pe_session *session)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef WLAN_FEATURE_11BE
|
|
|
+static void
|
|
|
+lim_update_eht_caps_mcs(struct mac_context *mac, struct pe_session *session)
|
|
|
+{
|
|
|
+}
|
|
|
+#else
|
|
|
+static void
|
|
|
+lim_update_eht_caps_mcs(struct mac_context *mac, struct pe_session *session)
|
|
|
+{
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static void lim_check_oui_and_update_session(struct mac_context *mac_ctx,
|
|
|
struct pe_session *session,
|
|
|
tDot11fBeaconIEs *ie_struct)
|
|
@@ -1648,6 +1702,7 @@ static void lim_check_oui_and_update_session(struct mac_context *mac_ctx,
|
|
|
|
|
|
lim_handle_iot_ap_no_common_he_rates(mac_ctx, session, ie_struct);
|
|
|
lim_update_he_caps_mcs(mac_ctx, session);
|
|
|
+ lim_update_eht_caps_mcs(mac_ctx, session);
|
|
|
}
|
|
|
|
|
|
static enum mlme_dot11_mode
|
|
@@ -1727,6 +1782,9 @@ lim_get_bss_dot11_mode(struct bss_description *bss_desc,
|
|
|
if (ie_struct->he_cap.present)
|
|
|
bss_dot11_mode = MLME_DOT11_MODE_11AX;
|
|
|
|
|
|
+ if (ie_struct->eht_cap.present)
|
|
|
+ bss_dot11_mode = MLME_DOT11_MODE_11BE;
|
|
|
+
|
|
|
pe_debug("bss HT %d VHT %d HE %d nw_type %d bss dot11_mode %d",
|
|
|
ie_struct->HTCaps.present, ie_struct->VHTCaps.present,
|
|
|
ie_struct->he_cap.present, bss_desc->nwType, bss_dot11_mode);
|
|
@@ -1975,6 +2033,40 @@ lim_handle_11ax_dot11_mode(enum mlme_dot11_mode bss_dot11_mode,
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
+static QDF_STATUS
|
|
|
+lim_handle_11be_dot11_mode(enum mlme_dot11_mode bss_dot11_mode,
|
|
|
+ enum mlme_dot11_mode *intersected_mode)
|
|
|
+{
|
|
|
+ switch (bss_dot11_mode) {
|
|
|
+ case MLME_DOT11_MODE_11N:
|
|
|
+ *intersected_mode = MLME_DOT11_MODE_11N;
|
|
|
+ break;
|
|
|
+ case MLME_DOT11_MODE_11AC:
|
|
|
+ *intersected_mode = MLME_DOT11_MODE_11AC;
|
|
|
+ break;
|
|
|
+ case MLME_DOT11_MODE_11AX:
|
|
|
+ *intersected_mode = MLME_DOT11_MODE_11AX;
|
|
|
+ break;
|
|
|
+ case MLME_DOT11_MODE_11BE:
|
|
|
+ *intersected_mode = MLME_DOT11_MODE_11BE;
|
|
|
+ break;
|
|
|
+ case MLME_DOT11_MODE_11G:
|
|
|
+ *intersected_mode = MLME_DOT11_MODE_11G;
|
|
|
+ break;
|
|
|
+ case MLME_DOT11_MODE_11B:
|
|
|
+ *intersected_mode = MLME_DOT11_MODE_11B;
|
|
|
+ break;
|
|
|
+ case MLME_DOT11_MODE_11A:
|
|
|
+ *intersected_mode = MLME_DOT11_MODE_11A;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ pe_err("Invalid bss dot11mode %d passed", bss_dot11_mode);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
static QDF_STATUS
|
|
|
lim_handle_11g_only_dot11_mode(enum mlme_dot11_mode bss_dot11_mode,
|
|
|
enum mlme_dot11_mode *intersected_mode,
|
|
@@ -2127,6 +2219,36 @@ lim_handle_11ax_only_dot11_mode(enum mlme_dot11_mode bss_dot11_mode,
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
+static QDF_STATUS
|
|
|
+lim_handle_11be_only_dot11_mode(enum mlme_dot11_mode bss_dot11_mode,
|
|
|
+ enum mlme_dot11_mode *intersected_mode)
|
|
|
+{
|
|
|
+ switch (bss_dot11_mode) {
|
|
|
+ case MLME_DOT11_MODE_11BE:
|
|
|
+ *intersected_mode = MLME_DOT11_MODE_11BE;
|
|
|
+ break;
|
|
|
+ case MLME_DOT11_MODE_11N:
|
|
|
+ /* fallthrough */
|
|
|
+ case MLME_DOT11_MODE_11AC:
|
|
|
+ /* fallthrough */
|
|
|
+ case MLME_DOT11_MODE_11AX:
|
|
|
+ /* fallthrough */
|
|
|
+ case MLME_DOT11_MODE_11G:
|
|
|
+ /* fallthrough */
|
|
|
+ case MLME_DOT11_MODE_11B:
|
|
|
+ /* fallthrough */
|
|
|
+ case MLME_DOT11_MODE_11A:
|
|
|
+ pe_err("Self dot11mode 11BE only, bss dot11mode %d not compatible",
|
|
|
+ bss_dot11_mode);
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ default:
|
|
|
+ pe_err("Invalid bss dot11mode %d passed", bss_dot11_mode);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
static QDF_STATUS
|
|
|
lim_get_intersected_dot11_mode_sta_ap(struct mac_context *mac_ctx,
|
|
|
enum mlme_dot11_mode self_dot11_mode,
|
|
@@ -2176,6 +2298,12 @@ lim_get_intersected_dot11_mode_sta_ap(struct mac_context *mac_ctx,
|
|
|
case MLME_DOT11_MODE_11AX_ONLY:
|
|
|
return lim_handle_11ax_only_dot11_mode(bss_dot11_mode,
|
|
|
intersected_mode);
|
|
|
+ case MLME_DOT11_MODE_11BE:
|
|
|
+ return lim_handle_11be_dot11_mode(bss_dot11_mode,
|
|
|
+ intersected_mode);
|
|
|
+ case MLME_DOT11_MODE_11BE_ONLY:
|
|
|
+ return lim_handle_11be_only_dot11_mode(bss_dot11_mode,
|
|
|
+ intersected_mode);
|
|
|
default:
|
|
|
pe_err("Invalid self dot11mode %d not supported",
|
|
|
self_dot11_mode);
|
|
@@ -2705,6 +2833,11 @@ lim_fill_pe_session(struct mac_context *mac_ctx, struct pe_session *session,
|
|
|
lim_copy_join_req_he_cap(session);
|
|
|
}
|
|
|
|
|
|
+ if (IS_DOT11_MODE_EHT(session->dot11mode)) {
|
|
|
+ lim_update_session_eht_capable(mac_ctx, session);
|
|
|
+ lim_copy_join_req_eht_cap(session);
|
|
|
+ }
|
|
|
+
|
|
|
/* Record if management frames need to be protected */
|
|
|
session->limRmfEnabled =
|
|
|
lim_get_vdev_rmf_capable(mac_ctx, session);
|