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 void ConnectIfNeed( 88 const AppExecFwk::InnerEvent::Pointer &event, sptr<ApnHolder> apnHolder, const NetRequest &request); 89 90 ApnActivateReportInfo GetDefaultActReportInfo(); 91 ApnActivateReportInfo GetInternalActReportInfo(); 92 93 private: 94 std::shared_ptr<CellularDataStateMachine> CreateCellularDataConnect(); 95 std::shared_ptr<CellularDataStateMachine> FindIdleCellularDataConnection() const; 96 bool CheckCellularDataSlotId(sptr<ApnHolder> &apnHolder); 97 bool CheckAttachAndSimState(sptr<ApnHolder> &apnHolder); 98 bool CheckRoamingState(sptr<ApnHolder> &apnHolder); 99 bool CheckApnState(sptr<ApnHolder> &apnHolder); 100 void AttemptEstablishDataConnection(sptr<ApnHolder> &apnHolder); 101 bool EstablishDataConnection(sptr<ApnHolder> &apnHolder, int32_t radioTech); 102 void RadioPsConnectionAttached(const AppExecFwk::InnerEvent::Pointer &event); 103 void RoamingStateOn(const AppExecFwk::InnerEvent::Pointer &event); 104 void RoamingStateOff(const AppExecFwk::InnerEvent::Pointer &event); 105 void PsRadioEmergencyStateOpen(const AppExecFwk::InnerEvent::Pointer &event); 106 void PsRadioEmergencyStateClose(const AppExecFwk::InnerEvent::Pointer &event); 107 void EstablishDataConnectionComplete(const AppExecFwk::InnerEvent::Pointer &event); 108 void DisconnectDataComplete(const AppExecFwk::InnerEvent::Pointer &event); 109 void HandleDisconnectDataCompleteForMmsType(sptr<ApnHolder> &apnHolder); 110 void MsgEstablishDataConnection(const AppExecFwk::InnerEvent::Pointer &event); 111 void MsgRequestNetwork(const AppExecFwk::InnerEvent::Pointer &event); 112 void HandleSettingSwitchChanged(const AppExecFwk::InnerEvent::Pointer &event); 113 void HandleVoiceCallChanged(int32_t state); 114 void HandleDefaultDataSubscriptionChanged(); 115 void HandleSimStateChanged(); 116 void HandleRecordsChanged(); 117 void HandleDsdsModeChanged(const AppExecFwk::InnerEvent::Pointer &event); 118 void HandleSimEvent(const AppExecFwk::InnerEvent::Pointer &event); 119 void HandleSimAccountLoaded(); 120 void HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer &event); 121 void PsDataRatChanged(const AppExecFwk::InnerEvent::Pointer &event); 122 void SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer &event); 123 bool HasAnyHigherPriorityConnection(const sptr<ApnHolder> &apnHolder); 124 void GetConfigurationFor5G(); 125 void GetDefaultConfiguration(); 126 void GetDefaultDataRoamingConfig(); 127 void GetDefaultDataEnableConfig(); 128 bool ParseOperatorConfig(const std::u16string &configName); 129 void HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer &event); 130 void HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer &event); 131 void GetDefaultUpLinkThresholdsConfig(); 132 void GetDefaultDownLinkThresholdsConfig(); 133 void SetRilLinkBandwidths(); 134 void HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer &event); 135 void HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer &event); 136 void HandleSortConnection(); 137 void SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer &event); 138 void SetDataPermitted(int32_t slotId, bool dataPermitted); 139 bool CheckDataPermittedByDsds(); 140 bool SetDataPermittedForMms(bool dataPermittedForMms); 141 std::shared_ptr<IncallDataStateMachine> CreateIncallDataStateMachine(int32_t callState); 142 void HandleDBSettingIncallChanged(const AppExecFwk::InnerEvent::Pointer &event); 143 void HandleCallChanged(int32_t state); 144 void HandleImsCallChanged(int32_t state); 145 void IncallDataComplete(const AppExecFwk::InnerEvent::Pointer &event); 146 void ResetDataFlowType(); 147 void ClearConnectionIfRequired(); 148 void ReleaseAllNetworkRequest(); 149 bool GetEsmFlagFromOpCfg(); 150 void GetSinglePdpEnabledFromOpCfg(); 151 bool IsSingleConnectionEnabled(int32_t radioTech); 152 void OnRilAdapterHostDied(const AppExecFwk::InnerEvent::Pointer &event); 153 void HandleFactoryReset(const AppExecFwk::InnerEvent::Pointer &event); 154 void OnCleanAllDataConnectionsDone(const AppExecFwk::InnerEvent::Pointer &event); 155 void ResumeDataPermittedTimerOut(const AppExecFwk::InnerEvent::Pointer &event); 156 void CreateApnItem(); 157 void UpdatePhysicalConnectionState(bool noActiveConnection); 158 bool IsVSimSlotId(int32_t slotId); 159 std::shared_ptr<CellularDataStateMachine> CheckForCompatibleDataConnection(sptr<ApnHolder> &apnHolder); 160 bool IsGsm(); 161 bool IsCdma(); 162 void HandleScreenStateChanged(bool isScreenOn) const; 163 void HandleEstablishAllApnsIfConnectable(const AppExecFwk::InnerEvent::Pointer &event); 164 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 165 bool IsSimRequestNetOnVSimEnabled(int32_t reqType, bool isMmsType) const; 166 bool NotifyReqCellularData(bool isCellularDataRequested); 167 #endif 168 void SetNetRequest(NetRequest &request, const std::unique_ptr<NetRequest> &netRequest); 169 void SendEstablishDataConnectionEvent(int32_t id); 170 bool IsSimStateReadyOrLoaded(); 171 void UpdateCellularDataConnectState(const std::string &apnType); 172 void RetryToSetupDatacall(const AppExecFwk::InnerEvent::Pointer &event); 173 void RetryOrClearConnection(const sptr<ApnHolder> &apnHolder, DisConnectionReason reason, 174 const std::shared_ptr<SetupDataCallResultInfo> &netInfo); 175 std::shared_ptr<DataShare::DataShareHelper> CreatorDataShareHelper(); 176 bool GetCurrentDataShareApnInfo(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 177 const int32_t simId, int32_t &profileIdValue); 178 void UpdateApnInfo(const int32_t profileId); 179 int32_t GetCurrentApnId(); 180 bool WriteEventCellularRequest(NetRequest request, int32_t state); 181 void DataConnCompleteUpdateState(const sptr<ApnHolder> &apnHolder, 182 const std::shared_ptr<SetupDataCallResultInfo> &resultInfo); 183 bool HandleCompatibleDataConnection(std::shared_ptr<CellularDataStateMachine> stateMachine, 184 const sptr<ApnHolder> &apnHolder); 185 int64_t GetCurTime(); 186 void SetApnActivateStart(const std::string &apnType); 187 void SetApnActivateEnd(const std::shared_ptr<SetupDataCallResultInfo> &resultInfo); 188 void EraseApnActivateList(); 189 ApnActivateReportInfo GetApnActReportInfo(uint32_t apnId); 190 191 private: 192 sptr<ApnManager> apnManager_; 193 std::unique_ptr<DataSwitchSettings> dataSwitchSettings_; 194 sptr<DataConnectionManager> connectionManager_; 195 std::u16string lastIccId_; 196 int32_t lastCallState_ = (int32_t)TelCallStatus::CALL_STATUS_IDLE; 197 const int32_t slotId_; 198 DisConnectionReason disconnectionReason_ = DisConnectionReason::REASON_NORMAL; 199 bool unMeteredAllNsaConfig_ = false; 200 bool unMeteredNrNsaMmwaveConfig_ = false; 201 bool unMeteredNrNsaSub6Config_ = false; 202 bool unMeteredAllNrsaConfig_ = false; 203 bool unMeteredNrsaMmwaveConfig_ = false; 204 bool unMeteredNrsaSub6Config_ = false; 205 bool unMeteredRoamingConfig_ = false; 206 int defaultMobileMtuConfig_ = 0; 207 bool defaultPreferApn_ = true; 208 bool physicalConnectionActiveState_ = false; 209 bool multipleConnectionsEnabled_ = false; 210 bool defaultDataRoamingEnable_ = false; 211 bool isRilApnAttached_ = false; 212 std::mutex mtx_; 213 std::mutex apnActivateListMutex_; 214 std::vector<std::string> upLinkThresholds_; 215 std::vector<std::string> downLinkThresholds_; 216 sptr<CellularDataSettingObserver> settingObserver_; 217 sptr<CellularDataRoamingObserver> roamingObserver_; 218 sptr<CellularDataIncallObserver> incallObserver_; 219 sptr<CellularDataRdbObserver> cellularDataRdbObserver_; 220 sptr<CellularDataAirplaneObserver> airplaneObserver_; 221 std::shared_ptr<IncallDataStateMachine> incallDataStateMachine_; 222 sptr<ApnItem> lastApnItem_ = nullptr; 223 std::vector<ApnActivateInfo> apnActivateChrList_; 224 uint64_t defaultApnActTime_ = 0; 225 uint64_t internalApnActTime_ = 0; 226 int32_t retryCreateApnTimes_ = 0; 227 228 using Fun = std::function<void(const AppExecFwk::InnerEvent::Pointer &event)>; 229 std::map<uint32_t, Fun> eventIdMap_ { 230 { RadioEvent::RADIO_PS_CONNECTION_ATTACHED, 231 [this](const AppExecFwk::InnerEvent::Pointer &event) { RadioPsConnectionAttached(event); } }, 232 { RadioEvent::RADIO_PS_ROAMING_OPEN, 233 [this](const AppExecFwk::InnerEvent::Pointer &event) { RoamingStateOn(event); } }, 234 { RadioEvent::RADIO_PS_ROAMING_CLOSE, 235 [this](const AppExecFwk::InnerEvent::Pointer &event) { RoamingStateOff(event); } }, 236 { RadioEvent::RADIO_EMERGENCY_STATE_OPEN, 237 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsRadioEmergencyStateOpen(event); } }, 238 { RadioEvent::RADIO_EMERGENCY_STATE_CLOSE, 239 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsRadioEmergencyStateClose(event); } }, 240 { CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION_COMPLETE, 241 [this](const AppExecFwk::InnerEvent::Pointer &event) { EstablishDataConnectionComplete(event); } }, 242 { CellularDataEventCode::MSG_DISCONNECT_DATA_COMPLETE, 243 [this](const AppExecFwk::InnerEvent::Pointer &event) { DisconnectDataComplete(event); } }, 244 { CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, 245 [this](const AppExecFwk::InnerEvent::Pointer &event) { MsgEstablishDataConnection(event); } }, 246 { CellularDataEventCode::MSG_SETTING_SWITCH, 247 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSettingSwitchChanged(event); } }, 248 { CellularDataEventCode::MSG_REQUEST_NETWORK, 249 [this](const AppExecFwk::InnerEvent::Pointer &event) { MsgRequestNetwork(event); } }, 250 { RadioEvent::RADIO_STATE_CHANGED, 251 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioStateChanged(event); } }, 252 { RadioEvent::RADIO_DSDS_MODE_CHANGED, 253 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDsdsModeChanged(event); } }, 254 { RadioEvent::RADIO_SIM_STATE_CHANGE, 255 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimEvent(event); } }, 256 { RadioEvent::RADIO_SIM_RECORDS_LOADED, 257 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimEvent(event); } }, 258 { RadioEvent::RADIO_SIM_ACCOUNT_LOADED, 259 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimEvent(event); } }, 260 { RadioEvent::RADIO_PS_RAT_CHANGED, 261 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsDataRatChanged(event); } }, 262 { CellularDataEventCode::MSG_APN_CHANGED, 263 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleApnChanged(event); } }, 264 { CellularDataEventCode::MSG_SET_RIL_ATTACH_APN, 265 [this](const AppExecFwk::InnerEvent::Pointer &event) { SetRilAttachApnResponse(event); } }, 266 { RadioEvent::RADIO_NR_STATE_CHANGED, 267 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioNrStateChanged(event); } }, 268 { RadioEvent::RADIO_NR_FREQUENCY_CHANGED, 269 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioNrFrequencyChanged(event); } }, 270 { CellularDataEventCode::MSG_DB_SETTING_ENABLE_CHANGED, 271 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingEnableChanged(event); } }, 272 { CellularDataEventCode::MSG_DB_SETTING_ROAMING_CHANGED, 273 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingRoamingChanged(event); } }, 274 { CellularDataEventCode::MSG_DB_SETTING_INCALL_CHANGED, 275 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingIncallChanged(event); } }, 276 { CellularDataEventCode::MSG_INCALL_DATA_COMPLETE, 277 [this](const AppExecFwk::InnerEvent::Pointer &event) { IncallDataComplete(event); } }, 278 { RadioEvent::RADIO_RIL_ADAPTER_HOST_DIED, 279 [this](const AppExecFwk::InnerEvent::Pointer &event) { OnRilAdapterHostDied(event); } }, 280 { RadioEvent::RADIO_FACTORY_RESET, 281 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleFactoryReset(event); } }, 282 { RadioEvent::RADIO_CLEAN_ALL_DATA_CONNECTIONS, 283 [this](const AppExecFwk::InnerEvent::Pointer &event) { OnCleanAllDataConnectionsDone(event); } }, 284 { CellularDataEventCode::MSG_DATA_CALL_LIST_CHANGED, 285 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleUpdateNetInfo(event); } }, 286 { RadioEvent::RADIO_NV_REFRESH_FINISHED, 287 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimEvent(event); } }, 288 { CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL, 289 [this](const AppExecFwk::InnerEvent::Pointer &event) { RetryToSetupDatacall(event); } }, 290 { CellularDataEventCode::MSG_ESTABLISH_ALL_APNS_IF_CONNECTABLE, 291 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleEstablishAllApnsIfConnectable(event); } }, 292 { CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT, 293 [this](const AppExecFwk::InnerEvent::Pointer &event) { ResumeDataPermittedTimerOut(event); } }, 294 { CellularDataEventCode::MSG_RETRY_TO_CREATE_APN, 295 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleApnChanged(event); } }, 296 }; 297 }; 298 } // namespace Telephony 299 } // namespace OHOS 300 #endif // CELLULAR_DATA_HANDLER_H 301