1 /*
2 * Copyright (C) 2021 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 "apn_holder.h"
17
18 #include "cellular_data_event_code.h"
19 #include "cellular_data_state_machine.h"
20 #include "data_disconnect_params.h"
21 #include "apn_manager.h"
22 namespace OHOS {
23 namespace Telephony {
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
ReleaseAllCellularDataForInternet()27 void ReleaseAllCellularDataForInternet()
28 {
29 using namespace OHOS::Telephony;
30 OHOS::sptr<ApnManager> apnManager = std::make_unique<ApnManager>().release();
31 if (!apnManager) {
32 TELEPHONY_LOGE("Get Apn manager failed");
33 return;
34 }
35 apnManager->InitApnHolders();
36 int32_t id = ApnManager::FindApnIdByCapability(OHOS::NetManagerStandard::NET_CAPABILITY_INTERNET);
37 OHOS::sptr<ApnHolder> apnHolder = apnManager->FindApnHolderById(id);
38 apnHolder->ReleaseAllCellularData();
39 TELEPHONY_LOGI("Release all cellular data");
40 }
41 #ifdef __cplusplus
42 }
43 #endif
44
45 const std::map<std::string, int32_t> ApnHolder::apnTypeDataProfileMap_ {
46 {DATA_CONTEXT_ROLE_DEFAULT, DATA_PROFILE_DEFAULT},
47 {DATA_CONTEXT_ROLE_MMS, DATA_PROFILE_MMS},
48 {DATA_CONTEXT_ROLE_SUPL, DATA_PROFILE_SUPL},
49 {DATA_CONTEXT_ROLE_DUN, DATA_PROFILE_DUN},
50 {DATA_CONTEXT_ROLE_IA, DATA_PROFILE_IA},
51 {DATA_CONTEXT_ROLE_XCAP, DATA_PROFILE_XCAP}
52 };
53
ApnHolder(const std::string & apnType,const int32_t priority)54 ApnHolder::ApnHolder(const std::string &apnType, const int32_t priority) : apnType_(apnType), priority_(priority) {}
55
56 ApnHolder::~ApnHolder() = default;
57
GetNextRetryApn() const58 sptr<ApnItem> ApnHolder::GetNextRetryApn() const
59 {
60 return retryPolicy_.GetNextRetryApnItem();
61 }
62
SetAllMatchedApns(std::vector<sptr<ApnItem>> & matchedApns)63 void ApnHolder::SetAllMatchedApns(std::vector<sptr<ApnItem>> &matchedApns)
64 {
65 retryPolicy_.SetMatchedApns(matchedApns);
66 }
67
GetRetryDelay() const68 int64_t ApnHolder::GetRetryDelay() const
69 {
70 return retryPolicy_.GetNextRetryDelay();
71 }
72
SetCurrentApn(sptr<ApnItem> & apnItem)73 void ApnHolder::SetCurrentApn(sptr<ApnItem> &apnItem)
74 {
75 apnItem_ = apnItem;
76 }
77
GetCurrentApn() const78 sptr<ApnItem> ApnHolder::GetCurrentApn() const
79 {
80 return apnItem_;
81 }
82
SetApnState(ApnProfileState state)83 void ApnHolder::SetApnState(ApnProfileState state)
84 {
85 if (apnState_ != state) {
86 apnState_ = state;
87 }
88 if (apnState_ == PROFILE_STATE_FAILED) {
89 retryPolicy_.ClearRetryApns();
90 }
91 }
92
GetApnState() const93 ApnProfileState ApnHolder::GetApnState() const
94 {
95 return apnState_;
96 }
97
IsDataCallEnabled() const98 bool ApnHolder::IsDataCallEnabled() const
99 {
100 return dataCallEnabled_;
101 }
102
GetApnType() const103 std::string ApnHolder::GetApnType() const
104 {
105 return apnType_;
106 }
107
ReleaseDataConnection()108 void ApnHolder::ReleaseDataConnection()
109 {
110 if (cellularDataStateMachine_ == nullptr) {
111 TELEPHONY_LOGE("cellularDataStateMachine_ is null");
112 return;
113 }
114 std::unique_ptr<DataDisconnectParams> object =
115 std::make_unique<DataDisconnectParams>(apnType_, DisConnectionReason::REASON_CLEAR_CONNECTION);
116 if (object == nullptr) {
117 TELEPHONY_LOGE("ClearConnection fail, object is null");
118 return;
119 }
120 apnState_ = PROFILE_STATE_DISCONNECTING;
121 AppExecFwk::InnerEvent::Pointer event =
122 AppExecFwk::InnerEvent::Get(CellularDataEventCode::MSG_SM_DISCONNECT, object);
123 cellularDataStateMachine_->SendEvent(event);
124 cellularDataStateMachine_ = nullptr;
125 }
126
GetProfileId(const std::string & apnType) const127 int32_t ApnHolder::GetProfileId(const std::string &apnType) const
128 {
129 std::map<std::string, int32_t>::const_iterator it = apnTypeDataProfileMap_.find(apnType);
130 if (it != apnTypeDataProfileMap_.end()) {
131 return it->second;
132 }
133 TELEPHONY_LOGI("this apnType is not in apnTypeDataProfileMap.");
134 return DATA_PROFILE_DEFAULT;
135 }
136
SetCellularDataStateMachine(const std::shared_ptr<CellularDataStateMachine> & stateMachine)137 void ApnHolder::SetCellularDataStateMachine(const std::shared_ptr<CellularDataStateMachine> &stateMachine)
138 {
139 cellularDataStateMachine_ = stateMachine;
140 }
141
GetCellularDataStateMachine() const142 std::shared_ptr<CellularDataStateMachine> ApnHolder::GetCellularDataStateMachine() const
143 {
144 return cellularDataStateMachine_;
145 }
146
GetCapability() const147 uint64_t ApnHolder::GetCapability() const
148 {
149 return capability_;
150 }
151
GetPriority() const152 int32_t ApnHolder::GetPriority() const
153 {
154 return priority_;
155 }
156
RequestCellularData(const NetRequest & netRequest)157 void ApnHolder::RequestCellularData(const NetRequest &netRequest)
158 {
159 for (const NetRequest &request : netRequests_) {
160 if ((netRequest.capability == request.capability) && (netRequest.ident == request.ident)) {
161 return;
162 }
163 }
164 netRequests_.push_back(netRequest);
165 capability_ = netRequest.capability;
166 dataCallEnabled_ = true;
167 }
168
ReleaseCellularData(const NetRequest & netRequest)169 void ApnHolder::ReleaseCellularData(const NetRequest &netRequest)
170 {
171 for (std::vector<NetRequest>::const_iterator it = netRequests_.begin(); it != netRequests_.end(); it++) {
172 if ((netRequest.capability == it->capability) && (netRequest.ident == it->ident)) {
173 netRequests_.erase(it);
174 if (netRequests_.empty()) {
175 dataCallEnabled_ = false;
176 }
177 return;
178 }
179 }
180 }
181
ReleaseAllCellularData()182 void ApnHolder::ReleaseAllCellularData()
183 {
184 TELEPHONY_LOGI("clear all cellular data");
185 netRequests_.clear();
186 if (netRequests_.empty()) {
187 dataCallEnabled_ = false;
188 }
189 }
190
IsEmergencyType() const191 bool ApnHolder::IsEmergencyType() const
192 {
193 return apnType_ == DATA_CONTEXT_ROLE_EMERGENCY;
194 }
195
IsMmsType() const196 bool ApnHolder::IsMmsType() const
197 {
198 return apnType_ == DATA_CONTEXT_ROLE_MMS;
199 }
200
InitialApnRetryCount()201 void ApnHolder::InitialApnRetryCount()
202 {
203 retryPolicy_.InitialRetryCountValue();
204 }
205
IsSameMatchedApns(std::vector<sptr<ApnItem>> newMatchedApns,bool roamingState)206 bool ApnHolder::IsSameMatchedApns(std::vector<sptr<ApnItem>> newMatchedApns, bool roamingState)
207 {
208 std::vector<sptr<ApnItem>> currentMatchedApns = retryPolicy_.GetMatchedApns();
209 if (currentMatchedApns.empty() || newMatchedApns.empty()) {
210 TELEPHONY_LOGE("newMatchedApns or oldMatchedApns is empty");
211 return false;
212 }
213 if (currentMatchedApns.size() != newMatchedApns.size()) {
214 TELEPHONY_LOGI("newMatchedApns and oldMatchedApns are not equal in size");
215 return false;
216 }
217 for (const sptr<ApnItem> &newApnItem : newMatchedApns) {
218 bool canHandle = false;
219 for (const sptr<ApnItem> &oldApnItem : currentMatchedApns) {
220 if (IsSameApnItem(newApnItem, oldApnItem, roamingState)) {
221 canHandle = true;
222 break;
223 }
224 }
225 if (!canHandle) {
226 return false;
227 }
228 }
229 return true;
230 }
231
IsSameApnItem(const sptr<ApnItem> & newApnItem,const sptr<ApnItem> & oldApnItem,bool roamingState)232 bool ApnHolder::IsSameApnItem(const sptr<ApnItem> &newApnItem,
233 const sptr<ApnItem> &oldApnItem,
234 bool roamingState)
235 {
236 if (newApnItem == nullptr || oldApnItem == nullptr) {
237 TELEPHONY_LOGE("newApnItem or oldApnItem is null");
238 return false;
239 }
240 bool isSameProtocol = false;
241 if (roamingState) {
242 isSameProtocol = std::strcmp(newApnItem->attr_.roamingProtocol_, oldApnItem->attr_.roamingProtocol_) == 0;
243 } else {
244 isSameProtocol = std::strcmp(newApnItem->attr_.protocol_, oldApnItem->attr_.protocol_) == 0;
245 }
246 return isSameProtocol && newApnItem->attr_.profileId_ == oldApnItem->attr_.profileId_ &&
247 newApnItem->attr_.authType_ == oldApnItem->attr_.authType_ &&
248 newApnItem->attr_.isRoamingApn_ == oldApnItem->attr_.isRoamingApn_ &&
249 newApnItem->attr_.isEdited_ == oldApnItem->attr_.isEdited_ &&
250 std::strcmp(newApnItem->attr_.types_, oldApnItem->attr_.types_) == 0 &&
251 std::strcmp(newApnItem->attr_.numeric_, oldApnItem->attr_.numeric_) == 0 &&
252 std::strcmp(newApnItem->attr_.apn_, oldApnItem->attr_.apn_) == 0 &&
253 std::strcmp(newApnItem->attr_.apnName_, oldApnItem->attr_.apnName_) == 0 &&
254 std::strcmp(newApnItem->attr_.user_, oldApnItem->attr_.user_) == 0 &&
255 std::strcmp(newApnItem->attr_.password_, oldApnItem->attr_.password_) == 0 &&
256 std::strcmp(newApnItem->attr_.homeUrl_, oldApnItem->attr_.homeUrl_) == 0 &&
257 std::strcmp(newApnItem->attr_.proxyIpAddress_, oldApnItem->attr_.proxyIpAddress_) == 0 &&
258 std::strcmp(newApnItem->attr_.mmsIpAddress_, oldApnItem->attr_.mmsIpAddress_) == 0;
259 }
260
IsCompatibleApnItem(const sptr<ApnItem> & newApnItem,const sptr<ApnItem> & oldApnItem,bool roamingState)261 bool ApnHolder::IsCompatibleApnItem(const sptr<ApnItem> &newApnItem, const sptr<ApnItem> &oldApnItem,
262 bool roamingState)
263 {
264 if (newApnItem == nullptr || oldApnItem == nullptr) {
265 TELEPHONY_LOGE("newApnItem or oldApnItem is null");
266 return false;
267 }
268 bool isSameProtocol = false;
269 if (roamingState) {
270 isSameProtocol = std::strcmp(newApnItem->attr_.roamingProtocol_, oldApnItem->attr_.roamingProtocol_) == 0;
271 } else {
272 isSameProtocol = std::strcmp(newApnItem->attr_.protocol_, oldApnItem->attr_.protocol_) == 0;
273 }
274 return isSameProtocol && newApnItem->attr_.profileId_ == oldApnItem->attr_.profileId_ &&
275 newApnItem->attr_.authType_ == oldApnItem->attr_.authType_ &&
276 std::strcmp(newApnItem->attr_.types_, oldApnItem->attr_.types_) == 0 &&
277 std::strcmp(newApnItem->attr_.numeric_, oldApnItem->attr_.numeric_) == 0 &&
278 std::strcmp(newApnItem->attr_.apn_, oldApnItem->attr_.apn_) == 0 &&
279 std::strcmp(newApnItem->attr_.apnName_, oldApnItem->attr_.apnName_) == 0 &&
280 std::strcmp(newApnItem->attr_.user_, oldApnItem->attr_.user_) == 0 &&
281 std::strcmp(newApnItem->attr_.password_, oldApnItem->attr_.password_) == 0 &&
282 std::strcmp(newApnItem->attr_.proxyIpAddress_, oldApnItem->attr_.proxyIpAddress_) == 0 &&
283 std::strcmp(newApnItem->attr_.mmsIpAddress_, oldApnItem->attr_.mmsIpAddress_) == 0;
284 }
285 } // namespace Telephony
286 } // namespace OHOS