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 #ifndef CELLULAR_DATA_HANDLER_H 17 #define CELLULAR_DATA_HANDLER_H 18 19 #include <atomic> 20 #include <memory> 21 22 #include "apn_manager.h" 23 #include "cellular_data_constant.h" 24 #include "cellular_data_event_code.h" 25 #include "cellular_data_incall_observer.h" 26 #include "cellular_data_rdb_observer.h" 27 #include "cellular_data_roaming_observer.h" 28 #include "cellular_data_setting_observer.h" 29 #include "cellular_data_airplane_observer.h" 30 #include "cellular_data_state_machine.h" 31 #include "common_event_manager.h" 32 #include "data_switch_settings.h" 33 #include "incall_data_state_machine.h" 34 #include "inner_event.h" 35 #include "radio_event.h" 36 #include "state_notification.h" 37 #include "tel_event_handler.h" 38 #include "tel_profile_util.h" 39 #include "tel_ril_data_parcel.h" 40 #include "telephony_types.h" 41 namespace OHOS { 42 namespace Telephony { 43 const uint32_t KEEP_APN_ACTIVATE_PERIOD = 30 * 1000; 44 class CellularDataHandler : public TelEventHandler, public EventFwk::CommonEventSubscriber { 45 public: 46 explicit CellularDataHandler(const EventFwk::CommonEventSubscribeInfo &sp, int32_t slotId); 47 ~CellularDataHandler(); 48 void Init(); 49 bool ReleaseNet(const NetRequest &request); 50 bool RequestNet(const NetRequest &request); 51 bool AddUid(const NetRequest &request); 52 bool RemoveUid(const NetRequest &request); 53 void ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event) override; 54 void OnReceiveEvent(const EventFwk::CommonEventData &data) override; 55 int32_t SetCellularDataEnable(bool userDataEnabled); 56 int32_t SetIntelligenceSwitchEnable(bool userDataEnabled); 57 int32_t IsCellularDataEnabled(bool &dataEnabled) const; 58 int32_t IsCellularDataRoamingEnabled(bool &dataRoamingEnabled) const; 59 int32_t SetCellularDataRoamingEnabled(bool dataRoamingEnabled); 60 ApnProfileState GetCellularDataState() const; 61 ApnProfileState GetCellularDataState(const std::string &apnType) const; 62 void ClearConnection(const sptr<ApnHolder> &apnHolder, DisConnectionReason reason); 63 void EstablishAllApnsIfConnectable(); 64 void ClearAllConnections(DisConnectionReason reason); 65 void ClearConnectionsOnUpdateApns(DisConnectionReason reason); 66 bool ChangeConnectionForDsds(bool enable); 67 int32_t GetSlotId() const; 68 bool HandleApnChanged(); 69 void HandleApnChanged(const AppExecFwk::InnerEvent::Pointer &event); 70 int32_t GetCellularDataFlowType(); 71 void SetPolicyDataOn(bool enable); 72 bool IsRestrictedMode() const; 73 DisConnectionReason GetDisConnectionReason(); 74 bool HasInternetCapability(const int32_t cid) const; 75 void GetDataConnApnAttr(ApnItem::Attribute &apnAttr) const; 76 std::string GetDataConnIpType() const; 77 int32_t GetDataRecoveryState(); 78 void SetRilAttachApn(); 79 void IsNeedDoRecovery(bool needDoRecovery) const; 80 void RegisterDataSettingObserver(); 81 void UnRegisterDataSettingObserver(); 82 int32_t GetIntelligenceSwitchState(bool &switchState); 83 void HandleUpdateNetInfo(const AppExecFwk::InnerEvent::Pointer &event); 84 void ReleaseCellularDataConnection(); 85 bool UpdateNetworkInfo(); 86 bool IsSupportDunApn(); 87 ApnActivateReportInfo GetDefaultActReportInfo(); 88 ApnActivateReportInfo GetInternalActReportInfo(); 89 90 private: 91 std::shared_ptr<CellularDataStateMachine> CreateCellularDataConnect(); 92 std::shared_ptr<CellularDataStateMachine> FindIdleCellularDataConnection() const; 93 bool CheckCellularDataSlotId(sptr<ApnHolder> &apnHolder); 94 bool CheckAttachAndSimState(sptr<ApnHolder> &apnHolder); 95 bool CheckRoamingState(sptr<ApnHolder> &apnHolder); 96 bool CheckApnState(sptr<ApnHolder> &apnHolder); 97 void AttemptEstablishDataConnection(sptr<ApnHolder> &apnHolder); 98 bool EstablishDataConnection(sptr<ApnHolder> &apnHolder, int32_t radioTech); 99 void RadioPsConnectionAttached(const AppExecFwk::InnerEvent::Pointer &event); 100 void RoamingStateOn(const AppExecFwk::InnerEvent::Pointer &event); 101 void RoamingStateOff(const AppExecFwk::InnerEvent::Pointer &event); 102 void PsRadioEmergencyStateOpen(const AppExecFwk::InnerEvent::Pointer &event); 103 void PsRadioEmergencyStateClose(const AppExecFwk::InnerEvent::Pointer &event); 104 void EstablishDataConnectionComplete(const AppExecFwk::InnerEvent::Pointer &event); 105 void DisconnectDataComplete(const AppExecFwk::InnerEvent::Pointer &event); 106 void MsgEstablishDataConnection(const AppExecFwk::InnerEvent::Pointer &event); 107 void MsgRequestNetwork(const AppExecFwk::InnerEvent::Pointer &event); 108 void HandleSettingSwitchChanged(const AppExecFwk::InnerEvent::Pointer &event); 109 void HandleVoiceCallChanged(int32_t state); 110 void HandleDefaultDataSubscriptionChanged(); 111 void HandleSimStateChanged(); 112 void HandleRecordsChanged(); 113 void HandleDsdsModeChanged(const AppExecFwk::InnerEvent::Pointer &event); 114 void HandleSimEvent(const AppExecFwk::InnerEvent::Pointer &event); 115 void HandleSimAccountLoaded(); 116 void HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer &event); 117 void PsDataRatChanged(const AppExecFwk::InnerEvent::Pointer &event); 118 void SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer &event); 119 bool HasAnyHigherPriorityConnection(const sptr<ApnHolder> &apnHolder); 120 void GetConfigurationFor5G(); 121 void GetDefaultConfiguration(); 122 void GetDefaultDataRoamingConfig(); 123 void GetDefaultDataEnableConfig(); 124 bool ParseOperatorConfig(const std::u16string &configName); 125 void HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer &event); 126 void HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer &event); 127 void GetDefaultUpLinkThresholdsConfig(); 128 void GetDefaultDownLinkThresholdsConfig(); 129 void SetRilLinkBandwidths(); 130 void HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer &event); 131 void HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer &event); 132 void HandleSortConnection(); 133 void SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer &event); 134 void SetDataPermitted(int32_t slotId, bool dataPermitted); 135 bool CheckDataPermittedByDsds(); 136 bool SetDataPermittedForMms(bool dataPermittedForMms); 137 std::shared_ptr<IncallDataStateMachine> CreateIncallDataStateMachine(int32_t callState); 138 void HandleDBSettingIncallChanged(const AppExecFwk::InnerEvent::Pointer &event); 139 void HandleCallChanged(int32_t state); 140 void HandleImsCallChanged(int32_t state); 141 void IncallDataComplete(const AppExecFwk::InnerEvent::Pointer &event); 142 void ResetDataFlowType(); 143 void ClearConnectionIfRequired(); 144 void ReleaseAllNetworkRequest(); 145 bool GetEsmFlagFromOpCfg(); 146 void GetSinglePdpEnabledFromOpCfg(); 147 bool IsSingleConnectionEnabled(int32_t radioTech); 148 void OnRilAdapterHostDied(const AppExecFwk::InnerEvent::Pointer &event); 149 void HandleFactoryReset(const AppExecFwk::InnerEvent::Pointer &event); 150 void OnCleanAllDataConnectionsDone(const AppExecFwk::InnerEvent::Pointer &event); 151 void ResumeDataPermittedTimerOut(const AppExecFwk::InnerEvent::Pointer &event); 152 void CreateApnItem(); 153 void UpdatePhysicalConnectionState(bool noActiveConnection); 154 bool IsVSimSlotId(int32_t slotId); 155 std::shared_ptr<CellularDataStateMachine> CheckForCompatibleDataConnection(sptr<ApnHolder> &apnHolder); 156 bool IsGsm(); 157 bool IsCdma(); 158 void HandleScreenStateChanged(bool isScreenOn) const; 159 void HandleEstablishAllApnsIfConnectable(const AppExecFwk::InnerEvent::Pointer &event); 160 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 161 bool IsSimRequestNetOnVSimEnabled(int32_t reqType, bool isMmsType) const; 162 #endif 163 void SetNetRequest(NetRequest &request, const std::unique_ptr<NetRequest> &netRequest); 164 void SendEstablishDataConnectionEvent(int32_t id); 165 bool IsSimStateReadyOrLoaded(); 166 void UpdateCellularDataConnectState(const std::string &apnType); 167 void RetryToSetupDatacall(const AppExecFwk::InnerEvent::Pointer &event); 168 void RetryOrClearConnection(const sptr<ApnHolder> &apnHolder, DisConnectionReason reason, 169 const std::shared_ptr<SetupDataCallResultInfo> &netInfo); 170 std::shared_ptr<DataShare::DataShareHelper> CreatorDataShareHelper(); 171 bool GetCurrentDataShareApnInfo(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 172 const int32_t simId, int32_t &profileIdValue); 173 void UpdateApnInfo(const int32_t profileId); 174 int32_t GetCurrentApnId(); 175 bool WriteEventCellularRequest(NetRequest request, int32_t state); 176 void DataConnCompleteUpdateState(const sptr<ApnHolder> &apnHolder, 177 const std::shared_ptr<SetupDataCallResultInfo> &resultInfo); 178 bool HandleCompatibleDataConnection(std::shared_ptr<CellularDataStateMachine> stateMachine, 179 const sptr<ApnHolder> &apnHolder); 180 int64_t GetCurTime(); 181 void SetApnActivateStart(const std::string &apnType); 182 void SetApnActivateEnd(const std::shared_ptr<SetupDataCallResultInfo> &resultInfo); 183 void EraseApnActivateList(); 184 ApnActivateReportInfo GetApnActReportInfo(uint32_t apnId); 185 186 private: 187 sptr<ApnManager> apnManager_; 188 std::unique_ptr<DataSwitchSettings> dataSwitchSettings_; 189 sptr<DataConnectionManager> connectionManager_; 190 std::u16string lastIccId_; 191 int32_t lastCallState_ = (int32_t)TelCallStatus::CALL_STATUS_IDLE; 192 const int32_t slotId_; 193 DisConnectionReason disconnectionReason_ = DisConnectionReason::REASON_NORMAL; 194 bool unMeteredAllNsaConfig_ = false; 195 bool unMeteredNrNsaMmwaveConfig_ = false; 196 bool unMeteredNrNsaSub6Config_ = false; 197 bool unMeteredAllNrsaConfig_ = false; 198 bool unMeteredNrsaMmwaveConfig_ = false; 199 bool unMeteredNrsaSub6Config_ = false; 200 bool unMeteredRoamingConfig_ = false; 201 int defaultMobileMtuConfig_ = 0; 202 bool defaultPreferApn_ = true; 203 bool physicalConnectionActiveState_ = false; 204 bool multipleConnectionsEnabled_ = false; 205 bool defaultDataRoamingEnable_ = false; 206 bool isRilApnAttached_ = false; 207 std::mutex mtx_; 208 std::mutex apnActivateListMutex_; 209 std::vector<std::string> upLinkThresholds_; 210 std::vector<std::string> downLinkThresholds_; 211 sptr<CellularDataSettingObserver> settingObserver_; 212 sptr<CellularDataRoamingObserver> roamingObserver_; 213 sptr<CellularDataIncallObserver> incallObserver_; 214 sptr<CellularDataRdbObserver> cellularDataRdbObserver_; 215 sptr<CellularDataAirplaneObserver> airplaneObserver_; 216 std::shared_ptr<IncallDataStateMachine> incallDataStateMachine_; 217 sptr<ApnItem> lastApnItem_ = nullptr; 218 std::vector<ApnActivateInfo> apnActivateChrList_; 219 uint64_t defaultApnActTime_ = 0; 220 uint64_t internalApnActTime_ = 0; 221 222 using Fun = std::function<void(const AppExecFwk::InnerEvent::Pointer &event)>; 223 std::map<uint32_t, Fun> eventIdMap_ { 224 { RadioEvent::RADIO_PS_CONNECTION_ATTACHED, 225 [this](const AppExecFwk::InnerEvent::Pointer &event) { RadioPsConnectionAttached(event); } }, 226 { RadioEvent::RADIO_PS_ROAMING_OPEN, 227 [this](const AppExecFwk::InnerEvent::Pointer &event) { RoamingStateOn(event); } }, 228 { RadioEvent::RADIO_PS_ROAMING_CLOSE, 229 [this](const AppExecFwk::InnerEvent::Pointer &event) { RoamingStateOff(event); } }, 230 { RadioEvent::RADIO_EMERGENCY_STATE_OPEN, 231 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsRadioEmergencyStateOpen(event); } }, 232 { RadioEvent::RADIO_EMERGENCY_STATE_CLOSE, 233 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsRadioEmergencyStateClose(event); } }, 234 { CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION_COMPLETE, 235 [this](const AppExecFwk::InnerEvent::Pointer &event) { EstablishDataConnectionComplete(event); } }, 236 { CellularDataEventCode::MSG_DISCONNECT_DATA_COMPLETE, 237 [this](const AppExecFwk::InnerEvent::Pointer &event) { DisconnectDataComplete(event); } }, 238 { CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, 239 [this](const AppExecFwk::InnerEvent::Pointer &event) { MsgEstablishDataConnection(event); } }, 240 { CellularDataEventCode::MSG_SETTING_SWITCH, 241 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSettingSwitchChanged(event); } }, 242 { CellularDataEventCode::MSG_REQUEST_NETWORK, 243 [this](const AppExecFwk::InnerEvent::Pointer &event) { MsgRequestNetwork(event); } }, 244 { RadioEvent::RADIO_STATE_CHANGED, 245 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioStateChanged(event); } }, 246 { RadioEvent::RADIO_DSDS_MODE_CHANGED, 247 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDsdsModeChanged(event); } }, 248 { RadioEvent::RADIO_SIM_STATE_CHANGE, 249 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimEvent(event); } }, 250 { RadioEvent::RADIO_SIM_RECORDS_LOADED, 251 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimEvent(event); } }, 252 { RadioEvent::RADIO_SIM_ACCOUNT_LOADED, 253 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimEvent(event); } }, 254 { RadioEvent::RADIO_PS_RAT_CHANGED, 255 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsDataRatChanged(event); } }, 256 { CellularDataEventCode::MSG_APN_CHANGED, 257 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleApnChanged(event); } }, 258 { CellularDataEventCode::MSG_SET_RIL_ATTACH_APN, 259 [this](const AppExecFwk::InnerEvent::Pointer &event) { SetRilAttachApnResponse(event); } }, 260 { RadioEvent::RADIO_NR_STATE_CHANGED, 261 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioNrStateChanged(event); } }, 262 { RadioEvent::RADIO_NR_FREQUENCY_CHANGED, 263 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioNrFrequencyChanged(event); } }, 264 { CellularDataEventCode::MSG_DB_SETTING_ENABLE_CHANGED, 265 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingEnableChanged(event); } }, 266 { CellularDataEventCode::MSG_DB_SETTING_ROAMING_CHANGED, 267 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingRoamingChanged(event); } }, 268 { CellularDataEventCode::MSG_DB_SETTING_INCALL_CHANGED, 269 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingIncallChanged(event); } }, 270 { CellularDataEventCode::MSG_INCALL_DATA_COMPLETE, 271 [this](const AppExecFwk::InnerEvent::Pointer &event) { IncallDataComplete(event); } }, 272 { RadioEvent::RADIO_RIL_ADAPTER_HOST_DIED, 273 [this](const AppExecFwk::InnerEvent::Pointer &event) { OnRilAdapterHostDied(event); } }, 274 { RadioEvent::RADIO_FACTORY_RESET, 275 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleFactoryReset(event); } }, 276 { RadioEvent::RADIO_CLEAN_ALL_DATA_CONNECTIONS, 277 [this](const AppExecFwk::InnerEvent::Pointer &event) { OnCleanAllDataConnectionsDone(event); } }, 278 { CellularDataEventCode::MSG_DATA_CALL_LIST_CHANGED, 279 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleUpdateNetInfo(event); } }, 280 { RadioEvent::RADIO_NV_REFRESH_FINISHED, 281 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimEvent(event); } }, 282 { CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL, 283 [this](const AppExecFwk::InnerEvent::Pointer &event) { RetryToSetupDatacall(event); } }, 284 { CellularDataEventCode::MSG_ESTABLISH_ALL_APNS_IF_CONNECTABLE, 285 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleEstablishAllApnsIfConnectable(event); } }, 286 { CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT, 287 [this](const AppExecFwk::InnerEvent::Pointer &event) { ResumeDataPermittedTimerOut(event); } }, 288 }; 289 }; 290 } // namespace Telephony 291 } // namespace OHOS 292 #endif // CELLULAR_DATA_HANDLER_H 293