12d43be4eSopenharmony_ci/* 22d43be4eSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 32d43be4eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 42d43be4eSopenharmony_ci * you may not use this file except in compliance with the License. 52d43be4eSopenharmony_ci * You may obtain a copy of the License at 62d43be4eSopenharmony_ci * 72d43be4eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 82d43be4eSopenharmony_ci * 92d43be4eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 102d43be4eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 112d43be4eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 122d43be4eSopenharmony_ci * See the License for the specific language governing permissions and 132d43be4eSopenharmony_ci * limitations under the License. 142d43be4eSopenharmony_ci */ 152d43be4eSopenharmony_ci 162d43be4eSopenharmony_ci#include "data_connection_monitor.h" 172d43be4eSopenharmony_ci 182d43be4eSopenharmony_ci#include "core_manager_inner.h" 192d43be4eSopenharmony_ci#include "radio_event.h" 202d43be4eSopenharmony_ci#include "telephony_log_wrapper.h" 212d43be4eSopenharmony_ci 222d43be4eSopenharmony_ci#include "cellular_data_event_code.h" 232d43be4eSopenharmony_ci#include "cellular_data_hisysevent.h" 242d43be4eSopenharmony_ci#include "cellular_data_service.h" 252d43be4eSopenharmony_ci#include "cellular_data_types.h" 262d43be4eSopenharmony_ci#include "cellular_data_constant.h" 272d43be4eSopenharmony_ci#include "data_service_ext_wrapper.h" 282d43be4eSopenharmony_ci 292d43be4eSopenharmony_ci#ifdef ABILITY_POWER_SUPPORT 302d43be4eSopenharmony_ci#include "power_mgr_client.h" 312d43be4eSopenharmony_ci#endif 322d43be4eSopenharmony_ci 332d43be4eSopenharmony_cinamespace OHOS { 342d43be4eSopenharmony_cinamespace Telephony { 352d43be4eSopenharmony_ciDataConnectionMonitor::DataConnectionMonitor(int32_t slotId) : TelEventHandler("DataConnectionMonitor"), slotId_(slotId) 362d43be4eSopenharmony_ci{ 372d43be4eSopenharmony_ci trafficManager_ = std::make_unique<TrafficManagement>(slotId); 382d43be4eSopenharmony_ci stallDetectionTrafficManager_ = std::make_unique<TrafficManagement>(slotId); 392d43be4eSopenharmony_ci if (trafficManager_ == nullptr || stallDetectionTrafficManager_ == nullptr) { 402d43be4eSopenharmony_ci TELEPHONY_LOGE("TrafficManager or stallDetectionTrafficManager init failed"); 412d43be4eSopenharmony_ci } 422d43be4eSopenharmony_ci} 432d43be4eSopenharmony_ci 442d43be4eSopenharmony_civoid DataConnectionMonitor::HandleScreenStateChanged(bool isScreenOn) 452d43be4eSopenharmony_ci{ 462d43be4eSopenharmony_ci if (isScreenOn_ == isScreenOn) { 472d43be4eSopenharmony_ci return; 482d43be4eSopenharmony_ci } 492d43be4eSopenharmony_ci isScreenOn_ = isScreenOn; 502d43be4eSopenharmony_ci StopStallDetectionTimer(); 512d43be4eSopenharmony_ci StartStallDetectionTimer(); 522d43be4eSopenharmony_ci} 532d43be4eSopenharmony_ci 542d43be4eSopenharmony_cibool DataConnectionMonitor::IsAggressiveRecovery() 552d43be4eSopenharmony_ci{ 562d43be4eSopenharmony_ci return (dataRecoveryState_ == RecoveryState::STATE_CLEANUP_CONNECTIONS) || 572d43be4eSopenharmony_ci (dataRecoveryState_ == RecoveryState::STATE_REREGISTER_NETWORK) || 582d43be4eSopenharmony_ci (dataRecoveryState_ == RecoveryState::STATE_RADIO_STATUS_RESTART); 592d43be4eSopenharmony_ci} 602d43be4eSopenharmony_ci 612d43be4eSopenharmony_ciint32_t DataConnectionMonitor::GetStallDetectionPeriod() 622d43be4eSopenharmony_ci{ 632d43be4eSopenharmony_ci if (isScreenOn_ || IsAggressiveRecovery()) { 642d43be4eSopenharmony_ci return DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT; 652d43be4eSopenharmony_ci } 662d43be4eSopenharmony_ci return DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT; 672d43be4eSopenharmony_ci} 682d43be4eSopenharmony_ci 692d43be4eSopenharmony_civoid DataConnectionMonitor::StartStallDetectionTimer() 702d43be4eSopenharmony_ci{ 712d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: start stall detection", slotId_); 722d43be4eSopenharmony_ci stallDetectionEnabled_ = true; 732d43be4eSopenharmony_ci int32_t stallDetectionPeriod = GetStallDetectionPeriod(); 742d43be4eSopenharmony_ci TELEPHONY_LOGI("stallDetectionPeriod = %{public}d", stallDetectionPeriod); 752d43be4eSopenharmony_ci if (!HasInnerEvent(CellularDataEventCode::MSG_STALL_DETECTION_EVENT_ID)) { 762d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Pointer event = 772d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Get(CellularDataEventCode::MSG_STALL_DETECTION_EVENT_ID); 782d43be4eSopenharmony_ci SendEvent(event, stallDetectionPeriod, Priority::LOW); 792d43be4eSopenharmony_ci } 802d43be4eSopenharmony_ci} 812d43be4eSopenharmony_ci 822d43be4eSopenharmony_ci__attribute__((no_sanitize("cfi"))) void DataConnectionMonitor::OnStallDetectionTimer() 832d43be4eSopenharmony_ci{ 842d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: on stall detection", slotId_); 852d43be4eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_DATA_SERVICE_EXT 862d43be4eSopenharmony_ci if (DATA_SERVICE_EXT_WRAPPER.requestTcpAndDnsPackets_) { 872d43be4eSopenharmony_ci DATA_SERVICE_EXT_WRAPPER.requestTcpAndDnsPackets_(); 882d43be4eSopenharmony_ci return; 892d43be4eSopenharmony_ci } 902d43be4eSopenharmony_ci#endif 912d43be4eSopenharmony_ci UpdateFlowInfo(); 922d43be4eSopenharmony_ci if (noRecvPackets_ > RECOVERY_TRIGGER_PACKET) { 932d43be4eSopenharmony_ci HandleRecovery(); 942d43be4eSopenharmony_ci noRecvPackets_ = 0; 952d43be4eSopenharmony_ci } 962d43be4eSopenharmony_ci int32_t stallDetectionPeriod = GetStallDetectionPeriod(); 972d43be4eSopenharmony_ci TELEPHONY_LOGI("stallDetectionPeriod = %{public}d", stallDetectionPeriod); 982d43be4eSopenharmony_ci if (!HasInnerEvent(CellularDataEventCode::MSG_STALL_DETECTION_EVENT_ID) && stallDetectionEnabled_) { 992d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Pointer event = 1002d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Get(CellularDataEventCode::MSG_STALL_DETECTION_EVENT_ID); 1012d43be4eSopenharmony_ci SendEvent(event, stallDetectionPeriod, Priority::LOW); 1022d43be4eSopenharmony_ci } 1032d43be4eSopenharmony_ci} 1042d43be4eSopenharmony_ci 1052d43be4eSopenharmony_civoid DataConnectionMonitor::StopStallDetectionTimer() 1062d43be4eSopenharmony_ci{ 1072d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: stop stall detection", slotId_); 1082d43be4eSopenharmony_ci stallDetectionEnabled_ = false; 1092d43be4eSopenharmony_ci RemoveEvent(CellularDataEventCode::MSG_STALL_DETECTION_EVENT_ID); 1102d43be4eSopenharmony_ci} 1112d43be4eSopenharmony_ci 1122d43be4eSopenharmony_civoid DataConnectionMonitor::UpdateFlowInfo() 1132d43be4eSopenharmony_ci{ 1142d43be4eSopenharmony_ci if (stallDetectionTrafficManager_ == nullptr) { 1152d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: stallDetectionTrafficManager_ is null", slotId_); 1162d43be4eSopenharmony_ci return; 1172d43be4eSopenharmony_ci } 1182d43be4eSopenharmony_ci int64_t previousSentPackets = 0; 1192d43be4eSopenharmony_ci int64_t previousRecvPackets = 0; 1202d43be4eSopenharmony_ci int64_t currentSentPackets = 0; 1212d43be4eSopenharmony_ci int64_t currentRecvPackets = 0; 1222d43be4eSopenharmony_ci stallDetectionTrafficManager_->GetPacketData(previousSentPackets, previousRecvPackets); 1232d43be4eSopenharmony_ci stallDetectionTrafficManager_->UpdatePacketData(); 1242d43be4eSopenharmony_ci stallDetectionTrafficManager_->GetPacketData(currentSentPackets, currentRecvPackets); 1252d43be4eSopenharmony_ci int64_t sentPackets = currentSentPackets - previousSentPackets; 1262d43be4eSopenharmony_ci int64_t recvPackets = currentRecvPackets - previousRecvPackets; 1272d43be4eSopenharmony_ci if (sentPackets > 0 && recvPackets == 0) { 1282d43be4eSopenharmony_ci noRecvPackets_ += sentPackets; 1292d43be4eSopenharmony_ci } else if ((sentPackets > 0 && recvPackets > 0) || (sentPackets == 0 && recvPackets > 0)) { 1302d43be4eSopenharmony_ci noRecvPackets_ = 0; 1312d43be4eSopenharmony_ci dataRecoveryState_ = RecoveryState::STATE_REQUEST_CONTEXT_LIST; 1322d43be4eSopenharmony_ci } else { 1332d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: Update Flow Info nothing to do", slotId_); 1342d43be4eSopenharmony_ci } 1352d43be4eSopenharmony_ci} 1362d43be4eSopenharmony_ci 1372d43be4eSopenharmony_civoid DataConnectionMonitor::HandleRecovery() 1382d43be4eSopenharmony_ci{ 1392d43be4eSopenharmony_ci if (callState_ != static_cast<int32_t>(TelCallStatus::CALL_STATUS_IDLE) && 1402d43be4eSopenharmony_ci callState_ != static_cast<int32_t>(TelCallStatus::CALL_STATUS_DISCONNECTED)) { 1412d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Stop recovery while call is busy", slotId_); 1422d43be4eSopenharmony_ci dataRecoveryState_ = RecoveryState::STATE_REQUEST_CONTEXT_LIST; 1432d43be4eSopenharmony_ci return; 1442d43be4eSopenharmony_ci } 1452d43be4eSopenharmony_ci switch (dataRecoveryState_) { 1462d43be4eSopenharmony_ci case RecoveryState::STATE_REQUEST_CONTEXT_LIST: { 1472d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Handle Recovery: get data call list", slotId_); 1482d43be4eSopenharmony_ci dataRecoveryState_ = RecoveryState::STATE_CLEANUP_CONNECTIONS; 1492d43be4eSopenharmony_ci GetPdpContextList(); 1502d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataDeactiveBehaviorEvent(slotId_, DataDisconnectCause::ON_THE_NETWORK_SIDE); 1512d43be4eSopenharmony_ci break; 1522d43be4eSopenharmony_ci } 1532d43be4eSopenharmony_ci case RecoveryState::STATE_CLEANUP_CONNECTIONS: { 1542d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Handle Recovery: cleanup connections", slotId_); 1552d43be4eSopenharmony_ci dataRecoveryState_ = RecoveryState::STATE_REREGISTER_NETWORK; 1562d43be4eSopenharmony_ci int32_t ret = DelayedRefSingleton<CellularDataService>::GetInstance().ClearAllConnections( 1572d43be4eSopenharmony_ci slotId_, DisConnectionReason::REASON_RETRY_CONNECTION); 1582d43be4eSopenharmony_ci if (ret != static_cast<int32_t>(RequestNetCode::REQUEST_SUCCESS)) { 1592d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: Handle Recovery: cleanup connections failed", slotId_); 1602d43be4eSopenharmony_ci } 1612d43be4eSopenharmony_ci break; 1622d43be4eSopenharmony_ci } 1632d43be4eSopenharmony_ci case RecoveryState::STATE_REREGISTER_NETWORK: { 1642d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Handle Recovery: re-register network", slotId_); 1652d43be4eSopenharmony_ci dataRecoveryState_ = RecoveryState::STATE_RADIO_STATUS_RESTART; 1662d43be4eSopenharmony_ci GetPreferredNetworkPara(); 1672d43be4eSopenharmony_ci break; 1682d43be4eSopenharmony_ci } 1692d43be4eSopenharmony_ci case RecoveryState::STATE_RADIO_STATUS_RESTART: { 1702d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Handle Recovery: radio restart", slotId_); 1712d43be4eSopenharmony_ci dataRecoveryState_ = RecoveryState::STATE_REQUEST_CONTEXT_LIST; 1722d43be4eSopenharmony_ci int32_t ret = DelayedRefSingleton<CellularDataService>::GetInstance().ClearAllConnections( 1732d43be4eSopenharmony_ci slotId_, DisConnectionReason::REASON_RETRY_CONNECTION); 1742d43be4eSopenharmony_ci if (ret != static_cast<int32_t>(RequestNetCode::REQUEST_SUCCESS)) { 1752d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: Handle Recovery: radio restart cleanup connections failed", slotId_); 1762d43be4eSopenharmony_ci } 1772d43be4eSopenharmony_ci SetRadioState(CORE_SERVICE_POWER_OFF, RadioEvent::RADIO_OFF); 1782d43be4eSopenharmony_ci break; 1792d43be4eSopenharmony_ci } 1802d43be4eSopenharmony_ci default: { 1812d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: Handle Recovery is falsie", slotId_); 1822d43be4eSopenharmony_ci break; 1832d43be4eSopenharmony_ci } 1842d43be4eSopenharmony_ci } 1852d43be4eSopenharmony_ci} 1862d43be4eSopenharmony_ci 1872d43be4eSopenharmony_civoid DataConnectionMonitor::BeginNetStatistics() 1882d43be4eSopenharmony_ci{ 1892d43be4eSopenharmony_ci updateNetStat_ = true; 1902d43be4eSopenharmony_ci UpdateNetTrafficState(); 1912d43be4eSopenharmony_ci} 1922d43be4eSopenharmony_ci 1932d43be4eSopenharmony_civoid DataConnectionMonitor::UpdateCallState(int32_t state) 1942d43be4eSopenharmony_ci{ 1952d43be4eSopenharmony_ci callState_ = state; 1962d43be4eSopenharmony_ci} 1972d43be4eSopenharmony_ci 1982d43be4eSopenharmony_civoid DataConnectionMonitor::EndNetStatistics() 1992d43be4eSopenharmony_ci{ 2002d43be4eSopenharmony_ci RemoveEvent(CellularDataEventCode::MSG_RUN_MONITOR_TASK); 2012d43be4eSopenharmony_ci updateNetStat_ = false; 2022d43be4eSopenharmony_ci if (dataFlowType_ != CellDataFlowType::DATA_FLOW_TYPE_NONE) { 2032d43be4eSopenharmony_ci dataFlowType_ = CellDataFlowType::DATA_FLOW_TYPE_NONE; 2042d43be4eSopenharmony_ci StateNotification::GetInstance().OnUpDataFlowtype(slotId_, dataFlowType_); 2052d43be4eSopenharmony_ci } 2062d43be4eSopenharmony_ci} 2072d43be4eSopenharmony_ci 2082d43be4eSopenharmony_civoid DataConnectionMonitor::UpdateNetTrafficState() 2092d43be4eSopenharmony_ci{ 2102d43be4eSopenharmony_ci if (!HasInnerEvent(CellularDataEventCode::MSG_RUN_MONITOR_TASK) && updateNetStat_) { 2112d43be4eSopenharmony_ci UpdateDataFlowType(); 2122d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Pointer event = 2132d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Get(CellularDataEventCode::MSG_RUN_MONITOR_TASK); 2142d43be4eSopenharmony_ci SendEvent(event, DEFAULT_NET_STATISTICS_PERIOD); 2152d43be4eSopenharmony_ci } 2162d43be4eSopenharmony_ci} 2172d43be4eSopenharmony_ci 2182d43be4eSopenharmony_civoid DataConnectionMonitor::GetPdpContextList() 2192d43be4eSopenharmony_ci{ 2202d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetPdpContextList(slotId_, 2212d43be4eSopenharmony_ci RadioEvent::RADIO_DATA_CALL_LIST_CHANGED, shared_from_this()); 2222d43be4eSopenharmony_ci} 2232d43be4eSopenharmony_ci 2242d43be4eSopenharmony_civoid DataConnectionMonitor::SetRadioState(const int32_t &radioState, const int32_t &eventCode) 2252d43be4eSopenharmony_ci{ 2262d43be4eSopenharmony_ci CoreManagerInner::GetInstance().SetRadioState(slotId_, eventCode, radioState, 0, shared_from_this()); 2272d43be4eSopenharmony_ci} 2282d43be4eSopenharmony_ci 2292d43be4eSopenharmony_civoid DataConnectionMonitor::GetPreferredNetworkPara() 2302d43be4eSopenharmony_ci{ 2312d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetPreferredNetworkPara(slotId_, 2322d43be4eSopenharmony_ci RadioEvent::RADIO_GET_PREFERRED_NETWORK_MODE, shared_from_this()); 2332d43be4eSopenharmony_ci} 2342d43be4eSopenharmony_ci 2352d43be4eSopenharmony_civoid DataConnectionMonitor::SetPreferredNetworkPara(const AppExecFwk::InnerEvent::Pointer &event) 2362d43be4eSopenharmony_ci{ 2372d43be4eSopenharmony_ci std::shared_ptr<PreferredNetworkTypeInfo> preferredNetworkInfo = event->GetSharedObject<PreferredNetworkTypeInfo>(); 2382d43be4eSopenharmony_ci if (preferredNetworkInfo == nullptr) { 2392d43be4eSopenharmony_ci TELEPHONY_LOGE("preferredNetworkInfo is null"); 2402d43be4eSopenharmony_ci return; 2412d43be4eSopenharmony_ci } 2422d43be4eSopenharmony_ci int32_t networkType = preferredNetworkInfo->preferredNetworkType; 2432d43be4eSopenharmony_ci CoreManagerInner::GetInstance().SetPreferredNetworkPara(slotId_, 2442d43be4eSopenharmony_ci RadioEvent::RADIO_SET_PREFERRED_NETWORK_MODE, networkType, shared_from_this()); 2452d43be4eSopenharmony_ci} 2462d43be4eSopenharmony_ci 2472d43be4eSopenharmony_ciRecoveryState DataConnectionMonitor::GetDataRecoveryState() 2482d43be4eSopenharmony_ci{ 2492d43be4eSopenharmony_ci return dataRecoveryState_; 2502d43be4eSopenharmony_ci} 2512d43be4eSopenharmony_ci 2522d43be4eSopenharmony_civoid DataConnectionMonitor::UpdateDataFlowType() 2532d43be4eSopenharmony_ci{ 2542d43be4eSopenharmony_ci if (trafficManager_ == nullptr) { 2552d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: trafficManager is null", slotId_); 2562d43be4eSopenharmony_ci return; 2572d43be4eSopenharmony_ci } 2582d43be4eSopenharmony_ci int64_t previousSentPackets = 0; 2592d43be4eSopenharmony_ci int64_t previousRecvPackets = 0; 2602d43be4eSopenharmony_ci int64_t currentSentPackets = 0; 2612d43be4eSopenharmony_ci int64_t currentRecvPackets = 0; 2622d43be4eSopenharmony_ci trafficManager_->GetPacketData(previousSentPackets, previousRecvPackets); 2632d43be4eSopenharmony_ci trafficManager_->UpdatePacketData(); 2642d43be4eSopenharmony_ci trafficManager_->GetPacketData(currentSentPackets, currentRecvPackets); 2652d43be4eSopenharmony_ci int64_t sentPackets = currentSentPackets - previousSentPackets; 2662d43be4eSopenharmony_ci int64_t recvPackets = currentRecvPackets - previousRecvPackets; 2672d43be4eSopenharmony_ci CellDataFlowType previousDataFlowType = dataFlowType_; 2682d43be4eSopenharmony_ci if (previousSentPackets != 0 || previousRecvPackets != 0) { 2692d43be4eSopenharmony_ci if (sentPackets > 0 && recvPackets == 0) { 2702d43be4eSopenharmony_ci dataFlowType_ = CellDataFlowType::DATA_FLOW_TYPE_UP; 2712d43be4eSopenharmony_ci } else if (sentPackets == 0 && recvPackets > 0) { 2722d43be4eSopenharmony_ci dataFlowType_ = CellDataFlowType::DATA_FLOW_TYPE_DOWN; 2732d43be4eSopenharmony_ci } else if (sentPackets > 0 && recvPackets > 0) { 2742d43be4eSopenharmony_ci dataFlowType_ = CellDataFlowType::DATA_FLOW_TYPE_UP_DOWN; 2752d43be4eSopenharmony_ci } else { 2762d43be4eSopenharmony_ci dataFlowType_ = CellDataFlowType::DATA_FLOW_TYPE_NONE; 2772d43be4eSopenharmony_ci } 2782d43be4eSopenharmony_ci } 2792d43be4eSopenharmony_ci if (previousDataFlowType != dataFlowType_) { 2802d43be4eSopenharmony_ci StateNotification::GetInstance().OnUpDataFlowtype(slotId_, dataFlowType_); 2812d43be4eSopenharmony_ci } 2822d43be4eSopenharmony_ci} 2832d43be4eSopenharmony_ci 2842d43be4eSopenharmony_ciCellDataFlowType DataConnectionMonitor::GetDataFlowType() 2852d43be4eSopenharmony_ci{ 2862d43be4eSopenharmony_ci return dataFlowType_; 2872d43be4eSopenharmony_ci} 2882d43be4eSopenharmony_ci 2892d43be4eSopenharmony_civoid DataConnectionMonitor::SetDataFlowType(CellDataFlowType dataFlowType) 2902d43be4eSopenharmony_ci{ 2912d43be4eSopenharmony_ci if (dataFlowType_ != dataFlowType) { 2922d43be4eSopenharmony_ci dataFlowType_ = dataFlowType; 2932d43be4eSopenharmony_ci StateNotification::GetInstance().OnUpDataFlowtype(slotId_, dataFlowType_); 2942d43be4eSopenharmony_ci } 2952d43be4eSopenharmony_ci} 2962d43be4eSopenharmony_ci 2972d43be4eSopenharmony_civoid DataConnectionMonitor::IsNeedDoRecovery(bool needDoRecovery) 2982d43be4eSopenharmony_ci{ 2992d43be4eSopenharmony_ci if (needDoRecovery) { 3002d43be4eSopenharmony_ci HandleRecovery(); 3012d43be4eSopenharmony_ci } else { 3022d43be4eSopenharmony_ci dataRecoveryState_ = RecoveryState::STATE_REQUEST_CONTEXT_LIST; 3032d43be4eSopenharmony_ci } 3042d43be4eSopenharmony_ci int32_t stallDetectionPeriod = GetStallDetectionPeriod(); 3052d43be4eSopenharmony_ci TELEPHONY_LOGI("stallDetectionPeriod = %{public}d", stallDetectionPeriod); 3062d43be4eSopenharmony_ci if (!HasInnerEvent(CellularDataEventCode::MSG_STALL_DETECTION_EVENT_ID) && stallDetectionEnabled_) { 3072d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Pointer event = 3082d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Get(CellularDataEventCode::MSG_STALL_DETECTION_EVENT_ID); 3092d43be4eSopenharmony_ci SendEvent(event, stallDetectionPeriod, Priority::LOW); 3102d43be4eSopenharmony_ci } 3112d43be4eSopenharmony_ci} 3122d43be4eSopenharmony_ci 3132d43be4eSopenharmony_civoid DataConnectionMonitor::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event) 3142d43be4eSopenharmony_ci{ 3152d43be4eSopenharmony_ci if (event == nullptr) { 3162d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_); 3172d43be4eSopenharmony_ci return; 3182d43be4eSopenharmony_ci } 3192d43be4eSopenharmony_ci uint32_t eventID = event->GetInnerEventId(); 3202d43be4eSopenharmony_ci switch (eventID) { 3212d43be4eSopenharmony_ci case CellularDataEventCode::MSG_RUN_MONITOR_TASK: { 3222d43be4eSopenharmony_ci UpdateNetTrafficState(); 3232d43be4eSopenharmony_ci break; 3242d43be4eSopenharmony_ci } 3252d43be4eSopenharmony_ci case CellularDataEventCode::MSG_STALL_DETECTION_EVENT_ID: 3262d43be4eSopenharmony_ci OnStallDetectionTimer(); 3272d43be4eSopenharmony_ci break; 3282d43be4eSopenharmony_ci case RadioEvent::RADIO_DATA_CALL_LIST_CHANGED: 3292d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: radio call list changed complete", slotId_); 3302d43be4eSopenharmony_ci break; 3312d43be4eSopenharmony_ci case RadioEvent::RADIO_GET_PREFERRED_NETWORK_MODE: 3322d43be4eSopenharmony_ci SetPreferredNetworkPara(event); 3332d43be4eSopenharmony_ci break; 3342d43be4eSopenharmony_ci case RadioEvent::RADIO_SET_PREFERRED_NETWORK_MODE: 3352d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: set preferred network mode complete", slotId_); 3362d43be4eSopenharmony_ci break; 3372d43be4eSopenharmony_ci case RadioEvent::RADIO_OFF: 3382d43be4eSopenharmony_ci SetRadioState(CORE_SERVICE_POWER_ON, RadioEvent::RADIO_ON); 3392d43be4eSopenharmony_ci break; 3402d43be4eSopenharmony_ci case RadioEvent::RADIO_ON: 3412d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: set radio state on complete", slotId_); 3422d43be4eSopenharmony_ci break; 3432d43be4eSopenharmony_ci default: 3442d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: connection monitor ProcessEvent code = %{public}u", slotId_, eventID); 3452d43be4eSopenharmony_ci break; 3462d43be4eSopenharmony_ci } 3472d43be4eSopenharmony_ci} 3482d43be4eSopenharmony_ci} // namespace Telephony 3492d43be4eSopenharmony_ci} // namespace OHOS 350