• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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