• 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 "cellular_data_handler.h"
17 
18 #include "cellular_data_constant.h"
19 #include "cellular_data_error.h"
20 #include "cellular_data_hisysevent.h"
21 #include "cellular_data_service.h"
22 #include "cellular_data_settings_rdb_helper.h"
23 #include "cellular_data_types.h"
24 #include "cellular_data_utils.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "core_manager_inner.h"
28 #include "hitrace_meter.h"
29 #include "tel_ril_call_parcel.h"
30 #include "net_specifier.h"
31 #include "net_all_capabilities.h"
32 #include "radio_event.h"
33 #include "str_convert.h"
34 #include "string_ex.h"
35 #include "telephony_log_wrapper.h"
36 #include "telephony_ext_wrapper.h"
37 #include "telephony_permission.h"
38 #include "ipc_skeleton.h"
39 #include "connection_retry_policy.h"
40 #include "pdp_profile_data.h"
41 namespace OHOS {
42 namespace Telephony {
43 using namespace AppExecFwk;
44 using namespace OHOS::EventFwk;
45 using namespace NetManagerStandard;
46 static const int32_t ESM_FLAG_INVALID = -1;
47 const std::string DEFAULT_DATA_ROAMING = "persist.telephony.defaultdataroaming";
48 constexpr const char *PERSIST_EDM_MOBILE_DATA_POLICY = "persist.edm.mobile_data_policy";
49 constexpr const char *MOBILE_DATA_POLICY_FORCE_OPEN = "force_open";
50 constexpr const char *MOBILE_DATA_POLICY_DISALLOW = "disallow";
CellularDataHandler(const EventFwk::CommonEventSubscribeInfo & sp,int32_t slotId)51 CellularDataHandler::CellularDataHandler(const EventFwk::CommonEventSubscribeInfo &sp, int32_t slotId)
52     : TelEventHandler("CellularDataHandler"), CommonEventSubscriber(sp), slotId_(slotId)
53 {}
54 
Init()55 void CellularDataHandler::Init()
56 {
57     lastApnItem_ = new ApnItem();
58     apnManager_ = std::make_unique<ApnManager>().release();
59     dataSwitchSettings_ = std::make_unique<DataSwitchSettings>(slotId_);
60     connectionManager_ = std::make_unique<DataConnectionManager>(slotId_).release();
61     settingObserver_ = new (std::nothrow) CellularDataSettingObserver(
62         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())));
63     roamingObserver_ = new (std::nothrow) CellularDataRoamingObserver(
64         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())), slotId_);
65     incallObserver_ = new (std::nothrow) CellularDataIncallObserver(
66         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())));
67     cellularDataRdbObserver_ = new (std::nothrow) CellularDataRdbObserver(
68         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())));
69     airplaneObserver_ = new (std::nothrow) CellularDataAirplaneObserver();
70     if ((apnManager_ == nullptr) || (dataSwitchSettings_ == nullptr) || (connectionManager_ == nullptr)) {
71         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or dataSwitchSettings_ or connectionManager_ is null", slotId_);
72         return;
73     }
74     connectionManager_->Init();
75     apnManager_->InitApnHolders();
76     dataSwitchSettings_->LoadSwitchValue();
77     GetConfigurationFor5G();
78     SetRilLinkBandwidths();
79 }
80 
~CellularDataHandler()81 CellularDataHandler::~CellularDataHandler() {}
82 
ReleaseNet(const NetRequest & request)83 bool CellularDataHandler::ReleaseNet(const NetRequest &request)
84 {
85     std::unique_ptr<NetRequest> netRequest = std::make_unique<NetRequest>();
86     if (netRequest == nullptr) {
87         TELEPHONY_LOGE("Netrequest is null");
88         return false;
89     }
90     netRequest->capability = ApnManager::FindBestCapability(request.capability);
91     netRequest->ident = request.ident;
92     AppExecFwk::InnerEvent::Pointer event =
93         InnerEvent::Get(CellularDataEventCode::MSG_REQUEST_NETWORK, netRequest, TYPE_RELEASE_NET);
94     if (event == nullptr) {
95         TELEPHONY_LOGE("event is null");
96         return false;
97     }
98     return SendEvent(event);
99 }
100 
RequestNet(const NetRequest & request)101 bool CellularDataHandler::RequestNet(const NetRequest &request)
102 {
103     std::unique_ptr<NetRequest> netRequest = std::make_unique<NetRequest>();
104     if (netRequest == nullptr) {
105         TELEPHONY_LOGE("Netrequest is null");
106         return false;
107     }
108     netRequest->capability = ApnManager::FindBestCapability(request.capability);
109     netRequest->ident = request.ident;
110     netRequest->registerType = request.registerType;
111     netRequest->bearTypes = request.bearTypes;
112     netRequest->uid = request.uid;
113     AppExecFwk::InnerEvent::Pointer event =
114         InnerEvent::Get(CellularDataEventCode::MSG_REQUEST_NETWORK, netRequest, TYPE_REQUEST_NET);
115     return SendEvent(event);
116 }
117 
AddUid(const NetRequest & request)118 bool CellularDataHandler::AddUid(const NetRequest &request)
119 {
120     int32_t id = ApnManager::FindApnIdByCapability(ApnManager::FindBestCapability(request.capability));
121 
122     if (!apnManager_) {
123         TELEPHONY_LOGE("apnManager_ is nullptr");
124         return false;
125     }
126 
127     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
128     if (apnHolder == nullptr) {
129         TELEPHONY_LOGE("apnHolder is nullptr");
130         return false;
131     }
132     apnHolder->AddUid(request.uid);
133 
134     return true;
135 }
136 
RemoveUid(const NetRequest & request)137 bool CellularDataHandler::RemoveUid(const NetRequest &request)
138 {
139     int32_t id = ApnManager::FindApnIdByCapability(ApnManager::FindBestCapability(request.capability));
140 
141     if (!apnManager_) {
142         TELEPHONY_LOGE("apnManager_ is nullptr");
143         return false;
144     }
145 
146     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
147     if (apnHolder == nullptr) {
148         TELEPHONY_LOGE("apnHolder is nullptr");
149         return false;
150     }
151     apnHolder->RemoveUid(request.uid);
152     return true;
153 }
154 
SetCellularDataEnable(bool userDataOn)155 int32_t CellularDataHandler::SetCellularDataEnable(bool userDataOn)
156 {
157     if (dataSwitchSettings_ == nullptr) {
158         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
159         return TELEPHONY_ERR_LOCAL_PTR_NULL;
160     }
161     bool dataEnabled = true;
162     int32_t result = dataSwitchSettings_->QueryUserDataStatus(dataEnabled);
163     if (result != TELEPHONY_ERR_SUCCESS) {
164         TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result);
165         return result;
166     }
167     if (dataEnabled == userDataOn) {
168         TELEPHONY_LOGI("Slot%{public}d: The status of the cellular data switch has not changed", slotId_);
169         return TELEPHONY_ERR_SUCCESS;
170     }
171 
172 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
173     if (TELEPHONY_EXT_WRAPPER.sendDataSwitchChangeInfo_) {
174         int32_t callingUid = IPCSkeleton::GetCallingUid();
175         int32_t callingPid = IPCSkeleton::GetCallingPid();
176         std::string bundleName = "";
177         TelephonyPermission::GetBundleNameByUid(callingUid, bundleName);
178         TELEPHONY_EXT_WRAPPER.sendDataSwitchChangeInfo_(bundleName.c_str(), callingPid, userDataOn);
179     }
180 #endif
181     return dataSwitchSettings_->SetUserDataOn(userDataOn);
182 }
183 
SetIntelligenceSwitchEnable(bool userSwitchOn)184 int32_t CellularDataHandler::SetIntelligenceSwitchEnable(bool userSwitchOn)
185 {
186     if (dataSwitchSettings_ == nullptr) {
187         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
188         return TELEPHONY_ERR_LOCAL_PTR_NULL;
189     }
190     bool switchEnabled = false;
191     int32_t result = dataSwitchSettings_->QueryIntelligenceSwitchStatus(switchEnabled);
192     if (result != TELEPHONY_ERR_SUCCESS) {
193         TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result);
194     }
195     if (switchEnabled == userSwitchOn) {
196         TELEPHONY_LOGI("Slot%{public}d: The status of the cellular data switch has not changed", slotId_);
197         return TELEPHONY_ERR_SUCCESS;
198     }
199     return dataSwitchSettings_->SetIntelliSwitchOn(userSwitchOn);
200 }
201 
IsCellularDataEnabled(bool & dataEnabled) const202 int32_t CellularDataHandler::IsCellularDataEnabled(bool &dataEnabled) const
203 {
204     if (dataSwitchSettings_ == nullptr) {
205         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
206         return TELEPHONY_ERR_LOCAL_PTR_NULL;
207     }
208     if (dataSwitchSettings_->GetLastQryRet() != TELEPHONY_ERR_SUCCESS) {
209         return dataSwitchSettings_->QueryUserDataStatus(dataEnabled);
210     }
211     dataEnabled = dataSwitchSettings_->IsUserDataOn();
212     return TELEPHONY_ERR_SUCCESS;
213 }
214 
IsCellularDataRoamingEnabled(bool & dataRoamingEnabled) const215 int32_t CellularDataHandler::IsCellularDataRoamingEnabled(bool &dataRoamingEnabled) const
216 {
217     if (slotId_ != CELLULAR_DATA_VSIM_SLOT_ID) {
218         int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
219         if (simId <= INVALID_SIM_ID) {
220             TELEPHONY_LOGE("Slot%{public}d: invalid sim id %{public}d", slotId_, simId);
221             return TELEPHONY_ERR_LOCAL_PTR_NULL;
222         }
223     }
224     dataRoamingEnabled = defaultDataRoamingEnable_;
225     if (dataSwitchSettings_ == nullptr) {
226         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
227         return TELEPHONY_ERR_LOCAL_PTR_NULL;
228     }
229     dataSwitchSettings_->QueryUserDataRoamingStatus(dataRoamingEnabled);
230     return TELEPHONY_ERR_SUCCESS;
231 }
232 
GetIntelligenceSwitchState(bool & switchState)233 int32_t CellularDataHandler::GetIntelligenceSwitchState(bool &switchState)
234 {
235     if (dataSwitchSettings_ == nullptr) {
236         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
237         return TELEPHONY_ERR_LOCAL_PTR_NULL;
238     }
239     bool switchEnabled = false;
240     int32_t result = dataSwitchSettings_->QueryIntelligenceSwitchStatus(switchEnabled);
241     if (result != TELEPHONY_ERR_SUCCESS) {
242         TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result);
243     }
244     TELEPHONY_LOGI("GetIntelligenceSwitchState: %{public}d    -- %{public}d", switchState, switchEnabled);
245     switchState = switchEnabled;
246     return result;
247 }
248 
SetCellularDataRoamingEnabled(bool dataRoamingEnabled)249 int32_t CellularDataHandler::SetCellularDataRoamingEnabled(bool dataRoamingEnabled)
250 {
251     if (dataSwitchSettings_ == nullptr) {
252         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
253         return TELEPHONY_ERR_LOCAL_PTR_NULL;
254     }
255     bool currentDataRoamEnabled = defaultDataRoamingEnable_;
256     int32_t result = dataSwitchSettings_->QueryUserDataRoamingStatus(currentDataRoamEnabled);
257     if (result != TELEPHONY_ERR_SUCCESS) {
258         TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result);
259     }
260     if (currentDataRoamEnabled == dataRoamingEnabled) {
261         TELEPHONY_LOGI("Slot%{public}d: The status of the data roam switch has not changed", slotId_);
262         return TELEPHONY_ERR_SUCCESS;
263     }
264     return dataSwitchSettings_->SetUserDataRoamingOn(dataRoamingEnabled);
265 }
266 
ClearAllConnections(DisConnectionReason reason)267 void CellularDataHandler::ClearAllConnections(DisConnectionReason reason)
268 {
269     if (apnManager_ == nullptr) {
270         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
271         return;
272     }
273     for (const sptr<ApnHolder> &apn : apnManager_->GetAllApnHolder()) {
274         ClearConnection(apn, reason);
275     }
276 
277     if (connectionManager_ == nullptr) {
278         TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
279         return;
280     }
281     connectionManager_->StopStallDetectionTimer();
282     connectionManager_->EndNetStatistics();
283 
284     ResetDataFlowType();
285 }
286 
ClearConnectionsOnUpdateApns(DisConnectionReason reason)287 void CellularDataHandler::ClearConnectionsOnUpdateApns(DisConnectionReason reason)
288 {
289     if (apnManager_ == nullptr) {
290         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
291         return;
292     }
293     bool isRoaming = false;
294     int32_t result = IsCellularDataRoamingEnabled(isRoaming);
295     if (result != TELEPHONY_ERR_SUCCESS) {
296         isRoaming = false;
297     }
298     auto apnItem = apnManager_->GetRilAttachApn();
299     if (apnItem != nullptr) {
300         TELEPHONY_LOGI("update preferId=%{public}d", apnItem->attr_.profileId_);
301         UpdateApnInfo(apnItem->attr_.profileId_);
302     }
303     if (!ApnHolder::IsCompatibleApnItem(lastApnItem_, apnItem, isRoaming)) {
304         ClearAllConnections(reason);
305         if (lastApnItem_ == nullptr) {
306             lastApnItem_ = new ApnItem();
307         }
308         if (apnItem == nullptr) {
309             return;
310         }
311         *lastApnItem_ = *apnItem;
312     }
313 }
314 
ResetDataFlowType()315 void CellularDataHandler::ResetDataFlowType()
316 {
317     if (dataSwitchSettings_ == nullptr) {
318         TELEPHONY_LOGE("Slot%{public}d: in ClearAllConnections dataSwitchSettings_ is null", slotId_);
319         return;
320     }
321     bool dataEnabled = dataSwitchSettings_->IsUserDataOn();
322     if (!dataEnabled) {
323         connectionManager_->SetDataFlowType(CellDataFlowType::DATA_FLOW_TYPE_NONE);
324     }
325 }
326 
ClearConnection(const sptr<ApnHolder> & apn,DisConnectionReason reason)327 void CellularDataHandler::ClearConnection(const sptr<ApnHolder> &apn, DisConnectionReason reason)
328 {
329     if (apn == nullptr) {
330         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
331         return;
332     }
333     std::shared_ptr<CellularDataStateMachine> stateMachine = apn->GetCellularDataStateMachine();
334     if (stateMachine == nullptr) {
335         TELEPHONY_LOGD("Slot%{public}d: stateMachine is null", slotId_);
336         return;
337     }
338     TELEPHONY_LOGI("Slot%{public}d: The APN holder is of type %{public}s, reason:%{public}d",
339         slotId_, apn->GetApnType().c_str(), reason);
340     std::unique_ptr<DataDisconnectParams> object = std::make_unique<DataDisconnectParams>(apn->GetApnType(), reason);
341     if (object == nullptr) {
342         TELEPHONY_LOGE("Slot%{public}d: ClearConnection fail, object is null", slotId_);
343         return;
344     }
345     ApnProfileState apnState = apn->GetApnState();
346     if (apnState == ApnProfileState::PROFILE_STATE_IDLE ||
347         apnState == ApnProfileState::PROFILE_STATE_DISCONNECTING ||
348         apnState == ApnProfileState::PROFILE_STATE_RETRYING) {
349         TELEPHONY_LOGE("Slot%{public}d: apn state has been idle, disconnecting, or retrying", slotId_);
350         return;
351     }
352     apn->SetApnState(PROFILE_STATE_DISCONNECTING);
353     CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apn->GetApnType(),
354         apn->GetCapability(), static_cast<int32_t>(PROFILE_STATE_DISCONNECTING));
355     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_DISCONNECT, object);
356     stateMachine->SendEvent(event);
357 }
358 
GetCellularDataState() const359 ApnProfileState CellularDataHandler::GetCellularDataState() const
360 {
361     if (apnManager_ == nullptr) {
362         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
363         return ApnProfileState::PROFILE_STATE_IDLE;
364     }
365     return apnManager_->GetOverallApnState();
366 }
367 
GetCellularDataState(const std::string & apnType) const368 ApnProfileState CellularDataHandler::GetCellularDataState(const std::string &apnType) const
369 {
370     if (apnManager_ == nullptr) {
371         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
372         return ApnProfileState::PROFILE_STATE_IDLE;
373     }
374     sptr<ApnHolder> apnHolder = apnManager_->GetApnHolder(apnType);
375     if (apnHolder == nullptr) {
376         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
377         return ApnProfileState::PROFILE_STATE_IDLE;
378     }
379     return apnHolder->GetApnState();
380 }
381 
RadioPsConnectionAttached(const InnerEvent::Pointer & event)382 void CellularDataHandler::RadioPsConnectionAttached(const InnerEvent::Pointer &event)
383 {
384     TELEPHONY_LOGI("Slot%{public}d: ps attached", slotId_);
385     if (event == nullptr || apnManager_ == nullptr) {
386         TELEPHONY_LOGE("Slot%{public}d: event or apnManager_ is null", slotId_);
387         return;
388     }
389     EstablishAllApnsIfConnectable();
390 }
391 
RoamingStateOn(const InnerEvent::Pointer & event)392 void CellularDataHandler::RoamingStateOn(const InnerEvent::Pointer &event)
393 {
394     TELEPHONY_LOGI("Slot%{public}d: roaming on", slotId_);
395     if (event == nullptr || dataSwitchSettings_ == nullptr || apnManager_ == nullptr) {
396         TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ or apnManager_ is null", slotId_);
397         return;
398     }
399     bool roamingState = false;
400     if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) {
401         roamingState = true;
402     }
403     if (!roamingState) {
404         TELEPHONY_LOGE("Slot%{public}d: device not currently roaming state", slotId_);
405         return;
406     }
407     bool dataRoamingEnabled = false;
408     int32_t res = IsCellularDataRoamingEnabled(dataRoamingEnabled);
409     if (res != TELEPHONY_ERR_SUCCESS) {
410         dataRoamingEnabled = false;
411     }
412     ApnProfileState apnState = apnManager_->GetOverallApnState();
413     if ((apnState == ApnProfileState::PROFILE_STATE_CONNECTING || apnState == ApnProfileState::PROFILE_STATE_CONNECTED)
414         && !dataRoamingEnabled) {
415         ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
416     }
417     EstablishAllApnsIfConnectable();
418 }
419 
RoamingStateOff(const InnerEvent::Pointer & event)420 void CellularDataHandler::RoamingStateOff(const InnerEvent::Pointer &event)
421 {
422     TELEPHONY_LOGI("Slot%{public}d: roaming off", slotId_);
423     if (event == nullptr || dataSwitchSettings_ == nullptr || apnManager_ == nullptr) {
424         TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ or apnManager_ is null", slotId_);
425         return;
426     }
427     bool dataRoamingEnabled = false;
428     int32_t res = IsCellularDataRoamingEnabled(dataRoamingEnabled);
429     if (res != TELEPHONY_ERR_SUCCESS) {
430         dataRoamingEnabled = false;
431     }
432     if (!dataRoamingEnabled) {
433         ApnProfileState apnState = apnManager_->GetOverallApnState();
434         if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
435             apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
436             ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
437         }
438         EstablishAllApnsIfConnectable();
439     }
440 }
441 
PsRadioEmergencyStateOpen(const InnerEvent::Pointer & event)442 void CellularDataHandler::PsRadioEmergencyStateOpen(const InnerEvent::Pointer &event)
443 {
444     TELEPHONY_LOGI("Slot%{public}d: emergency on", slotId_);
445     ApnProfileState currentState = apnManager_->GetOverallApnState();
446     if (currentState == ApnProfileState::PROFILE_STATE_CONNECTED ||
447         currentState == ApnProfileState::PROFILE_STATE_CONNECTING) {
448         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
449     }
450 }
451 
PsRadioEmergencyStateClose(const InnerEvent::Pointer & event)452 void CellularDataHandler::PsRadioEmergencyStateClose(const InnerEvent::Pointer &event)
453 {
454     TELEPHONY_LOGI("Slot%{public}d: emergency off", slotId_);
455     ApnProfileState currentState = apnManager_->GetOverallApnState();
456     if (currentState == ApnProfileState::PROFILE_STATE_IDLE ||
457         currentState == ApnProfileState::PROFILE_STATE_DISCONNECTING) {
458         EstablishAllApnsIfConnectable();
459     }
460 }
461 
EstablishAllApnsIfConnectable()462 void CellularDataHandler::EstablishAllApnsIfConnectable()
463 {
464     if (apnManager_ == nullptr) {
465         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
466         return;
467     }
468     apnManager_->ClearAllApnBad();
469     for (sptr<ApnHolder> apnHolder : apnManager_->GetSortApnHolder()) {
470         if (apnHolder == nullptr) {
471             TELEPHONY_LOGE("Slot%{public}d: apn is null", slotId_);
472             continue;
473         }
474         if (apnHolder->IsDataCallEnabled()) {
475             UpdateCellularDataConnectState(apnHolder->GetApnType());
476             ApnProfileState apnState = apnHolder->GetApnState();
477             if (apnState == PROFILE_STATE_FAILED || apnState == PROFILE_STATE_RETRYING) {
478                 apnHolder->ReleaseDataConnection();
479             }
480             AttemptEstablishDataConnection(apnHolder);
481         }
482     }
483 }
484 
SetDataPermittedForMms(bool dataPermittedForMms)485 bool CellularDataHandler::SetDataPermittedForMms(bool dataPermittedForMms)
486 {
487     if (incallDataStateMachine_ != nullptr) {
488         TELEPHONY_LOGI("Slot%{public}d: incall data active", slotId_);
489         return false;
490     }
491     if (CheckDataPermittedByDsds()) {
492         TELEPHONY_LOGI("Slot%{public}d: data permitted", slotId_);
493         return false;
494     }
495     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
496     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
497     SetDataPermitted(defSlotId, !dataPermittedForMms);
498 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
499     if (TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_()) {
500         SetDataPermitted(CELLULAR_DATA_VSIM_SLOT_ID, !dataPermittedForMms);
501     }
502 #endif
503     SetDataPermitted(slotId_, dataPermittedForMms);
504     DelayedRefSingleton<CellularDataService>::GetInstance().ChangeConnectionForDsds(defSlotId, !dataPermittedForMms);
505     return true;
506 }
507 
CheckDataPermittedByDsds()508 bool CellularDataHandler::CheckDataPermittedByDsds()
509 {
510     if (TELEPHONY_EXT_WRAPPER.getVSimSlotId_) {
511         int vSimSlotId = INVALID_SLOT_ID;
512         TELEPHONY_EXT_WRAPPER.getVSimSlotId_(vSimSlotId);
513         if (vSimSlotId == CELLULAR_DATA_VSIM_SLOT_ID && slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
514             return true;
515         }
516     }
517     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
518     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
519     int32_t dsdsMode = DSDS_MODE_V2;
520     coreInner.GetDsdsMode(dsdsMode);
521     if (defSlotId != slotId_ && dsdsMode == DSDS_MODE_V2) {
522         TELEPHONY_LOGI("Slot%{public}d: default:%{public}d, current:%{public}d, dsdsMode:%{public}d", slotId_,
523             defSlotId, slotId_, dsdsMode);
524         return false;
525     }
526     return true;
527 }
528 
CheckCellularDataSlotId(sptr<ApnHolder> & apnHolder)529 bool CellularDataHandler::CheckCellularDataSlotId(sptr<ApnHolder> &apnHolder)
530 {
531     if (apnHolder == nullptr) {
532         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
533         return false;
534     }
535     if (IsVSimSlotId(slotId_)) {
536         return true;
537     }
538     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
539     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
540     std::string apnType = apnHolder->GetApnType();
541     if (defSlotId != slotId_ && !apnType.compare(DATA_CONTEXT_ROLE_INTERNAL_DEFAULT)) {
542         TELEPHONY_LOGD("Slot%{public}d: internalDefault:%{public}d, current:%{public}d", slotId_, defSlotId, slotId_);
543         return false;
544     }
545 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
546     if (slotId_ != CELLULAR_DATA_VSIM_SLOT_ID && !apnHolder->IsMmsType() &&
547         TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_() &&
548         TELEPHONY_EXT_WRAPPER.isVSimInDisableProcess_ && !TELEPHONY_EXT_WRAPPER.isVSimInDisableProcess_()) {
549         TELEPHONY_LOGE("slot%{public}d, VSimEnabled & not mms type, ret false", slotId_);
550         return false;
551     }
552     if (TELEPHONY_EXT_WRAPPER.isDualCellularCardAllowed_) {
553         if (TELEPHONY_EXT_WRAPPER.isDualCellularCardAllowed_()) {
554             return true;
555         }
556     }
557 #endif
558 
559     if (defSlotId != slotId_ && !apnType.compare(DATA_CONTEXT_ROLE_DEFAULT)) {
560         TELEPHONY_LOGD("Slot%{public}d: default:%{public}d, current:%{public}d", slotId_, defSlotId, slotId_);
561         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
562             CellularDataErrorCode::DATA_ERROR_CELLULAR_DATA_SLOT_ID_MISMATCH,
563             "Default cellular data slot id is not current slot id");
564         return false;
565     }
566     return true;
567 }
568 
CheckAttachAndSimState(sptr<ApnHolder> & apnHolder)569 bool CellularDataHandler::CheckAttachAndSimState(sptr<ApnHolder> &apnHolder)
570 {
571     if (apnHolder == nullptr) {
572         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
573         return false;
574     }
575     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
576     bool attached = coreInner.GetPsRegState(slotId_) == (int32_t)RegServiceState::REG_STATE_IN_SERVICE;
577     bool isSimStateReadyOrLoaded = IsSimStateReadyOrLoaded();
578     TELEPHONY_LOGD("Slot%{public}d: attached: %{public}d simState: %{public}d isRilApnAttached: %{public}d",
579         slotId_, attached, isSimStateReadyOrLoaded, isRilApnAttached_);
580     if (apnHolder->IsMmsType() && isSimStateReadyOrLoaded && !attached) {
581         if (!HasInnerEvent(CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT)) {
582             SendEvent(CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT,
583                 apnHolder->IsMmsType(), RESUME_DATA_PERMITTED_TIMEOUT);
584         }
585         SetDataPermittedForMms(true);
586         return false;
587     }
588     bool isEmergencyApn = apnHolder->IsEmergencyType();
589     if (!isEmergencyApn && !attached) {
590         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
591             CellularDataErrorCode::DATA_ERROR_PS_NOT_ATTACH, "It is not emergencyApn and not attached");
592         return false;
593     }
594     if (!isEmergencyApn && !isSimStateReadyOrLoaded) {
595         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
596             CellularDataErrorCode::DATA_ERROR_SIM_NOT_READY, "It is not emergencyApn and sim not ready");
597         return false;
598     }
599     return isEmergencyApn || isSimStateReadyOrLoaded;
600 }
601 
CheckRoamingState(sptr<ApnHolder> & apnHolder)602 bool CellularDataHandler::CheckRoamingState(sptr<ApnHolder> &apnHolder)
603 {
604     if (dataSwitchSettings_ == nullptr || apnHolder == nullptr) {
605         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ or apnManager_ is null", slotId_);
606         return false;
607     }
608     if (IsVSimSlotId(slotId_)) {
609         return true;
610     }
611     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
612     bool isEmergencyApn = apnHolder->IsEmergencyType();
613     bool isMmsApn = apnHolder->IsMmsType();
614     bool isBipApn = apnHolder->IsBipType();
615     bool isAllowActiveData = dataSwitchSettings_->IsAllowActiveData();
616     bool roamingState = coreInner.GetPsRoamingState(slotId_) > 0;
617     bool dataRoamingEnabled = dataSwitchSettings_->IsUserDataRoamingOn();
618     if (roamingState && !dataRoamingEnabled) {
619         isAllowActiveData = false;
620     } else if (isMmsApn || isBipApn) {
621         isAllowActiveData = true;
622     }
623     if (isEmergencyApn) {
624         isAllowActiveData = true;
625     }
626 
627 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
628     if (TELEPHONY_EXT_WRAPPER.isApnAllowedActive_) {
629         std::string apnHolderType = apnHolder->GetApnType();
630         isAllowActiveData =
631             TELEPHONY_EXT_WRAPPER.isApnAllowedActive_(slotId_, apnHolderType.c_str(), isAllowActiveData);
632     }
633 #endif
634 
635     if (!isAllowActiveData) {
636         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
637             CellularDataErrorCode::DATA_ERROR_ROAMING_SWITCH_OFF_AND_ROAMING, "Data roaming is not on and is roaming");
638         TELEPHONY_LOGD("Slot%{public}d: AllowActiveData:%{public}d lastCallState_:%{public}d", slotId_,
639             isAllowActiveData, lastCallState_);
640         return false;
641     }
642     if (IsRestrictedMode()) {
643         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
644             CellularDataErrorCode::DATA_ERROR_CALL_AND_DATA_NOT_CONCURRENCY,
645             "CS call and data are not allowed concurrency");
646         TELEPHONY_LOGD("Slot%{public}d: AllowActiveData:%{public}d lastCallState_:%{public}d", slotId_,
647             isAllowActiveData, lastCallState_);
648         return false;
649     }
650     return true;
651 }
652 
CheckApnState(sptr<ApnHolder> & apnHolder)653 bool CellularDataHandler::CheckApnState(sptr<ApnHolder> &apnHolder)
654 {
655     if (apnManager_ == nullptr || apnHolder == nullptr) {
656         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or apnManager_ is null", slotId_);
657         return false;
658     }
659     if (apnHolder->GetApnState() == PROFILE_STATE_DISCONNECTING &&
660         !HasInnerEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION)) {
661         TELEPHONY_LOGI("Slot%{public}d: APN holder is disconnecting", slotId_);
662         int32_t id = apnManager_->FindApnIdByApnName(apnHolder->GetApnType());
663         SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id, ESTABLISH_DATA_CONNECTION_DELAY);
664         return false;
665     }
666     if (apnHolder->GetApnState() == PROFILE_STATE_RETRYING) {
667         TELEPHONY_LOGI("during retry, check state fail");
668         return false;
669     }
670     if (apnHolder->GetApnState() == PROFILE_STATE_FAILED) {
671         apnHolder->SetApnState(PROFILE_STATE_IDLE);
672     }
673     if (apnHolder->GetApnState() != PROFILE_STATE_IDLE) {
674         TELEPHONY_LOGD("Slot%{public}d: APN holder is not idle, apn state is %{public}d",
675             slotId_, apnHolder->GetApnState());
676         return false;
677     }
678     std::vector<sptr<ApnItem>> matchedApns = apnManager_->FilterMatchedApns(apnHolder->GetApnType(), slotId_);
679     if (matchedApns.empty()) {
680         TELEPHONY_LOGE("Slot%{public}d: AttemptEstablishDataConnection:matchedApns is empty", slotId_);
681         return false;
682     }
683     apnHolder->SetAllMatchedApns(matchedApns);
684     return true;
685 }
686 
AttemptEstablishDataConnection(sptr<ApnHolder> & apnHolder)687 void CellularDataHandler::AttemptEstablishDataConnection(sptr<ApnHolder> &apnHolder)
688 {
689     if ((airplaneObserver_ != nullptr) && (airplaneObserver_->IsAirplaneModeOn())) {
690         return;
691     }
692     if (!CheckCellularDataSlotId(apnHolder) || !CheckAttachAndSimState(apnHolder) || !CheckRoamingState(apnHolder)) {
693         return;
694     }
695     DelayedSingleton<CellularDataHiSysEvent>::GetInstance()->SetCellularDataActivateStartTime();
696     StartTrace(HITRACE_TAG_OHOS, "ActivateCellularData");
697     if (!CheckApnState(apnHolder)) {
698         FinishTrace(HITRACE_TAG_OHOS);
699         return;
700     }
701     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
702     int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
703     coreInner.GetPsRadioTech(slotId_, radioTech);
704     if (!EstablishDataConnection(apnHolder, radioTech)) {
705         TELEPHONY_LOGE("Slot%{public}d: Establish data connection fail", slotId_);
706     }
707     FinishTrace(HITRACE_TAG_OHOS);
708     DelayedSingleton<CellularDataHiSysEvent>::GetInstance()->JudgingDataActivateTimeOut(slotId_, SWITCH_ON);
709 }
710 
FindIdleCellularDataConnection() const711 std::shared_ptr<CellularDataStateMachine> CellularDataHandler::FindIdleCellularDataConnection() const
712 {
713     if (connectionManager_ == nullptr) {
714         TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
715         return nullptr;
716     }
717     std::vector<std::shared_ptr<CellularDataStateMachine>> allMachines = connectionManager_->GetAllConnectionMachine();
718     for (const std::shared_ptr<CellularDataStateMachine> &connect : allMachines) {
719         if (connect == nullptr || apnManager_ == nullptr) {
720             TELEPHONY_LOGE("Slot%{public}d: CellularDataHandler:stateMachine or apnManager_ is null", slotId_);
721             return nullptr;
722         }
723         if (connect->IsInactiveState() && apnManager_->IsDataConnectionNotUsed(connect)) {
724             return connect;
725         }
726     }
727     return nullptr;
728 }
729 
CreateCellularDataConnect()730 std::shared_ptr<CellularDataStateMachine> CellularDataHandler::CreateCellularDataConnect()
731 {
732     std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = std::make_shared<CellularDataStateMachine>(
733         connectionManager_, std::static_pointer_cast<TelEventHandler>(shared_from_this()));
734     if (cellularDataStateMachine == nullptr) {
735         TELEPHONY_LOGE("Slot%{public}d: cellularDataStateMachine is null", slotId_);
736         return nullptr;
737     }
738     return cellularDataStateMachine;
739 }
740 
EstablishDataConnection(sptr<ApnHolder> & apnHolder,int32_t radioTech)741 bool CellularDataHandler::EstablishDataConnection(sptr<ApnHolder> &apnHolder, int32_t radioTech)
742 {
743     int32_t profileId = GetCurrentApnId();
744     sptr<ApnItem> apnItem = apnManager_->GetApnItemById(profileId);
745     if (apnItem == nullptr) {
746         TELEPHONY_LOGD("profileId: %{public}d: apnItem is null", profileId);
747         apnItem = apnHolder->GetNextRetryApn();
748     }
749     if (apnItem == nullptr) {
750         TELEPHONY_LOGE("Slot%{public}d: apnItem is null", slotId_);
751         return false;
752     }
753     std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = nullptr;
754     if ((apnHolder->GetApnType() != DATA_CONTEXT_ROLE_DEFAULT) &&
755         (apnHolder->GetApnType() != DATA_CONTEXT_ROLE_INTERNAL_DEFAULT)) {
756         cellularDataStateMachine = CheckForCompatibleDataConnection(apnHolder);
757         if (cellularDataStateMachine != nullptr) {
758             sptr<ApnItem> dcApnItem = cellularDataStateMachine->GetApnItem();
759             if (dcApnItem != nullptr) {
760                 apnItem = dcApnItem;
761             }
762         }
763     }
764     if (cellularDataStateMachine == nullptr) {
765         if (IsSingleConnectionEnabled(radioTech)) {
766             if (HasAnyHigherPriorityConnection(apnHolder)) {
767                 TELEPHONY_LOGE("Slot%{public}d: has higher priority connection", slotId_);
768                 return false;
769             }
770             ApnProfileState apnState = apnManager_->GetOverallApnState();
771             if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
772                 apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
773                 ClearAllConnections(DisConnectionReason::REASON_CHANGE_CONNECTION);
774                 return false;
775             }
776         }
777         cellularDataStateMachine = FindIdleCellularDataConnection();
778         if (cellularDataStateMachine == nullptr) {
779             cellularDataStateMachine = CreateCellularDataConnect();
780             if (cellularDataStateMachine == nullptr) {
781                 TELEPHONY_LOGE("Slot%{public}d: cellularDataStateMachine is null", slotId_);
782                 return false;
783             }
784             cellularDataStateMachine->Init();
785             if (connectionManager_ == nullptr) {
786                 TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
787                 return false;
788             }
789             connectionManager_->AddConnectionStateMachine(cellularDataStateMachine);
790         }
791     } else {
792         return HandleCompatibleDataConnection(cellularDataStateMachine, apnHolder);
793     }
794     cellularDataStateMachine->SetCapability(apnHolder->GetCapability());
795     apnHolder->SetCurrentApn(apnItem);
796     apnHolder->SetApnState(PROFILE_STATE_CONNECTING);
797     CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(),
798         apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_CONNECTING));
799     apnHolder->SetCellularDataStateMachine(cellularDataStateMachine);
800     bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0;
801     bool userDataRoaming = dataSwitchSettings_->IsUserDataRoamingOn();
802     UpdateCellularDataConnectState(apnHolder->GetApnType());
803     std::unique_ptr<DataConnectionParams> object = std::make_unique<DataConnectionParams>(
804         apnHolder, apnItem->attr_.profileId_, radioTech, roamingState, userDataRoaming, true);
805     TELEPHONY_LOGI("Slot%{public}d: MSG_SM_CONNECT profileId:%{public}d type:%{public}s networkType:%{public}d",
806         slotId_, apnItem->attr_.profileId_, apnHolder->GetApnType().c_str(), radioTech);
807     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_CONNECT, object);
808     if (event == nullptr) {
809         TELEPHONY_LOGE("event is null");
810         return false;
811     }
812     cellularDataStateMachine->SendEvent(event);
813     SetApnActivateStart(apnHolder->GetApnType());
814     return true;
815 }
816 
HandleCompatibleDataConnection(std::shared_ptr<CellularDataStateMachine> stateMachine,const sptr<ApnHolder> & apnHolder)817 bool CellularDataHandler::HandleCompatibleDataConnection(
818     std::shared_ptr<CellularDataStateMachine> stateMachine, const sptr<ApnHolder> &apnHolder)
819 {
820     TELEPHONY_LOGI("Enter HandleCompatibleDataConnection");
821     int32_t oldApnId = ApnManager::FindApnIdByCapability(stateMachine->GetCapability());
822     int32_t newApnId = ApnManager::FindApnIdByCapability(apnHolder->GetCapability());
823     apnHolder->ReleaseAllCellularData();
824     if (stateMachine->IsActiveState()) {
825         TELEPHONY_LOGI("set reuse apnId[%{public}d] for apnId[%{public}d]", newApnId, oldApnId);
826         stateMachine->SetReuseApnCap(apnHolder->GetCapability());
827         stateMachine->SetIfReuseSupplierId(true);
828         return true;
829     }
830     SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, newApnId, ESTABLISH_DATA_CONNECTION_DELAY);
831     return false;
832 }
833 
EstablishDataConnectionComplete(const InnerEvent::Pointer & event)834 void CellularDataHandler::EstablishDataConnectionComplete(const InnerEvent::Pointer &event)
835 {
836     if (event == nullptr) {
837         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
838         return;
839     }
840     std::shared_ptr<SetupDataCallResultInfo> resultInfo = event->GetSharedObject<SetupDataCallResultInfo>();
841     if ((resultInfo != nullptr) && (apnManager_ != nullptr)) {
842         TELEPHONY_LOGI("EstablishDataConnectionComplete reason: %{public}d, flag: %{public}d",
843             resultInfo->reason, resultInfo->flag);
844         SetApnActivateEnd(resultInfo);
845         sptr<ApnHolder> apnHolder = apnManager_->GetApnHolder(apnManager_->FindApnNameByApnId(resultInfo->flag));
846         if (apnHolder == nullptr) {
847             TELEPHONY_LOGE("Slot%{public}d: flag:%{public}d complete apnHolder is null", slotId_, resultInfo->flag);
848             return;
849         }
850         apnHolder->SetApnState(PROFILE_STATE_CONNECTED);
851         CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(),
852             apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_CONNECTED));
853         apnHolder->InitialApnRetryCount();
854         if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DEFAULT) {
855             TELEPHONY_LOGI("default apn has connected, to setup internal_default apn");
856             SendEvent(CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL, DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID, 0);
857         }
858         DataConnCompleteUpdateState(apnHolder, resultInfo);
859     }
860 }
861 
DataConnCompleteUpdateState(const sptr<ApnHolder> & apnHolder,const std::shared_ptr<SetupDataCallResultInfo> & resultInfo)862 void CellularDataHandler::DataConnCompleteUpdateState(const sptr<ApnHolder> &apnHolder,
863     const std::shared_ptr<SetupDataCallResultInfo> &resultInfo)
864 {
865     std::shared_ptr<CellularDataStateMachine> stateMachine = apnHolder->GetCellularDataStateMachine();
866     if (stateMachine != nullptr) {
867         std::string proxyIpAddress = "";
868         sptr<ApnItem> attachApn = apnManager_->GetRilAttachApn();
869         if (attachApn != nullptr) {
870             proxyIpAddress = attachApn->attr_.proxyIpAddress_;
871         }
872         stateMachine->UpdateHttpProxy(proxyIpAddress);
873         stateMachine->UpdateNetworkInfo(*resultInfo);
874     } else {
875         apnHolder->SetApnState(PROFILE_STATE_IDLE);
876         TELEPHONY_LOGE(
877             "Slot%{public}d:update network info stateMachine(%{public}d) is null", slotId_, resultInfo->flag);
878     }
879     if (connectionManager_ != nullptr) {
880         connectionManager_->StartStallDetectionTimer();
881         connectionManager_->BeginNetStatistics();
882     }
883     if (!physicalConnectionActiveState_) {
884         physicalConnectionActiveState_ = true;
885         CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
886     }
887     if (incallDataStateMachine_ != nullptr) {
888         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DATA_CONNECTED);
889         incallDataStateMachine_->SendEvent(incallEvent);
890     }
891     UpdateCellularDataConnectState(apnHolder->GetApnType());
892     if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DEFAULT) {
893         TELEPHONY_LOGI("update default apn info");
894         UpdateApnInfo(apnHolder->GetCurrentApn()->attr_.profileId_);
895     }
896     if (apnHolder->IsMmsType()) {
897         RemoveEvent(CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT);
898     }
899 }
900 
CreatorDataShareHelper()901 std::shared_ptr<DataShare::DataShareHelper> CellularDataHandler::CreatorDataShareHelper()
902 {
903     sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
904     if (saManager == nullptr) {
905         TELEPHONY_LOGE("saManager is nullptr.");
906         return nullptr;
907     }
908     sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(TELEPHONY_CELLULAR_DATA_SYS_ABILITY_ID);
909     if (remoteObj == nullptr) {
910         TELEPHONY_LOGE("remoteObj is nullptr.");
911         return nullptr;
912     }
913     return DataShare::DataShareHelper::Creator(remoteObj, CELLULAR_DATA_RDB_URI);
914 }
915 
GetCurrentDataShareApnInfo(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t simId,int32_t & profileIdValue)916 bool CellularDataHandler::GetCurrentDataShareApnInfo(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
917     const int32_t simId, int32_t &profileIdValue)
918 {
919     Uri preferApnUri(std::string(CELLULAR_DATA_RDB_PREFER) + "?simId=" + std::to_string(simId));
920     DataShare::DataSharePredicates predicates;
921     std::vector<std::string> columns;
922     std::shared_ptr<DataShare::DataShareResultSet> resultSet =
923         dataShareHelper->Query(preferApnUri, predicates, columns);
924     if (resultSet == nullptr) {
925         TELEPHONY_LOGI("Query CurrentDataShareApnInfo resultSet is nullptr.");
926         return false;
927     }
928     int count = 0;
929     resultSet->GetRowCount(count);
930     if (count <= 0) {
931         TELEPHONY_LOGI("GetRowCount is NULL.");
932         resultSet->Close();
933         return false;
934     }
935     int columnIndex = 0;
936     resultSet->GoToFirstRow();
937     resultSet->GetColumnIndex(PdpProfileData::PROFILE_ID, columnIndex);
938     resultSet->GetInt(columnIndex, profileIdValue);
939     resultSet->Close();
940     return true;
941 }
942 
UpdateApnInfo(const int32_t profileId)943 void CellularDataHandler::UpdateApnInfo(const int32_t profileId)
944 {
945     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
946     if (simId <= INVALID_SIM_ID) {
947         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
948         return;
949     }
950     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreatorDataShareHelper();
951     if (dataShareHelper == nullptr) {
952         TELEPHONY_LOGE("dataShareHelper is nullptr.");
953         return;
954     }
955     int32_t profileIdValue = 0;
956     if (!GetCurrentDataShareApnInfo(dataShareHelper, simId, profileIdValue)) {
957         TELEPHONY_LOGE("GetCurrentDataShareApnInfo fail.");
958         dataShareHelper->Release();
959         return;
960     }
961     if (profileIdValue != profileId) {
962         DataShare::DataSharePredicates predicates;
963         DataShare::DataShareValuesBucket values;
964         double profileIdAsDouble = static_cast<double>(profileId);
965         double simIdAsDouble = static_cast<double>(simId);
966         values.Put(PdpProfileData::PROFILE_ID, profileIdAsDouble);
967         values.Put(PdpProfileData::SIM_ID, simIdAsDouble);
968         Uri uri(CELLULAR_DATA_RDB_PREFER);
969         int32_t result = dataShareHelper->Update(uri, predicates, values);
970         if (result < TELEPHONY_ERR_SUCCESS) {
971             TELEPHONY_LOGE("UpdateApnInfo fail! result:%{public}d", result);
972         }
973     }
974     dataShareHelper->Release();
975 }
976 
GetCurrentApnId()977 int32_t CellularDataHandler::GetCurrentApnId()
978 {
979     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
980     if (simId <= INVALID_SIM_ID) {
981         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
982         return 0;
983     }
984     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreatorDataShareHelper();
985     if (dataShareHelper == nullptr) {
986         TELEPHONY_LOGE("dataShareHelper is nullptr.");
987         return 0;
988     }
989     int32_t profileIdValue = 0;
990     if (!GetCurrentDataShareApnInfo(dataShareHelper, simId, profileIdValue)) {
991         TELEPHONY_LOGE("GetCurrentDataShareApnInfo fail.");
992     }
993     dataShareHelper->Release();
994     return profileIdValue;
995 }
996 
GetSlotId() const997 int32_t CellularDataHandler::GetSlotId() const
998 {
999     return slotId_;
1000 }
1001 
DisconnectDataComplete(const InnerEvent::Pointer & event)1002 void CellularDataHandler::DisconnectDataComplete(const InnerEvent::Pointer &event)
1003 {
1004     if (event == nullptr || apnManager_ == nullptr || connectionManager_ == nullptr) {
1005         TELEPHONY_LOGE("Slot%{public}d: event or apnManager or connectionManager_ is null", slotId_);
1006         return;
1007     }
1008     auto netInfo = event->GetSharedObject<SetupDataCallResultInfo>();
1009     if (netInfo == nullptr) {
1010         TELEPHONY_LOGE("Slot%{public}d: netInfo is null", slotId_);
1011         return;
1012     }
1013     int32_t apnId = netInfo->flag;
1014     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(apnId);
1015     if (apnHolder == nullptr) {
1016         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null, apnId is %{public}d", slotId_, apnId);
1017         return;
1018     }
1019     DisConnectionReason reason = ConnectionRetryPolicy::ConvertPdpErrorToDisconnReason(netInfo->reason);
1020     auto stateMachine = apnHolder->GetCellularDataStateMachine();
1021     if (stateMachine == nullptr) {
1022         apnHolder->SetApnState(PROFILE_STATE_IDLE);
1023         TELEPHONY_LOGE("stateMachine is null");
1024         return;
1025     }
1026     stateMachine->UpdateNetworkInfo(*netInfo);
1027     connectionManager_->RemoveActiveConnectionByCid(stateMachine->GetCid());
1028     apnHolder->SetCellularDataStateMachine(nullptr);
1029     apnHolder->SetApnState(PROFILE_STATE_IDLE);
1030     CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(),
1031         apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_IDLE));
1032     UpdateCellularDataConnectState(apnHolder->GetApnType());
1033     UpdatePhysicalConnectionState(connectionManager_->isNoActiveConnection());
1034     if (apnHolder->IsDataCallEnabled()) {
1035         RetryOrClearConnection(apnHolder, reason, netInfo);
1036     } else {
1037 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1038         NotifyReqCellularData(false);
1039 #endif
1040     }
1041     if (!apnManager_->HasAnyConnectedState()) {
1042         connectionManager_->StopStallDetectionTimer();
1043         connectionManager_->EndNetStatistics();
1044         if (incallDataStateMachine_ != nullptr) {
1045             auto incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DATA_DISCONNECTED);
1046             incallDataStateMachine_->SendEvent(incallEvent);
1047         }
1048     }
1049     if (reason == DisConnectionReason::REASON_CHANGE_CONNECTION) {
1050         HandleSortConnection();
1051     }
1052     HandleDisconnectDataCompleteForMmsType(apnHolder);
1053 }
1054 
HandleDisconnectDataCompleteForMmsType(sptr<ApnHolder> & apnHolder)1055 void CellularDataHandler::HandleDisconnectDataCompleteForMmsType(sptr<ApnHolder> &apnHolder)
1056 {
1057     if (apnHolder->IsMmsType()) {
1058         SetDataPermittedForMms(false);
1059         RemoveEvent(CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT);
1060     }
1061 }
1062 
RetryOrClearConnection(const sptr<ApnHolder> & apnHolder,DisConnectionReason reason,const std::shared_ptr<SetupDataCallResultInfo> & netInfo)1063 void CellularDataHandler::RetryOrClearConnection(const sptr<ApnHolder> &apnHolder, DisConnectionReason reason,
1064     const std::shared_ptr<SetupDataCallResultInfo> &netInfo)
1065 {
1066     if (apnHolder == nullptr || netInfo == nullptr || apnManager_ == nullptr) {
1067         return;
1068     }
1069     ConnectionRetryPolicy::RestartRadioIfRequired(netInfo->reason, slotId_);
1070     if (reason == DisConnectionReason::REASON_CLEAR_CONNECTION) {
1071         TELEPHONY_LOGI("clear connection");
1072         ClearConnection(apnHolder, reason);
1073 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1074         NotifyReqCellularData(false);
1075 #endif
1076     } else if (reason == DisConnectionReason::REASON_PERMANENT_REJECT) {
1077         TELEPHONY_LOGI("permannent reject, mark bad and clear connection");
1078         apnHolder->SetApnBadState(true);
1079         ClearConnection(apnHolder, DisConnectionReason::REASON_CLEAR_CONNECTION);
1080     } else if (reason == DisConnectionReason::REASON_RETRY_CONNECTION) {
1081         apnHolder->SetApnState(PROFILE_STATE_RETRYING);
1082         RetryScene scene = static_cast<RetryScene>(netInfo->retryScene);
1083         bool isRetrying = (apnManager_->GetOverallDefaultApnState() == ApnProfileState::PROFILE_STATE_RETRYING);
1084         int64_t delayTime = apnHolder->GetRetryDelay(netInfo->reason, netInfo->retryTime, scene, isRetrying);
1085         TELEPHONY_LOGI("cid=%{public}d, cause=%{public}d, suggest=%{public}d, delay=%{public}lld, scene=%{public}d",
1086             netInfo->cid, netInfo->reason, netInfo->retryTime, static_cast<long long>(delayTime), netInfo->retryScene);
1087         SendEvent(CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL, netInfo->flag, delayTime);
1088     }
1089 }
1090 
ResumeDataPermittedTimerOut(const AppExecFwk::InnerEvent::Pointer & event)1091 void CellularDataHandler::ResumeDataPermittedTimerOut(const AppExecFwk::InnerEvent::Pointer &event)
1092 {
1093     TELEPHONY_LOGI("SlotId=%{public}d, ResumeDataPermittedTimerOut", slotId_);
1094     if (apnManager_ == nullptr) {
1095         SetDataPermittedForMms(false);
1096         return;
1097     }
1098     auto apnHolder = apnManager_->FindApnHolderById(DataContextRolesId::DATA_CONTEXT_ROLE_MMS_ID);
1099     if (apnHolder == nullptr || apnHolder->GetApnState() == PROFILE_STATE_IDLE) {
1100         TELEPHONY_LOGI("SlotId=%{public}d, mms resume data due time out", slotId_);
1101         SetDataPermittedForMms(false);
1102     }
1103 }
1104 
RetryToSetupDatacall(const AppExecFwk::InnerEvent::Pointer & event)1105 void CellularDataHandler::RetryToSetupDatacall(const AppExecFwk::InnerEvent::Pointer &event)
1106 {
1107     if (event == nullptr || apnManager_ == nullptr) {
1108         return;
1109     }
1110     int32_t apnId = event->GetParam();
1111     auto apnHolder = apnManager_->FindApnHolderById(apnId);
1112     if (apnHolder == nullptr || apnHolder->GetApnState() != PROFILE_STATE_RETRYING) {
1113         return;
1114     }
1115     TELEPHONY_LOGI("apnId=%{public}d, state=%{public}d", apnId, apnHolder->GetApnState());
1116     apnHolder->SetApnState(PROFILE_STATE_IDLE);
1117     SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, 0);
1118 }
1119 
UpdatePhysicalConnectionState(bool noActiveConnection)1120 void CellularDataHandler::UpdatePhysicalConnectionState(bool noActiveConnection)
1121 {
1122     if (noActiveConnection && physicalConnectionActiveState_) {
1123         physicalConnectionActiveState_ = false;
1124         CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
1125     } else if (!noActiveConnection && !physicalConnectionActiveState_) {
1126         physicalConnectionActiveState_ = true;
1127         CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
1128     }
1129 }
1130 
HandleSortConnection()1131 void CellularDataHandler::HandleSortConnection()
1132 {
1133     ApnProfileState state = apnManager_->GetOverallApnState();
1134     if (state == PROFILE_STATE_IDLE || state == PROFILE_STATE_FAILED) {
1135         for (const sptr<ApnHolder> &sortApnHolder : apnManager_->GetSortApnHolder()) {
1136             if (sortApnHolder->IsDataCallEnabled()) {
1137                 int32_t apnId = apnManager_->FindApnIdByApnName(sortApnHolder->GetApnType());
1138                 TELEPHONY_LOGI("Slot%{public}d: HandleSortConnection the apn type is %{public}s", slotId_,
1139                     sortApnHolder->GetApnType().c_str());
1140                 SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, 0);
1141                 break;
1142             }
1143         }
1144     }
1145 }
1146 
MsgEstablishDataConnection(const InnerEvent::Pointer & event)1147 void CellularDataHandler::MsgEstablishDataConnection(const InnerEvent::Pointer &event)
1148 {
1149     if (apnManager_ == nullptr || event == nullptr) {
1150         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or event is null", slotId_);
1151         return;
1152     }
1153     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(event->GetParam());
1154     if (apnHolder == nullptr) {
1155         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
1156         return;
1157     }
1158     TELEPHONY_LOGD("Slot%{public}d: APN holder type:%{public}s call:%{public}d", slotId_,
1159         apnHolder->GetApnType().c_str(), apnHolder->IsDataCallEnabled());
1160     if (apnHolder->IsDataCallEnabled()) {
1161         AttemptEstablishDataConnection(apnHolder);
1162     } else {
1163         TELEPHONY_LOGI("MsgEstablishDataConnection IsDataCallEnabled is false");
1164         DisConnectionReason reason = DisConnectionReason::REASON_CHANGE_CONNECTION;
1165         int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1166         CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, radioTech);
1167         if (!IsSingleConnectionEnabled(radioTech)) {
1168             reason = DisConnectionReason::REASON_CLEAR_CONNECTION;
1169         }
1170         ClearConnection(apnHolder, reason);
1171     }
1172 }
1173 
1174 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
IsSimRequestNetOnVSimEnabled(int32_t reqType,bool isMmsType) const1175 bool CellularDataHandler::IsSimRequestNetOnVSimEnabled(int32_t reqType, bool isMmsType) const
1176 {
1177     if (reqType == TYPE_REQUEST_NET) {
1178         if (slotId_ != CELLULAR_DATA_VSIM_SLOT_ID &&
1179             TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_() && !isMmsType &&
1180             TELEPHONY_EXT_WRAPPER.isVSimInDisableProcess_ && !TELEPHONY_EXT_WRAPPER.isVSimInDisableProcess_()) {
1181             TELEPHONY_LOGE("Slot%{public}d, VSimEnabled & not mms type", slotId_);
1182             return true;
1183         }
1184     }
1185     return false;
1186 }
1187 
NotifyReqCellularData(bool isCellularDataRequested)1188 bool CellularDataHandler::NotifyReqCellularData(bool isCellularDataRequested)
1189 {
1190     if (TELEPHONY_EXT_WRAPPER.dynamicLoadNotifyReqCellularDataStatus_) {
1191         TELEPHONY_EXT_WRAPPER.dynamicLoadNotifyReqCellularDataStatus_(isCellularDataRequested);
1192         TELEPHONY_LOGE("NotifyReqCellularData isCellularDataRequested %{public}d", isCellularDataRequested);
1193         return true;
1194     }
1195     return false;
1196 }
1197 #endif
1198 
SetNetRequest(NetRequest & request,const std::unique_ptr<NetRequest> & netRequest)1199 void CellularDataHandler::SetNetRequest(NetRequest &request, const std::unique_ptr<NetRequest> &netRequest)
1200 {
1201     request.ident = netRequest->ident;
1202     request.capability = netRequest->capability;
1203     request.registerType = netRequest->registerType;
1204     request.bearTypes = netRequest->bearTypes;
1205     request.uid = netRequest->uid;
1206 }
1207 
SendEstablishDataConnectionEvent(int32_t id)1208 void CellularDataHandler::SendEstablishDataConnectionEvent(int32_t id)
1209 {
1210     InnerEvent::Pointer innerEvent = InnerEvent::Get(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id);
1211     if (!SendEvent(innerEvent)) {
1212         TELEPHONY_LOGE("Slot%{public}d: send data connection event failed", slotId_);
1213     }
1214 }
1215 
ConnectIfNeed(const InnerEvent::Pointer & event,sptr<ApnHolder> apnHolder,const NetRequest & request)1216 void CellularDataHandler::ConnectIfNeed(
1217     const InnerEvent::Pointer &event, sptr<ApnHolder> apnHolder, const NetRequest &request)
1218 {
1219     if (event == nullptr || apnHolder == nullptr) {
1220         return;
1221     }
1222     if (event->GetParam() == TYPE_REQUEST_NET) {
1223         TELEPHONY_LOGI("try to activate Cellular");
1224         apnHolder->RequestCellularData(request);
1225         int32_t id = ApnManager::FindApnIdByCapability(request.capability);
1226         SendEstablishDataConnectionEvent(id);
1227     }
1228 }
1229 
MsgRequestNetwork(const InnerEvent::Pointer & event)1230 void CellularDataHandler::MsgRequestNetwork(const InnerEvent::Pointer &event)
1231 {
1232     if (apnManager_ == nullptr || event == nullptr) {
1233         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or event is null", slotId_);
1234         return;
1235     }
1236     std::unique_ptr<NetRequest> netRequest = event->GetUniqueObject<NetRequest>();
1237     if (netRequest == nullptr) {
1238         TELEPHONY_LOGE("Slot%{public}d: netRequest is null", slotId_);
1239         return;
1240     }
1241     NetRequest request;
1242     SetNetRequest(request, netRequest);
1243     int32_t id = ApnManager::FindApnIdByCapability(request.capability);
1244     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
1245     if (apnHolder == nullptr) {
1246         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null.", slotId_);
1247         return;
1248     }
1249     WriteEventCellularRequest(request, event->GetParam());
1250 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1251     if (TELEPHONY_EXT_WRAPPER.judgeOtherRequestHolding_ &&
1252         TELEPHONY_EXT_WRAPPER.judgeOtherRequestHolding_(request, apnHolder->GetUidStatus())) {
1253         ConnectIfNeed(event, apnHolder, request);
1254         return;
1255     }
1256     if (IsSimRequestNetOnVSimEnabled(event->GetParam(), apnHolder->IsMmsType())) {
1257         return;
1258     }
1259 #endif
1260 
1261     bool isAllCellularDataAllowed = true;
1262 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1263     if (TELEPHONY_EXT_WRAPPER.isAllCellularDataAllowed_) {
1264         isAllCellularDataAllowed =
1265             TELEPHONY_EXT_WRAPPER.isAllCellularDataAllowed_(request, apnHolder->GetUidStatus());
1266     }
1267 #endif
1268     if (isAllCellularDataAllowed) {
1269         TELEPHONY_LOGD("allow cellular data");
1270         if (event->GetParam() == TYPE_REQUEST_NET) {
1271             apnHolder->RequestCellularData(request);
1272 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1273             NotifyReqCellularData(true);
1274 #endif
1275         } else {
1276             if (apnHolder->IsReqUidsEmpty()) {
1277                 apnHolder->ReleaseAllCellularData();
1278             }
1279 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1280             NotifyReqCellularData(false);
1281 #endif
1282         }
1283     } else {
1284         if (event->GetParam() == TYPE_REQUEST_NET) {
1285             TELEPHONY_LOGD("not allow reqeust cellular data because of in controled");
1286             return;
1287         } else {
1288             TELEPHONY_LOGI("release all cellular data");
1289             apnHolder->ReleaseAllCellularData();
1290         }
1291     }
1292     SendEstablishDataConnectionEvent(id);
1293 }
1294 
WriteEventCellularRequest(NetRequest request,int32_t state)1295 bool CellularDataHandler::WriteEventCellularRequest(NetRequest request, int32_t state)
1296 {
1297     if (request.capability == NetCap::NET_CAPABILITY_INTERNET &&
1298         (request.bearTypes & (1ULL << NetBearType::BEARER_CELLULAR)) != 0) {
1299         CellularDataHiSysEvent::WriteCellularRequestBehaviorEvent(
1300             request.uid, request.ident, request.registerType, state);
1301             return true;
1302     }
1303     return false;
1304 }
1305 
ProcessEvent(const InnerEvent::Pointer & event)1306 void CellularDataHandler::ProcessEvent(const InnerEvent::Pointer &event)
1307 {
1308     if (event == nullptr) {
1309         TELEPHONY_LOGE("Slot%{public}d: event is null!", slotId_);
1310         return;
1311     }
1312     uint32_t eventCode = event->GetInnerEventId();
1313     std::map<uint32_t, Fun>::iterator it = eventIdMap_.find(eventCode);
1314     if (it != eventIdMap_.end()) {
1315         it->second(event);
1316     }
1317 }
1318 
OnReceiveEvent(const EventFwk::CommonEventData & data)1319 void CellularDataHandler::OnReceiveEvent(const EventFwk::CommonEventData &data)
1320 {
1321     const AAFwk::Want &want = data.GetWant();
1322     std::string action = want.GetAction();
1323     int32_t slotId = want.GetIntParam("slotId", 0);
1324     TELEPHONY_LOGI("[slot%{public}d] action=%{public}s code=%{public}d", slotId_, action.c_str(), data.GetCode());
1325     if (EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED == action) {
1326         if (slotId_ != slotId) {
1327             return;
1328         }
1329         int32_t state = want.GetIntParam("state", CALL_STATUS_UNKNOWN);
1330         if (state == CALL_STATUS_UNKNOWN) {
1331             TELEPHONY_LOGE("Slot%{public}d: unknown call state=%{public}d", slotId, state);
1332             return;
1333         }
1334         HandleCallChanged(state);
1335     } else if (action == CommonEventSupport::COMMON_EVENT_SIM_CARD_DEFAULT_DATA_SUBSCRIPTION_CHANGED) {
1336         HandleDefaultDataSubscriptionChanged();
1337     } else if (action == CommonEventSupport::COMMON_EVENT_OPERATOR_CONFIG_CHANGED) {
1338         if (slotId_ != slotId) {
1339             return;
1340         }
1341         GetConfigurationFor5G();
1342     } else if (action == CommonEventSupport::COMMON_EVENT_SCREEN_ON) {
1343         HandleScreenStateChanged(true);
1344     } else if (action == CommonEventSupport::COMMON_EVENT_SCREEN_OFF) {
1345         HandleScreenStateChanged(false);
1346     } else if (action == CommonEventSupport::COMMON_EVENT_DATA_SHARE_READY) {
1347         RegisterDataSettingObserver();
1348     } else {
1349         TELEPHONY_LOGI("Slot%{public}d: action=%{public}s code=%{public}d", slotId_, action.c_str(), data.GetCode());
1350     }
1351 }
1352 
HandleScreenStateChanged(bool isScreenOn) const1353 void CellularDataHandler::HandleScreenStateChanged(bool isScreenOn) const
1354 {
1355     if (connectionManager_ == nullptr) {
1356         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null!", slotId_);
1357         return;
1358     }
1359     connectionManager_->HandleScreenStateChanged(isScreenOn);
1360 }
1361 
IsSimStateReadyOrLoaded()1362 bool CellularDataHandler::IsSimStateReadyOrLoaded()
1363 {
1364     SimState simState = SimState::SIM_STATE_UNKNOWN;
1365     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1366     coreInner.GetSimState(slotId_, simState);
1367     return (simState == SimState::SIM_STATE_READY || simState == SimState::SIM_STATE_LOADED);
1368 }
1369 
UpdateCellularDataConnectState(const std::string & apnType)1370 void CellularDataHandler::UpdateCellularDataConnectState(const std::string &apnType)
1371 {
1372     int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1373     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType);
1374     if (apnType == DATA_CONTEXT_ROLE_DEFAULT || apnType == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) {
1375         ApnProfileState apnState = apnManager_->GetOverallDefaultApnState();
1376         StateNotification::GetInstance().UpdateCellularDataConnectState(slotId_, apnState, networkType);
1377     }
1378 }
1379 
HandleSettingSwitchChanged(const InnerEvent::Pointer & event)1380 void CellularDataHandler::HandleSettingSwitchChanged(const InnerEvent::Pointer &event)
1381 {
1382     if (event == nullptr) {
1383         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1384         return;
1385     }
1386     bool setting_switch = event->GetParam();
1387     TELEPHONY_LOGI("Slot%{public}d: setting switch = %{public}d", slotId_, setting_switch);
1388 }
1389 
HandleDBSettingIncallChanged(const AppExecFwk::InnerEvent::Pointer & event)1390 void CellularDataHandler::HandleDBSettingIncallChanged(const AppExecFwk::InnerEvent::Pointer &event)
1391 {
1392     if (event == nullptr) {
1393         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1394         return;
1395     }
1396     if (incallDataStateMachine_ == nullptr) {
1397         TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine_ is null", slotId_);
1398         return;
1399     }
1400     int64_t value = event->GetParam();
1401     if (value == static_cast<int64_t>(DataSwitchCode::CELLULAR_DATA_ENABLED)) {
1402         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_ON);
1403         incallDataStateMachine_->SendEvent(incallEvent);
1404     } else {
1405         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_OFF);
1406         incallDataStateMachine_->SendEvent(incallEvent);
1407     }
1408 }
1409 
CreateIncallDataStateMachine(int32_t callState)1410 std::shared_ptr<IncallDataStateMachine> CellularDataHandler::CreateIncallDataStateMachine(int32_t callState)
1411 {
1412     std::shared_ptr<IncallDataStateMachine> incallDataStateMachine = std::make_shared<IncallDataStateMachine>(slotId_,
1413         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())), apnManager_);
1414     if (incallDataStateMachine == nullptr) {
1415         TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine is null", slotId_);
1416         return nullptr;
1417     }
1418     incallDataStateMachine->Init(callState);
1419     return incallDataStateMachine;
1420 }
1421 
IncallDataComplete(const InnerEvent::Pointer & event)1422 void CellularDataHandler::IncallDataComplete(const InnerEvent::Pointer &event)
1423 {
1424     TELEPHONY_LOGI("Slot%{public}d: MSG_INCALL_DATA_COMPLETE", slotId_);
1425     if (incallDataStateMachine_ != nullptr) {
1426         incallDataStateMachine_->DeInit();
1427     }
1428 }
1429 
HandleCallChanged(int32_t state)1430 void CellularDataHandler::HandleCallChanged(int32_t state)
1431 {
1432     TELEPHONY_LOGI("Slot%{public}d: lastState:%{public}d, state:%{public}d", slotId_, lastCallState_, state);
1433     if (lastCallState_ == state) {
1434         TELEPHONY_LOGE("Slot%{public}d: call state=%{public}d, not changed", slotId_, state);
1435         return;
1436     }
1437     if (connectionManager_ == nullptr) {
1438         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null!", slotId_);
1439         return;
1440     }
1441     lastCallState_ = state;
1442     connectionManager_->UpdateCallState(state);
1443     ImsRegInfo voiceInfo;
1444     CoreManagerInner::GetInstance().GetImsRegStatus(slotId_, ImsServiceType::TYPE_VOICE, voiceInfo);
1445     ImsRegInfo videoInfo;
1446     CoreManagerInner::GetInstance().GetImsRegStatus(slotId_, ImsServiceType::TYPE_VIDEO, videoInfo);
1447     if (voiceInfo.imsRegState == ImsRegState::IMS_REGISTERED || videoInfo.imsRegState == ImsRegState::IMS_REGISTERED
1448         || (incallDataStateMachine_ != nullptr && incallDataStateMachine_->IsSecondaryActiveState())) {
1449         HandleImsCallChanged(state);
1450     } else {
1451         HandleVoiceCallChanged(state);
1452     }
1453 }
1454 
HandleImsCallChanged(int32_t state)1455 void CellularDataHandler::HandleImsCallChanged(int32_t state)
1456 {
1457     if (state == TelCallStatus::CALL_STATUS_DIALING || state == TelCallStatus::CALL_STATUS_INCOMING) {
1458         if (incallDataStateMachine_ == nullptr) {
1459             incallDataStateMachine_ = CreateIncallDataStateMachine(state);
1460         } else {
1461             if (incallDataStateMachine_->GetCurrentState() == nullptr) {
1462                 incallDataStateMachine_->Init(state);
1463             }
1464         }
1465     }
1466     if (incallDataStateMachine_ == nullptr) {
1467         TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine_ is null!", slotId_);
1468         return;
1469     }
1470     incallDataStateMachine_->UpdateCallState(state);
1471     if (state == TelCallStatus::CALL_STATUS_DIALING || state == TelCallStatus::CALL_STATUS_INCOMING) {
1472         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_STARTED);
1473         incallDataStateMachine_->SendEvent(incallEvent);
1474     }
1475     if (state == TelCallStatus::CALL_STATUS_DISCONNECTED || state == TelCallStatus::CALL_STATUS_IDLE) {
1476         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_ENDED);
1477         incallDataStateMachine_->SendEvent(incallEvent);
1478     }
1479 }
1480 
HandleVoiceCallChanged(int32_t state)1481 void CellularDataHandler::HandleVoiceCallChanged(int32_t state)
1482 {
1483     if (apnManager_ == nullptr || connectionManager_ == nullptr) {
1484         TELEPHONY_LOGE("Slot%{public}d: apnManager or connectionManager is null!", slotId_);
1485         return;
1486     }
1487     // next to check if radio technology support voice and data at same time.
1488     int32_t psRadioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1489     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, psRadioTech);
1490     bool support = (psRadioTech == static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_GSM));
1491     if (state != TelCallStatus::CALL_STATUS_IDLE && state != TelCallStatus::CALL_STATUS_DISCONNECTED) {
1492         if (apnManager_->HasAnyConnectedState() && support) {
1493             connectionManager_->EndNetStatistics();
1494             connectionManager_->SetDataFlowType(CellDataFlowType::DATA_FLOW_TYPE_DORMANT);
1495             connectionManager_->StopStallDetectionTimer();
1496             disconnectionReason_ = DisConnectionReason::REASON_GSM_AND_CALLING_ONLY;
1497         }
1498     } else {
1499         if (apnManager_->HasAnyConnectedState() && support) {
1500             connectionManager_->StartStallDetectionTimer();
1501             connectionManager_->BeginNetStatistics();
1502         }
1503         disconnectionReason_ = DisConnectionReason::REASON_NORMAL;
1504         TELEPHONY_LOGI("Slot%{public}d: HandleVoiceCallChanged EstablishAllApnsIfConnectable", slotId_);
1505         EstablishAllApnsIfConnectable();
1506     }
1507     TELEPHONY_LOGI("Slot%{public}d: disconnectionReason_=%{public}d", slotId_, disconnectionReason_);
1508 }
1509 
HandleDefaultDataSubscriptionChanged()1510 void CellularDataHandler::HandleDefaultDataSubscriptionChanged()
1511 {
1512     TELEPHONY_LOGI("Slot%{public}d", slotId_);
1513     if (CheckDataPermittedByDsds()) {
1514         SetDataPermitted(slotId_, true);
1515     } else {
1516         SetDataPermitted(slotId_, false);
1517     }
1518     if (dataSwitchSettings_ != nullptr) {
1519         dataSwitchSettings_->LoadSwitchValue();
1520     }
1521     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1522     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
1523     if (defSlotId == slotId_) {
1524         SendEvent(CellularDataEventCode::MSG_ESTABLISH_ALL_APNS_IF_CONNECTABLE);
1525     } else {
1526         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1527     }
1528 }
1529 
ReleaseAllNetworkRequest()1530 void CellularDataHandler::ReleaseAllNetworkRequest()
1531 {
1532     if (apnManager_ == nullptr) {
1533         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
1534         return;
1535     }
1536     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
1537         if (apnHolder == nullptr) {
1538             continue;
1539         }
1540         apnHolder->ReleaseAllCellularData();
1541         apnHolder->ReleaseAllUids();
1542     }
1543 }
1544 
HandleSimStateChanged()1545 void CellularDataHandler::HandleSimStateChanged()
1546 {
1547     SimState simState = SimState::SIM_STATE_UNKNOWN;
1548     CoreManagerInner::GetInstance().GetSimState(slotId_, simState);
1549     TELEPHONY_LOGI("Slot%{public}d: sim state is :%{public}d", slotId_, simState);
1550     if (simState == SimState::SIM_STATE_READY) {
1551         std::u16string iccId;
1552         CoreManagerInner::GetInstance().GetSimIccId(slotId_, iccId);
1553         if (lastIccId_ != u"" && lastIccId_ == iccId) {
1554             EstablishAllApnsIfConnectable();
1555         }
1556     } else if (simState != SimState::SIM_STATE_LOADED) {
1557         isRilApnAttached_ = false;
1558         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1559         if (simState == SimState::SIM_STATE_NOT_PRESENT) {
1560             CellularDataNetAgent::GetInstance().UnregisterNetSupplierForSimUpdate(slotId_);
1561             ReleaseAllNetworkRequest();
1562             UnRegisterDataSettingObserver();
1563         }
1564     }
1565 }
1566 
HandleRecordsChanged()1567 void CellularDataHandler::HandleRecordsChanged()
1568 {
1569     std::u16string iccId;
1570     CoreManagerInner::GetInstance().GetSimIccId(slotId_, iccId);
1571     if (iccId == u"") {
1572         TELEPHONY_LOGI("iccId nullptr");
1573         return;
1574     }
1575     if (iccId != lastIccId_) {
1576         if (dataSwitchSettings_ != nullptr) {
1577             dataSwitchSettings_->SetPolicyDataOn(true);
1578         }
1579         lastIccId_ = iccId;
1580     }
1581     GetConfigurationFor5G();
1582     CreateApnItem();
1583     SetRilAttachApn();
1584     ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_CHANGE_CONNECTION);
1585     EstablishAllApnsIfConnectable();
1586 }
1587 
HandleSimEvent(const AppExecFwk::InnerEvent::Pointer & event)1588 void CellularDataHandler::HandleSimEvent(const AppExecFwk::InnerEvent::Pointer &event)
1589 {
1590     if (event == nullptr) {
1591         return;
1592     }
1593     auto slotId = event->GetParam();
1594     if (slotId != slotId_) {
1595         return;
1596     }
1597     if (dataSwitchSettings_ != nullptr) {
1598         dataSwitchSettings_->LoadSwitchValue();
1599     }
1600     auto eventId = event->GetInnerEventId();
1601     TELEPHONY_LOGI("Slot%{public}d, event:%{public}d", slotId_, eventId);
1602     switch (eventId) {
1603         case RadioEvent::RADIO_SIM_STATE_CHANGE:
1604             HandleSimStateChanged();
1605             break;
1606         case RadioEvent::RADIO_SIM_RECORDS_LOADED:
1607             HandleRecordsChanged();
1608             break;
1609         case RadioEvent::RADIO_NV_REFRESH_FINISHED: {
1610             SetRilAttachApn();
1611             break;
1612         }
1613         case RadioEvent::RADIO_SIM_ACCOUNT_LOADED:
1614             HandleSimAccountLoaded();
1615             break;
1616         default:
1617             break;
1618     }
1619 }
1620 
HandleEstablishAllApnsIfConnectable(const AppExecFwk::InnerEvent::Pointer & event)1621 void CellularDataHandler::HandleEstablishAllApnsIfConnectable(const AppExecFwk::InnerEvent::Pointer &event)
1622 {
1623     if (event == nullptr) {
1624         return;
1625     }
1626     EstablishAllApnsIfConnectable();
1627 }
1628 
HandleSimAccountLoaded()1629 void CellularDataHandler::HandleSimAccountLoaded()
1630 {
1631     CellularDataNetAgent::GetInstance().UnregisterNetSupplierForSimUpdate(slotId_);
1632     bool registerRes = CellularDataNetAgent::GetInstance().RegisterNetSupplier(slotId_);
1633     if (!registerRes) {
1634         TELEPHONY_LOGE("Slot%{public}d register supplierid fail", slotId_);
1635     }
1636     if (slotId_ == 0) {
1637         CellularDataNetAgent::GetInstance().UnregisterPolicyCallback();
1638         CellularDataNetAgent::GetInstance().RegisterPolicyCallback();
1639     }
1640     RegisterDataSettingObserver();
1641     if (dataSwitchSettings_ != nullptr) {
1642         dataSwitchSettings_->LoadSwitchValue();
1643     }
1644     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1645     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
1646     CreateApnItem();
1647     if (defSlotId == slotId_) {
1648         EstablishAllApnsIfConnectable();
1649         ApnProfileState apnState = apnManager_->GetOverallApnState();
1650         if (registerRes && apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
1651             UpdateNetworkInfo();
1652         }
1653     } else {
1654         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1655     }
1656 }
1657 
CreateApnItem()1658 void CellularDataHandler::CreateApnItem()
1659 {
1660     if (apnManager_ == nullptr) {
1661         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
1662         return;
1663     }
1664     int32_t result = 0;
1665     for (int32_t i = 0; i < DEFAULT_READ_APN_TIME; ++i) {
1666         result = apnManager_->CreateAllApnItemByDatabase(slotId_);
1667         if (result != 0) {
1668             break;
1669         }
1670     }
1671     if (result == 0 && !HasInnerEvent(CellularDataEventCode::MSG_RETRY_TO_CREATE_APN)) {
1672         if (retryCreateApnTimes_ < APN_CREATE_RETRY_TIMES) {
1673             retryCreateApnTimes_++;
1674             auto event = AppExecFwk::InnerEvent::Get(CellularDataEventCode::MSG_RETRY_TO_CREATE_APN);
1675             SendEvent(event, RETRY_DELAY_TIME);
1676         } else {
1677             retryCreateApnTimes_ = 0;
1678         }
1679     } else if (result != 0) {
1680         retryCreateApnTimes_ = 0;
1681         if (HasInnerEvent(CellularDataEventCode::MSG_RETRY_TO_CREATE_APN)) {
1682             RemoveEvent(CellularDataEventCode::MSG_RETRY_TO_CREATE_APN);
1683         }
1684     }
1685 }
1686 
HandleApnChanged()1687 bool CellularDataHandler::HandleApnChanged()
1688 {
1689     if (apnManager_ == nullptr) {
1690         TELEPHONY_LOGE("apnManager is null");
1691         return false;
1692     }
1693     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
1694         TELEPHONY_LOGI("Slot%{public}d: apn type:%{public}s state:%{public}d", slotId_, apnHolder->GetApnType().c_str(),
1695             apnHolder->GetApnState());
1696     }
1697     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_APN_CHANGED);
1698     if (event == nullptr) {
1699         TELEPHONY_LOGE("Slot%{public}d: get apn changed event is null", slotId_);
1700         return false;
1701     }
1702     return SendEvent(event);
1703 }
1704 
HandleApnChanged(const InnerEvent::Pointer & event)1705 void CellularDataHandler::HandleApnChanged(const InnerEvent::Pointer &event)
1706 {
1707     if (apnManager_ == nullptr) {
1708         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
1709         return;
1710     }
1711     CreateApnItem();
1712     SetRilAttachApn();
1713     ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_CLEAR_CONNECTION);
1714     apnManager_->ClearAllApnBad();
1715     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
1716         if (apnHolder == nullptr) {
1717             continue;
1718         }
1719         int32_t id = apnManager_->FindApnIdByApnName(apnHolder->GetApnType());
1720         if (apnHolder->GetApnState() == PROFILE_STATE_RETRYING) {
1721             apnHolder->InitialApnRetryCount();
1722             apnHolder->SetApnState(PROFILE_STATE_IDLE);
1723             RemoveEvent(CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL);
1724         }
1725         SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id, ESTABLISH_DATA_CONNECTION_DELAY);
1726     }
1727 }
1728 
GetCellularDataFlowType()1729 int32_t CellularDataHandler::GetCellularDataFlowType()
1730 {
1731     if (connectionManager_ == nullptr) {
1732         TELEPHONY_LOGE("Slot%{public}d: connection manager is null", slotId_);
1733         return 0;
1734     }
1735     return connectionManager_->GetDataFlowType();
1736 }
1737 
HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer & event)1738 void CellularDataHandler::HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
1739 {
1740     if (apnManager_ == nullptr || event == nullptr) {
1741         TELEPHONY_LOGE("Slot%{public}d: radio off or not available apnManager or event is null!", slotId_);
1742         return;
1743     }
1744     std::shared_ptr<Int32Parcel> object = event->GetSharedObject<Int32Parcel>();
1745     if (object == nullptr) {
1746         TELEPHONY_LOGE("Slot%{public}d: object is nullptr!", slotId_);
1747         return;
1748     }
1749     TELEPHONY_LOGI("Slot%{public}d: Radio changed with state: %{public}d", slotId_, object->data);
1750     switch (object->data) {
1751         case CORE_SERVICE_POWER_OFF:
1752         case CORE_SERVICE_POWER_NOT_AVAILABLE: {
1753             ApnProfileState apnState = apnManager_->GetOverallApnState();
1754             TELEPHONY_LOGI("Slot%{public}d: apn state is %{public}d", slotId_, apnState);
1755             if (apnState != ApnProfileState::PROFILE_STATE_IDLE) {
1756                 ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1757             }
1758             break;
1759         }
1760         case CORE_SERVICE_POWER_ON:
1761             SetRilLinkBandwidths();
1762             EstablishAllApnsIfConnectable();
1763             break;
1764         default:
1765             TELEPHONY_LOGI("Slot%{public}d: un-handle state:%{public}d", slotId_, object->data);
1766             break;
1767     }
1768 }
1769 
HandleDsdsModeChanged(const AppExecFwk::InnerEvent::Pointer & event)1770 void CellularDataHandler::HandleDsdsModeChanged(const AppExecFwk::InnerEvent::Pointer &event)
1771 {
1772     if (event == nullptr) {
1773         TELEPHONY_LOGE("Slot%{public}d: event is null!", slotId_);
1774         return;
1775     }
1776     std::shared_ptr<Int32Parcel> object = event->GetSharedObject<Int32Parcel>();
1777     if (object == nullptr) {
1778         TELEPHONY_LOGE("Slot%{public}d: object is null!", slotId_);
1779         return;
1780     }
1781     TELEPHONY_LOGI("Slot%{public}d: DSDS changed with mode: %{public}d", slotId_, object->data);
1782     int32_t dsdsMode = DSDS_MODE_V2;
1783     CoreManagerInner::GetInstance().GetDsdsMode(dsdsMode);
1784     if (object->data == dsdsMode) {
1785         TELEPHONY_LOGE("Slot%{public}d: DSDS mode is the same!", slotId_);
1786         return;
1787     }
1788     if (object->data < DSDS_MODE_V2) {
1789         TELEPHONY_LOGE("Slot%{public}d: DSDS mode is illegal!", slotId_);
1790         return;
1791     }
1792     CoreManagerInner::GetInstance().SetDsdsMode(object->data);
1793     int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
1794     int32_t simNum = CoreManagerInner::GetInstance().GetMaxSimCount();
1795     bool dataEnableStatus = true;
1796     IsCellularDataEnabled(dataEnableStatus);
1797     for (int32_t i = 0; i < simNum; ++i) {
1798         if (defaultSlotId != i && object->data == DSDS_MODE_V2) {
1799             SetDataPermitted(i, false);
1800         } else {
1801             if (dataEnableStatus) {
1802                 SetDataPermitted(i, true);
1803             }
1804             DelayedRefSingleton<CellularDataService>::GetInstance().ChangeConnectionForDsds(i, true);
1805         }
1806     }
1807     if (incallDataStateMachine_ != nullptr) {
1808         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED);
1809         incallDataStateMachine_->SendEvent(incallEvent);
1810     }
1811 }
1812 
ClearConnectionIfRequired()1813 void CellularDataHandler::ClearConnectionIfRequired()
1814 {
1815     if (apnManager_ == nullptr) {
1816         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
1817         return;
1818     }
1819     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
1820         if (apnHolder == nullptr) {
1821             TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
1822             continue;
1823         }
1824         ApnProfileState apnState = apnHolder->GetApnState();
1825         std::string apnType = apnHolder->GetApnType();
1826         std::vector<sptr<ApnItem>> matchedApns = apnManager_->FilterMatchedApns(apnType, slotId_);
1827         if (matchedApns.empty()) {
1828             TELEPHONY_LOGE("Slot%{public}d: matchedApns is empty", slotId_);
1829             continue;
1830         }
1831         bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0;
1832         if (!apnHolder->IsSameMatchedApns(matchedApns, roamingState)) {
1833             apnHolder->SetAllMatchedApns(matchedApns);
1834             if (apnState != ApnProfileState::PROFILE_STATE_IDLE &&
1835                 apnState != ApnProfileState::PROFILE_STATE_FAILED) {
1836                 TELEPHONY_LOGI("Slot%{public}d: the connection of APN type:%{public}s will be cleared.",
1837                     slotId_, apnType.c_str());
1838                 ClearConnection(apnHolder, DisConnectionReason::REASON_RETRY_CONNECTION);
1839             }
1840         }
1841     }
1842     if (connectionManager_ == nullptr) {
1843         TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
1844         return;
1845     }
1846     if (!apnManager_->HasAnyConnectedState()) {
1847         connectionManager_->StopStallDetectionTimer();
1848         connectionManager_->EndNetStatistics();
1849         ResetDataFlowType();
1850     }
1851 }
1852 
PsDataRatChanged(const InnerEvent::Pointer & event)1853 void CellularDataHandler::PsDataRatChanged(const InnerEvent::Pointer &event)
1854 {
1855     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1856     int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1857     coreInner.GetPsRadioTech(slotId_, radioTech);
1858     TELEPHONY_LOGI("Slot%{public}d: radioTech is %{public}d", slotId_, radioTech);
1859     if (event == nullptr) {
1860         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1861         return;
1862     }
1863     if (dataSwitchSettings_ == nullptr) {
1864         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings is null", slotId_);
1865         return;
1866     }
1867     bool dataEnabled = dataSwitchSettings_->IsUserDataOn();
1868     if (!dataEnabled) {
1869         TELEPHONY_LOGE("Slot%{public}d: data enable is close", slotId_);
1870         return;
1871     }
1872     bool attached = coreInner.GetPsRegState(slotId_) == (int32_t)RegServiceState::REG_STATE_IN_SERVICE;
1873     if (!attached) {
1874         TELEPHONY_LOGE("Slot%{public}d: attached is false", slotId_);
1875         return;
1876     }
1877     ClearConnectionIfRequired();
1878     EstablishAllApnsIfConnectable();
1879 }
1880 
SetPolicyDataOn(bool enable)1881 void CellularDataHandler::SetPolicyDataOn(bool enable)
1882 {
1883     if (dataSwitchSettings_ == nullptr) {
1884         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings is null", slotId_);
1885         return;
1886     }
1887     bool policyDataOn = dataSwitchSettings_->IsPolicyDataOn();
1888     if (policyDataOn != enable) {
1889         dataSwitchSettings_->SetPolicyDataOn(enable);
1890         if (enable) {
1891             SendEvent(CellularDataEventCode::MSG_ESTABLISH_ALL_APNS_IF_CONNECTABLE);
1892         } else {
1893             ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1894         }
1895     }
1896 }
1897 
IsRestrictedMode() const1898 bool CellularDataHandler::IsRestrictedMode() const
1899 {
1900     int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1901     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType);
1902     bool support = (networkType == (int32_t)RadioTech::RADIO_TECHNOLOGY_GSM);
1903     bool inCall = (lastCallState_ != TelCallStatus::CALL_STATUS_IDLE &&
1904                    lastCallState_ != TelCallStatus::CALL_STATUS_DISCONNECTED);
1905     TELEPHONY_LOGD("Slot%{public}d: radio technology is gsm only:%{public}d and call is busy:%{public}d", slotId_,
1906         support, inCall);
1907     return inCall && support;
1908 }
1909 
GetDisConnectionReason()1910 DisConnectionReason CellularDataHandler::GetDisConnectionReason()
1911 {
1912     return disconnectionReason_;
1913 }
1914 
SetDataPermitted(int32_t slotId,bool dataPermitted)1915 void CellularDataHandler::SetDataPermitted(int32_t slotId, bool dataPermitted)
1916 {
1917     TELEPHONY_LOGI("Slot%{public}d: dataPermitted is %{public}d.", slotId, dataPermitted);
1918     int32_t maxSimCount = CoreManagerInner::GetInstance().GetMaxSimCount();
1919     if (maxSimCount <= 1) {
1920         TELEPHONY_LOGE("Slot%{public}d: maxSimCount is: %{public}d", slotId_, maxSimCount);
1921         return;
1922     }
1923     bool hasSimCard = false;
1924     CoreManagerInner::GetInstance().HasSimCard(slotId, hasSimCard);
1925     if (!hasSimCard && !IsVSimSlotId(slotId)) {
1926         TELEPHONY_LOGE("Slot%{public}d: no sim :%{public}d", slotId_, slotId);
1927         return;
1928     }
1929     CoreManagerInner::GetInstance().SetDataPermitted(
1930         slotId, CellularDataEventCode::MSG_SET_DATA_PERMITTED, dataPermitted, shared_from_this());
1931 }
1932 
SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer & event)1933 void CellularDataHandler::SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer &event)
1934 {
1935     if (event == nullptr) {
1936         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1937         return;
1938     }
1939     std::shared_ptr<TelRilResponseInfo<int32_t>> rilInfo = event->GetSharedObject<TelRilResponseInfo<int32_t>>();
1940     if (rilInfo == nullptr) {
1941         TELEPHONY_LOGE("Slot%{public}d: RadioResponseInfo is null", slotId_);
1942         return;
1943     }
1944     if (rilInfo->errorNo != 0) {
1945         TELEPHONY_LOGE("Slot%{public}d: SetDataPermitted error", slotId_);
1946     }
1947 }
1948 
GetEsmFlagFromOpCfg()1949 bool CellularDataHandler::GetEsmFlagFromOpCfg()
1950 {
1951     int32_t esmFlagFromOpCfg = ESM_FLAG_INVALID;
1952     OperatorConfig configsForEsmFlag;
1953     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForEsmFlag);
1954     if (configsForEsmFlag.intValue.find(KEY_PLMN_ESM_FLAG_INT) != configsForEsmFlag.intValue.end()) {
1955         esmFlagFromOpCfg = configsForEsmFlag.intValue[KEY_PLMN_ESM_FLAG_INT];
1956     }
1957     if (esmFlagFromOpCfg < 0 || esmFlagFromOpCfg > 1) {
1958         TELEPHONY_LOGE("esmFlag value is invalid");
1959     }
1960     return (esmFlagFromOpCfg != 0);
1961 }
1962 
SetRilAttachApn()1963 void CellularDataHandler::SetRilAttachApn()
1964 {
1965     DataProfile dataProfile;
1966     if (!GetEsmFlagFromOpCfg()) {
1967         dataProfile.profileId = 0;
1968         dataProfile.apn = "";
1969         dataProfile.protocol = "";
1970         dataProfile.verType = 0;
1971         dataProfile.userName = "";
1972         dataProfile.password = "";
1973         dataProfile.roamingProtocol = "";
1974     } else {
1975         sptr<ApnItem> attachApn = apnManager_->GetRilAttachApn();
1976         if (attachApn == nullptr) {
1977             TELEPHONY_LOGE("Slot%{public}d: attachApn is null", slotId_);
1978             return;
1979         }
1980         dataProfile.profileId = attachApn->attr_.profileId_;
1981         dataProfile.apn = attachApn->attr_.apn_;
1982         dataProfile.protocol = attachApn->attr_.protocol_;
1983         dataProfile.verType = attachApn->attr_.authType_;
1984         dataProfile.userName = attachApn->attr_.user_;
1985         dataProfile.password = attachApn->attr_.password_;
1986         dataProfile.roamingProtocol = attachApn->attr_.roamingProtocol_;
1987     }
1988     TELEPHONY_LOGI("Slot%{public}d: DataProfile profileId = %{public}d", slotId_, dataProfile.profileId);
1989     CoreManagerInner::GetInstance().SetInitApnInfo(
1990         slotId_, CellularDataEventCode::MSG_SET_RIL_ATTACH_APN, dataProfile, shared_from_this());
1991 }
1992 
SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer & event)1993 void CellularDataHandler::SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer &event)
1994 {
1995     if (event == nullptr) {
1996         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1997         return;
1998     }
1999     std::shared_ptr<TelRilResponseInfo<int32_t>> rilInfo = event->GetSharedObject<TelRilResponseInfo<int32_t>>();
2000     if (rilInfo == nullptr) {
2001         TELEPHONY_LOGE("Slot%{public}d: RadioResponseInfo is null", slotId_);
2002         return;
2003     }
2004     if (rilInfo->errorNo != 0) {
2005         TELEPHONY_LOGE("Slot%{public}d: SetRilAttachApn error", slotId_);
2006     }
2007     isRilApnAttached_ = (rilInfo->errorNo == 0);
2008     TELEPHONY_LOGI("Slot%{public}d: isRilApnAttached_ = %{public}d", slotId_, isRilApnAttached_);
2009 }
2010 
HasAnyHigherPriorityConnection(const sptr<ApnHolder> & apnHolder)2011 bool CellularDataHandler::HasAnyHigherPriorityConnection(const sptr<ApnHolder> &apnHolder)
2012 {
2013     if (apnManager_ == nullptr) {
2014         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
2015         return false;
2016     }
2017     std::vector<sptr<ApnHolder>> sortApnHolders = apnManager_->GetSortApnHolder();
2018     if (sortApnHolders.empty()) {
2019         TELEPHONY_LOGE("Slot%{public}d: SortApnHolder is null", slotId_);
2020         return false;
2021     }
2022     for (const sptr<ApnHolder> &sortApnHolder : sortApnHolders) {
2023         if (sortApnHolder->GetPriority() > apnHolder->GetPriority()) {
2024             if (sortApnHolder->IsDataCallEnabled() &&
2025                 (sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTED ||
2026                     sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTING ||
2027                     sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_DISCONNECTING)) {
2028                 CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
2029                     CellularDataErrorCode::DATA_ERROR_HAS_HIGHER_PRIORITY_CONNECTION,
2030                     "There is higher priority connection");
2031                 return true;
2032             }
2033         }
2034     }
2035     return false;
2036 }
2037 
HasInternetCapability(const int32_t cid) const2038 bool CellularDataHandler::HasInternetCapability(const int32_t cid) const
2039 {
2040     if (connectionManager_ == nullptr) {
2041         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2042         return false;
2043     }
2044     std::shared_ptr<CellularDataStateMachine> activeStateMachine = connectionManager_->GetActiveConnectionByCid(cid);
2045     if (activeStateMachine == nullptr) {
2046         TELEPHONY_LOGE("Slot%{public}d: get activeStateMachine by cid fail", slotId_);
2047         return false;
2048     }
2049     uint64_t netCapability = activeStateMachine->GetCapability();
2050     if (netCapability == NetCap::NET_CAPABILITY_INTERNET) {
2051         return true;
2052     }
2053     return false;
2054 }
2055 
ChangeConnectionForDsds(bool enable)2056 bool CellularDataHandler::ChangeConnectionForDsds(bool enable)
2057 {
2058     if (dataSwitchSettings_ == nullptr) {
2059         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
2060         return false;
2061     }
2062     if (enable) {
2063         dataSwitchSettings_->SetInternalDataOn(true);
2064         SendEvent(CellularDataEventCode::MSG_ESTABLISH_ALL_APNS_IF_CONNECTABLE);
2065     } else {
2066         dataSwitchSettings_->SetInternalDataOn(false);
2067         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
2068     }
2069     return true;
2070 }
2071 
GetConfigurationFor5G()2072 void CellularDataHandler::GetConfigurationFor5G()
2073 {
2074     // get 5G configurations
2075     unMeteredAllNsaConfig_ = ParseOperatorConfig(u"allmeterednas");
2076     unMeteredNrNsaMmwaveConfig_ = ParseOperatorConfig(u"meterednrnsammware");
2077     unMeteredNrNsaSub6Config_ = ParseOperatorConfig(u"meteredNrnsasub6");
2078     unMeteredAllNrsaConfig_ = ParseOperatorConfig(u"meteredallnrsa");
2079     unMeteredNrsaMmwaveConfig_ = ParseOperatorConfig(u"meterednrsammware");
2080     unMeteredNrsaSub6Config_ = ParseOperatorConfig(u"meterednrsasub6");
2081     unMeteredRoamingConfig_ = ParseOperatorConfig(u"meteredroaming");
2082     GetDefaultConfiguration();
2083 }
2084 
ParseOperatorConfig(const std::u16string & configName)2085 bool CellularDataHandler::ParseOperatorConfig(const std::u16string &configName)
2086 {
2087     OperatorConfig configsFor5G;
2088     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsFor5G);
2089     if (configsFor5G.configValue.count(configName) > 0) {
2090         std::string flag = Str16ToStr8(configsFor5G.configValue[configName]);
2091         TELEPHONY_LOGI("Slot%{public}d: parse operator 5G config: %{public}s", slotId_, flag.c_str());
2092         if (flag == "true") {
2093             return true;
2094         }
2095     }
2096     return false;
2097 }
2098 
GetSinglePdpEnabledFromOpCfg()2099 void CellularDataHandler::GetSinglePdpEnabledFromOpCfg()
2100 {
2101     OperatorConfig configsForSinglePdp;
2102     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForSinglePdp);
2103     if (configsForSinglePdp.boolValue.find(KEY_SINGLE_PDP_ENABLED_BOOL) != configsForSinglePdp.boolValue.end()) {
2104         multipleConnectionsEnabled_ = !configsForSinglePdp.boolValue[KEY_SINGLE_PDP_ENABLED_BOOL];
2105     }
2106     return;
2107 }
2108 
IsSingleConnectionEnabled(int32_t radioTech)2109 bool CellularDataHandler::IsSingleConnectionEnabled(int32_t radioTech)
2110 {
2111     std::vector<int32_t> singlePdpRadio;
2112     OperatorConfig configsForSinglePdpRadioType;
2113     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForSinglePdpRadioType);
2114     if (configsForSinglePdpRadioType.intArrayValue.count(KEY_SINGLE_PDP_RADIO_TYPE_INT_ARRAY) >0) {
2115         singlePdpRadio = configsForSinglePdpRadioType.intArrayValue[KEY_SINGLE_PDP_RADIO_TYPE_INT_ARRAY];
2116     }
2117     if (singlePdpRadio.empty()) {
2118         TELEPHONY_LOGI("single pdp radio type array is empty");
2119     }
2120     if (std::find(singlePdpRadio.begin(), singlePdpRadio.end(), radioTech) != singlePdpRadio.end()) {
2121         TELEPHONY_LOGI("radio type array is matched single pdp type");
2122         multipleConnectionsEnabled_ = false;
2123         return !multipleConnectionsEnabled_;
2124     }
2125     GetSinglePdpEnabledFromOpCfg();
2126     return !multipleConnectionsEnabled_;
2127 }
2128 
GetDefaultDataEnableConfig()2129 void CellularDataHandler::GetDefaultDataEnableConfig()
2130 {
2131     if (dataSwitchSettings_ == nullptr) {
2132         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
2133         return;
2134     }
2135     bool dataEnbaled = true;
2136     int32_t ret = dataSwitchSettings_->QueryAnySimDetectedStatus(
2137         static_cast<int32_t>(DataSimDetectedCode::SIM_DETECTED_DISABLED));
2138     const int32_t defSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
2139     if (ret == TELEPHONY_ERR_SUCCESS || defSlotId != slotId_) {
2140         return;
2141     }
2142     OperatorConfig config;
2143     if (ret == TELEPHONY_ERR_DATABASE_READ_EMPTY) {
2144         CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, config);
2145         if (config.boolValue.find(KEY_DEFAULT_DATA_ENABLE_BOOL) != config.boolValue.end()) {
2146             dataEnbaled = config.boolValue[KEY_DEFAULT_DATA_ENABLE_BOOL];
2147             TELEPHONY_LOGI("Slot%{public}d: OperatorConfig dataEnable_ = %{public}d", slotId_, dataEnbaled);
2148             dataSwitchSettings_->SetUserDataOn(dataEnbaled);
2149         }
2150         dataSwitchSettings_->SetAnySimDetected(static_cast<int32_t>(DataSimDetectedCode::SIM_DETECTED_ENABLED));
2151     }
2152 }
2153 
GetDefaultDataRoamingConfig()2154 void CellularDataHandler::GetDefaultDataRoamingConfig()
2155 {
2156     defaultDataRoamingEnable_ = false;
2157     OperatorConfig configsForDataRoaming;
2158     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForDataRoaming);
2159     if (configsForDataRoaming.boolValue.find(KEY_DEFAULT_DATA_ROAMING_BOOL) != configsForDataRoaming.boolValue.end()) {
2160         defaultDataRoamingEnable_ = configsForDataRoaming.boolValue[KEY_DEFAULT_DATA_ROAMING_BOOL];
2161         TELEPHONY_LOGI("Slot%{public}d: OperatorConfig defaultDataRoamingEnable_ = %{public}d", slotId_,
2162             defaultDataRoamingEnable_);
2163     } else {
2164         std::string defaultDataRoaming = DEFAULT_DATA_ROAMING + std::to_string(slotId_);
2165         int32_t dataRoaming = static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_DISABLED);
2166         dataRoaming = GetIntParameter(defaultDataRoaming.c_str(), dataRoaming);
2167         defaultDataRoamingEnable_ =
2168             (dataRoaming == static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED));
2169         TELEPHONY_LOGI(
2170             "Slot%{public}d: defaultDataRoamingEnable_ from prop is %{public}d", slotId_, defaultDataRoamingEnable_);
2171     }
2172     if (dataSwitchSettings_ == nullptr) {
2173         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
2174         return;
2175     }
2176     bool dataRoamingEnabled = false;
2177     int32_t ret = dataSwitchSettings_->QueryUserDataRoamingStatus(dataRoamingEnabled);
2178     if (ret != TELEPHONY_ERR_SUCCESS && defaultDataRoamingEnable_ != dataSwitchSettings_->IsUserDataRoamingOn()) {
2179         dataSwitchSettings_->UpdateUserDataRoamingOn(defaultDataRoamingEnable_);
2180         if (apnManager_ == nullptr) {
2181             TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
2182             return;
2183         }
2184         bool roamingState = false;
2185         if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) {
2186             roamingState = true;
2187         }
2188         if (roamingState) {
2189             ApnProfileState apnState = apnManager_->GetOverallApnState();
2190             if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
2191                 apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
2192                 ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
2193             }
2194             EstablishAllApnsIfConnectable();
2195         } else {
2196             TELEPHONY_LOGI("Slot%{public}d: Not roaming(%{public}d), not doing anything", slotId_, roamingState);
2197         }
2198     }
2199 }
2200 
GetDefaultConfiguration()2201 void CellularDataHandler::GetDefaultConfiguration()
2202 {
2203     if (connectionManager_ == nullptr) {
2204         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2205         return;
2206     }
2207     connectionManager_->GetDefaultBandWidthsConfig();
2208     connectionManager_->GetDefaultTcpBufferConfig();
2209     GetDefaultUpLinkThresholdsConfig();
2210     GetDefaultDownLinkThresholdsConfig();
2211     defaultMobileMtuConfig_ = CellularDataUtils::GetDefaultMobileMtuConfig();
2212     TELEPHONY_LOGI("Slot%{public}d: defaultMobileMtuConfig_ = %{public}d", slotId_, defaultMobileMtuConfig_);
2213     defaultPreferApn_ = CellularDataUtils::GetDefaultPreferApnConfig();
2214     TELEPHONY_LOGI("Slot%{public}d: defaultPreferApn_ is %{public}d", slotId_, defaultPreferApn_);
2215     multipleConnectionsEnabled_ = CellularDataUtils::GetDefaultMultipleConnectionsConfig();
2216     GetSinglePdpEnabledFromOpCfg();
2217     GetDefaultDataRoamingConfig();
2218     GetDefaultDataEnableConfig();
2219     TELEPHONY_LOGI("Slot%{public}d: multipleConnectionsEnabled_ = %{public}d, defaultDataRoamingEnable_ = %{public}d",
2220         slotId_, multipleConnectionsEnabled_, defaultDataRoamingEnable_);
2221 }
2222 
HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer & event)2223 void CellularDataHandler::HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
2224 {
2225     if (connectionManager_ == nullptr) {
2226         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2227         return;
2228     }
2229     TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_);
2230     std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines =
2231         connectionManager_->GetAllConnectionMachine();
2232     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
2233         InnerEvent::Pointer eventCode = InnerEvent::Get(RadioEvent::RADIO_NR_STATE_CHANGED);
2234         cellularDataStateMachine->SendEvent(eventCode);
2235     }
2236 }
2237 
HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer & event)2238 void CellularDataHandler::HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer &event)
2239 {
2240     if (connectionManager_ == nullptr) {
2241         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2242         return;
2243     }
2244     TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_);
2245     std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines =
2246         connectionManager_->GetAllConnectionMachine();
2247     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
2248         InnerEvent::Pointer eventCode = InnerEvent::Get(RadioEvent::RADIO_NR_FREQUENCY_CHANGED);
2249         cellularDataStateMachine->SendEvent(eventCode);
2250     }
2251 }
2252 
GetDefaultUpLinkThresholdsConfig()2253 void CellularDataHandler::GetDefaultUpLinkThresholdsConfig()
2254 {
2255     std::lock_guard<std::mutex> guard(mtx_);
2256     upLinkThresholds_.clear();
2257     char upLinkConfig[UP_DOWN_LINK_SIZE] = { 0 };
2258     GetParameter(CONFIG_UPLINK_THRESHOLDS, CAPACITY_THRESHOLDS_FOR_UPLINK, upLinkConfig, UP_DOWN_LINK_SIZE);
2259     TELEPHONY_LOGI("Slot%{public}d: upLinkThresholds = %{public}s", slotId_, upLinkConfig);
2260     upLinkThresholds_ = CellularDataUtils::Split(upLinkConfig, ",");
2261 }
2262 
GetDefaultDownLinkThresholdsConfig()2263 void CellularDataHandler::GetDefaultDownLinkThresholdsConfig()
2264 {
2265     std::lock_guard<std::mutex> guard(mtx_);
2266     downLinkThresholds_.clear();
2267     char downLinkConfig[UP_DOWN_LINK_SIZE] = { 0 };
2268     GetParameter(CONFIG_DOWNLINK_THRESHOLDS, CAPACITY_THRESHOLDS_FOR_DOWNLINK, downLinkConfig, UP_DOWN_LINK_SIZE);
2269     TELEPHONY_LOGI("Slot%{public}d: downLinkThresholds_ = %{public}s", slotId_, downLinkConfig);
2270     downLinkThresholds_ = CellularDataUtils::Split(downLinkConfig, ",");
2271 }
2272 
SetRilLinkBandwidths()2273 void CellularDataHandler::SetRilLinkBandwidths()
2274 {
2275     std::lock_guard<std::mutex> guard(mtx_);
2276     LinkBandwidthRule linkBandwidth;
2277     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, linkBandwidth.rat);
2278     linkBandwidth.delayMs = DELAY_SET_RIL_BANDWIDTH_MS;
2279     linkBandwidth.delayUplinkKbps = DELAY_SET_RIL_UP_DOWN_BANDWIDTH_MS;
2280     linkBandwidth.delayDownlinkKbps = DELAY_SET_RIL_UP_DOWN_BANDWIDTH_MS;
2281     for (std::string upLinkThreshold : upLinkThresholds_) {
2282         linkBandwidth.maximumUplinkKbps.push_back(atoi(upLinkThreshold.c_str()));
2283     }
2284     for (std::string downLinkThreshold : downLinkThresholds_) {
2285         linkBandwidth.maximumDownlinkKbps.push_back(atoi(downLinkThreshold.c_str()));
2286     }
2287     CoreManagerInner::GetInstance().SetLinkBandwidthReportingRule(
2288         slotId_, CellularDataEventCode::MSG_SET_RIL_BANDWIDTH, linkBandwidth, shared_from_this());
2289 }
2290 
HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer & event)2291 void CellularDataHandler::HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer &event)
2292 {
2293     TELEPHONY_LOGI("Slot%{public}d: HandleDBSettingEnableChanged enter.", slotId_);
2294     if (dataSwitchSettings_ == nullptr) {
2295         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
2296         return;
2297     }
2298     bool dataEnabled = true;
2299     dataSwitchSettings_->QueryUserDataStatus(dataEnabled);
2300     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
2301     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
2302     std::string dataPolicy = system::GetParameter(PERSIST_EDM_MOBILE_DATA_POLICY, "");
2303     if (dataEnabled && defSlotId == slotId_) {
2304         if (dataPolicy == MOBILE_DATA_POLICY_DISALLOW) {
2305             TELEPHONY_LOGE("Slot%{public}d: policy is disallow, not allow establish all apns", slotId_);
2306             return;
2307         }
2308         EstablishAllApnsIfConnectable();
2309     } else {
2310         if (dataPolicy == MOBILE_DATA_POLICY_FORCE_OPEN) {
2311             TELEPHONY_LOGE("Slot%{public}d: policy is force_open, not allow clear connections", slotId_);
2312             return;
2313         }
2314         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
2315     }
2316 }
2317 
HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer & event)2318 void CellularDataHandler::HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer &event)
2319 {
2320     if (dataSwitchSettings_ == nullptr) {
2321         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
2322         return;
2323     }
2324     bool dataRoamingEnabled = dataSwitchSettings_->IsUserDataRoamingOn();
2325     bool roamingState = false;
2326     if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) {
2327         roamingState = true;
2328     }
2329     TELEPHONY_LOGI("Slot%{public}d: roamingState%{public}d, dataRoamingEnabled%{public}d.",
2330         slotId_, roamingState, dataRoamingEnabled);
2331     if (roamingState) {
2332         if (dataRoamingEnabled) {
2333             EstablishAllApnsIfConnectable();
2334         } else {
2335             ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
2336         }
2337     }
2338 }
2339 
UnRegisterDataSettingObserver()2340 void CellularDataHandler::UnRegisterDataSettingObserver()
2341 {
2342     if (settingObserver_ == nullptr || roamingObserver_ == nullptr || incallObserver_ == nullptr ||
2343         cellularDataRdbObserver_ == nullptr || airplaneObserver_ == nullptr) {
2344         TELEPHONY_LOGE("Slot%{public}d: settingObserver_ or roamingObserver_ or incallObserver_ or "
2345                        "cellularDataRdbObserver_ or airplaneObserver_ is null", slotId_);
2346         return;
2347     }
2348     std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance();
2349     if (settingHelper == nullptr) {
2350         TELEPHONY_LOGE("Slot%{public}d: settingHelper is null", slotId_);
2351         return;
2352     }
2353     Uri dataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
2354     settingHelper->UnRegisterSettingsObserver(dataEnableUri, settingObserver_);
2355 
2356     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
2357     if (simId <= INVALID_SIM_ID) {
2358         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
2359         return;
2360     }
2361     Uri dataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
2362     settingHelper->UnRegisterSettingsObserver(dataRoamingUri, roamingObserver_);
2363     Uri dataIncallUri(CELLULAR_DATA_SETTING_INTELLIGENCE_NETWORK_URI);
2364     settingHelper->UnRegisterSettingsObserver(dataIncallUri, incallObserver_);
2365     Uri airplaneUri(CELLULAR_DATA_AIRPLANE_MODE_URI);
2366     settingHelper->UnRegisterSettingsObserver(airplaneUri, airplaneObserver_);
2367 
2368     std::shared_ptr<CellularDataRdbHelper> cellularDataRdbHelper = CellularDataRdbHelper::GetInstance();
2369     if (cellularDataRdbHelper == nullptr) {
2370         TELEPHONY_LOGE("Slot%{public}d: cellularDataRdbHelper is null", slotId_);
2371         return;
2372     }
2373     cellularDataRdbHelper->UnRegisterObserver(cellularDataRdbObserver_);
2374 }
2375 
RegisterDataSettingObserver()2376 void CellularDataHandler::RegisterDataSettingObserver()
2377 {
2378     if (settingObserver_ == nullptr || roamingObserver_ == nullptr || incallObserver_ == nullptr ||
2379         cellularDataRdbObserver_ == nullptr || airplaneObserver_ == nullptr) {
2380         TELEPHONY_LOGE("Slot%{public}d: settingObserver_ or roamingObserver_ or incallObserver_ or "
2381                        "cellularDataRdbObserver_ or airplaneObserver_ is null", slotId_);
2382         return;
2383     }
2384     std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance();
2385     if (settingHelper == nullptr) {
2386         TELEPHONY_LOGE("Slot%{public}d: settingHelper is null", slotId_);
2387         return;
2388     }
2389     Uri dataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
2390     settingHelper->RegisterSettingsObserver(dataEnableUri, settingObserver_);
2391 
2392     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
2393     if (simId <= INVALID_SIM_ID) {
2394         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
2395         return;
2396     }
2397     Uri dataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
2398     settingHelper->RegisterSettingsObserver(dataRoamingUri, roamingObserver_);
2399     Uri dataIncallUri(CELLULAR_DATA_SETTING_INTELLIGENCE_NETWORK_URI);
2400     settingHelper->RegisterSettingsObserver(dataIncallUri, incallObserver_);
2401     Uri airplaneUri(CELLULAR_DATA_AIRPLANE_MODE_URI);
2402     settingHelper->RegisterSettingsObserver(airplaneUri, airplaneObserver_);
2403 
2404     std::shared_ptr<CellularDataRdbHelper> cellularDataRdbHelper = CellularDataRdbHelper::GetInstance();
2405     if (cellularDataRdbHelper == nullptr) {
2406         TELEPHONY_LOGE("Slot%{public}d: cellularDataRdbHelper is null", slotId_);
2407         return;
2408     }
2409     cellularDataRdbHelper->RegisterObserver(cellularDataRdbObserver_);
2410 }
2411 
OnRilAdapterHostDied(const AppExecFwk::InnerEvent::Pointer & event)2412 void CellularDataHandler::OnRilAdapterHostDied(const AppExecFwk::InnerEvent::Pointer &event)
2413 {
2414     if (connectionManager_ == nullptr) {
2415         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2416         return;
2417     }
2418     TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_);
2419     std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines =
2420         connectionManager_->GetAllConnectionMachine();
2421     std::shared_ptr<SetupDataCallResultInfo> setupDataCallResultInfo = std::make_shared<SetupDataCallResultInfo>();
2422     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
2423         InnerEvent::Pointer eventCode =
2424             InnerEvent::Get(CellularDataEventCode::MSG_SM_RIL_ADAPTER_HOST_DIED, setupDataCallResultInfo);
2425         cellularDataStateMachine->SendEvent(eventCode);
2426     }
2427 }
2428 
GetDataConnApnAttr(ApnItem::Attribute & apnAttr) const2429 void CellularDataHandler::GetDataConnApnAttr(ApnItem::Attribute &apnAttr) const
2430 {
2431     if (apnManager_ == nullptr) {
2432         TELEPHONY_LOGE("Slot%{public}d: GetDataConnApnAttr:apnManager is null", slotId_);
2433         return;
2434     }
2435     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
2436         if (apnHolder == nullptr) {
2437             TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
2438             continue;
2439         }
2440         if (apnHolder->IsDataCallEnabled()) {
2441             sptr<ApnItem> apnItem = apnHolder->GetCurrentApn();
2442             if (apnItem == nullptr) {
2443                 continue;
2444             }
2445             apnAttr = apnItem->attr_;
2446             return;
2447         }
2448     }
2449 }
2450 
GetDataConnIpType() const2451 std::string CellularDataHandler::GetDataConnIpType() const
2452 {
2453     if (apnManager_ == nullptr) {
2454         TELEPHONY_LOGE("Slot%{public}d: GetDataConnApnAttr:apnManager is null", slotId_);
2455         return "";
2456     }
2457     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
2458         if (apnHolder == nullptr) {
2459             TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
2460             continue;
2461         }
2462         if (apnHolder->IsDataCallEnabled()) {
2463             auto stateMachine = apnHolder->GetCellularDataStateMachine();
2464             if (stateMachine == nullptr) {
2465                 TELEPHONY_LOGE("Slot%{public}d: stateMachine is null", slotId_);
2466                 continue;
2467             }
2468             return stateMachine->GetIpType();
2469         }
2470     }
2471     return "";
2472 }
2473 
GetDataRecoveryState()2474 int32_t CellularDataHandler::GetDataRecoveryState()
2475 {
2476     if (connectionManager_ == nullptr) {
2477         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2478         return -1;
2479     }
2480     return connectionManager_->GetDataRecoveryState();
2481 }
2482 
HandleFactoryReset(const InnerEvent::Pointer & event)2483 void CellularDataHandler::HandleFactoryReset(const InnerEvent::Pointer &event)
2484 {
2485     TELEPHONY_LOGI("Slot%{public}d: factory reset", slotId_);
2486     SetCellularDataEnable(true);
2487     SetCellularDataRoamingEnabled(defaultDataRoamingEnable_);
2488     if (apnManager_ == nullptr) {
2489         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
2490         return;
2491     }
2492     apnManager_->ResetApns(slotId_);
2493 }
2494 
IsNeedDoRecovery(bool needDoRecovery) const2495 void CellularDataHandler::IsNeedDoRecovery(bool needDoRecovery) const
2496 {
2497     if (connectionManager_ == nullptr) {
2498         TELEPHONY_LOGE("Slot%{public}d: in IsNeedDoRecovery connectionManager_ is null", slotId_);
2499         return;
2500     }
2501     connectionManager_->IsNeedDoRecovery(needDoRecovery);
2502 }
2503 
OnCleanAllDataConnectionsDone(const AppExecFwk::InnerEvent::Pointer & event)2504 void CellularDataHandler::OnCleanAllDataConnectionsDone(const AppExecFwk::InnerEvent::Pointer &event)
2505 {
2506     TELEPHONY_LOGI("Slot%{public}d: receive OnCleanAllDataConnectionsDone event", slotId_);
2507 }
2508 
IsVSimSlotId(int32_t slotId)2509 bool CellularDataHandler::IsVSimSlotId(int32_t slotId)
2510 {
2511     if (TELEPHONY_EXT_WRAPPER.getVSimSlotId_) {
2512         int vSimSlotId = INVALID_SLOT_ID;
2513         TELEPHONY_EXT_WRAPPER.getVSimSlotId_(vSimSlotId);
2514         return vSimSlotId == slotId;
2515     }
2516     return false;
2517 }
2518 
CheckForCompatibleDataConnection(sptr<ApnHolder> & apnHolder)2519 std::shared_ptr<CellularDataStateMachine> CellularDataHandler::CheckForCompatibleDataConnection(
2520     sptr<ApnHolder> &apnHolder)
2521 {
2522     std::shared_ptr<CellularDataStateMachine> potentialDc = nullptr;
2523     if (apnManager_ == nullptr || connectionManager_ == nullptr) {
2524         return potentialDc;
2525     }
2526     std::vector<sptr<ApnItem>> dunApnList;
2527     if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DUN) {
2528         apnManager_->FetchDunApns(dunApnList, slotId_);
2529     } else if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_BIP) {
2530         sptr<ApnItem> bipApn = nullptr;
2531         apnManager_->GetBipApnItem(bipApn);
2532         if (bipApn != nullptr) {
2533             return potentialDc;
2534         }
2535     }
2536     auto allDCs = connectionManager_->GetAllConnectionMachine();
2537     bool isRoaming = false;
2538     int32_t result = IsCellularDataRoamingEnabled(isRoaming);
2539     if (result != TELEPHONY_ERR_SUCCESS) {
2540         isRoaming = false;
2541     }
2542     for (const auto& curDc : allDCs) {
2543         sptr<ApnItem> apnItem = curDc->GetApnItem();
2544         for (const auto& dunItem : dunApnList) {
2545             if (!ApnHolder::IsCompatibleApnItem(apnItem, dunItem, isRoaming)) {
2546                 continue;
2547             }
2548             if (curDc->IsActiveState()) {
2549                 return curDc;
2550             } else if (curDc->IsActivatingState()) {
2551                 potentialDc = curDc;
2552             } else if (curDc->IsDisconnectingState()) {
2553                 if (potentialDc == nullptr) {
2554                     potentialDc = curDc;
2555                 }
2556             }
2557         }
2558         if (dunApnList.size() == 0 && apnItem->CanDealWithType(apnHolder->GetApnType())) {
2559             if (curDc->IsActiveState()) {
2560                 return curDc;
2561             } else if (curDc->IsActivatingState()) {
2562                 potentialDc = curDc;
2563             } else if (curDc->IsDisconnectingState() && potentialDc == nullptr) {
2564                 potentialDc = curDc;
2565             }
2566         }
2567     }
2568     return potentialDc;
2569 }
2570 
HandleUpdateNetInfo(const AppExecFwk::InnerEvent::Pointer & event)2571 void CellularDataHandler::HandleUpdateNetInfo(const AppExecFwk::InnerEvent::Pointer &event)
2572 {
2573     TELEPHONY_LOGI("Slot%{public}d: HandleUpdateNetInfo", slotId_);
2574     if (event == nullptr || apnManager_ == nullptr) {
2575         TELEPHONY_LOGE("event or apnManager_ is null");
2576         return;
2577     }
2578 
2579     std::shared_ptr<SetupDataCallResultInfo> netInfo = event->GetSharedObject<SetupDataCallResultInfo>();
2580     if (netInfo == nullptr) {
2581         TELEPHONY_LOGE("info is null");
2582         return;
2583     }
2584 
2585     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(netInfo->flag);
2586     if (apnHolder == nullptr) {
2587         TELEPHONY_LOGE("Slot%{public}d: flag:%{public}d complete apnHolder is null", slotId_, netInfo->flag);
2588         return;
2589     }
2590     if (apnHolder->GetApnState() != PROFILE_STATE_CONNECTING && apnHolder->GetApnState() != PROFILE_STATE_CONNECTED) {
2591         TELEPHONY_LOGE("Slot%{public}d: apnHolder is not connecting or connected", slotId_);
2592         return;
2593     }
2594     auto stateMachine = apnHolder->GetCellularDataStateMachine();
2595     if (stateMachine == nullptr) {
2596         TELEPHONY_LOGE("stateMachine is null");
2597         return;
2598     }
2599     stateMachine->UpdateNetworkInfo(*netInfo);
2600 }
2601 
IsGsm()2602 bool CellularDataHandler::IsGsm()
2603 {
2604     bool isGsm = false;
2605     CoreManagerInner::GetInstance().IsGsm(slotId_, isGsm);
2606     return isGsm;
2607 }
2608 
IsCdma()2609 bool CellularDataHandler::IsCdma()
2610 {
2611     bool isCdma = false;
2612     CoreManagerInner::GetInstance().IsCdma(slotId_, isCdma);
2613     return isCdma;
2614 }
2615 
ReleaseCellularDataConnection()2616 void CellularDataHandler::ReleaseCellularDataConnection()
2617 {
2618     int32_t id = ApnManager::FindApnIdByCapability(OHOS::NetManagerStandard::NET_CAPABILITY_INTERNET);
2619     if (!apnManager_) {
2620         TELEPHONY_LOGE("apnManager_ is nullptr");
2621         return;
2622     }
2623     OHOS::sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
2624     if (apnHolder->GetUidStatus() == HasSystemUse::HAS) {
2625         TELEPHONY_LOGI("system using, can not release");
2626         return;
2627     }
2628     ClearConnection(apnHolder, DisConnectionReason::REASON_CLEAR_CONNECTION);
2629 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
2630     NotifyReqCellularData(false);
2631 #endif
2632 }
2633 
UpdateNetworkInfo()2634 bool CellularDataHandler::UpdateNetworkInfo()
2635 {
2636     if (connectionManager_ == nullptr) {
2637         TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
2638         return false;
2639     }
2640     auto stateMachines = connectionManager_->GetAllConnectionMachine();
2641     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
2642         auto eventCode = InnerEvent::Get(CellularDataEventCode::MSG_SM_UPDATE_NETWORK_INFO);
2643         cellularDataStateMachine->SendEvent(eventCode);
2644     }
2645     return true;
2646 }
2647 
IsSupportDunApn()2648 bool CellularDataHandler::IsSupportDunApn()
2649 {
2650     if (apnManager_ == nullptr) {
2651         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
2652         return false;
2653     }
2654     std::vector<sptr<ApnItem>> dunApnList;
2655     apnManager_->FetchDunApns(dunApnList, slotId_);
2656     ApnProfileState apnState = apnManager_->GetOverallDefaultApnState();
2657     TELEPHONY_LOGI("Slot%{public}d: IsSupportDun=%{public}d, apnState=%{public}d", slotId_, !dunApnList.empty(),
2658         apnState);
2659     return (!dunApnList.empty() && apnState == ApnProfileState::PROFILE_STATE_CONNECTED);
2660 }
2661 
GetDefaultActReportInfo()2662 ApnActivateReportInfo CellularDataHandler::GetDefaultActReportInfo()
2663 {
2664     return GetApnActReportInfo(DATA_CONTEXT_ROLE_DEFAULT_ID);
2665 }
2666 
GetInternalActReportInfo()2667 ApnActivateReportInfo CellularDataHandler::GetInternalActReportInfo()
2668 {
2669     return GetApnActReportInfo(DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID);
2670 }
2671 
GetApnActReportInfo(uint32_t apnId)2672 ApnActivateReportInfo CellularDataHandler::GetApnActReportInfo(uint32_t apnId)
2673 {
2674     struct ApnActivateReportInfo info;
2675     uint32_t totalDuration = 0;
2676     uint32_t totalActTimes = 0;
2677     uint32_t totalActSuccTimes = 0;
2678     uint32_t topReason = 0;
2679     uint32_t topReasonCnt = 0;
2680     std::map<uint32_t, uint32_t> errorMap;
2681     std::lock_guard<std::mutex> lock(apnActivateListMutex_);
2682     EraseApnActivateList();
2683     for (uint32_t i = 0; i < apnActivateChrList_.size(); i++) {
2684         ApnActivateInfo info = apnActivateChrList_[i];
2685         if (info.apnId != apnId) {
2686             continue;
2687         }
2688         totalDuration += info.duration;
2689         totalActTimes++;
2690         if (info.reason == 0) {
2691             totalActSuccTimes++;
2692             continue;
2693         }
2694         if (errorMap.find(info.reason) != errorMap.end()) {
2695             errorMap[info.reason] = errorMap[info.reason]+1;
2696         } else {
2697             errorMap[info.reason] = 1;
2698         }
2699     }
2700     apnActivateListMutex_.unlock();
2701     info.actTimes = totalActTimes;
2702     info.actSuccTimes = totalActSuccTimes;
2703     info.averDuration = totalActSuccTimes == 0 ? 0 : totalDuration / totalActSuccTimes;
2704     std::map<uint32_t, uint32_t>::iterator iter;
2705     for (iter = errorMap.begin(); iter != errorMap.end(); ++iter) {
2706         if (iter->second > topReasonCnt) {
2707             topReason = iter->first;
2708             topReasonCnt = iter->second;
2709         }
2710     }
2711     info.topReason = topReason;
2712     TELEPHONY_LOGI("GetApnActReportInfo,%{public}d,%{public}d,%{public}d,%{public}d,%{public}d,",
2713         totalDuration, totalActTimes, totalActSuccTimes, topReason, topReasonCnt);
2714     return info;
2715 }
2716 
SetApnActivateStart(const std::string & apnType)2717 void CellularDataHandler::SetApnActivateStart(const std::string &apnType)
2718 {
2719     uint64_t currentTime = GetCurTime();
2720     if (apnType == DATA_CONTEXT_ROLE_DEFAULT) {
2721         defaultApnActTime_ = currentTime;
2722     }
2723     if (apnType == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) {
2724         internalApnActTime_ = currentTime;
2725     }
2726 }
2727 
SetApnActivateEnd(const std::shared_ptr<SetupDataCallResultInfo> & resultInfo)2728 void CellularDataHandler::SetApnActivateEnd(const std::shared_ptr<SetupDataCallResultInfo> &resultInfo)
2729 {
2730     struct ApnActivateInfo info;
2731     info.actSuccTime = GetCurTime();
2732     info.reason = resultInfo->reason;
2733     info.apnId = resultInfo->flag;
2734     if (resultInfo->flag == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID
2735         && internalApnActTime_ != 0) {
2736         info.duration = info.actSuccTime - internalApnActTime_;
2737     }
2738     if (resultInfo->flag == DATA_CONTEXT_ROLE_DEFAULT_ID
2739         && defaultApnActTime_ != 0) {
2740         info.duration = info.actSuccTime - defaultApnActTime_;
2741     }
2742     std::lock_guard<std::mutex> lock(apnActivateListMutex_);
2743     EraseApnActivateList();
2744     apnActivateChrList_.push_back(info);
2745     apnActivateListMutex_.unlock();
2746 }
2747 
EraseApnActivateList()2748 void CellularDataHandler::EraseApnActivateList()
2749 {
2750     int64_t currentTime = GetCurTime();
2751     for (std::vector<ApnActivateInfo>::iterator iter = apnActivateChrList_.begin();
2752         iter != apnActivateChrList_.end();) {
2753         if ((currentTime - iter->actSuccTime) > KEEP_APN_ACTIVATE_PERIOD) {
2754             apnActivateChrList_.erase(iter);
2755         } else {
2756             iter++;
2757         }
2758     }
2759 }
2760 
GetCurTime()2761 int64_t CellularDataHandler::GetCurTime()
2762 {
2763     return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()
2764         .time_since_epoch()).count();
2765 }
2766 } // namespace Telephony
2767 } // namespace OHOS
2768