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 #include "tel_ril_data.h"
17 
18 #include "core_service_hisysevent.h"
19 #include "radio_event.h"
20 #include "tel_ril_modem_parcel.h"
21 
22 namespace OHOS {
23 namespace Telephony {
TelRilData(int32_t slotId,sptr<HDI::Ril::V1_3::IRil> rilInterface,std::shared_ptr<ObserverHandler> observerHandler,std::shared_ptr<TelRilHandler> handler)24 TelRilData::TelRilData(int32_t slotId, sptr<HDI::Ril::V1_3::IRil> rilInterface,
25     std::shared_ptr<ObserverHandler> observerHandler, std::shared_ptr<TelRilHandler> handler)
26     : TelRilBase(slotId, rilInterface, observerHandler, handler)
27 {}
28 
ChangeDPToHalDataProfile(DataProfile dataProfile)29 HDI::Ril::V1_1::DataProfileDataInfo TelRilData::ChangeDPToHalDataProfile(DataProfile dataProfile)
30 {
31     HDI::Ril::V1_1::DataProfileDataInfo dataProfileInfo;
32     dataProfileInfo.profileId = dataProfile.profileId;
33     dataProfileInfo.password = dataProfile.password;
34     dataProfileInfo.authenticationType = dataProfile.verType;
35     dataProfileInfo.userName = dataProfile.userName;
36     dataProfileInfo.apn = dataProfile.apn;
37     dataProfileInfo.protocol = dataProfile.protocol;
38     dataProfileInfo.roamingProtocol = dataProfile.roamingProtocol;
39     return dataProfileInfo;
40 }
41 
DeactivatePdpContext(int32_t cid,int32_t reason,const AppExecFwk::InnerEvent::Pointer & response)42 int32_t TelRilData::DeactivatePdpContext(int32_t cid, int32_t reason, const AppExecFwk::InnerEvent::Pointer &response)
43 {
44     HDI::Ril::V1_1::UniInfo uniInfo;
45     uniInfo.gsmIndex = cid;
46     uniInfo.arg1 = reason;
47     return Request(TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_1::IRil::DeactivatePdpContext, uniInfo);
48 }
49 
DeactivatePdpContextResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo)50 int32_t TelRilData::DeactivatePdpContextResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo)
51 {
52     return Response(TELEPHONY_LOG_FUNC_NAME, responseInfo);
53 }
54 
ActivatePdpContext(int32_t radioTechnology,DataProfile dataProfile,bool isRoaming,bool allowRoaming,const AppExecFwk::InnerEvent::Pointer & response)55 int32_t TelRilData::ActivatePdpContext(int32_t radioTechnology, DataProfile dataProfile, bool isRoaming,
56     bool allowRoaming, const AppExecFwk::InnerEvent::Pointer &response)
57 {
58     HDI::Ril::V1_1::DataCallInfo dataCallInfo;
59     dataCallInfo.radioTechnology = radioTechnology;
60     dataCallInfo.dataProfileInfo = ChangeDPToHalDataProfile(dataProfile);
61     dataCallInfo.roamingAllowed = allowRoaming;
62     dataCallInfo.isRoaming = isRoaming;
63     return Request(TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_1::IRil::ActivatePdpContext, dataCallInfo);
64 }
65 
ActivatePdpContextResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const HDI::Ril::V1_1::SetupDataCallResultInfo & iSetupDataCallResultInfo)66 int32_t TelRilData::ActivatePdpContextResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo,
67     const HDI::Ril::V1_1::SetupDataCallResultInfo &iSetupDataCallResultInfo)
68 {
69     auto getDataFunc = [&iSetupDataCallResultInfo, this](std::shared_ptr<TelRilRequest> telRilRequest) {
70         std::shared_ptr<SetupDataCallResultInfo> setupDataCallResultInfo = std::make_shared<SetupDataCallResultInfo>();
71         this->BuildDataCallResultInfo(setupDataCallResultInfo, iSetupDataCallResultInfo);
72         setupDataCallResultInfo->flag = telRilRequest->pointer_->GetParam();
73         return setupDataCallResultInfo;
74     };
75     return Response<SetupDataCallResultInfo>(TELEPHONY_LOG_FUNC_NAME, responseInfo, getDataFunc);
76 }
77 
GetPdpContextList(const AppExecFwk::InnerEvent::Pointer & response)78 int32_t TelRilData::GetPdpContextList(const AppExecFwk::InnerEvent::Pointer &response)
79 {
80     HDI::Ril::V1_1::UniInfo uniInfo;
81     return Request(TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_1::IRil::GetPdpContextList, uniInfo);
82 }
83 
GetPdpContextListResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const HDI::Ril::V1_1::DataCallResultList & iDataCallResultList)84 int32_t TelRilData::GetPdpContextListResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo,
85     const HDI::Ril::V1_1::DataCallResultList &iDataCallResultList)
86 {
87     if (iDataCallResultList.size != (int32_t)iDataCallResultList.dcList.size()) {
88         TELEPHONY_LOGE("Slot%{public}d iDataCallResultList.size is invalid", slotId_);
89         return TELEPHONY_ERR_ARGUMENT_INVALID;
90     }
91     auto getDataFunc = [&iDataCallResultList, this](std::shared_ptr<TelRilRequest> telRilRequest) {
92         std::shared_ptr<DataCallResultList> dataCallResultList = std::make_shared<DataCallResultList>();
93         this->BuildDataCallResultList(dataCallResultList, iDataCallResultList);
94         int32_t param = telRilRequest->pointer_->GetParam();
95         for (auto &setupDataCallResultInfo : dataCallResultList->dcList) {
96             setupDataCallResultInfo.flag = param;
97         }
98         return dataCallResultList;
99     };
100     return Response<DataCallResultList>(TELEPHONY_LOG_FUNC_NAME, responseInfo, getDataFunc);
101 }
102 
SetInitApnInfo(const DataProfile & dataProfile,const AppExecFwk::InnerEvent::Pointer & response)103 int32_t TelRilData::SetInitApnInfo(const DataProfile &dataProfile, const AppExecFwk::InnerEvent::Pointer &response)
104 {
105     HDI::Ril::V1_1::DataProfileDataInfo dataProfileInfo = ChangeDPToHalDataProfile(dataProfile);
106     return Request(TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_1::IRil::SetInitApnInfo, dataProfileInfo);
107 }
108 
SetInitApnInfoResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo)109 int32_t TelRilData::SetInitApnInfoResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo)
110 {
111     return Response(TELEPHONY_LOG_FUNC_NAME, responseInfo);
112 }
113 
PdpContextListUpdated(const HDI::Ril::V1_1::DataCallResultList & iDataCallResultList)114 int32_t TelRilData::PdpContextListUpdated(const HDI::Ril::V1_1::DataCallResultList &iDataCallResultList)
115 {
116     std::shared_ptr<DataCallResultList> dataCallResultList = std::make_shared<DataCallResultList>();
117     if (dataCallResultList == nullptr) {
118         TELEPHONY_LOGE("Slot%{public}d dataCallResultList is nullptr", slotId_);
119         return TELEPHONY_ERR_LOCAL_PTR_NULL;
120     }
121     if (iDataCallResultList.size != (int32_t)iDataCallResultList.dcList.size()) {
122         TELEPHONY_LOGE("Slot%{public}d iDataCallResultList.size is invalid", slotId_);
123         return TELEPHONY_ERR_ARGUMENT_INVALID;
124     }
125     BuildDataCallResultList(dataCallResultList, iDataCallResultList);
126     return Notify<DataCallResultList>(
127         TELEPHONY_LOG_FUNC_NAME, dataCallResultList, RadioEvent::RADIO_DATA_CALL_LIST_CHANGED);
128 }
129 
DataLinkCapabilityUpdated(const HDI::Ril::V1_1::DataLinkCapability & dataLinkCapability)130 int32_t TelRilData::DataLinkCapabilityUpdated(const HDI::Ril::V1_1::DataLinkCapability &dataLinkCapability)
131 {
132     std::shared_ptr<DataLinkCapability> linkCapability = std::make_shared<DataLinkCapability>();
133     if (linkCapability == nullptr) {
134         TELEPHONY_LOGE("Slot%{public}d linkCapability is nullptr", slotId_);
135         return TELEPHONY_ERR_LOCAL_PTR_NULL;
136     }
137     linkCapability->primaryDownlinkKbps = dataLinkCapability.primaryDownlinkKbps;
138     linkCapability->primaryUplinkKbps = dataLinkCapability.primaryUplinkKbps;
139     linkCapability->secondaryDownlinkKbps = dataLinkCapability.secondaryDownlinkKbps;
140     linkCapability->secondaryUplinkKbps = dataLinkCapability.secondaryUplinkKbps;
141     return Notify<DataLinkCapability>(
142         TELEPHONY_LOG_FUNC_NAME, linkCapability, RadioEvent::RADIO_LINK_CAPABILITY_CHANGED);
143 }
144 
GetLinkCapability(const AppExecFwk::InnerEvent::Pointer & response)145 int32_t TelRilData::GetLinkCapability(const AppExecFwk::InnerEvent::Pointer &response)
146 {
147     return Request(TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_1::IRil::GetLinkCapability);
148 }
149 
GetLinkCapabilityResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const HDI::Ril::V1_1::DataLinkCapability & dataLinkCapability)150 int32_t TelRilData::GetLinkCapabilityResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo,
151     const HDI::Ril::V1_1::DataLinkCapability &dataLinkCapability)
152 {
153     std::shared_ptr<DataLinkCapability> linkCapability = std::make_shared<DataLinkCapability>();
154     if (linkCapability == nullptr) {
155         TELEPHONY_LOGE("ERROR : linkCapability == nullptr !!!");
156         return TELEPHONY_ERR_LOCAL_PTR_NULL;
157     }
158     linkCapability->primaryDownlinkKbps = dataLinkCapability.primaryDownlinkKbps;
159     linkCapability->primaryUplinkKbps = dataLinkCapability.primaryUplinkKbps;
160     linkCapability->secondaryDownlinkKbps = dataLinkCapability.secondaryDownlinkKbps;
161     linkCapability->secondaryUplinkKbps = dataLinkCapability.secondaryUplinkKbps;
162     return Response<DataLinkCapability>(TELEPHONY_LOG_FUNC_NAME, responseInfo, linkCapability);
163 }
164 
GetLinkBandwidthInfo(const int32_t cid,const AppExecFwk::InnerEvent::Pointer & response)165 int32_t TelRilData::GetLinkBandwidthInfo(const int32_t cid, const AppExecFwk::InnerEvent::Pointer &response)
166 {
167     return Request(TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_1::IRil::GetLinkBandwidthInfo, cid);
168 }
169 
GetLinkBandwidthInfoResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const HDI::Ril::V1_1::DataLinkBandwidthInfo & iDataLinkBandwidthInfo)170 int32_t TelRilData::GetLinkBandwidthInfoResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo,
171     const HDI::Ril::V1_1::DataLinkBandwidthInfo &iDataLinkBandwidthInfo)
172 {
173     std::shared_ptr<DataLinkBandwidthInfo> dataLinkBandwidthInfo = std::make_shared<DataLinkBandwidthInfo>();
174     if (dataLinkBandwidthInfo == nullptr) {
175         TELEPHONY_LOGE("ERROR : dataLinkBandwidthInfo == nullptr !!!");
176         return TELEPHONY_ERR_LOCAL_PTR_NULL;
177     }
178     BuildDataLinkBandwidthInfo(dataLinkBandwidthInfo, iDataLinkBandwidthInfo);
179     return Response<DataLinkBandwidthInfo>(TELEPHONY_LOG_FUNC_NAME, responseInfo, dataLinkBandwidthInfo);
180 }
181 
SetLinkBandwidthReportingRule(LinkBandwidthRule linkBandwidth,const AppExecFwk::InnerEvent::Pointer & response)182 int32_t TelRilData::SetLinkBandwidthReportingRule(
183     LinkBandwidthRule linkBandwidth, const AppExecFwk::InnerEvent::Pointer &response)
184 {
185     HDI::Ril::V1_1::DataLinkBandwidthReportingRule dLinkBandwidth;
186     dLinkBandwidth.rat = linkBandwidth.rat;
187     dLinkBandwidth.delayMs = linkBandwidth.delayMs;
188     dLinkBandwidth.delayUplinkKbps = linkBandwidth.delayUplinkKbps;
189     dLinkBandwidth.delayDownlinkKbps = linkBandwidth.delayDownlinkKbps;
190     dLinkBandwidth.maximumUplinkKbpsSize = static_cast<int32_t>(linkBandwidth.maximumUplinkKbps.size());
191     dLinkBandwidth.maximumDownlinkKbpsSize = static_cast<int32_t>(linkBandwidth.maximumDownlinkKbps.size());
192     dLinkBandwidth.maximumUplinkKbps = linkBandwidth.maximumUplinkKbps;
193     dLinkBandwidth.maximumDownlinkKbps = linkBandwidth.maximumDownlinkKbps;
194     TELEPHONY_LOGD("maximumUplinkKbpsSize:%{public}d, maximumDownlinkKbpsSize:%{public}d",
195         dLinkBandwidth.maximumUplinkKbpsSize, dLinkBandwidth.maximumDownlinkKbpsSize);
196     return Request(
197         TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_1::IRil::SetLinkBandwidthReportingRule, dLinkBandwidth);
198 }
199 
SetLinkBandwidthReportingRuleResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo)200 int32_t TelRilData::SetLinkBandwidthReportingRuleResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo)
201 {
202     return Response(TELEPHONY_LOG_FUNC_NAME, responseInfo);
203 }
204 
SetDataPermitted(const int32_t dataPermitted,const AppExecFwk::InnerEvent::Pointer & response)205 int32_t TelRilData::SetDataPermitted(const int32_t dataPermitted, const AppExecFwk::InnerEvent::Pointer &response)
206 {
207     return Request(TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_1::IRil::SetDataPermitted, dataPermitted);
208 }
209 
SetDataPermittedResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo)210 int32_t TelRilData::SetDataPermittedResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo)
211 {
212     return Response(TELEPHONY_LOG_FUNC_NAME, responseInfo);
213 }
214 
CleanAllConnections(const AppExecFwk::InnerEvent::Pointer & response)215 int32_t TelRilData::CleanAllConnections(const AppExecFwk::InnerEvent::Pointer &response)
216 {
217     return Request(TELEPHONY_LOG_FUNC_NAME, response, &HDI::Ril::V1_2::IRil::CleanAllConnections);
218 }
219 
CleanAllConnectionsResponse(const HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo)220 int32_t TelRilData::CleanAllConnectionsResponse(const HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo)
221 {
222     return Response(TELEPHONY_LOG_FUNC_NAME, responseInfo);
223 }
224 
BuildDataCallResultList(std::shared_ptr<DataCallResultList> dataCallResultList,const HDI::Ril::V1_1::DataCallResultList & iDataCallResultList)225 void TelRilData::BuildDataCallResultList(std::shared_ptr<DataCallResultList> dataCallResultList,
226     const HDI::Ril::V1_1::DataCallResultList &iDataCallResultList)
227 {
228     dataCallResultList->size = iDataCallResultList.size;
229     for (auto dc : iDataCallResultList.dcList) {
230         SetupDataCallResultInfo dataCallResultInfo;
231         dataCallResultInfo.flag = dc.flag;
232         dataCallResultInfo.reason = dc.reason;
233         dataCallResultInfo.retryTime = dc.retryTime;
234         dataCallResultInfo.cid = dc.cid;
235         dataCallResultInfo.active = dc.active;
236         dataCallResultInfo.type = dc.type;
237         dataCallResultInfo.netPortName = dc.netPortName;
238         dataCallResultInfo.address = dc.address;
239         dataCallResultInfo.dns = dc.dns;
240         dataCallResultInfo.dnsSec = dc.dnsSec;
241         dataCallResultInfo.gateway = dc.gateway;
242         dataCallResultInfo.maxTransferUnit = dc.maxTransferUnit;
243         dataCallResultInfo.pCscfPrimAddr = dc.pCscfPrimAddr;
244         dataCallResultInfo.pCscfSecAddr = dc.pCscfSecAddr;
245         dataCallResultInfo.pduSessionId = dc.pduSessionId;
246         dataCallResultList->dcList.push_back(dataCallResultInfo);
247     }
248 }
249 
BuildDataCallResultInfo(std::shared_ptr<SetupDataCallResultInfo> dataCallResult,const HDI::Ril::V1_1::SetupDataCallResultInfo & iSetupDataCallResultInfo)250 void TelRilData::BuildDataCallResultInfo(std::shared_ptr<SetupDataCallResultInfo> dataCallResult,
251     const HDI::Ril::V1_1::SetupDataCallResultInfo &iSetupDataCallResultInfo)
252 {
253     dataCallResult->flag = iSetupDataCallResultInfo.flag;
254     dataCallResult->reason = iSetupDataCallResultInfo.reason;
255     dataCallResult->retryTime = iSetupDataCallResultInfo.retryTime;
256     dataCallResult->cid = iSetupDataCallResultInfo.cid;
257     dataCallResult->active = iSetupDataCallResultInfo.active;
258     dataCallResult->type = iSetupDataCallResultInfo.type;
259     dataCallResult->netPortName = iSetupDataCallResultInfo.netPortName;
260     dataCallResult->address = iSetupDataCallResultInfo.address;
261     dataCallResult->dns = iSetupDataCallResultInfo.dns;
262     dataCallResult->dnsSec = iSetupDataCallResultInfo.dnsSec;
263     dataCallResult->gateway = iSetupDataCallResultInfo.gateway;
264     dataCallResult->maxTransferUnit = iSetupDataCallResultInfo.maxTransferUnit;
265     dataCallResult->pCscfPrimAddr = iSetupDataCallResultInfo.pCscfPrimAddr;
266     dataCallResult->pCscfSecAddr = iSetupDataCallResultInfo.pCscfSecAddr;
267     dataCallResult->pduSessionId = iSetupDataCallResultInfo.pduSessionId;
268 }
269 
BuildDataLinkBandwidthInfo(std::shared_ptr<DataLinkBandwidthInfo> dataLinkBandwidthInfo,const HDI::Ril::V1_1::DataLinkBandwidthInfo & iDataLinkBandwidthInfo)270 void TelRilData::BuildDataLinkBandwidthInfo(std::shared_ptr<DataLinkBandwidthInfo> dataLinkBandwidthInfo,
271     const HDI::Ril::V1_1::DataLinkBandwidthInfo &iDataLinkBandwidthInfo)
272 {
273     dataLinkBandwidthInfo->serial = iDataLinkBandwidthInfo.serial;
274     dataLinkBandwidthInfo->cid = iDataLinkBandwidthInfo.cid;
275     dataLinkBandwidthInfo->qi = iDataLinkBandwidthInfo.qi;
276     dataLinkBandwidthInfo->dlGfbr = iDataLinkBandwidthInfo.dlGfbr;
277     dataLinkBandwidthInfo->ulGfbr = iDataLinkBandwidthInfo.ulGfbr;
278     dataLinkBandwidthInfo->dlMfbr = iDataLinkBandwidthInfo.dlMfbr;
279     dataLinkBandwidthInfo->ulMfbr = iDataLinkBandwidthInfo.ulMfbr;
280     dataLinkBandwidthInfo->ulSambr = iDataLinkBandwidthInfo.ulSambr;
281     dataLinkBandwidthInfo->dlSambr = iDataLinkBandwidthInfo.dlSambr;
282     dataLinkBandwidthInfo->averagingWindow = iDataLinkBandwidthInfo.averagingWindow;
283 }
284 } // namespace Telephony
285 } // namespace OHOS
286