diff options
| -rw-r--r-- | core/mac/src/pe/sch/sch_message.c | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/core/mac/src/pe/sch/sch_message.c b/core/mac/src/pe/sch/sch_message.c index ff363a07254e..020821169399 100644 --- a/core/mac/src/pe/sch/sch_message.c +++ b/core/mac/src/pe/sch/sch_message.c @@ -189,7 +189,6 @@ void sch_process_message(tpAniSirGlobal pMac, tpSirMsgQ pSchMsg) case WNI_CFG_EDCA_WME_ACVI: case WNI_CFG_EDCA_WME_ACVO: if (LIM_IS_AP_ROLE(psessionEntry)) { - psessionEntry->gLimEdcaParamSetCount++; sch_qos_update_broadcast(pMac, psessionEntry); } break; @@ -298,9 +297,9 @@ sch_get_params(tpAniSirGlobal pMac, * @mac_ctx: mac global context * @session: pesession entry * - * Return: void + * Return: true if wmm param updated, false if wmm param not updated */ -static void +static bool broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx, tpPESession session) { @@ -327,7 +326,13 @@ broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx, } if (concurrent_session == NULL) - return; + return false; + + if (!qdf_mem_cmp(session->gLimEdcaParamsBC, + concurrent_session->gLimEdcaParams, + sizeof(concurrent_session->gLimEdcaParams))) + return false; + /* * Once atleast one concurrent session on same channel is found and WMM * broadcast params for current SoftAP/GO session updated, return @@ -351,6 +356,7 @@ broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx, session->gLimEdcaParamsBC[j].cw.max, session->gLimEdcaParamsBC[j].txoplimit);) } + return true; } void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry) @@ -359,6 +365,7 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry) uint32_t cwminidx, cwmaxidx, txopidx; uint32_t phyMode; uint8_t i; + bool updated = false; if (sch_get_params(pMac, params, false) != eSIR_SUCCESS) { PELOGE(sch_log(pMac, LOGE, FL("QosUpdateBroadcast: failed"));) @@ -384,16 +391,36 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry) } for (i = 0; i < MAX_NUM_AC; i++) { - psessionEntry->gLimEdcaParamsBC[i].aci.acm = + if (psessionEntry->gLimEdcaParamsBC[i].aci.acm != + (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX]) { + psessionEntry->gLimEdcaParamsBC[i].aci.acm = (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX]; - psessionEntry->gLimEdcaParamsBC[i].aci.aifsn = + updated = true; + } + if (psessionEntry->gLimEdcaParamsBC[i].aci.aifsn != + (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX]) { + psessionEntry->gLimEdcaParamsBC[i].aci.aifsn = (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX]; - psessionEntry->gLimEdcaParamsBC[i].cw.min = + updated = true; + } + if (psessionEntry->gLimEdcaParamsBC[i].cw.min != + convert_cw(GET_CW(¶ms[i][cwminidx]))) { + psessionEntry->gLimEdcaParamsBC[i].cw.min = convert_cw(GET_CW(¶ms[i][cwminidx])); - psessionEntry->gLimEdcaParamsBC[i].cw.max = + updated = true; + } + if (psessionEntry->gLimEdcaParamsBC[i].cw.max != + convert_cw(GET_CW(¶ms[i][cwmaxidx]))) { + psessionEntry->gLimEdcaParamsBC[i].cw.max = convert_cw(GET_CW(¶ms[i][cwmaxidx])); - psessionEntry->gLimEdcaParamsBC[i].txoplimit = + updated = true; + } + if (psessionEntry->gLimEdcaParamsBC[i].txoplimit != + (uint16_t) params[i][txopidx]) { + psessionEntry->gLimEdcaParamsBC[i].txoplimit = (uint16_t) params[i][txopidx]; + updated = true; + } PELOG1(sch_log (pMac, LOG1, @@ -408,7 +435,10 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry) } /* If there exists a concurrent STA-AP session, use its WMM params to broadcast in beacons. WFA Wifi Direct test plan 6.1.14 requirement */ - broadcast_wmm_of_concurrent_sta_session(pMac, psessionEntry); + if (broadcast_wmm_of_concurrent_sta_session(pMac, psessionEntry)) + updated = true; + if (updated) + psessionEntry->gLimEdcaParamSetCount++; if (sch_set_fixed_beacon_fields(pMac, psessionEntry) != eSIR_SUCCESS) PELOGE(sch_log(pMac, LOGE, "Unable to set beacon fields!");) @@ -567,7 +597,6 @@ void sch_edca_profile_update(tpAniSirGlobal pMac, tpPESession psessionEntry) if (LIM_IS_AP_ROLE(psessionEntry) || LIM_IS_IBSS_ROLE(psessionEntry)) { sch_qos_update_local(pMac, psessionEntry); - psessionEntry->gLimEdcaParamSetCount++; sch_qos_update_broadcast(pMac, psessionEntry); } } |
