From 4b6cbf6a8100fc810e2dac69a3fb27ed939e5781 Mon Sep 17 00:00:00 2001 From: l00635678 Date: Sat, 21 Sep 2024 16:49:42 +0800 Subject: [PATCH] =?UTF-8?q?ril/modem=20crash=E5=90=8E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E6=9C=AA=E6=BF=80=E6=B4=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: l00635678 --- services/include/apn_manager/apn_holder.h | 5 +- services/include/cellular_data_handler.h | 6 +- services/src/apn_manager/apn_holder.cpp | 1 - services/src/cellular_data_handler.cpp | 70 ++++++++++------------- test/apn_manager_test.cpp | 9 +-- test/cellular_data_handler_test.cpp | 16 ++---- test/zero_branch_test.cpp | 7 +-- 7 files changed, 48 insertions(+), 66 deletions(-) diff --git a/services/include/apn_manager/apn_holder.h b/services/include/apn_manager/apn_holder.h index c81601a5..66a47820 100644 --- a/services/include/apn_manager/apn_holder.h +++ b/services/include/apn_manager/apn_holder.h @@ -60,8 +60,9 @@ public: bool IsMmsType() const; void InitialApnRetryCount(); bool IsSameMatchedApns(std::vector> newMatchedApns, bool roamingState); - bool IsSameApnItem(const sptr &newApnItem, const sptr &oldApnItem, bool roamingState); - bool IsCompatibleApnItem(const sptr &newApnItem, const sptr &oldApnItem, bool roamingState); + static bool IsSameApnItem(const sptr &newApnItem, const sptr &oldApnItem, bool roamingState); + static bool IsCompatibleApnItem(const sptr &newApnItem, const sptr &oldApnItem, + bool roamingState); void AddUid(uint32_t uid); void RemoveUid(uint32_t uid); HasSystemUse GetUidStatus() const; diff --git a/services/include/cellular_data_handler.h b/services/include/cellular_data_handler.h index c81a0154..5064ff84 100644 --- a/services/include/cellular_data_handler.h +++ b/services/include/cellular_data_handler.h @@ -60,7 +60,7 @@ public: void ClearConnection(const sptr &apnHolder, DisConnectionReason reason); void EstablishAllApnsIfConnectable(); void ClearAllConnections(DisConnectionReason reason); - void ClearConnectionsOnUpdateApns(const DataProfile &dataProfile, DisConnectionReason reason); + void ClearConnectionsOnUpdateApns(DisConnectionReason reason); bool ChangeConnectionForDsds(bool enable); int32_t GetSlotId() const; bool HandleApnChanged(); @@ -73,7 +73,7 @@ public: void GetDataConnApnAttr(ApnItem::Attribute &apnAttr) const; std::string GetDataConnIpType() const; int32_t GetDataRecoveryState(); - void SetRilAttachApn(DataProfile &dataProfile); + void SetRilAttachApn(); void IsNeedDoRecovery(bool needDoRecovery) const; void RegisterDataSettingObserver(); void UnRegisterDataSettingObserver(); @@ -187,7 +187,7 @@ private: sptr incallObserver_; sptr cellularDataRdbObserver_; std::shared_ptr incallDataStateMachine_; - DataProfile lastDataProfile_; + sptr lastApnItem_ = nullptr; using Fun = std::function; std::map eventIdMap_ { diff --git a/services/src/apn_manager/apn_holder.cpp b/services/src/apn_manager/apn_holder.cpp index aec51dad..22119013 100644 --- a/services/src/apn_manager/apn_holder.cpp +++ b/services/src/apn_manager/apn_holder.cpp @@ -123,7 +123,6 @@ void ApnHolder::ReleaseDataConnection() AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(CellularDataEventCode::MSG_SM_DISCONNECT, object); cellularDataStateMachine_->SendEvent(event); - cellularDataStateMachine_ = nullptr; } int32_t ApnHolder::GetProfileId(const std::string &apnType) const diff --git a/services/src/cellular_data_handler.cpp b/services/src/cellular_data_handler.cpp index e5ac787b..70212ddd 100644 --- a/services/src/cellular_data_handler.cpp +++ b/services/src/cellular_data_handler.cpp @@ -69,6 +69,7 @@ void CellularDataHandler::Init() dataSwitchSettings_->LoadSwitchValue(); GetConfigurationFor5G(); SetRilLinkBandwidths(); + lastApnItem_ = new ApnItem(); } CellularDataHandler::~CellularDataHandler() @@ -276,18 +277,21 @@ void CellularDataHandler::ClearAllConnections(DisConnectionReason reason) ResetDataFlowType(); } -void CellularDataHandler::ClearConnectionsOnUpdateApns(const DataProfile &dataProfile, DisConnectionReason reason) +void CellularDataHandler::ClearConnectionsOnUpdateApns(DisConnectionReason reason) { - bool isDataProfileSame = (dataProfile.profileId == lastDataProfile_.profileId - && dataProfile.apn == lastDataProfile_.apn - && dataProfile.protocol == lastDataProfile_.protocol - && dataProfile.verType == lastDataProfile_.verType - && dataProfile.userName == lastDataProfile_.userName - && dataProfile.password == lastDataProfile_.password - && dataProfile.roamingProtocol == lastDataProfile_.roamingProtocol); - if (!isDataProfileSame) { + if (apnManager_ == nullptr) { + TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_); + return; + } + bool isRoaming = false; + int32_t result = IsCellularDataRoamingEnabled(isRoaming); + if (result != TELEPHONY_ERR_SUCCESS) { + isRoaming = false; + } + auto apnItem = apnManager_->GetRilAttachApn(); + if (!ApnHolder::IsCompatibleApnItem(lastApnItem_, apnItem, isRoaming)) { ClearAllConnections(reason); - lastDataProfile_ = dataProfile; + *lastApnItem_ = *apnItem; } } @@ -327,7 +331,6 @@ void CellularDataHandler::ClearConnection(const sptr &apn, DisConnect return; } apn->SetApnState(PROFILE_STATE_DISCONNECTING); - apn->SetCellularDataStateMachine(nullptr); InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_DISCONNECT, object); stateMachine->SendEvent(event); } @@ -833,22 +836,18 @@ void CellularDataHandler::DisconnectDataComplete(const InnerEvent::Pointer &even } DisConnectionReason reason = static_cast(netInfo->reason); apnHolder->SetApnState(PROFILE_STATE_IDLE); - auto stateMachine = connectionManager_->GetActiveConnectionByCid(netInfo->cid); + auto stateMachine = apnHolder->GetCellularDataStateMachine(); if (stateMachine == nullptr) { TELEPHONY_LOGE("stateMachine is null"); return; } stateMachine->UpdateNetworkInfo(*netInfo); connectionManager_->RemoveActiveConnectionByCid(stateMachine->GetCid()); + apnHolder->SetCellularDataStateMachine(nullptr); UpdateCellularDataConnectState(apnHolder->GetApnType()); UpdatePhysicalConnectionState(connectionManager_->isNoActiveConnection()); - if (apnHolder->IsDataCallEnabled()) { - if (apnHolder->GetApnState() == PROFILE_STATE_IDLE || apnHolder->GetApnState() == PROFILE_STATE_FAILED) { - apnHolder->SetCellularDataStateMachine(nullptr); - } - if (reason == DisConnectionReason::REASON_RETRY_CONNECTION) { - SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, apnHolder->GetRetryDelay()); - } + if (apnHolder->IsDataCallEnabled() && reason == DisConnectionReason::REASON_RETRY_CONNECTION) { + SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, apnHolder->GetRetryDelay()); } if (!apnManager_->HasAnyConnectedState()) { connectionManager_->StopStallDetectionTimer(); @@ -1255,7 +1254,6 @@ void CellularDataHandler::HandleSimStateChanged() EstablishAllApnsIfConnectable(); } } else if (simState != SimState::SIM_STATE_LOADED) { - isSimAccountLoaded_ = false; isRilApnAttached_ = false; ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); if (simState == SimState::SIM_STATE_NOT_PRESENT) { @@ -1282,9 +1280,8 @@ void CellularDataHandler::HandleRecordsChanged() } GetConfigurationFor5G(); CreateApnItem(); - DataProfile dataProfile; - SetRilAttachApn(dataProfile); - ClearConnectionsOnUpdateApns(dataProfile, DisConnectionReason::REASON_CHANGE_CONNECTION); + SetRilAttachApn(); + ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_CHANGE_CONNECTION); EstablishAllApnsIfConnectable(); } @@ -1310,8 +1307,7 @@ void CellularDataHandler::HandleSimEvent(const AppExecFwk::InnerEvent::Pointer & HandleRecordsChanged(); break; case RadioEvent::RADIO_NV_REFRESH_FINISHED: { - DataProfile dataProfile; - SetRilAttachApn(dataProfile); + SetRilAttachApn(); break; } case RadioEvent::RADIO_SIM_ACCOUNT_LOADED: @@ -1324,10 +1320,6 @@ void CellularDataHandler::HandleSimEvent(const AppExecFwk::InnerEvent::Pointer & void CellularDataHandler::HandleSimAccountLoaded() { - if (isSimAccountLoaded_) { - TELEPHONY_LOGE("Slot%{public}d has already loaded", slotId_); - return; - } isSimAccountLoaded_ = true; CellularDataNetAgent::GetInstance().UnregisterNetSupplierForSimUpdate(slotId_); if (!CellularDataNetAgent::GetInstance().RegisterNetSupplier(slotId_)) { @@ -1391,9 +1383,8 @@ void CellularDataHandler::HandleApnChanged(const InnerEvent::Pointer &event) return; } CreateApnItem(); - DataProfile dataProfile; - SetRilAttachApn(dataProfile); - ClearConnectionsOnUpdateApns(dataProfile, DisConnectionReason::REASON_RETRY_CONNECTION); + SetRilAttachApn(); + ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_RETRY_CONNECTION); for (const sptr &apnHolder : apnManager_->GetAllApnHolder()) { if (apnHolder == nullptr) { continue; @@ -1633,8 +1624,9 @@ bool CellularDataHandler::GetEsmFlagFromOpCfg() return (esmFlagFromOpCfg != 0); } -void CellularDataHandler::SetRilAttachApn(DataProfile &dataProfile) +void CellularDataHandler::SetRilAttachApn() { + DataProfile dataProfile; if (!GetEsmFlagFromOpCfg()) { dataProfile.profileId = 0; dataProfile.apn = ""; @@ -2183,10 +2175,10 @@ std::shared_ptr CellularDataHandler::CheckForCompatibl if (result != TELEPHONY_ERR_SUCCESS) { isRoaming = false; } - for(const auto& curDc : allDCs) { + for (const auto& curDc : allDCs) { sptr apnItem = curDc->GetApnItem(); - for(const auto& dunItem : dunApnList) { - if (!apnHolder->IsCompatibleApnItem(apnItem, dunItem, isRoaming)) { + for (const auto& dunItem : dunApnList) { + if (!ApnHolder::IsCompatibleApnItem(apnItem, dunItem, isRoaming)) { continue; } if (curDc->IsActiveState()) { @@ -2206,8 +2198,8 @@ std::shared_ptr CellularDataHandler::CheckForCompatibl void CellularDataHandler::HandleUpdateNetInfo(const AppExecFwk::InnerEvent::Pointer &event) { TELEPHONY_LOGI("Slot%{public}d: HandleUpdateNetInfo", slotId_); - if (event == nullptr || connectionManager_ == nullptr || apnManager_ == nullptr) { - TELEPHONY_LOGE("event or connectionManager_ or apnManager_ is null"); + if (event == nullptr || apnManager_ == nullptr) { + TELEPHONY_LOGE("event or apnManager_ is null"); return; } @@ -2226,7 +2218,7 @@ void CellularDataHandler::HandleUpdateNetInfo(const AppExecFwk::InnerEvent::Poin TELEPHONY_LOGE("Slot%{public}d: apnHolder is not connecting or connected", slotId_); return; } - auto stateMachine = connectionManager_->GetActiveConnectionByCid(netInfo->cid); + auto stateMachine = apnHolder->GetCellularDataStateMachine(); if (stateMachine == nullptr) { TELEPHONY_LOGE("stateMachine is null"); return; diff --git a/test/apn_manager_test.cpp b/test/apn_manager_test.cpp index 50f66a9b..2b0184b7 100644 --- a/test/apn_manager_test.cpp +++ b/test/apn_manager_test.cpp @@ -626,8 +626,7 @@ HWTEST_F(ApnManagerTest, IsCompatibleApnItem_001, TestSize.Level0) sptr newApnItem = nullptr; sptr oldApnItem = nullptr; bool roamingState = false; - sptr apnHolder = new ApnHolder("", 0); - bool result = apnHolder->IsCompatibleApnItem(newApnItem, oldApnItem, roamingState); + bool result = ApnHolder::IsCompatibleApnItem(newApnItem, oldApnItem, roamingState); ASSERT_FALSE(result); } @@ -643,8 +642,7 @@ HWTEST_F(ApnManagerTest, IsCompatibleApnItem_002, TestSize.Level0) std::strcmp(newApnItem->attr_.roamingProtocol_, "test_protocol"); std::strcmp(newApnItem->attr_.roamingProtocol_, "test_protocol"); bool roamingState = true; - sptr apnHolder = new ApnHolder("", 0); - bool result = apnHolder->IsCompatibleApnItem(newApnItem, oldApnItem, roamingState); + bool result = ApnHolder::IsCompatibleApnItem(newApnItem, oldApnItem, roamingState); ASSERT_TRUE(result); } @@ -660,8 +658,7 @@ HWTEST_F(ApnManagerTest, IsCompatibleApnItem_003, TestSize.Level0) std::strcmp(newApnItem->attr_.roamingProtocol_, "test_protocol"); std::strcmp(newApnItem->attr_.roamingProtocol_, "test_protocol"); bool roamingState = false; - sptr apnHolder = new ApnHolder("", 0); - bool result = apnHolder->IsCompatibleApnItem(newApnItem, oldApnItem, roamingState); + bool result = ApnHolder::IsCompatibleApnItem(newApnItem, oldApnItem, roamingState); ASSERT_TRUE(result); } diff --git a/test/cellular_data_handler_test.cpp b/test/cellular_data_handler_test.cpp index 59ef7041..073df5b1 100644 --- a/test/cellular_data_handler_test.cpp +++ b/test/cellular_data_handler_test.cpp @@ -332,11 +332,8 @@ HWTEST_F(CellularDataHandlerTest, ClearConnectionsOnUpdateApns_001, Function | M matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED); EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); auto cellularDataHandler = std::make_shared(subscriberInfo, 0); - cellularDataHandler->Init(); - DataProfile dataProfile; - cellularDataHandler->ClearConnectionsOnUpdateApns(dataProfile, DisConnectionReason::REASON_RETRY_CONNECTION); - EXPECT_NE(cellularDataHandler->connectionManager_, nullptr); - EXPECT_NE(cellularDataHandler->apnManager_, nullptr); + cellularDataHandler->ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_RETRY_CONNECTION); + EXPECT_EQ(cellularDataHandler->apnManager_, nullptr); } /** @@ -351,9 +348,7 @@ HWTEST_F(CellularDataHandlerTest, ClearConnectionsOnUpdateApns_002, Function | M EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); auto cellularDataHandler = std::make_shared(subscriberInfo, 0); cellularDataHandler->Init(); - DataProfile dataProfile; - dataProfile.profileId = 1; - cellularDataHandler->ClearConnectionsOnUpdateApns(dataProfile, DisConnectionReason::REASON_RETRY_CONNECTION); + cellularDataHandler->ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_RETRY_CONNECTION); EXPECT_NE(cellularDataHandler->connectionManager_, nullptr); EXPECT_NE(cellularDataHandler->apnManager_, nullptr); } @@ -641,11 +636,10 @@ HWTEST_F(CellularDataHandlerTest, SetRilAttachApnTest001, Function | MediumTest EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); auto cellularDataHandler = std::make_shared(subscriberInfo, 1); cellularDataHandler->Init(); + EXPECT_NE(cellularDataHandler->apnManager_, nullptr); sptr attachApn = ApnItem::MakeDefaultApn(DATA_CONTEXT_ROLE_DEFAULT); cellularDataHandler->apnManager_->allApnItem_.push_back(attachApn); - DataProfile dataProfile; - cellularDataHandler->SetRilAttachApn(dataProfile); - EXPECT_EQ(dataProfile.profileId, attachApn->attr_.profileId_); + cellularDataHandler->SetRilAttachApn(); } /** diff --git a/test/zero_branch_test.cpp b/test/zero_branch_test.cpp index d3b70da2..2878cc0b 100644 --- a/test/zero_branch_test.cpp +++ b/test/zero_branch_test.cpp @@ -1230,15 +1230,14 @@ HWTEST_F(BranchTest, Telephony_ApnHolder_002, Function | MediumTest | Level3) */ HWTEST_F(BranchTest, Telephony_ApnHolder_003, Function | MediumTest | Level3) { - sptr apnHolder = new ApnHolder("", 0); sptr newApnItem; sptr oldApnItem; - ASSERT_FALSE(apnHolder->IsSameApnItem(newApnItem, oldApnItem, true)); + ASSERT_FALSE(ApnHolder::IsSameApnItem(newApnItem, oldApnItem, true)); oldApnItem = ApnItem::MakeDefaultApn(DATA_CONTEXT_ROLE_DEFAULT); - ASSERT_FALSE(apnHolder->IsSameApnItem(newApnItem, oldApnItem, true)); + ASSERT_FALSE(ApnHolder::IsSameApnItem(newApnItem, oldApnItem, true)); newApnItem = ApnItem::MakeDefaultApn(DATA_CONTEXT_ROLE_DEFAULT); oldApnItem = ApnItem::MakeDefaultApn(DATA_CONTEXT_ROLE_DEFAULT); - ASSERT_TRUE(apnHolder->IsSameApnItem(newApnItem, oldApnItem, false)); + ASSERT_TRUE(ApnHolder::IsSameApnItem(newApnItem, oldApnItem, false)); oldApnItem->CanDealWithType(DATA_CONTEXT_ROLE_DEFAULT); oldApnItem->GetApnTypes(); PdpProfile apnBean; -- Gitee