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