diff --git a/core/mac/src/include/dot11f.h b/core/mac/src/include/dot11f.h index 89436fbf02e3..6e4f077323e2 100644 --- a/core/mac/src/include/dot11f.h +++ b/core/mac/src/include/dot11f.h @@ -10574,6 +10574,7 @@ typedef struct sDot11fReAssocRequest{ tDot11fIEFTInfo FTInfo; uint16_t num_RICDataDesc; tDot11fIERICDataDesc RICDataDesc[2]; + tDot11fIESuppOperatingClasses SuppOperatingClasses; tDot11fIEWPAOpaque WPAOpaque; tDot11fIEHTCaps HTCaps; tDot11fIEWMMCaps WMMCaps; diff --git a/core/mac/src/include/dph_global.h b/core/mac/src/include/dph_global.h index 406384268dcc..43df2d5d4475 100644 --- a/core/mac/src/include/dph_global.h +++ b/core/mac/src/include/dph_global.h @@ -184,7 +184,8 @@ typedef struct sDphHashNode { #ifdef WLAN_FEATURE_11AX tDot11fIEhe_cap he_config; #endif - + /* Peer operation class, extracted from ASSOC request frame*/ + tDot11fIESuppOperatingClasses supp_operating_classes; /* * When a station with already an existing dph entry tries to * associate again, the old dph entry will be zeroed out except diff --git a/core/mac/src/include/parser_api.h b/core/mac/src/include/parser_api.h index 8fc74b31861e..f2cbf39a37b1 100644 --- a/core/mac/src/include/parser_api.h +++ b/core/mac/src/include/parser_api.h @@ -329,6 +329,7 @@ typedef struct sSirAssocReq { tSirMacSupportedChannelIE supportedChannels; tDot11fIEHTCaps HTCaps; tDot11fIEWMMInfoStation WMMInfoStation; + tDot11fIESuppOperatingClasses supp_operating_classes; /* / This is set if the frame is a reassoc request: */ uint8_t reassocRequest; uint8_t ssidPresent; diff --git a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c index 8dbb38e7e7a6..7882d1d64e1e 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c +++ b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c @@ -1424,6 +1424,14 @@ static bool lim_chk_wmm(struct mac_context *mac_ctx, tpSirMacMgmtHdr hdr, return true; } +static void lim_update_sta_ds_op_classes(tpSirAssocReq assoc_req, + tpDphHashNode sta_ds) +{ + qdf_mem_copy(&sta_ds->supp_operating_classes, + &assoc_req->supp_operating_classes, + sizeof(tDot11fIESuppOperatingClasses)); +} + /** * lim_update_sta_ds() - updates ds dph entry * @mac_ctx: pointer to Global MAC structure @@ -1705,7 +1713,7 @@ static bool lim_update_sta_ds(struct mac_context *mac_ctx, tpSirMacMgmtHdr hdr, == MCSMAPMASK2x2) ? 1 : 2; } lim_update_stads_he_6ghz_op(session, sta_ds); - + lim_update_sta_ds_op_classes(assoc_req, sta_ds); /* Add STA context at MAC HW (BMU, RHP & TFP) */ sta_ds->qosMode = false; sta_ds->lleEnabled = false; diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index fc7aed9d91fa..e4afeffd765d 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -6035,6 +6035,9 @@ QDF_STATUS lim_strip_supp_op_class_update_struct(struct mac_context *mac_ctx, pe_err("dot11f_unpack Parse Error"); return QDF_STATUS_E_FAILURE; } + if (dst->num_classes) + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, + &dst->classes[0], dst->num_classes); return QDF_STATUS_SUCCESS; } diff --git a/core/mac/src/sys/legacy/src/utils/src/dot11f.c b/core/mac/src/sys/legacy/src/utils/src/dot11f.c index 85ee388c78f1..3c36c517402d 100644 --- a/core/mac/src/sys/legacy/src/utils/src/dot11f.c +++ b/core/mac/src/sys/legacy/src/utils/src/dot11f.c @@ -11603,6 +11603,10 @@ static const tIEDefn IES_ReAssocRequest[] = { offsetof(tDot11fReAssocRequest, num_RICDataDesc), "RICDataDesc", 2, 2, 550, SigIeRICDataDesc, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RICDATADESC, 0, 0, }, + { offsetof(tDot11fReAssocRequest, SuppOperatingClasses), + offsetof(tDot11fIESuppOperatingClasses, present), 0, + "SuppOperatingClasses", 0, 3, 34, SigIeSuppOperatingClasses, + {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPOPERATINGCLASSES, 0, 0, }, { offsetof(tDot11fReAssocRequest, WPAOpaque), offsetof(tDot11fIEWPAOpaque, present), 0, "WPAOpaque", 0, 8, 255, SigIeWPAOpaque, {0, 80, 242, 1, 0}, diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c index 1e9d8bc7e8e8..04bd8426af92 100644 --- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c +++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c @@ -2762,6 +2762,19 @@ sir_convert_assoc_req_frame2_struct(struct mac_context *mac, ext_cap->timing_meas, ext_cap->fine_time_meas_initiator, ext_cap->fine_time_meas_responder); } + if (ar->SuppOperatingClasses.present) { + uint8_t num_classes = ar->SuppOperatingClasses.num_classes; + + if (num_classes > sizeof(ar->SuppOperatingClasses.classes)) + num_classes = + sizeof(ar->SuppOperatingClasses.classes); + qdf_mem_copy(&pAssocReq->supp_operating_classes, + &ar->SuppOperatingClasses, + sizeof(tDot11fIESuppOperatingClasses)); + QDF_TRACE_HEX_DUMP( + QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, + ar->SuppOperatingClasses.classes, num_classes); + } pAssocReq->vendor_vht_ie.present = ar->vendor_vht_ie.present; if (ar->vendor_vht_ie.present) { @@ -3413,7 +3426,19 @@ sir_convert_reassoc_req_frame2_struct(struct mac_context *mac, convert_wfd_opaque(mac, &pAssocReq->addIE, &ar->WFDIEOpaque); } #endif + if (ar->SuppOperatingClasses.present) { + uint8_t num_classes = ar->SuppOperatingClasses.num_classes; + if (num_classes > sizeof(ar->SuppOperatingClasses.classes)) + num_classes = + sizeof(ar->SuppOperatingClasses.classes); + qdf_mem_copy(&pAssocReq->supp_operating_classes, + &ar->SuppOperatingClasses, + sizeof(tDot11fIESuppOperatingClasses)); + QDF_TRACE_HEX_DUMP( + QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, + ar->SuppOperatingClasses.classes, num_classes); + } if (ar->VHTCaps.present) { qdf_mem_copy(&pAssocReq->VHTCaps, &ar->VHTCaps, sizeof(tDot11fIEVHTCaps));