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