• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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