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_manager.h"
17
18 #include "cellular_data_utils.h"
19 #include "cellular_data_hisysevent.h"
20 #include "core_manager_inner.h"
21 #include "net_specifier.h"
22 #include "string_ex.h"
23 #include "tel_profile_util.h"
24 #include "telephony_log_wrapper.h"
25 #include "telephony_ext_wrapper.h"
26
27 namespace OHOS {
28 namespace Telephony {
29 const std::map<std::string, int32_t> ApnManager::apnIdApnNameMap_ {
30 {DATA_CONTEXT_ROLE_ALL, DATA_CONTEXT_ROLE_ALL_ID},
31 {DATA_CONTEXT_ROLE_DEFAULT, DATA_CONTEXT_ROLE_DEFAULT_ID},
32 {DATA_CONTEXT_ROLE_MMS, DATA_CONTEXT_ROLE_MMS_ID},
33 {DATA_CONTEXT_ROLE_SUPL, DATA_CONTEXT_ROLE_SUPL_ID},
34 {DATA_CONTEXT_ROLE_DUN, DATA_CONTEXT_ROLE_DUN_ID},
35 {DATA_CONTEXT_ROLE_IMS, DATA_CONTEXT_ROLE_IMS_ID},
36 {DATA_CONTEXT_ROLE_IA, DATA_CONTEXT_ROLE_IA_ID},
37 {DATA_CONTEXT_ROLE_EMERGENCY, DATA_CONTEXT_ROLE_EMERGENCY_ID},
38 {DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID},
39 {DATA_CONTEXT_ROLE_XCAP, DATA_CONTEXT_ROLE_XCAP_ID},
40 {DATA_CONTEXT_ROLE_BIP, DATA_CONTEXT_ROLE_BIP_ID}
41 };
42 const std::map<std::string, ApnTypes> ApnManager::apnNameApnTypeMap_ {
43 {DATA_CONTEXT_ROLE_ALL, ApnTypes::ALL},
44 {DATA_CONTEXT_ROLE_DEFAULT, ApnTypes::DEFAULT},
45 {DATA_CONTEXT_ROLE_MMS, ApnTypes::MMS},
46 {DATA_CONTEXT_ROLE_SUPL, ApnTypes::SUPL},
47 {DATA_CONTEXT_ROLE_DUN, ApnTypes::DUN},
48 {DATA_CONTEXT_ROLE_IMS, ApnTypes::IMS},
49 {DATA_CONTEXT_ROLE_IA, ApnTypes::IA},
50 {DATA_CONTEXT_ROLE_EMERGENCY, ApnTypes::EMERGENCY},
51 {DATA_CONTEXT_ROLE_XCAP, ApnTypes::XCAP},
52 {DATA_CONTEXT_ROLE_BIP, ApnTypes::BIP},
53 {DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, ApnTypes::INTERNAL_DEFAULT}
54 };
55 const std::vector<ApnProfileState> ApnManager::apnStateArr_ = {
56 PROFILE_STATE_CONNECTED,
57 PROFILE_STATE_DISCONNECTING,
58 PROFILE_STATE_CONNECTING,
59 PROFILE_STATE_IDLE,
60 PROFILE_STATE_RETRYING,
61 PROFILE_STATE_FAILED
62 };
63 constexpr const char *CT_MCC_MNC_1 = "46003";
64 constexpr const char *CT_MCC_MNC_2 = "46011";
65 constexpr const char *GC_ICCID = "8985231";
66 constexpr const char *GC_MCC_MNC = "45431";
67 constexpr const char *GC_SPN = "CTExcel";
68 constexpr const char *MO_ICCID_1 = "8985302";
69 constexpr const char *MO_ICCID_2 = "8985307";
70 constexpr const char *MO_UNICOM_MCCMNC = "46001";
71 constexpr int32_t ICCID_LEN_MINIMUM = 7;
72
73 ApnManager::ApnManager() = default;
74
75 ApnManager::~ApnManager() = default;
76
InitApnHolders()77 void ApnManager::InitApnHolders()
78 {
79 AddApnHolder(DATA_CONTEXT_ROLE_DEFAULT, static_cast<int32_t>(DataContextPriority::PRIORITY_LOW));
80 AddApnHolder(DATA_CONTEXT_ROLE_MMS, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
81 AddApnHolder(DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, static_cast<int32_t>(DataContextPriority::PRIORITY_NONE));
82 AddApnHolder(DATA_CONTEXT_ROLE_XCAP, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
83 AddApnHolder(DATA_CONTEXT_ROLE_DUN, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
84 AddApnHolder(DATA_CONTEXT_ROLE_IA, static_cast<int32_t>(DataContextPriority::PRIORITY_HIGH));
85 AddApnHolder(DATA_CONTEXT_ROLE_SUPL, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
86 AddApnHolder(DATA_CONTEXT_ROLE_BIP, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
87 }
88
FindApnHolderById(const int32_t id) const89 sptr<ApnHolder> ApnManager::FindApnHolderById(const int32_t id) const
90 {
91 if (apnIdApnHolderMap_.empty()) {
92 TELEPHONY_LOGE("apnIdApnHolderMap_ empty");
93 return nullptr;
94 }
95 if (id == DATA_CONTEXT_ROLE_INVALID_ID) {
96 TELEPHONY_LOGE("find a invalid capability!");
97 return nullptr;
98 }
99 std::map<int32_t, sptr<ApnHolder>>::const_iterator it = apnIdApnHolderMap_.find(id);
100 if (it != apnIdApnHolderMap_.end()) {
101 return it->second;
102 }
103 return nullptr;
104 }
105
FindApnIdByApnName(const std::string & type)106 int32_t ApnManager::FindApnIdByApnName(const std::string &type)
107 {
108 std::map<std::string, int32_t>::const_iterator it = apnIdApnNameMap_.find(type);
109 if (it != apnIdApnNameMap_.end()) {
110 return it->second;
111 }
112 TELEPHONY_LOGE("apnType %{public}s is not exist!", type.c_str());
113 return DATA_CONTEXT_ROLE_INVALID_ID;
114 }
115
FindApnNameByApnId(const int32_t id)116 std::string ApnManager::FindApnNameByApnId(const int32_t id)
117 {
118 for (std::pair<const std::string, int32_t> it : apnIdApnNameMap_) {
119 if (it.second == id) {
120 return it.first;
121 }
122 }
123 TELEPHONY_LOGI("apnId %{public}d is not exist!", id);
124 return DATA_CONTEXT_ROLE_DEFAULT;
125 }
126
FindApnTypeByApnName(const std::string & apnName)127 int32_t ApnManager::FindApnTypeByApnName(const std::string &apnName)
128 {
129 auto iter = apnNameApnTypeMap_.find(apnName);
130 if (iter != apnNameApnTypeMap_.end()) {
131 return static_cast<uint64_t>(iter->second);
132 }
133 TELEPHONY_LOGI("ApnName %{public}s is not exist!", apnName.c_str());
134 return static_cast<uint64_t>(ApnTypes::NONETYPE);
135 }
136
FindApnIdByCapability(const uint64_t capability)137 int32_t ApnManager::FindApnIdByCapability(const uint64_t capability)
138 {
139 switch (capability) {
140 case NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET:
141 return DATA_CONTEXT_ROLE_DEFAULT_ID;
142 case NetManagerStandard::NetCap::NET_CAPABILITY_MMS:
143 return DATA_CONTEXT_ROLE_MMS_ID;
144 case NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT:
145 return DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID;
146 case NetManagerStandard::NetCap::NET_CAPABILITY_IA:
147 return DATA_CONTEXT_ROLE_IA_ID;
148 case NetManagerStandard::NetCap::NET_CAPABILITY_XCAP:
149 return DATA_CONTEXT_ROLE_XCAP_ID;
150 case NetManagerStandard::NetCap::NET_CAPABILITY_SUPL:
151 return DATA_CONTEXT_ROLE_SUPL_ID;
152 case NetManagerStandard::NetCap::NET_CAPABILITY_DUN:
153 return DATA_CONTEXT_ROLE_DUN_ID;
154 case NetManagerStandard::NetCap::NET_CAPABILITY_BIP:
155 return DATA_CONTEXT_ROLE_BIP_ID;
156 default:
157 return DATA_CONTEXT_ROLE_INVALID_ID;
158 }
159 }
160
HasNetCap(const uint64_t capabilities,const NetManagerStandard::NetCap netCap)161 static bool HasNetCap(const uint64_t capabilities, const NetManagerStandard::NetCap netCap)
162 {
163 return (capabilities & (1L << netCap)) != 0;
164 }
165
FindBestCapability(const uint64_t capabilities)166 NetManagerStandard::NetCap ApnManager::FindBestCapability(const uint64_t capabilities)
167 {
168 NetManagerStandard::NetCap netCap = NetManagerStandard::NetCap::NET_CAPABILITY_END;
169 if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET)) {
170 netCap = NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET;
171 }
172 if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT)) {
173 netCap = NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT;
174 }
175 if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_MMS)) {
176 netCap = NetManagerStandard::NetCap::NET_CAPABILITY_MMS;
177 }
178 if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_SUPL)) {
179 netCap = NetManagerStandard::NetCap::NET_CAPABILITY_SUPL;
180 }
181 if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_DUN)) {
182 netCap = NetManagerStandard::NetCap::NET_CAPABILITY_DUN;
183 }
184 if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_XCAP)) {
185 netCap = NetManagerStandard::NetCap::NET_CAPABILITY_XCAP;
186 }
187 if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_IA)) {
188 netCap = NetManagerStandard::NetCap::NET_CAPABILITY_IA;
189 }
190 if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_BIP)) {
191 netCap = NetManagerStandard::NetCap::NET_CAPABILITY_BIP;
192 }
193 return netCap;
194 }
195
AddApnHolder(const std::string & apnType,const int32_t priority)196 void ApnManager::AddApnHolder(const std::string &apnType, const int32_t priority)
197 {
198 int32_t apnId = FindApnIdByApnName(apnType);
199 if (apnId == DATA_CONTEXT_ROLE_INVALID_ID) {
200 TELEPHONY_LOGE("APN INVALID ID");
201 return;
202 }
203 sptr<ApnHolder> apnHolder = std::make_unique<ApnHolder>(apnType, priority).release();
204 if (apnHolder == nullptr) {
205 TELEPHONY_LOGE("apnHolder is null, type: %{public}s", apnType.c_str());
206 return;
207 }
208 apnHolder->SetApnState(PROFILE_STATE_IDLE);
209 apnHolders_.push_back(apnHolder);
210 apnIdApnHolderMap_.insert(std::pair<int32_t, sptr<ApnHolder>>(apnId, apnHolder));
211 sortedApnHolders_.emplace_back(apnHolder);
212 sort(sortedApnHolders_.begin(), sortedApnHolders_.end(),
213 [](const sptr<ApnHolder> &c1, const sptr<ApnHolder> &c2) {
214 if (c1 == nullptr || c2 == nullptr) {
215 return false;
216 }
217 return c2->GetPriority() < c1->GetPriority();
218 });
219 TELEPHONY_LOGI("The Apn holder type:%{public}s, size:%{public}zu", apnType.c_str(), sortedApnHolders_.size());
220 }
221
GetApnHolder(const std::string & apnType) const222 sptr<ApnHolder> ApnManager::GetApnHolder(const std::string &apnType) const
223 {
224 int32_t apnId = FindApnIdByApnName(apnType);
225 if (DATA_CONTEXT_ROLE_INVALID_ID == apnId) {
226 TELEPHONY_LOGE("APN INVALID ID");
227 return nullptr;
228 }
229 std::map<int32_t, sptr<ApnHolder>>::const_iterator it = apnIdApnHolderMap_.find(apnId);
230 if (it != apnIdApnHolderMap_.end()) {
231 return it->second;
232 }
233 TELEPHONY_LOGE("apnType %{public}s is not exist!", apnType.c_str());
234 return nullptr;
235 }
236
GetAllApnHolder() const237 std::vector<sptr<ApnHolder>> ApnManager::GetAllApnHolder() const
238 {
239 return apnHolders_;
240 }
241
GetSortApnHolder() const242 std::vector<sptr<ApnHolder>> ApnManager::GetSortApnHolder() const
243 {
244 return sortedApnHolders_;
245 }
246
CreateAllApnItemByDatabase(int32_t slotId)247 int32_t ApnManager::CreateAllApnItemByDatabase(int32_t slotId)
248 {
249 int32_t count = 0;
250 if (TELEPHONY_EXT_WRAPPER.createAllApnItemExt_) {
251 sptr<ApnItem> extraApnItem = ApnItem::MakeDefaultApn("default");
252 if (TELEPHONY_EXT_WRAPPER.createAllApnItemExt_(slotId, extraApnItem)) {
253 std::lock_guard<std::mutex> lock(mutex_);
254 allApnItem_.clear();
255 allApnItem_.push_back(extraApnItem);
256 return ++count;
257 }
258 }
259 std::u16string operatorNumeric;
260 CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId, operatorNumeric);
261 std::string numeric = Str16ToStr8(operatorNumeric);
262 GetCTOperator(slotId, numeric);
263 if (numeric.empty()) {
264 TELEPHONY_LOGE("numeric is empty!!!");
265 return count;
266 }
267 TELEPHONY_LOGI("current slotId = %{public}d, numeric = %{public}s", slotId, numeric.c_str());
268 preferId_ = INVALID_PROFILE_ID;
269 if (!GetPreferId(slotId)) {
270 TELEPHONY_LOGE("query prefer apn fail");
271 return count;
272 }
273 auto helper = CellularDataRdbHelper::GetInstance();
274 if (helper == nullptr) {
275 TELEPHONY_LOGE("get cellularDataRdbHelper failed");
276 return count;
277 }
278 std::string mcc = numeric.substr(0, DEFAULT_MCC_SIZE);
279 std::string mnc = numeric.substr(mcc.size(), numeric.size() - mcc.size());
280 int32_t mvnoCount = CreateMvnoApnItems(slotId, mcc, mnc);
281 if (mvnoCount > 0) {
282 return mvnoCount;
283 }
284 std::vector<PdpProfile> apnVec;
285 if (!helper->QueryApns(mcc, mnc, apnVec, slotId)) {
286 TELEPHONY_LOGE("query apns from data ability fail");
287 return count;
288 }
289 return MakeSpecificApnItem(apnVec, slotId);
290 }
291
GetCTOperator(int32_t slotId,std::string & numeric)292 void ApnManager::GetCTOperator(int32_t slotId, std::string &numeric)
293 {
294 bool isCTSimCard = false;
295 CoreManagerInner::GetInstance().IsCTSimCard(slotId, isCTSimCard);
296 if (isCTSimCard && numeric.compare(CT_MCC_MNC_2)) {
297 numeric = CT_MCC_MNC_1;
298 }
299 if (!numeric.compare(CT_MCC_MNC_1)) {
300 std::u16string tempIccId;
301 CoreManagerInner::GetInstance().GetSimIccId(slotId, tempIccId);
302 std::string iccId = Str16ToStr8(tempIccId);
303 std::u16string tempSpn;
304 CoreManagerInner::GetInstance().GetSimSpn(slotId, tempSpn);
305 std::string spn = Str16ToStr8(tempSpn);
306 if (!iccId.compare(0, ICCID_LEN_MINIMUM, GC_ICCID) || !spn.compare(GC_SPN)) {
307 numeric = GC_MCC_MNC;
308 } else if (!iccId.compare(0, ICCID_LEN_MINIMUM, MO_ICCID_1) ||
309 !iccId.compare(0, ICCID_LEN_MINIMUM, MO_ICCID_2)) {
310 std::u16string tempPlmn;
311 CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId, tempPlmn);
312 std::string plmn = Str16ToStr8(tempPlmn);
313 if (!plmn.empty() && !plmn.compare(MO_UNICOM_MCCMNC)) {
314 numeric = MO_UNICOM_MCCMNC;
315 }
316 }
317 }
318 }
319
CreateMvnoApnItems(int32_t slotId,const std::string & mcc,const std::string & mnc)320 int32_t ApnManager::CreateMvnoApnItems(int32_t slotId, const std::string &mcc, const std::string &mnc)
321 {
322 int32_t count = 0;
323 auto helper = CellularDataRdbHelper::GetInstance();
324 if (helper == nullptr) {
325 TELEPHONY_LOGE("get cellularDataRdbHelper failed");
326 return count;
327 }
328 std::vector<PdpProfile> mvnoApnVec;
329 std::u16string spn;
330 CoreManagerInner::GetInstance().GetSimSpn(slotId, spn);
331 if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::SPN, Str16ToStr8(spn), mvnoApnVec, slotId)) {
332 TELEPHONY_LOGE("query mvno apns by spn fail");
333 return count;
334 }
335 std::u16string imsi;
336 CoreManagerInner::GetInstance().GetIMSI(slotId, imsi);
337 if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::IMSI, Str16ToStr8(imsi), mvnoApnVec, slotId)) {
338 TELEPHONY_LOGE("query mvno apns by imsi fail");
339 return count;
340 }
341 std::u16string gid1;
342 CoreManagerInner::GetInstance().GetSimGid1(slotId, gid1);
343 if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::GID1, Str16ToStr8(gid1), mvnoApnVec, slotId)) {
344 TELEPHONY_LOGE("query mvno apns by gid1 fail");
345 return count;
346 }
347 std::u16string iccId;
348 CoreManagerInner::GetInstance().GetSimIccId(slotId, iccId);
349 if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::ICCID, Str16ToStr8(iccId), mvnoApnVec, slotId)) {
350 TELEPHONY_LOGE("query mvno apns by iccId fail");
351 return count;
352 }
353 return MakeSpecificApnItem(mvnoApnVec, slotId);
354 }
355
ReportApnInfo(int32_t slotId,PdpProfile & apnData)356 void ApnManager::ReportApnInfo(int32_t slotId, PdpProfile &apnData)
357 {
358 if (apnData.apnTypes.empty()) {
359 return;
360 }
361 if (apnData.apnTypes.find(DATA_CONTEXT_ROLE_DEFAULT) == std::string::npos) {
362 return;
363 }
364 CellularDataHiSysEvent::WriteApnInfoBehaviorEvent(slotId, apnData);
365 }
366
MakeSpecificApnItem(std::vector<PdpProfile> & apnVec,int32_t slotId)367 int32_t ApnManager::MakeSpecificApnItem(std::vector<PdpProfile> &apnVec, int32_t slotId)
368 {
369 std::lock_guard<std::mutex> lock(mutex_);
370 allApnItem_.clear();
371 TryMergeSimilarPdpProfile(apnVec);
372 int32_t count = 0;
373 for (PdpProfile &apnData : apnVec) {
374 TELEPHONY_LOGI("profileId = %{public}d, profileName = %{public}s, mvnoType = %{public}s",
375 apnData.profileId, apnData.profileName.c_str(), apnData.mvnoType.c_str());
376 if (apnData.profileId == preferId_ && apnData.apnTypes.empty()) {
377 apnData.apnTypes = DATA_CONTEXT_ROLE_DEFAULT;
378 }
379 ReportApnInfo(slotId, apnData);
380 sptr<ApnItem> apnItem = ApnItem::MakeApn(apnData);
381 if (apnItem != nullptr) {
382 allApnItem_.push_back(apnItem);
383 count++;
384 }
385 }
386 int32_t preferId = preferId_;
387 auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(),
388 [preferId](auto &apn) { return apn != nullptr && apn->attr_.profileId_ == preferId; });
389 if (it != allApnItem_.end()) {
390 sptr<ApnItem> apnItem = *it;
391 allApnItem_.erase(it);
392 allApnItem_.insert(allApnItem_.begin(), apnItem);
393 }
394 return count;
395 }
396
FilterMatchedApns(const std::string & requestApnType,const int32_t slotId)397 std::vector<sptr<ApnItem>> ApnManager::FilterMatchedApns(const std::string &requestApnType, const int32_t slotId)
398 {
399 std::lock_guard<std::mutex> lock(mutex_);
400 std::vector<sptr<ApnItem>> matchApnItemList;
401 if (requestApnType == DATA_CONTEXT_ROLE_DUN) {
402 FetchDunApns(matchApnItemList, slotId);
403 return matchApnItemList;
404 } else if (requestApnType == DATA_CONTEXT_ROLE_BIP) {
405 FetchBipApns(matchApnItemList);
406 return matchApnItemList;
407 }
408
409 for (const sptr<ApnItem> &apnItem : allApnItem_) {
410 if (apnItem->CanDealWithType(requestApnType)) {
411 matchApnItemList.push_back(apnItem);
412 }
413 }
414 TELEPHONY_LOGD("apn size is :%{public}zu", matchApnItemList.size());
415 return matchApnItemList;
416 }
417
IsDataConnectionNotUsed(const std::shared_ptr<CellularDataStateMachine> & stateMachine) const418 bool ApnManager::IsDataConnectionNotUsed(const std::shared_ptr<CellularDataStateMachine> &stateMachine) const
419 {
420 if (stateMachine == nullptr) {
421 TELEPHONY_LOGE("CellularDataHandler:stateMachine is null");
422 return false;
423 }
424 for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
425 if (apnHolder == nullptr) {
426 TELEPHONY_LOGE("apn holder is null");
427 continue;
428 }
429 std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = apnHolder->GetCellularDataStateMachine();
430 if (cellularDataStateMachine != nullptr && stateMachine == cellularDataStateMachine) {
431 TELEPHONY_LOGE("cellularDataStateMachine in use");
432 return false;
433 }
434 }
435 return true;
436 }
437
HasAnyConnectedState() const438 bool ApnManager::HasAnyConnectedState() const
439 {
440 for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
441 if (apnHolder == nullptr) {
442 TELEPHONY_LOGE("apn holder is null");
443 continue;
444 }
445 if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTED ||
446 apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_DISCONNECTING) {
447 return true;
448 }
449 }
450 return false;
451 }
452
GetOverallApnState() const453 ApnProfileState ApnManager::GetOverallApnState() const
454 {
455 if (apnHolders_.empty()) {
456 TELEPHONY_LOGE("apn overall state is STATE_IDLE");
457 return ApnProfileState::PROFILE_STATE_IDLE;
458 }
459 if (HasAnyConnectedState()) {
460 TELEPHONY_LOGI("apn overall state is STATE_CONNECTED");
461 return ApnProfileState::PROFILE_STATE_CONNECTED;
462 }
463 bool failState = false;
464 for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
465 if (apnHolder == nullptr) {
466 continue;
467 }
468 if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTING ||
469 apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_RETRYING) {
470 TELEPHONY_LOGI("apn overall state is STATE_CONNECTING");
471 return ApnProfileState::PROFILE_STATE_CONNECTING;
472 } else if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_IDLE) {
473 failState = true;
474 }
475 }
476 if (failState) {
477 TELEPHONY_LOGD("apn overall state is STATE_IDLE");
478 return ApnProfileState::PROFILE_STATE_IDLE;
479 }
480 TELEPHONY_LOGI("apn overall state is STATE_FAILED");
481 return ApnProfileState::PROFILE_STATE_FAILED;
482 }
483
GetOverallDefaultApnState() const484 ApnProfileState ApnManager::GetOverallDefaultApnState() const
485 {
486 if (apnHolders_.empty()) {
487 TELEPHONY_LOGE("apn overall state is STATE_IDLE");
488 return ApnProfileState::PROFILE_STATE_IDLE;
489 }
490 ApnProfileState defaultApnState = ApnProfileState::PROFILE_STATE_IDLE;
491 ApnProfileState internalApnState = ApnProfileState::PROFILE_STATE_IDLE;
492
493 for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
494 if (apnHolder == nullptr) {
495 continue;
496 }
497 if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DEFAULT) {
498 defaultApnState = apnHolder->GetApnState();
499 }
500 if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) {
501 internalApnState = apnHolder->GetApnState();
502 }
503 }
504 TELEPHONY_LOGI("defaultApnState is %{public}d, internalApnState is %{public}d", defaultApnState,
505 internalApnState);
506 for (auto apnState : apnStateArr_) {
507 if (defaultApnState == apnState || internalApnState == apnState) {
508 return apnState;
509 }
510 }
511 return ApnProfileState::PROFILE_STATE_IDLE;
512 }
513
GetRilAttachApn()514 sptr<ApnItem> ApnManager::GetRilAttachApn()
515 {
516 std::lock_guard<std::mutex> lock(mutex_);
517 if (allApnItem_.empty()) {
518 TELEPHONY_LOGE("apn item is null");
519 return nullptr;
520 }
521 if (preferId_ != INVALID_PROFILE_ID) {
522 TELEPHONY_LOGI("GetRilAttachApn use prefer apn");
523 return allApnItem_[0];
524 }
525 sptr<ApnItem> attachApn = nullptr;
526 for (const sptr<ApnItem> &apnItem : allApnItem_) {
527 if (apnItem->CanDealWithType(DATA_CONTEXT_ROLE_IA)) {
528 attachApn = apnItem;
529 break;
530 }
531 if (attachApn == nullptr && apnItem->CanDealWithType(DATA_CONTEXT_ROLE_DEFAULT)) {
532 attachApn = apnItem;
533 }
534 }
535 if (attachApn == nullptr) {
536 attachApn = allApnItem_[0];
537 }
538 return attachApn;
539 }
540
GetApnItemById(const int32_t id)541 sptr<ApnItem> ApnManager::GetApnItemById(const int32_t id)
542 {
543 std::lock_guard<std::mutex> lock(mutex_);
544 if (allApnItem_.empty()) {
545 TELEPHONY_LOGE("apn item is null");
546 return nullptr;
547 }
548 sptr<ApnItem> attachApn = nullptr;
549 for (const sptr<ApnItem> &apnItem : allApnItem_) {
550 if (id == apnItem->attr_.profileId_) {
551 attachApn = apnItem;
552 break;
553 }
554 }
555 return attachApn;
556 }
557
ResetApns(int32_t slotId)558 bool ApnManager::ResetApns(int32_t slotId)
559 {
560 auto helper = CellularDataRdbHelper::GetInstance();
561 if (helper == nullptr) {
562 TELEPHONY_LOGE("get cellularDataRdbHelper failed");
563 return false;
564 }
565 return helper->ResetApns(slotId);
566 }
567
FetchBipApns(std::vector<sptr<ApnItem>> & matchApnItemList)568 void ApnManager::FetchBipApns(std::vector<sptr<ApnItem>> &matchApnItemList)
569 {
570 sptr<ApnItem> defaultApn = nullptr;
571 for (const sptr<ApnItem> &apnItem : allApnItem_) {
572 if (apnItem->CanDealWithType(DATA_CONTEXT_ROLE_BIP)) {
573 matchApnItemList.push_back(apnItem);
574 return;
575 }
576 if (apnItem->CanDealWithType(DATA_CONTEXT_ROLE_DEFAULT)) {
577 defaultApn = apnItem;
578 }
579 }
580
581 if (defaultApn != nullptr) {
582 matchApnItemList.push_back(defaultApn);
583 }
584 }
585
FetchDunApns(std::vector<sptr<ApnItem>> & matchApnItemList,const int32_t slotId)586 void ApnManager::FetchDunApns(std::vector<sptr<ApnItem>> &matchApnItemList, const int32_t slotId)
587 {
588 bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId) > 0;
589 if (roamingState && !IsPreferredApnUserEdited()) {
590 TELEPHONY_LOGI("FetchDunApns: Dun apn is not used in roaming network");
591 return;
592 }
593 int32_t preferId = preferId_;
594 sptr<ApnItem> preferredApn = nullptr;
595 auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(), [preferId](auto &apn) {
596 return apn != nullptr && apn->attr_.profileId_ == preferId;
597 });
598 if (it != allApnItem_.end()) {
599 preferredApn = *it;
600 }
601 if (preferredApn != nullptr && preferredApn->CanDealWithType(DATA_CONTEXT_ROLE_DUN)) {
602 matchApnItemList.insert(matchApnItemList.begin(), preferredApn);
603 }
604 if (matchApnItemList.empty()) {
605 for (const auto &item : allApnItem_) {
606 if (item->CanDealWithType(DATA_CONTEXT_ROLE_DUN)) {
607 matchApnItemList.push_back(item);
608 }
609 }
610 }
611 }
612
IsPreferredApnUserEdited()613 bool ApnManager::IsPreferredApnUserEdited()
614 {
615 bool isUserEdited = false;
616 int32_t preferId = preferId_;
617 auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(), [preferId](auto &apn) {
618 return apn->attr_.profileId_ == preferId;
619 });
620 if (it != allApnItem_.end() && *it != nullptr) {
621 isUserEdited = (*it)->attr_.isEdited_;
622 }
623 return isUserEdited;
624 }
625
ClearAllApnBad()626 void ApnManager::ClearAllApnBad()
627 {
628 for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
629 if (apnHolder != nullptr) {
630 apnHolder->SetApnBadState(false);
631 }
632 }
633 }
634
TryMergeSimilarPdpProfile(std::vector<PdpProfile> & apnVec)635 void ApnManager::TryMergeSimilarPdpProfile(std::vector<PdpProfile> &apnVec)
636 {
637 // coalesce similar APNs to prevent bringing up two data calls with same interface
638 std::vector<PdpProfile> newApnVec;
639 for (size_t i = 0; i < apnVec.size(); i++) {
640 if (apnVec[i].profileId == -1) {
641 continue;
642 }
643 for (size_t j = i + 1; j < apnVec.size(); j++) {
644 if (ApnItem::IsSimilarPdpProfile(apnVec[i], apnVec[j])) {
645 MergePdpProfile(apnVec[i], apnVec[j]);
646 apnVec[j].profileId = -1;
647 }
648 }
649 newApnVec.push_back(apnVec[i]);
650 }
651 apnVec.assign(newApnVec.begin(), newApnVec.end());
652 }
653
MergePdpProfile(PdpProfile & newProfile,PdpProfile & oldProfile)654 void ApnManager::MergePdpProfile(PdpProfile &newProfile, PdpProfile &oldProfile)
655 {
656 newProfile.apnTypes = newProfile.apnTypes + ',' + oldProfile.apnTypes;
657 newProfile.pdpProtocol = (newProfile.pdpProtocol == PROTOCOL_IPV4V6) ?
658 newProfile.pdpProtocol : oldProfile.pdpProtocol;
659 newProfile.roamPdpProtocol = (newProfile.roamPdpProtocol == PROTOCOL_IPV4V6) ?
660 newProfile.roamPdpProtocol : oldProfile.roamPdpProtocol;
661 if (preferId_ == oldProfile.profileId) {
662 TELEPHONY_LOGI("preferId change from %{public}d to %{public}d", oldProfile.profileId, newProfile.profileId);
663 preferId_ = newProfile.profileId;
664 }
665 TELEPHONY_LOGI("merge %{public}d and %{public}d: apn[%{public}s], apnTypes[%{public}s]",
666 newProfile.profileId, oldProfile.profileId, newProfile.apn.c_str(), newProfile.apnTypes.c_str());
667 }
668
FindCapabilityByApnId(int32_t apnId)669 uint64_t ApnManager::FindCapabilityByApnId(int32_t apnId)
670 {
671 switch (apnId) {
672 case DATA_CONTEXT_ROLE_DEFAULT_ID:
673 return NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET;
674 case DATA_CONTEXT_ROLE_MMS_ID:
675 return NetManagerStandard::NetCap::NET_CAPABILITY_MMS;
676 case DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID:
677 return NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT;
678 case DATA_CONTEXT_ROLE_IA_ID:
679 return NetManagerStandard::NetCap::NET_CAPABILITY_IA;
680 case DATA_CONTEXT_ROLE_XCAP_ID:
681 return NetManagerStandard::NetCap::NET_CAPABILITY_XCAP;
682 case DATA_CONTEXT_ROLE_SUPL_ID:
683 return NetManagerStandard::NetCap::NET_CAPABILITY_SUPL;
684 case DATA_CONTEXT_ROLE_DUN_ID:
685 return NetManagerStandard::NetCap::NET_CAPABILITY_DUN;
686 case DATA_CONTEXT_ROLE_BIP_ID:
687 return NetManagerStandard::NetCap::NET_CAPABILITY_BIP;
688 default:
689 return NetManagerStandard::NetCap::NET_CAPABILITY_END;
690 }
691 }
692
GetPreferId(int32_t slotId)693 bool ApnManager::GetPreferId(int32_t slotId)
694 {
695 int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId);
696 if (simId <= INVALID_SIM_ID) {
697 TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId, simId);
698 return false;
699 }
700 auto helper = CellularDataRdbHelper::GetInstance();
701 if (helper == nullptr) {
702 TELEPHONY_LOGE("get cellularDataRdbHelper failed");
703 return false;
704 }
705 std::vector<PdpProfile> preferApnVec;
706 if (helper->QueryPreferApn(slotId, preferApnVec)) {
707 if (preferApnVec.size() > 0) {
708 preferId_ = preferApnVec[0].profileId;
709 TELEPHONY_LOGI("query preferId_ = %{public}d", preferId_);
710 } else {
711 TELEPHONY_LOGI("query prefer apn is null");
712 }
713 return true;
714 }
715 TELEPHONY_LOGE("query prefer apn fail");
716 return false;
717 }
718 } // namespace Telephony
719 } // namespace OHOS
720