• 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     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