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 "sta_app_acceleration.h"
17 #include "wifi_logger.h"
18 #include "wifi_sta_hal_interface.h"
19 #include "wifi_common_util.h"
20 #include "wifi_app_parser.h"
21 #include "wifi_config_center.h"
22 #include "app_mgr_client.h"
23 #include "app_network_speed_limit_service.h"
24
25 namespace OHOS {
26 namespace Wifi {
27
28 DEFINE_WIFILOG_LABEL("StaAppAcceleration");
29 const std::string CLASS_NAME = "StaAppAcceleration";
30
31 constexpr const int POWER_SAVE_ENABLE = 3;
32 constexpr const int POWER_SAVE_DISABLE = 4;
33 constexpr const int GAME_BOOST_ENABLE = 1;
34 constexpr const int GAME_BOOST_DISABLE = 0;
35 constexpr const int BOOST_UDP_TYPE = 17;
36
StaAppAcceleration(int instId)37 StaAppAcceleration::StaAppAcceleration(int instId) : gameBoostingFlag(false)
38 {}
39
~StaAppAcceleration()40 StaAppAcceleration::~StaAppAcceleration()
41 {}
42
InitAppAcceleration()43 ErrCode StaAppAcceleration::InitAppAcceleration()
44 {
45 using namespace std::placeholders;
46 m_staCallback.callbackModuleName = CLASS_NAME;
47 m_staCallback.OnStaConnChanged = std::bind(&StaAppAcceleration::DealStaConnChanged, this, _1, _2, _3);
48 return WIFI_OPT_SUCCESS;
49 }
50
GetStaCallback() const51 StaServiceCallback StaAppAcceleration::GetStaCallback() const
52 {
53 return m_staCallback;
54 }
55
DealStaConnChanged(OperateResState state,const WifiLinkedInfo & info,int instId)56 void StaAppAcceleration::DealStaConnChanged(OperateResState state, const WifiLinkedInfo &info, int instId)
57 {
58 if (state == OperateResState::DISCONNECT_DISCONNECTED) {
59 StopAllAppAcceleration();
60 }
61 }
62
HandleScreenStatusChanged(int screenState)63 void StaAppAcceleration::HandleScreenStatusChanged(int screenState)
64 {
65 WIFI_LOGI("Enter HandleScreenStatusChanged.\n");
66
67 if (screenState == MODE_STATE_OPEN) {
68 SetPmMode(POWER_SAVE_DISABLE);
69 } else if (screenState == MODE_STATE_CLOSE) {
70 SetPmMode(POWER_SAVE_ENABLE);
71 } else {
72 WIFI_LOGI("mode not handle.\n");
73 }
74 }
75
76 #ifndef OHOS_ARCH_LITE
HandleForegroundAppChangedAction(const AppExecFwk::AppStateData & appStateData)77 void StaAppAcceleration::HandleForegroundAppChangedAction(const AppExecFwk::AppStateData &appStateData)
78 {
79 if (appStateData.state == static_cast<int>(AppExecFwk::AppProcessState::APP_STATE_FOREGROUND)
80 && appStateData.isFocused) {
81 if (AppParser::GetInstance().IsLowLatencyApp(appStateData.bundleName)) {
82 WIFI_LOGI("target app on the foreground.");
83 StartGameBoost(appStateData.uid);
84 } else {
85 StopGameBoost(appStateData.uid);
86 }
87 }
88 return;
89 }
90 #endif
91
SetPmMode(int mode)92 void StaAppAcceleration::SetPmMode(int mode)
93 {
94 if (mode != POWER_SAVE_DISABLE && POWER_SAVE_ENABLE) {
95 WIFI_LOGI("Unsupported mode %{public}d.", mode);
96 return;
97 }
98
99 WifiLinkedInfo linkedInfo;
100 WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo);
101 WifiErrorNo ret = WifiStaHalInterface::GetInstance().SetPmMode(
102 WifiConfigCenter::GetInstance().GetStaIfaceName(), linkedInfo.frequency, mode);
103 if (ret != 0) {
104 WIFI_LOGE("SetPmMode failed, ret = %{public}d.", ret);
105 return;
106 }
107 }
108
StartGameBoost(int uid)109 void StaAppAcceleration::StartGameBoost(int uid)
110 {
111 if (!gameBoostingFlag) {
112 WIFI_LOGI("start game boost.\n");
113 SetGameBoostMode(GAME_BOOST_ENABLE, uid, BOOST_UDP_TYPE, BG_LIMIT_LEVEL_3);
114 gameBoostingFlag = true;
115 return;
116 } else {
117 WIFI_LOGE("game boost has started, not handle.\n");
118 return;
119 }
120 }
121
StopGameBoost(int uid)122 void StaAppAcceleration::StopGameBoost(int uid)
123 {
124 if (gameBoostingFlag) {
125 SetGameBoostMode(GAME_BOOST_DISABLE, uid, BOOST_UDP_TYPE, BG_LIMIT_OFF);
126 gameBoostingFlag = false;
127 }
128 }
129
SetGameBoostMode(int enable,int uid,int type,int limitMode)130 void StaAppAcceleration::SetGameBoostMode(int enable, int uid, int type, int limitMode)
131 {
132 HighPriorityTransmit(uid, type, enable);
133 AppNetworkSpeedLimitService::GetInstance().LimitSpeed(BG_LIMIT_CONTROL_ID_GAME, limitMode);
134 }
135
HighPriorityTransmit(int uid,int protocol,int enable)136 void StaAppAcceleration::HighPriorityTransmit(int uid, int protocol, int enable)
137 {
138 WIFI_LOGI("Enter HighPriorityTransmit.\n");
139 WifiErrorNo ret = WifiStaHalInterface::GetInstance().SetDpiMarkRule(
140 WifiConfigCenter::GetInstance().GetStaIfaceName(), uid, protocol, enable);
141 if (ret != 0) {
142 WIFI_LOGE("HighPriorityTransmit failed, ret = %{public}d.", ret);
143 return;
144 }
145 }
146
StopAllAppAcceleration()147 void StaAppAcceleration::StopAllAppAcceleration()
148 {
149 WIFI_LOGI("Wifi disconnected, stop game boost.\n");
150 SetPmMode(POWER_SAVE_ENABLE);
151 HighPriorityTransmit(UNKNOWN_UID, BOOST_UDP_TYPE, GAME_BOOST_DISABLE);
152 AppNetworkSpeedLimitService::GetInstance().LimitSpeed(BG_LIMIT_CONTROL_ID_GAME, BG_LIMIT_OFF);
153 }
154
155 } // namespace Wifi
156 } // namespace OHOS