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