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