1 /*
2 * Copyright (C) 2021-2024 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 "network_register.h"
17
18 #include <cinttypes>
19
20 #include "core_service_hisysevent.h"
21 #include "enum_convert.h"
22 #include "i_network_search_callback.h"
23 #include "network_search_manager.h"
24 #include "parameter.h"
25 #include "resource_utils.h"
26 #include "string_ex.h"
27 #include "tel_ril_modem_parcel.h"
28 #include "telephony_errors.h"
29 #include "telephony_ext_wrapper.h"
30 #include "telephony_log_wrapper.h"
31
32 namespace OHOS {
33 namespace Telephony {
34 constexpr const char *TELEPHONY_NR_CONVERSION_CONFIG = "persist.telephony.nr.config";
35 constexpr const char *TELEPHONY_NR_CONFIG_A = "ConfigA";
36 constexpr const char *TELEPHONY_NR_CONFIG_B = "ConfigB";
37 constexpr const char *TELEPHONY_NR_CONFIG_C = "ConfigC";
38 constexpr const char *TELEPHONY_NR_CONFIG_D = "ConfigD";
39 constexpr const char *TELEPHONY_NR_CONFIG_AD = "ConfigAD";
40 constexpr int32_t SYS_PARAMETER_SIZE = 256;
41 constexpr int32_t MAX_SIZE = 100;
42 constexpr int32_t CS_TYPE = 0;
43 constexpr int32_t IMS_TYPE = 1;
44
NetworkRegister(std::shared_ptr<NetworkSearchState> networkSearchState,std::weak_ptr<NetworkSearchManager> networkSearchManager,int32_t slotId)45 NetworkRegister::NetworkRegister(std::shared_ptr<NetworkSearchState> networkSearchState,
46 std::weak_ptr<NetworkSearchManager> networkSearchManager, int32_t slotId)
47 : networkSearchState_(networkSearchState), networkSearchManager_(networkSearchManager), slotId_(slotId)
48 {
49 ResourceUtils::Get().GetBooleanValueByName(ResourceUtils::IS_CS_CAPABLE, isCsCapable_);
50 }
51
InitNrConversionConfig()52 void NetworkRegister::InitNrConversionConfig()
53 {
54 GetSystemPropertiesConfig(systemPropertiesConfig_);
55 if (systemPropertiesConfig_ == TELEPHONY_NR_CONFIG_AD) {
56 int32_t rrcState = 0;
57 GetRrcConnectionState(rrcState);
58 if (rrcState == RRC_CONNECTED_STATUS) {
59 currentNrConfig_ = TELEPHONY_NR_CONFIG_A;
60 } else {
61 currentNrConfig_ = TELEPHONY_NR_CONFIG_D;
62 }
63 } else {
64 currentNrConfig_ = systemPropertiesConfig_;
65 }
66 }
67
UpdateNetworkSearchState(RegServiceState regStatus,RadioTech tech,RoamingType roam,DomainType type)68 void NetworkRegister::UpdateNetworkSearchState(RegServiceState regStatus,
69 RadioTech tech,
70 RoamingType roam,
71 DomainType type)
72 {
73 networkSearchState_->SetNetworkState(regStatus, type);
74 networkSearchState_->SetEmergency(
75 (regStatus == RegServiceState::REG_STATE_EMERGENCY_ONLY) && isCsCapable_);
76 networkSearchState_->SetNetworkType(tech, type);
77 networkSearchState_->SetNetworkStateToRoaming(roam, type);
78 }
79
ProcessCsRegister(const std::shared_ptr<CsRegStatusInfo> csRegStateResult)80 void NetworkRegister::ProcessCsRegister(const std::shared_ptr<CsRegStatusInfo> csRegStateResult)
81 {
82 auto networkSearchManager = networkSearchManager_.lock();
83 if (networkSearchManager == nullptr) {
84 TELEPHONY_LOGE("NetworkRegister::ProcessCsRegister networkSearchManager is nullptr slotId:%{public}d", slotId_);
85 return;
86 }
87 if (csRegStateResult == nullptr) {
88 TELEPHONY_LOGE("NetworkRegister::ProcessCsRegister csRegStateResult is nullptr slotId:%{public}d", slotId_);
89 return;
90 }
91 RilRegister registrationStatus = static_cast<RilRegister>(csRegStateResult->regStatus);
92 RegServiceState regStatus = ConvertRegFromRil(registrationStatus);
93 if (networkSearchState_ == nullptr) {
94 TELEPHONY_LOGE("NetworkRegister::ProcessCsRegister networkSearchState_ is nullptr slotId:%{public}d", slotId_);
95 return;
96 }
97 UpdateCellularCall(regStatus, CS_TYPE);
98 RadioTech tech = ConvertTechFromRil(static_cast<TelRilRadioTech>(csRegStateResult->radioTechnology));
99 RoamingType roam = RoamingType::ROAMING_STATE_UNKNOWN;
100 if (registrationStatus == RilRegister::REG_STATE_ROAMING) {
101 roam = RoamingType::ROAMING_STATE_UNSPEC;
102 }
103 UpdateNetworkSearchState(regStatus, tech, roam, DomainType::DOMAIN_TYPE_CS);
104 auto iter = rilRegisterStateMap_.find(static_cast<int32_t>(registrationStatus));
105 if (iter != rilRegisterStateMap_.end()) {
106 TELEPHONY_LOGI("regStatus= %{public}s(%{public}d) radioTechnology=%{public}d roam=%{public}d slotId:%{public}d",
107 iter->second.c_str(), registrationStatus, csRegStateResult->radioTechnology, roam, slotId_);
108 }
109 CoreServiceHiSysEvent::WriteNetworkStateBehaviorEvent(slotId_, static_cast<int32_t>(DomainType::DOMAIN_TYPE_CS),
110 static_cast<int32_t>(tech), static_cast<int32_t>(regStatus));
111 }
112
UpdateCellularCall(const RegServiceState & regStatus,const int32_t callType)113 void NetworkRegister::UpdateCellularCall(const RegServiceState ®Status, const int32_t callType)
114 {
115 auto networkSearchManager = networkSearchManager_.lock();
116 if (networkSearchManager == nullptr) {
117 TELEPHONY_LOGE("networkSearchManager is nullptr");
118 return;
119 }
120 if (regStatus == RegServiceState::REG_STATE_IN_SERVICE || regStatus == RegServiceState::REG_STATE_EMERGENCY_ONLY) {
121 sptr<NetworkSearchCallBackBase> cellularCall = networkSearchManager->GetCellularCallCallBack();
122 if (cellularCall) {
123 cellularCall->SetReadyToCall(slotId_, callType, true);
124 }
125 }
126 }
127
ProcessPsRegister(const std::shared_ptr<PsRegStatusResultInfo> psRegStatusResult)128 void NetworkRegister::ProcessPsRegister(const std::shared_ptr<PsRegStatusResultInfo> psRegStatusResult)
129 {
130 auto networkSearchManager = networkSearchManager_.lock();
131 if (networkSearchManager == nullptr) {
132 TELEPHONY_LOGE("NetworkRegister::ProcessPsRegister networkSearchManager is nullptr");
133 return;
134 }
135 if (psRegStatusResult == nullptr) {
136 TELEPHONY_LOGE("NetworkRegister::ProcessPsRegister psRegStatusResult is nullptr slotId:%{public}d", slotId_);
137 return;
138 }
139 RilRegister registrationStatus = static_cast<RilRegister>(psRegStatusResult->regStatus);
140 RegServiceState regStatus = ConvertRegFromRil(registrationStatus);
141 if (networkSearchState_ == nullptr) {
142 TELEPHONY_LOGE("NetworkRegister::ProcessPsRegister networkSearchState_ is nullptr slotId:%{public}d", slotId_);
143 return;
144 }
145 UpdateCellularCall(regStatus, IMS_TYPE);
146 RadioTech tech = ConvertTechFromRil(static_cast<TelRilRadioTech>(psRegStatusResult->radioTechnology));
147 RoamingType roam = RoamingType::ROAMING_STATE_UNKNOWN;
148 if (registrationStatus == RilRegister::REG_STATE_ROAMING) {
149 roam = RoamingType::ROAMING_STATE_UNSPEC;
150 }
151 UpdateNetworkSearchState(regStatus, tech, roam, DomainType::DOMAIN_TYPE_PS);
152 endcSupport_ = psRegStatusResult->isEnDcAvailable;
153 dcNrRestricted_ = psRegStatusResult->isDcNrRestricted;
154 nrSupport_ = psRegStatusResult->isNrAvailable;
155 UpdateNrState();
156 UpdateCfgTech();
157 auto iter = rilRegisterStateMap_.find(static_cast<int32_t>(registrationStatus));
158 TELEPHONY_LOGI("regStatus= %{public}s(%{public}d) radioTechnology=%{public}d roam=%{public}d slotId:%{public}d",
159 iter->second.c_str(), registrationStatus, psRegStatusResult->radioTechnology, roam, slotId_);
160 CoreServiceHiSysEvent::WriteNetworkStateBehaviorEvent(slotId_, static_cast<int32_t>(DomainType::DOMAIN_TYPE_PS),
161 static_cast<int32_t>(tech), static_cast<int32_t>(regStatus));
162 }
163
RevertLastTechnology()164 int32_t NetworkRegister::RevertLastTechnology()
165 {
166 if (networkSearchState_ == nullptr) {
167 TELEPHONY_LOGE("networkSearchState_ is nullptr slotId:%{public}d", slotId_);
168 return TELEPHONY_ERR_LOCAL_PTR_NULL;
169 }
170 RadioTech lastCfgTech = RadioTech::RADIO_TECHNOLOGY_UNKNOWN;
171 RadioTech lastPsRadioTech = RadioTech::RADIO_TECHNOLOGY_UNKNOWN;
172 networkSearchState_->GetLastCfgTech(lastCfgTech);
173 networkSearchState_->GetLastPsRadioTech(lastPsRadioTech);
174 networkSearchState_->SetCfgTech(lastCfgTech);
175 networkSearchState_->SetNetworkType(lastPsRadioTech, DomainType::DOMAIN_TYPE_PS);
176 TELEPHONY_LOGI(
177 "lastCfgTech:%{public}d lastPsRadioTech:%{public}d slotId:%{public}d", lastCfgTech, lastPsRadioTech, slotId_);
178 return TELEPHONY_ERR_SUCCESS;
179 }
180
NotifyStateChange()181 int32_t NetworkRegister::NotifyStateChange()
182 {
183 if (networkSearchState_ == nullptr) {
184 TELEPHONY_LOGE("networkSearchState_ is nullptr slotId:%{public}d", slotId_);
185 return TELEPHONY_ERR_LOCAL_PTR_NULL;
186 }
187 networkSearchState_->NotifyStateChange();
188 return TELEPHONY_ERR_SUCCESS;
189 }
190
ProcessChannelConfigInfo(const AppExecFwk::InnerEvent::Pointer & event)191 void NetworkRegister::ProcessChannelConfigInfo(const AppExecFwk::InnerEvent::Pointer &event)
192 {
193 std::shared_ptr<ChannelConfigInfoList> channelConfigInfoList = event->GetSharedObject<ChannelConfigInfoList>();
194 if (channelConfigInfoList == nullptr) {
195 TELEPHONY_LOGE(
196 "NetworkRegister::ProcessChannelConfigInfo psRegStatusResult is nullptr slotId:%{public}d", slotId_);
197 return;
198 }
199 int32_t size = channelConfigInfoList->itemNum;
200 TELEPHONY_LOGI("NetworkRegister::ProcessChannelConfigInfo num size:%{public}d slotId:%{public}d", size, slotId_);
201 if (size >= MAX_SIZE) {
202 TELEPHONY_LOGE("NetworkRegister::ProcessChannelConfigInfo num over max size");
203 return;
204 }
205 if (channelConfigInfoList->channelConfigInfos.size() > 0 &&
206 static_cast<int32_t>(channelConfigInfoList->channelConfigInfos.size()) == size) {
207 std::vector<PhysicalChannelConfig> &configs = channelConfigInfoList->channelConfigInfos;
208 channelConfigInfos_.clear();
209 channelConfigInfos_.insert(channelConfigInfos_.begin(), configs.begin(), configs.end());
210 } else {
211 TELEPHONY_LOGE("NetworkRegister::ProcessChannelConfigInfo data error slotId:%{public}d", slotId_);
212 return;
213 }
214
215 bool isNrSecondaryCell = false;
216 for (int32_t i = 0; i < size; ++i) {
217 if (static_cast<RadioTech>(channelConfigInfos_[i].ratType) == RadioTech::RADIO_TECHNOLOGY_NR &&
218 static_cast<ConnectServiceCell>(channelConfigInfos_[i].cellConnStatus) ==
219 ConnectServiceCell::CONNECTION_SECONDARY_CELL) {
220 isNrSecondaryCell = true;
221 break;
222 }
223 }
224 TELEPHONY_LOGI("isNrSecondaryCell:%{public}d slotId:%{public}d", isNrSecondaryCell, slotId_);
225 NotifyNrFrequencyChanged();
226 if (isNrSecondaryCell_ != isNrSecondaryCell) {
227 isNrSecondaryCell_ = isNrSecondaryCell;
228 UpdateNrState();
229 UpdateCfgTech();
230 auto networkSearchManager = networkSearchManager_.lock();
231 if (networkSearchManager == nullptr) {
232 TELEPHONY_LOGE("NetworkRegister::ProcessChannelConfigInfo networkSearchManager is nullptr");
233 return;
234 }
235 TELEPHONY_LOGI("physical channel change, slotId:%{public}d", slotId_);
236 networkSearchManager->ProcessNotifyStateChangeEvent(slotId_);
237 }
238 }
239
NotifyNrFrequencyChanged()240 void NetworkRegister::NotifyNrFrequencyChanged()
241 {
242 auto networkSearchManager = networkSearchManager_.lock();
243 if (networkSearchManager == nullptr) {
244 TELEPHONY_LOGE("NetworkRegister::NotifyNrFrequencyChanged networkSearchManager is nullptr");
245 return;
246 }
247 bool isFreqChanged = false;
248 FrequencyType curFreqType = FrequencyType::FREQ_TYPE_UNKNOWN;
249
250 sptr<NetworkSearchCallBackBase> cellularData = networkSearchManager->GetCellularDataCallBack();
251 if (cellularData == nullptr) {
252 TELEPHONY_LOGE("NetworkRegister::NotifyNrFrequencyChanged cellularData callback is nullptr");
253 return;
254 }
255 ssize_t size = channelConfigInfos_.size();
256 if (size >= MAX_SIZE) {
257 TELEPHONY_LOGE("NetworkRegister::NotifyNrFrequencyChanged channelConfigInfos_ over max size");
258 return;
259 }
260 for (int32_t i = 0; i < size; ++i) {
261 std::vector<int32_t> &cids = channelConfigInfos_[i].contextIds;
262 if (isFreqChanged) {
263 TELEPHONY_LOGE("NetworkRegister::NotifyNrFrequencyChanged channelConfigInfos:%{public}d isFreqChanged", i);
264 continue;
265 }
266 for (auto &cid : cids) {
267 if (!cellularData->HasInternetCapability(slotId_, cid)) {
268 TELEPHONY_LOGE("NetworkRegister::NotifyNrFrequencyChanged cid:%{public}d hasNoInternetCapability", cid);
269 continue;
270 }
271 curFreqType = static_cast<FrequencyType>(channelConfigInfos_[i].freqRange);
272 isFreqChanged = true;
273 break;
274 }
275 if (isFreqChanged) {
276 break;
277 }
278 }
279 if (freqType_ != curFreqType) {
280 freqType_ = curFreqType;
281 networkSearchManager->NotifyNrFrequencyChanged(slotId_);
282 networkSearchManager->SetFrequencyType(slotId_, freqType_);
283 }
284 }
285
DcPhysicalLinkActiveUpdate(bool isActive)286 void NetworkRegister::DcPhysicalLinkActiveUpdate(bool isActive)
287 {
288 TELEPHONY_LOGI("NetworkRegister::DcPhysicalLinkActiveUpdate isActive:%{public}s slotId:%{public}d",
289 isActive ? "true" : "false", slotId_);
290 isPhysicalLinkActive_ = isActive;
291 UpdateNrState();
292 }
293
UpdateNrState()294 void NetworkRegister::UpdateNrState()
295 {
296 if (networkSearchState_ == nullptr || networkSearchState_->GetNetworkStatus() == nullptr) {
297 TELEPHONY_LOGE("networkSearchState_ is nullptr, slotId:%{public}d", slotId_);
298 return;
299 }
300
301 nrState_ = NrState::NR_STATE_NOT_SUPPORT;
302 RadioTech rat = networkSearchState_->GetNetworkStatus()->GetPsRadioTech();
303 if (rat == RadioTech::RADIO_TECHNOLOGY_NR) {
304 nrState_ = NrState::NR_NSA_STATE_SA_ATTACHED;
305 } else {
306 if (isNrSecondaryCell_) {
307 nrState_ = NrState::NR_NSA_STATE_DUAL_CONNECTED;
308 } else if (endcSupport_) {
309 if (dcNrRestricted_) {
310 nrState_ = NrState::NR_STATE_NOT_SUPPORT;
311 } else {
312 nrState_ = NrState::NR_NSA_STATE_NO_DETECT;
313 }
314 }
315 }
316 nrState_ = static_cast<NrState>(UpdateNsaState(static_cast<int32_t>(nrState_)));
317 networkSearchState_->SetNrState(nrState_);
318 }
319
UpdateNsaState(int32_t nsaState)320 int32_t NetworkRegister::UpdateNsaState(int32_t nsaState)
321 {
322 int32_t newNsaState = nsaState;
323 auto networkSearchManager = networkSearchManager_.lock();
324 if (networkSearchManager == nullptr || networkSearchState_ == nullptr) {
325 TELEPHONY_LOGE("networkSearchState_ is nullptr, slotId:%{public}d", slotId_);
326 return newNsaState;
327 }
328 std::vector<sptr<CellInformation>> cellInfo;
329 networkSearchManager->GetCellInfoList(slotId_, cellInfo);
330 int32_t cellId = 0;
331 auto iter = cellInfo.begin();
332 while (iter != cellInfo.end()) {
333 if ((*iter)->GetNetworkType() == CellInformation::CellType::CELL_TYPE_LTE) {
334 cellId = (*iter)->GetCellId();
335 break;
336 }
337 iter++;
338 }
339 auto networkState = networkSearchState_->GetNetworkStatus();
340 if (networkState == nullptr) {
341 TELEPHONY_LOGE("networkState is nullptr, slotId:%{public}d", slotId_);
342 return newNsaState;
343 }
344 RegServiceState regState = networkState->GetRegStatus();
345 RadioTech psRegTech = networkState->GetPsRadioTech();
346 if (regState != RegServiceState::REG_STATE_IN_SERVICE ||
347 (psRegTech != RadioTech::RADIO_TECHNOLOGY_LTE && psRegTech != RadioTech::RADIO_TECHNOLOGY_LTE_CA)) {
348 return newNsaState;
349 }
350 if (TELEPHONY_EXT_WRAPPER.updateNsaStateExt_ != nullptr) {
351 newNsaState = TELEPHONY_EXT_WRAPPER.updateNsaStateExt_(
352 slotId_, cellId, nrSupport_, dcNrRestricted_, newNsaState);
353 }
354 return newNsaState;
355 }
356
UpdateCfgTech()357 void NetworkRegister::UpdateCfgTech()
358 {
359 if (networkSearchState_ == nullptr || networkSearchState_->GetNetworkStatus() == nullptr) {
360 TELEPHONY_LOGE("NetworkRegister::UpdateCfgTech networkSearchState_ is nullptr slotId:%{public}d", slotId_);
361 return;
362 }
363 RadioTech tech = networkSearchState_->GetNetworkStatus()->GetPsRadioTech();
364 TELEPHONY_LOGD("tech:%{public}d slotId:%{public}d", tech, slotId_);
365 RadioTech cfgTech = GetTechnologyByNrConfig(tech);
366 networkSearchState_->SetCfgTech(cfgTech);
367 }
368
ProcessRestrictedState(const AppExecFwk::InnerEvent::Pointer & event) const369 void NetworkRegister::ProcessRestrictedState(const AppExecFwk::InnerEvent::Pointer &event) const {}
370
ConvertRegFromRil(RilRegister code) const371 RegServiceState NetworkRegister::ConvertRegFromRil(RilRegister code) const
372 {
373 switch (code) {
374 case RilRegister::REG_STATE_SEARCH:
375 return RegServiceState::REG_STATE_SEARCH;
376 case RilRegister::REG_STATE_NOT_REG:
377 case RilRegister::REG_STATE_NO_SERVICE:
378 return RegServiceState::REG_STATE_NO_SERVICE;
379 case RilRegister::REG_STATE_INVALID:
380 return RegServiceState::REG_STATE_UNKNOWN;
381 case RilRegister::REG_STATE_ROAMING:
382 case RilRegister::REG_STATE_HOME_ONLY:
383 return RegServiceState::REG_STATE_IN_SERVICE;
384 case RilRegister::REG_STATE_EMERGENCY_ONLY:
385 return RegServiceState::REG_STATE_EMERGENCY_ONLY;
386 default:
387 return RegServiceState::REG_STATE_NO_SERVICE;
388 }
389 }
390
ConvertTechFromRil(TelRilRadioTech code) const391 RadioTech NetworkRegister::ConvertTechFromRil(TelRilRadioTech code) const
392 {
393 switch (code) {
394 case TelRilRadioTech::RADIO_TECHNOLOGY_GSM:
395 return RadioTech::RADIO_TECHNOLOGY_GSM;
396 case TelRilRadioTech::RADIO_TECHNOLOGY_1XRTT:
397 return RadioTech::RADIO_TECHNOLOGY_1XRTT;
398 case TelRilRadioTech::RADIO_TECHNOLOGY_HSPA:
399 return RadioTech::RADIO_TECHNOLOGY_HSPA;
400 case TelRilRadioTech::RADIO_TECHNOLOGY_HSPAP:
401 return RadioTech::RADIO_TECHNOLOGY_HSPAP;
402 case TelRilRadioTech::RADIO_TECHNOLOGY_WCDMA:
403 return RadioTech::RADIO_TECHNOLOGY_WCDMA;
404 case TelRilRadioTech::RADIO_TECHNOLOGY_LTE:
405 return RadioTech::RADIO_TECHNOLOGY_LTE;
406 case TelRilRadioTech::RADIO_TECHNOLOGY_EVDO:
407 return RadioTech::RADIO_TECHNOLOGY_EVDO;
408 case TelRilRadioTech::RADIO_TECHNOLOGY_EHRPD:
409 return RadioTech::RADIO_TECHNOLOGY_EHRPD;
410 case TelRilRadioTech::RADIO_TECHNOLOGY_TD_SCDMA:
411 return RadioTech::RADIO_TECHNOLOGY_TD_SCDMA;
412 case TelRilRadioTech::RADIO_TECHNOLOGY_LTE_CA:
413 return RadioTech::RADIO_TECHNOLOGY_LTE_CA;
414 case TelRilRadioTech::RADIO_TECHNOLOGY_NR:
415 return RadioTech::RADIO_TECHNOLOGY_NR;
416 default:
417 return RadioTech::RADIO_TECHNOLOGY_UNKNOWN;
418 }
419 }
420
IsValidConfig(const std::string & config)421 bool NetworkRegister::IsValidConfig(const std::string &config)
422 {
423 if (config == TELEPHONY_NR_CONFIG_A || config == TELEPHONY_NR_CONFIG_B || config == TELEPHONY_NR_CONFIG_C ||
424 config == TELEPHONY_NR_CONFIG_D || config == TELEPHONY_NR_CONFIG_AD) {
425 return true;
426 } else {
427 return false;
428 }
429 }
430
GetRrcConnectionState(int32_t & rrcState)431 int32_t NetworkRegister::GetRrcConnectionState(int32_t &rrcState)
432 {
433 auto networkSearchManager = networkSearchManager_.lock();
434 if (networkSearchManager == nullptr) {
435 TELEPHONY_LOGE("NetworkRegister::GetRrcConnectionState networkSearchManager is nullptr");
436 return TELEPHONY_ERR_LOCAL_PTR_NULL;
437 }
438 return networkSearchManager->UpdateRrcConnectionState(slotId_, rrcState);
439 }
440
HandleRrcStateChanged(int32_t status)441 int32_t NetworkRegister::HandleRrcStateChanged(int32_t status)
442 {
443 if (systemPropertiesConfig_ == TELEPHONY_NR_CONFIG_AD) {
444 if (status == RRC_CONNECTED_STATUS) {
445 currentNrConfig_ = TELEPHONY_NR_CONFIG_A;
446 } else {
447 currentNrConfig_ = TELEPHONY_NR_CONFIG_D;
448 }
449 }
450 TELEPHONY_LOGI("currentNrConfig_:%{public}s, slotId:%{public}d", currentNrConfig_.c_str(), slotId_);
451 UpdateNrState();
452 UpdateCfgTech();
453 return TELEPHONY_ERR_SUCCESS;
454 }
455
GetSystemPropertiesConfig(std::string & config)456 int32_t NetworkRegister::GetSystemPropertiesConfig(std::string &config)
457 {
458 char param[SYS_PARAMETER_SIZE] = { 0 };
459 int32_t code = GetParameter(TELEPHONY_NR_CONVERSION_CONFIG, TELEPHONY_NR_CONFIG_D, param, SYS_PARAMETER_SIZE);
460 if (code <= 0 || !IsValidConfig(param)) {
461 TELEPHONY_LOGE("get system properties:%{public}s, slotId:%{public}d", param, slotId_);
462 config = TELEPHONY_NR_CONFIG_D;
463 } else {
464 config = param;
465 }
466 return TELEPHONY_ERR_SUCCESS;
467 }
468
GetTechnologyByNrConfig(RadioTech tech)469 RadioTech NetworkRegister::GetTechnologyByNrConfig(RadioTech tech)
470 {
471 if (tech != RadioTech::RADIO_TECHNOLOGY_LTE_CA && tech != RadioTech::RADIO_TECHNOLOGY_LTE) {
472 return tech;
473 }
474 if (systemPropertiesConfig_ == TELEPHONY_NR_CONFIG_AD) {
475 int32_t rrcState = 0;
476 GetRrcConnectionState(rrcState);
477 if (rrcState == RRC_CONNECTED_STATUS) {
478 currentNrConfig_ = TELEPHONY_NR_CONFIG_A;
479 } else {
480 currentNrConfig_ = TELEPHONY_NR_CONFIG_D;
481 }
482 }
483 TELEPHONY_LOGI("currentNrConfig_:%{public}s, slotId:%{public}d", currentNrConfig_.c_str(), slotId_);
484 switch (nrState_) {
485 case NrState::NR_NSA_STATE_NO_DETECT: {
486 if (currentNrConfig_ == TELEPHONY_NR_CONFIG_D) {
487 tech = RadioTech::RADIO_TECHNOLOGY_NR;
488 }
489 break;
490 }
491 case NrState::NR_NSA_STATE_CONNECTED_DETECT: {
492 if (currentNrConfig_ == TELEPHONY_NR_CONFIG_C || currentNrConfig_ == TELEPHONY_NR_CONFIG_D) {
493 tech = RadioTech::RADIO_TECHNOLOGY_NR;
494 }
495 break;
496 }
497 case NrState::NR_NSA_STATE_IDLE_DETECT: {
498 if (currentNrConfig_ == TELEPHONY_NR_CONFIG_B || currentNrConfig_ == TELEPHONY_NR_CONFIG_C ||
499 currentNrConfig_ == TELEPHONY_NR_CONFIG_D) {
500 tech = RadioTech::RADIO_TECHNOLOGY_NR;
501 }
502 break;
503 }
504 case NrState::NR_NSA_STATE_DUAL_CONNECTED:
505 tech = RadioTech::RADIO_TECHNOLOGY_NR;
506 break;
507 default:
508 break;
509 }
510 return tech;
511 }
512 } // namespace Telephony
513 } // namespace OHOS
514