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