From 57ef9a3da139fb7ef6c6a5d93b1056e117ef2a3f Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Wed, 25 Dec 2019 13:14:40 +0800 Subject: [PATCH] qcacld-3.0: Save client operation class IE SAP's client operation class IE shows the supported band and bandwidth of the peer. Driver will use the information to identify the peer's band capabilities. Save operation class IE to sta_ds peer struct. Change-Id: Idf0b40cdd85b3da07f9db2e8de0ee2a86b307f40 CRs-Fixed: 2592870 --- core/mac/src/include/dot11f.h | 1 + core/mac/src/include/dph_global.h | 3 ++- core/mac/src/include/parser_api.h | 1 + .../src/pe/lim/lim_process_assoc_req_frame.c | 10 +++++++- core/mac/src/pe/lim/lim_utils.c | 3 +++ .../mac/src/sys/legacy/src/utils/src/dot11f.c | 4 +++ .../src/sys/legacy/src/utils/src/parser_api.c | 25 +++++++++++++++++++ 7 files changed, 45 insertions(+), 2 deletions(-) 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));