1 /*
2 * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "app_network_speed_limit_service.h"
17 #include "wifi_logger.h"
18 #include "wifi_app_parser.h"
19 #include "wifi_config_center.h"
20 #include "wifi_sta_hal_interface.h"
21 #include "app_mgr_client.h"
22 #include "speed_limit_configs_writer.h"
23 #include "wifi_app_state_aware.h"
24 #include "wifi_global_func.h"
25
26 namespace OHOS {
27 namespace Wifi {
28
29 DEFINE_WIFILOG_LABEL("AppNetworkSpeedLimitService");
30 const std::string APP_NETWORK_SPEED_LIMIT_CLASS_NAME = "AppNetworkSpeedLimitService";
31
32 namespace {
33 const int ON = 1;
34 const int OFF = 0;
35 const std::string ASYNC_WORK_NAME = "SendLimitInfo";
36 const std::string HANDLE_WIFI_CONNECT_CHANGED = "HandleWifiConnectStateChanged";
37 const std::string HANDLE_FOREGROUND_APP_CHANGED = "HandleForegroundAppChangedAction";
38 const std::string LIMIT_SPEED = "LimitSpeed";
39 const std::string RECEIVE_NETWORK_CONTROL = "ReceiveNetworkControlInfo";
40 const int GAME_BOOST_ENABLE = 1;
41 const int GAME_BOOST_DISABLE = 0;
42 const int BOOST_UDP_TYPE = 17;
43 }
44
AppNetworkSpeedLimitService()45 AppNetworkSpeedLimitService::AppNetworkSpeedLimitService()
46 {
47 Init();
48 }
49
~AppNetworkSpeedLimitService()50 AppNetworkSpeedLimitService::~AppNetworkSpeedLimitService() {}
51
52
GetInstance()53 AppNetworkSpeedLimitService &AppNetworkSpeedLimitService::GetInstance()
54 {
55 static AppNetworkSpeedLimitService instance;
56 return instance;
57 }
58
GetStaCallback() const59 StaServiceCallback AppNetworkSpeedLimitService::GetStaCallback() const
60 {
61 return m_staCallback;
62 }
63
Init()64 void AppNetworkSpeedLimitService::Init()
65 {
66 m_staCallback.callbackModuleName = APP_NETWORK_SPEED_LIMIT_CLASS_NAME;
67 m_staCallback.OnStaConnChanged = [this](OperateResState state, const WifiLinkedInfo &info, int instId) {
68 this->DealStaConnChanged(state, info, instId);
69 };
70 InitWifiLimitRecord();
71 InitCellarLimitRecord();
72 std::string delayTime = AppParser::GetInstance().GetAsyncLimitSpeedDelayTime();
73 m_delayTime = CheckDataTolonglong(delayTime);
74 m_asyncSendLimit = std::make_unique<WifiEventHandler>("StartSendLimitInfoThread");
75 if (IsTopNLimitSpeedSceneInNow()) {
76 WIFI_LOGI("%{public}s the current foreground application is TopN.", __FUNCTION__);
77 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_KEY_FG_APP, BG_LIMIT_LEVEL_3, m_isHighPriorityTransmit);
78 }
79 WIFI_LOGD("AppNetworkSpeedLimitService initialization complete.");
80 }
81
InitWifiLimitRecord()82 void AppNetworkSpeedLimitService::InitWifiLimitRecord()
83 {
84 m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_GAME] = BG_LIMIT_OFF;
85 m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_STREAM] = BG_LIMIT_OFF;
86 m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_TEMP] = BG_LIMIT_OFF;
87 m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_KEY_FG_APP] = BG_LIMIT_OFF;
88 }
89
InitCellarLimitRecord()90 void AppNetworkSpeedLimitService::InitCellarLimitRecord()
91 {
92 m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_MODULE_FOREGROUND_OPT] = BG_LIMIT_OFF;
93 }
94
DealStaConnChanged(OperateResState state,const WifiLinkedInfo & info,int instId)95 void AppNetworkSpeedLimitService::DealStaConnChanged(OperateResState state, const WifiLinkedInfo &info, int instId)
96 {
97 if (state == OperateResState::DISCONNECT_DISCONNECTED) {
98 HandleWifiConnectStateChanged(false);
99 } else if (state == OperateResState::CONNECT_AP_CONNECTED) {
100 HandleWifiConnectStateChanged(true);
101 }
102 }
103
HandleWifiConnectStateChanged(const bool isWifiConnected)104 void AppNetworkSpeedLimitService::HandleWifiConnectStateChanged(const bool isWifiConnected)
105 {
106 WIFI_LOGI("%{public}s, isWifiConnected=%{public}d", __FUNCTION__, isWifiConnected);
107 m_isWifiConnected = isWifiConnected;
108 AsyncParamInfo asyncParamInfo;
109 asyncParamInfo.funcName = __FUNCTION__;
110 AsyncLimitSpeed(asyncParamInfo);
111 }
112
HandleForegroundAppChangedAction(const AppExecFwk::AppStateData & appStateData)113 void AppNetworkSpeedLimitService::HandleForegroundAppChangedAction(const AppExecFwk::AppStateData &appStateData)
114 {
115 if (appStateData.state == static_cast<int>(AppExecFwk::AppProcessState::APP_STATE_FOREGROUND) &&
116 appStateData.isFocused) {
117 AsyncParamInfo asyncParamInfo;
118 asyncParamInfo.funcName = __FUNCTION__;
119 asyncParamInfo.bundleName = appStateData.bundleName;
120 AsyncLimitSpeed(asyncParamInfo);
121 }
122 }
123
LimitSpeed(const int controlId,const int limitMode)124 void AppNetworkSpeedLimitService::LimitSpeed(const int controlId, const int limitMode)
125 {
126 WIFI_LOGI("%{public}s enter, controlId=%{public}d, limitMode=%{public}d", __FUNCTION__, controlId, limitMode);
127 AsyncParamInfo asyncParamInfo;
128 asyncParamInfo.funcName = __FUNCTION__;
129 asyncParamInfo.controlId = controlId;
130 asyncParamInfo.limitMode = limitMode;
131 AsyncLimitSpeed(asyncParamInfo);
132 }
133
GetBgLimitMaxMode()134 int AppNetworkSpeedLimitService::GetBgLimitMaxMode()
135 {
136 if (m_bgLimitRecordMap.empty()) {
137 WIFI_LOGE("m_bgLimitRecordMap is empty.\n");
138 return -1;
139 }
140 int maxMode = 0;
141 std::map<int, int>::iterator iter;
142 for (iter = m_bgLimitRecordMap.begin(); iter != m_bgLimitRecordMap.end(); ++iter) {
143 if (!CheckNetWorkCanBeLimited(iter->first)) {
144 continue;
145 }
146 if (iter->second > maxMode) {
147 maxMode = iter->second;
148 }
149 }
150 return maxMode;
151 }
152
GetAppList(std::vector<AppExecFwk::RunningProcessInfo> & appList,bool getFgAppFlag)153 ErrCode AppNetworkSpeedLimitService::GetAppList(std::vector<AppExecFwk::RunningProcessInfo> &appList, bool getFgAppFlag)
154 {
155 std::vector<AppExecFwk::RunningProcessInfo> infos;
156 if (WifiAppStateAware::GetInstance().GetProcessRunningInfos(infos) != WIFI_OPT_SUCCESS) {
157 WIFI_LOGE("GetProcessRunningInfosByUserId failed.");
158 return WIFI_OPT_FAILED;
159 }
160 if (getFgAppFlag) {
161 for (auto iter = infos.begin(); iter != infos.end(); ++iter) {
162 if (iter->state_ == AppExecFwk::AppProcessState::APP_STATE_FOREGROUND &&
163 iter->isFocused) {
164 appList.push_back(*iter);
165 }
166 }
167 } else {
168 for (auto iter = infos.begin(); iter != infos.end(); ++iter) {
169 if (iter->state_ == AppExecFwk::AppProcessState::APP_STATE_BACKGROUND) {
170 appList.push_back(*iter);
171 }
172 }
173 }
174
175 return WIFI_OPT_SUCCESS;
176 }
177
CheckNetWorkCanBeLimited(const int controlId)178 bool AppNetworkSpeedLimitService::CheckNetWorkCanBeLimited(const int controlId)
179 {
180 switch (controlId) {
181 case BgLimitControl::BG_LIMIT_CONTROL_ID_GAME:
182 return true;
183 case BgLimitControl::BG_LIMIT_CONTROL_ID_STREAM:
184 return true;
185 case BgLimitControl::BG_LIMIT_CONTROL_ID_TEMP:
186 return m_isWifiConnected;
187 case BgLimitControl::BG_LIMIT_CONTROL_ID_KEY_FG_APP:
188 return true;
189 case BgLimitControl::BG_LIMIT_CONTROL_ID_MODULE_FOREGROUND_OPT:
190 return true;
191 case BgLimitControl::BG_LIMIT_CONTROL_ID_VIDEO_CALL:
192 return true;
193 default:
194 break;
195 }
196 return false;
197 }
198
UpdateSpeedLimitConfigs(const int enable)199 void AppNetworkSpeedLimitService::UpdateSpeedLimitConfigs(const int enable)
200 {
201 m_bgUidSet.clear();
202 m_bgPidSet.clear();
203 m_fgUidSet.clear();
204 if (m_limitSpeedMode == BgLimitLevel::BG_LIMIT_OFF) {
205 m_bgUidSet.insert(UNKNOWN_UID);
206 m_bgPidSet.insert(UNKNOWN_UID);
207 m_fgUidSet.insert(UNKNOWN_UID);
208 return;
209 }
210 std::vector<AppExecFwk::RunningProcessInfo> bgAppList;
211 if (GetAppList(bgAppList, false) < 0) {
212 WIFI_LOGE("Get background app list fail.");
213 }
214 for (auto &record : m_bgLimitRecordMap) {
215 if (!CheckNetWorkCanBeLimited(record.first) || record.second == BG_LIMIT_OFF) {
216 continue;
217 }
218 for (auto iter = bgAppList.begin(); iter != bgAppList.end(); ++iter) {
219 if (IsLimitSpeedBgApp(record.first, iter->processName_, enable)) {
220 m_bgUidSet.insert(iter->uid_);
221 m_bgPidSet.insert(iter->pid_);
222 }
223 }
224 }
225 std::vector<AppExecFwk::RunningProcessInfo> fgAppList;
226 if (GetAppList(fgAppList, true) < 0) {
227 WIFI_LOGE("Get foreground app list fail.");
228 }
229 for (auto iter = fgAppList.begin(); iter != fgAppList.end(); ++iter) {
230 m_fgUidSet.insert(iter->uid_);
231 }
232
233 FilterLimitSpeedConfigs();
234 }
235
IsLimitSpeedBgApp(const int controlId,const std::string & bundleName,const int enable)236 bool AppNetworkSpeedLimitService::IsLimitSpeedBgApp(const int controlId, const std::string &bundleName,
237 const int enable)
238 {
239 switch (controlId) {
240 case BgLimitControl::BG_LIMIT_CONTROL_ID_GAME:
241 if (enable == GAME_BOOST_ENABLE) {
242 return AppParser::GetInstance().IsLiveStreamApp(bundleName) ? false : true;
243 } else {
244 return AppParser::GetInstance().IsGameBackgroundLimitApp(bundleName);
245 }
246 case BgLimitControl::BG_LIMIT_CONTROL_ID_STREAM:
247 case BgLimitControl::BG_LIMIT_CONTROL_ID_TEMP:
248 return AppParser::GetInstance().IsHighTempLimitSpeedApp(bundleName);
249 case BgLimitControl::BG_LIMIT_CONTROL_ID_KEY_FG_APP:
250 return AppParser::GetInstance().IsKeyBackgroundLimitApp(bundleName);
251 case BgLimitControl::BG_LIMIT_CONTROL_ID_MODULE_FOREGROUND_OPT:
252 return true;
253 default:
254 break;
255 }
256 WIFI_LOGI("%{public}s invalid controlId", __FUNCTION__);
257 return false;
258 }
259
AsyncLimitSpeed(const AsyncParamInfo & asyncParamInfo)260 void AppNetworkSpeedLimitService::AsyncLimitSpeed(const AsyncParamInfo &asyncParamInfo)
261 {
262 m_asyncSendLimit->PostAsyncTask([asyncParamInfo, this]() {
263 this->HandleRequest(asyncParamInfo);
264 });
265 }
266
HandleRequest(const AsyncParamInfo & asyncParamInfo)267 void AppNetworkSpeedLimitService::HandleRequest(const AsyncParamInfo &asyncParamInfo)
268 {
269 if (asyncParamInfo.funcName == HANDLE_WIFI_CONNECT_CHANGED) {
270 WifiConnectStateChanged();
271 } else if (asyncParamInfo.funcName == HANDLE_FOREGROUND_APP_CHANGED) {
272 ForegroundAppChangedAction(asyncParamInfo.bundleName);
273 } else if (asyncParamInfo.funcName == LIMIT_SPEED) {
274 SendLimitCmd2Drv(asyncParamInfo.controlId, asyncParamInfo.limitMode, m_isHighPriorityTransmit);
275 } else if (asyncParamInfo.funcName == RECEIVE_NETWORK_CONTROL) {
276 if (asyncParamInfo.networkControlInfo.sceneId == BG_LIMIT_CONTROL_ID_GAME) {
277 GameNetworkSpeedLimitConfigs(asyncParamInfo.networkControlInfo);
278 WifiConfigCenter::GetInstance().SetNetworkControlInfo(asyncParamInfo.networkControlInfo);
279 } else if (asyncParamInfo.networkControlInfo.sceneId == BG_LIMIT_CONTROL_ID_VIDEO_CALL) {
280 VideoCallNetworkSpeedLimitConfigs(asyncParamInfo.networkControlInfo);
281 } else {
282 UpdateNoSpeedLimitConfigs(asyncParamInfo.networkControlInfo);
283 }
284 }
285 }
286
SendLimitCmd2Drv(const int controlId,const int limitMode,const int enable,const int uid)287 void AppNetworkSpeedLimitService::SendLimitCmd2Drv(const int controlId, const int limitMode, const int enable,
288 const int uid)
289 {
290 WIFI_LOGD("enter SendLimitCmd2Drv");
291 m_bgLimitRecordMap[controlId] = limitMode;
292 m_limitSpeedMode = GetBgLimitMaxMode();
293 int64_t delayTime = 0;
294 // Downshifting without delay, upshifting with delay.
295 if (m_limitSpeedMode >= m_lastLimitSpeedMode) {
296 delayTime = m_delayTime;
297 }
298 WIFI_LOGD("Current maximum speed limit m_limitSpeedMode: %{public}d.", m_limitSpeedMode);
299 m_asyncSendLimit->RemoveAsyncTask(ASYNC_WORK_NAME);
300 m_asyncSendLimit->PostAsyncTask([uid, enable, this]() {
301 this->UpdateSpeedLimitConfigs(enable);
302 this->HighPriorityTransmit(uid, BOOST_UDP_TYPE, enable);
303 this->SendLimitInfo();
304 }, ASYNC_WORK_NAME, delayTime);
305 }
306
SendLimitInfo()307 void AppNetworkSpeedLimitService::SendLimitInfo()
308 {
309 if (m_limitSpeedMode != m_lastLimitSpeedMode) {
310 int ret = SetBgLimitMode(m_limitSpeedMode);
311 if (ret < 0) {
312 WIFI_LOGE("SetBgLimitMode failed, ret = %{public}d.", ret);
313 return;
314 }
315 m_lastLimitSpeedMode = m_limitSpeedMode;
316 }
317
318 if (m_lastBgUidSet != m_bgUidSet) {
319 if (m_bgUidSet.empty()) {
320 m_bgUidSet.insert(UNKNOWN_UID);
321 }
322 SetBgLimitIdList(std::vector<int>(m_bgUidSet.begin(), m_bgUidSet.end()), SET_BG_UID);
323 m_lastBgUidSet = m_bgUidSet;
324 }
325
326 if (m_lastBgPidSet != m_bgPidSet) {
327 if (m_bgPidSet.empty()) {
328 m_bgPidSet.insert(UNKNOWN_UID);
329 }
330 SetBgLimitIdList(std::vector<int>(m_bgPidSet.begin(), m_bgPidSet.end()), SET_BG_PID);
331 m_lastBgPidSet = m_bgPidSet;
332 }
333
334 if (m_lastFgUidSet != m_fgUidSet) {
335 if (m_fgUidSet.empty()) {
336 m_fgUidSet.insert(UNKNOWN_UID);
337 }
338 SetBgLimitIdList(std::vector<int>(m_fgUidSet.begin(), m_fgUidSet.end()), SET_FG_UID);
339 m_lastFgUidSet = m_fgUidSet;
340 }
341
342 LogSpeedLimitConfigs();
343 }
344
LogSpeedLimitConfigs()345 void AppNetworkSpeedLimitService::LogSpeedLimitConfigs()
346 {
347 std::string recordsStr;
348 for (auto &record : m_bgLimitRecordMap) {
349 recordsStr += std::to_string(record.first);
350 recordsStr += ":";
351 recordsStr += std::to_string(record.second);
352 recordsStr += ",";
353 }
354 WIFI_LOGI("%{public}s speed limit records= %{public}s, limitMode: %{public}d, m_wifiConnected: %{public}d",
355 __FUNCTION__, recordsStr.c_str(), m_lastLimitSpeedMode, m_isWifiConnected.load());
356 WIFI_LOGI("%{public}s bgUidSet: %{public}s; bgPidSet: %{public}s; fgUidSet: %{public}s", __FUNCTION__,
357 JoinVecToString(std::vector<int>(m_lastBgUidSet.begin(), m_lastBgUidSet.end()), ",").c_str(),
358 JoinVecToString(std::vector<int>(m_lastBgPidSet.begin(), m_lastBgPidSet.end()), ",").c_str(),
359 JoinVecToString(std::vector<int>(m_lastFgUidSet.begin(), m_lastFgUidSet.end()), ",").c_str());
360 }
361
ReceiveNetworkControlInfo(const WifiNetworkControlInfo & networkControlInfo)362 void AppNetworkSpeedLimitService::ReceiveNetworkControlInfo(const WifiNetworkControlInfo &networkControlInfo)
363 {
364 AsyncParamInfo asyncParamInfo;
365 asyncParamInfo.funcName = __FUNCTION__;
366 asyncParamInfo.networkControlInfo = networkControlInfo;
367 AsyncLimitSpeed(asyncParamInfo);
368 }
369
UpdateNoSpeedLimitConfigs(const WifiNetworkControlInfo & networkControlInfo)370 void AppNetworkSpeedLimitService::UpdateNoSpeedLimitConfigs(const WifiNetworkControlInfo &networkControlInfo)
371 {
372 if (networkControlInfo.state == ON) {
373 if (networkControlInfo.sceneId == BG_LIMIT_CONTROL_ID_AUDIO_PLAYBACK) {
374 WIFI_LOGI("%{public}s No limit speed uid: %{public}d, pid: %{public}d.", __FUNCTION__,
375 networkControlInfo.uid, networkControlInfo.pid);
376 m_bgAudioPlaybackUidSet.insert(networkControlInfo.uid);
377 m_bgAudioPlaybackPidSet.insert(networkControlInfo.pid);
378 } else if (networkControlInfo.sceneId == BG_LIMIT_CONTROL_ID_WINDOW_VISIBLE) {
379 WIFI_LOGI("%{public}s No limit speed uid: %{public}d, pid: %{public}d.", __FUNCTION__,
380 networkControlInfo.uid, networkControlInfo.pid);
381 m_additionalWindowUidSet.insert(networkControlInfo.uid);
382 m_additionalWindowPidSet.insert(networkControlInfo.pid);
383 }
384 } else if (networkControlInfo.state == OFF) {
385 if (networkControlInfo.sceneId == BG_LIMIT_CONTROL_ID_AUDIO_PLAYBACK) {
386 WIFI_LOGI("%{public}s remove no limit speed uid: %{public}d, pid: %{public}d.", __FUNCTION__,
387 networkControlInfo.uid, networkControlInfo.pid);
388 m_bgAudioPlaybackUidSet.erase(networkControlInfo.uid);
389 m_bgAudioPlaybackPidSet.erase(networkControlInfo.pid);
390 } else if (networkControlInfo.sceneId == BG_LIMIT_CONTROL_ID_WINDOW_VISIBLE) {
391 WIFI_LOGI("%{public}s remove no limit speed uid: %{public}d, pid: %{public}d.", __FUNCTION__,
392 networkControlInfo.uid, networkControlInfo.pid);
393 m_additionalWindowUidSet.erase(networkControlInfo.uid);
394 m_additionalWindowPidSet.erase(networkControlInfo.pid);
395 }
396 }
397 // update speed limit info
398 if (m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_KEY_FG_APP] != BG_LIMIT_OFF ||
399 m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_GAME] != BG_LIMIT_OFF ||
400 m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_TEMP] != BG_LIMIT_OFF) {
401 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_KEY_FG_APP, m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_KEY_FG_APP],
402 m_isHighPriorityTransmit);
403 }
404 }
405
FilterLimitSpeedConfigs()406 void AppNetworkSpeedLimitService::FilterLimitSpeedConfigs()
407 {
408 for (const auto& windwoUid : m_additionalWindowUidSet) {
409 m_bgUidSet.erase(windwoUid);
410 m_fgUidSet.insert(windwoUid);
411 }
412 for (const auto& windwoPid : m_additionalWindowPidSet) {
413 m_bgPidSet.erase(windwoPid);
414 }
415 for (const auto& audioUid : m_bgAudioPlaybackUidSet) {
416 m_bgUidSet.erase(audioUid);
417 }
418 for (const auto& audioPid : m_bgAudioPlaybackPidSet) {
419 m_bgPidSet.erase(audioPid);
420 }
421 }
422
WifiConnectStateChanged()423 void AppNetworkSpeedLimitService::WifiConnectStateChanged()
424 {
425 if (m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_TEMP] != BG_LIMIT_OFF) {
426 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_TEMP, m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_TEMP],
427 m_isHighPriorityTransmit);
428 }
429 }
430
IsTopNLimitSpeedSceneInNow()431 bool AppNetworkSpeedLimitService::IsTopNLimitSpeedSceneInNow()
432 {
433 std::vector<AppExecFwk::RunningProcessInfo> fgAppList;
434 if (GetAppList(fgAppList, true) < 0) {
435 WIFI_LOGE("Get foreground app list fail.");
436 return false;
437 }
438
439 for (auto& foregroundApp : fgAppList) {
440 if (AppParser::GetInstance().IsKeyForegroundApp(foregroundApp.processName_)) {
441 WIFI_LOGD("Current TopN scenario.");
442 return true;
443 }
444 }
445 return false;
446 }
447
ForegroundAppChangedAction(const std::string & bundleName)448 void AppNetworkSpeedLimitService::ForegroundAppChangedAction(const std::string &bundleName)
449 {
450 if (m_isWifiConnected && m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_TEMP] != BG_LIMIT_OFF) {
451 WIFI_LOGI("%{public}s high temp speed limit is running, update background app list", __FUNCTION__);
452 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_TEMP, m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_TEMP],
453 m_isHighPriorityTransmit);
454 }
455 // don't distinguishing between WiFi and cellular links
456 if (AppParser::GetInstance().IsKeyForegroundApp(bundleName)) {
457 WIFI_LOGI("%{public}s top app speed limit is running, update background app list", __FUNCTION__);
458 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_KEY_FG_APP, BG_LIMIT_LEVEL_3, m_isHighPriorityTransmit);
459 } else if (m_bgLimitRecordMap[BG_LIMIT_CONTROL_ID_KEY_FG_APP] != BG_LIMIT_OFF) {
460 WIFI_LOGI("%{public}s top app speed limit is turnning off, update background app list", __FUNCTION__);
461 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_KEY_FG_APP, BG_LIMIT_OFF, m_isHighPriorityTransmit);
462 }
463 }
464
GameNetworkSpeedLimitConfigs(const WifiNetworkControlInfo & networkControlInfo)465 void AppNetworkSpeedLimitService::GameNetworkSpeedLimitConfigs(const WifiNetworkControlInfo &networkControlInfo)
466 {
467 WIFI_LOGI("%{public}s enter game limit configs, game state is %{public}d", __FUNCTION__, networkControlInfo.state);
468 switch (networkControlInfo.state) {
469 case GameSceneId::MSG_GAME_STATE_START:
470 case GameSceneId::MSG_GAME_STATE_FOREGROUND:
471 if (AppParser::GetInstance().IsOverGameRtt(networkControlInfo.bundleName, networkControlInfo.rtt)) {
472 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_GAME, BG_LIMIT_LEVEL_7, GAME_BOOST_ENABLE,
473 networkControlInfo.uid);
474 } else {
475 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_GAME, BG_LIMIT_LEVEL_3, GAME_BOOST_DISABLE,
476 networkControlInfo.uid);
477 }
478 break;
479 case GameSceneId::MSG_GAME_STATE_BACKGROUND:
480 case GameSceneId::MSG_GAME_STATE_END:
481 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_GAME, BG_LIMIT_OFF, GAME_BOOST_DISABLE, networkControlInfo.uid);
482 break;
483 case GameSceneId::MSG_GAME_ENTER_PVP_BATTLE:
484 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_GAME, BG_LIMIT_LEVEL_7, GAME_BOOST_ENABLE, networkControlInfo.uid);
485 break;
486 case GameSceneId::MSG_GAME_EXIT_PVP_BATTLE:
487 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_GAME, BG_LIMIT_LEVEL_3, GAME_BOOST_DISABLE, networkControlInfo.uid);
488 break;
489 default:
490 WIFI_LOGE("%{public}s there is no such state.", __FUNCTION__);
491 break;
492 }
493 }
494
VideoCallNetworkSpeedLimitConfigs(const WifiNetworkControlInfo & networkControlInfo)495 void AppNetworkSpeedLimitService::VideoCallNetworkSpeedLimitConfigs(const WifiNetworkControlInfo &networkControlInfo)
496 {
497 if (networkControlInfo.state == ON) {
498 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_VIDEO_CALL, BG_LIMIT_LEVEL_7, m_isHighPriorityTransmit);
499 } else {
500 SendLimitCmd2Drv(BG_LIMIT_CONTROL_ID_VIDEO_CALL, BG_LIMIT_OFF, m_isHighPriorityTransmit);
501 }
502 }
503
HighPriorityTransmit(int uid,int protocol,int enable)504 void AppNetworkSpeedLimitService::HighPriorityTransmit(int uid, int protocol, int enable)
505 {
506 if (m_isHighPriorityTransmit == enable || uid == -1) {
507 WIFI_LOGI("%{public}s HighPriorityTransmit was setted %{public}d or uid == -1", __FUNCTION__, enable);
508 return;
509 }
510 m_isHighPriorityTransmit = enable;
511 WIFI_LOGI("%{public}s enter HighPriorityTransmit, enable is %{public}d.", __FUNCTION__, enable);
512 WifiErrorNo ret = WifiStaHalInterface::GetInstance().SetDpiMarkRule(
513 WifiConfigCenter::GetInstance().GetStaIfaceName(), uid, protocol, enable);
514 if (ret != 0) {
515 WIFI_LOGE("%{public}s highPriorityTransmit failed, ret = %{public}d.", __FUNCTION__, ret);
516 return;
517 }
518 }
519 } // namespace Wifi
520 } // namespace OHOS