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