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