Commit 5d3bd102 authored by aligungr's avatar aligungr

RRC developments

parent 9f53791b
......@@ -84,17 +84,7 @@ void NasMm::performMmCycle()
m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH ||
m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE)
{
int64_t current = utils::CurrentTimeMillis();
int64_t backoff = (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH ||
m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH)
? -1
: 1500;
if (current - m_lastPlmnSearchTrigger > backoff)
{
m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::PLMN_SEARCH_REQUEST));
m_lastPlmnSearchTrigger = current;
}
// TODO
return;
}
......
......@@ -23,10 +23,6 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg)
handleRrcConnectionSetup();
break;
}
case NwUeRrcToNas::PLMN_SEARCH_RESPONSE: {
handlePlmnSearchResponse(msg.measurements);
break;
}
case NwUeRrcToNas::NAS_DELIVERY: {
OctetView buffer{msg.nasPdu};
auto nasMessage = nas::DecodeNasMessage(buffer);
......
......@@ -48,8 +48,6 @@ class NasMm
EDeregCause m_lastDeregCause{};
// Indicates the last service request cause
EServiceReqCause m_lastServiceReqCause{};
// Last time PLMN search is triggered
long m_lastPlmnSearchTrigger{};
// Registration attempt counter
int m_regCounter{};
// Service request attempt counter
......@@ -154,7 +152,6 @@ class NasMm
private: /* Radio */
void localReleaseConnection();
void handlePlmnSearchResponse(const std::vector<UeCellMeasurement> &measures);
void handleRrcConnectionSetup();
void handleRrcConnectionRelease();
void handleServingCellChange(const UeCellInfo &servingCell);
......
......@@ -16,139 +16,6 @@
namespace nr::ue
{
void NasMm::handlePlmnSearchResponse(const std::vector<UeCellMeasurement> &measures)
{
if (m_mmSubState != EMmSubState::MM_REGISTERED_PLMN_SEARCH &&
m_mmSubState != EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE &&
m_mmSubState != EMmSubState::MM_DEREGISTERED_PLMN_SEARCH &&
m_mmSubState != EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE)
{
m_logger->warn("PLMN search response received without being requested");
return;
}
if (measures.empty())
{
if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH)
{
m_logger->err("PLMN selection failure, no cell available");
switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE);
return;
}
else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH)
{
m_logger->err("PLMN selection failure, no cell available");
switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE);
return;
}
return; // otherwise it's one of the no-cell-available states, no need to print an error
}
int listedAsForbiddenPlmn = 0;
int listedAsForbiddenTai = 0;
int listedAsForbiddenServiceAreaPlmn = 0;
int listedAsForbiddenServiceAreaTai = 0;
int unlistedPlmn = 0;
std::vector<UeCellMeasurement> suitable{};
std::vector<UeCellMeasurement> acceptable{};
for (auto &item : measures)
{
acceptable.push_back(item);
if (nas::utils::PlmnListContains(m_usim->m_forbiddenPlmnList, item.cellId.plmn))
{
listedAsForbiddenPlmn++;
continue;
}
if (nas::utils::TaiListContains(
m_usim->m_forbiddenTaiListRps,
nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(item.cellId.plmn), octet3{item.tac}}) ||
nas::utils::TaiListContains(
m_usim->m_forbiddenTaiListRoaming,
nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(item.cellId.plmn), octet3{item.tac}}))
{
listedAsForbiddenTai++;
continue;
}
if (nas::utils::ServiceAreaListForbidsPlmn(m_usim->m_serviceAreaList, nas::utils::PlmnFrom(item.cellId.plmn)))
{
listedAsForbiddenServiceAreaPlmn++;
continue;
}
if (nas::utils::ServiceAreaListForbidsTai(
m_usim->m_serviceAreaList,
nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(item.cellId.plmn), octet3{item.tac}}))
{
listedAsForbiddenServiceAreaTai++;
continue;
}
if (item.cellId.plmn == m_base->config->hplmn || item.cellId.plmn == m_usim->m_currentPlmn ||
nas::utils::PlmnListContains(m_usim->m_equivalentPlmnList, item.cellId.plmn))
{
suitable.push_back(item);
}
else
{
unlistedPlmn++;
continue;
}
}
int totalForbidden = listedAsForbiddenPlmn + listedAsForbiddenTai + listedAsForbiddenServiceAreaPlmn +
listedAsForbiddenServiceAreaTai;
auto logErrorSuitableAcceptable = [this, totalForbidden, unlistedPlmn]() {
m_logger->err("PLMN selection failure, no suitable or acceptable cell can be found");
if (totalForbidden > 0 || unlistedPlmn > 0)
m_logger->err("[%d] cell was in forbidden list, [%d] was in unknown PLMN", totalForbidden, unlistedPlmn);
};
auto logWarningAcceptable = [this, totalForbidden, unlistedPlmn]() {
m_logger->warn("PLMN selection failure, no suitable cell can be found, an acceptable cell is selected instead");
if (totalForbidden > 0 || unlistedPlmn > 0)
m_logger->warn("[%d] cell was in forbidden list, [%d] was in unknown PLMN", totalForbidden, unlistedPlmn);
};
if (!suitable.empty())
{
std::stable_sort(suitable.begin(), suitable.end(), [](auto &x, auto &y) { return x.dbm >= y.dbm; });
auto *w = new NwUeNasToRrc(NwUeNasToRrc::CELL_SELECTION_COMMAND);
w->cellId = suitable[0].cellId;
w->isSuitableCell = true;
m_base->rrcTask->push(w);
}
else if (!acceptable.empty())
{
std::stable_sort(acceptable.begin(), acceptable.end(), [](auto &x, auto &y) { return x.dbm >= y.dbm; });
logWarningAcceptable();
auto *w = new NwUeNasToRrc(NwUeNasToRrc::CELL_SELECTION_COMMAND);
w->cellId = acceptable[0].cellId;
w->isSuitableCell = false;
m_base->rrcTask->push(w);
}
else
{
if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH)
{
logErrorSuitableAcceptable();
switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE);
return;
}
else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH)
{
logErrorSuitableAcceptable();
switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE);
return;
}
}
}
void NasMm::handleServingCellChange(const UeCellInfo &servingCell)
{
if (m_cmState == ECmState::CM_CONNECTED)
......
......@@ -65,7 +65,6 @@ struct NwUeRrcToNas : NtsMessage
enum PR
{
NAS_DELIVERY,
PLMN_SEARCH_RESPONSE,
RRC_CONNECTION_SETUP,
RRC_CONNECTION_RELEASE,
RADIO_LINK_FAILURE,
......@@ -76,9 +75,6 @@ struct NwUeRrcToNas : NtsMessage
// NAS_DELIVERY
OctetString nasPdu{};
// PLMN_SEARCH_RESPONSE
std::vector<UeCellMeasurement> measurements{};
// SERVING_CELL_CHANGE
UeCellInfo servingCell{};
......@@ -94,11 +90,9 @@ struct NwUeNasToRrc : NtsMessage
{
enum PR
{
PLMN_SEARCH_REQUEST,
LOCAL_RELEASE_CONNECTION,
INITIAL_NAS_DELIVERY,
UPLINK_NAS_DELIVERY,
CELL_SELECTION_COMMAND,
} present;
// INITIAL_NAS_DELIVERY
......@@ -108,10 +102,6 @@ struct NwUeNasToRrc : NtsMessage
// INITIAL_NAS_DELIVERY
long rrcEstablishmentCause{};
// CELL_SELECTION_COMMAND
GlobalNci cellId{};
bool isSuitableCell{}; // otherwise 'acceptable'
explicit NwUeNasToRrc(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RRC), present(present)
{
}
......@@ -121,16 +111,10 @@ struct NwUeRrcToRls : NtsMessage
{
enum PR
{
PLMN_SEARCH_REQUEST,
CELL_SELECTION_COMMAND,
RRC_PDU_DELIVERY,
RESET_STI,
} present;
// CELL_SELECTION_COMMAND
GlobalNci cellId{};
bool isSuitableCell{}; // otherwise 'acceptable'
// RRC_PDU_DELIVERY
rrc::RrcChannel channel{};
OctetString pdu{};
......
......@@ -48,10 +48,6 @@ void UeRrcTask::onLoop()
auto *w = dynamic_cast<NwUeNasToRrc *>(msg);
switch (w->present)
{
case NwUeNasToRrc::PLMN_SEARCH_REQUEST: {
m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::PLMN_SEARCH_REQUEST));
break;
}
case NwUeNasToRrc::INITIAL_NAS_DELIVERY: {
deliverInitialNas(std::move(w->nasPdu), w->rrcEstablishmentCause);
break;
......@@ -66,13 +62,6 @@ void UeRrcTask::onLoop()
m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::RESET_STI));
break;
}
case NwUeNasToRrc::CELL_SELECTION_COMMAND: {
auto *wr = new NwUeRrcToRls(NwUeRrcToRls::CELL_SELECTION_COMMAND);
wr->cellId = w->cellId;
wr->isSuitableCell = w->isSuitableCell;
m_base->rlsTask->push(wr);
break;
}
}
break;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment