Commit f0072a0a authored by aligungr's avatar aligungr

L3 RRC/NAS developments

parent 7fceda7f
......@@ -162,10 +162,10 @@ void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg)
switch (c1->present)
{
case ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcReject:
receiveRrcReject(*c1->choice.rrcReject);
receiveRrcReject(cellId, *c1->choice.rrcReject);
break;
case ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcSetup:
receiveRrcSetup(*c1->choice.rrcSetup);
receiveRrcSetup(cellId, *c1->choice.rrcSetup);
break;
default:
break;
......
......@@ -12,6 +12,10 @@
#include <ue/nas/task.hpp>
#include <ue/nts.hpp>
#include <asn/rrc/ASN_RRC_RRCSetup-IEs.h>
#include <asn/rrc/ASN_RRC_RRCSetup.h>
#include <asn/rrc/ASN_RRC_RRCSetupComplete-IEs.h>
#include <asn/rrc/ASN_RRC_RRCSetupComplete.h>
#include <asn/rrc/ASN_RRC_RRCSetupRequest-IEs.h>
#include <asn/rrc/ASN_RRC_RRCSetupRequest.h>
......@@ -55,4 +59,45 @@ void UeRrcTask::startConnectionSetup(OctetString &&nasPdu)
asn::Free(asn_DEF_ASN_RRC_UL_CCCH_Message, rrcSetupRequest);
}
} // namespace nr::ue
\ No newline at end of file
void UeRrcTask::receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg)
{
if (!isActiveCell(cellId))
return;
if (m_lastSetupReq != ERrcLastSetupRequest::SETUP_REQUEST)
{
// TODO
return;
}
auto *pdu = asn::New<ASN_RRC_UL_DCCH_Message>();
pdu->message.present = ASN_RRC_UL_DCCH_MessageType_PR_c1;
pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1);
pdu->message.choice.c1->present = ASN_RRC_UL_DCCH_MessageType__c1_PR_rrcSetupComplete;
auto &setupComplete = pdu->message.choice.c1->choice.rrcSetupComplete = asn::New<ASN_RRC_RRCSetupComplete>();
setupComplete->rrc_TransactionIdentifier = msg.rrc_TransactionIdentifier;
setupComplete->criticalExtensions.present = ASN_RRC_RRCSetupComplete__criticalExtensions_PR_rrcSetupComplete;
auto &ies = setupComplete->criticalExtensions.choice.rrcSetupComplete = asn::New<ASN_RRC_RRCSetupComplete_IEs>();
ies->selectedPLMN_Identity = 1;
asn::SetOctetString(ies->dedicatedNAS_Message, m_initialNasPdu);
m_initialNasPdu = {};
sendRrcMessage(pdu);
m_logger->info("RRC connection established");
switchState(ERrcState::RRC_CONNECTED);
m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_SETUP));
}
void UeRrcTask::receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg)
{
if (!isActiveCell(cellId))
return;
// TODO
m_logger->err("RRC Reject received");
}
} // namespace nr::ue
......@@ -51,41 +51,6 @@ void UeRrcTask::deliverUplinkNas(OctetString &&nasPdu)
sendRrcMessage(pdu);
}
void UeRrcTask::receiveRrcSetup(const ASN_RRC_RRCSetup &msg)
{
if (m_lastSetupReq != ERrcLastSetupRequest::SETUP_REQUEST)
{
// TODO
return;
}
m_state = ERrcState::RRC_CONNECTED;
auto *pdu = asn::New<ASN_RRC_UL_DCCH_Message>();
pdu->message.present = ASN_RRC_UL_DCCH_MessageType_PR_c1;
pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1);
pdu->message.choice.c1->present = ASN_RRC_UL_DCCH_MessageType__c1_PR_rrcSetupComplete;
auto &setupComplete = pdu->message.choice.c1->choice.rrcSetupComplete = asn::New<ASN_RRC_RRCSetupComplete>();
setupComplete->rrc_TransactionIdentifier = msg.rrc_TransactionIdentifier;
setupComplete->criticalExtensions.present = ASN_RRC_RRCSetupComplete__criticalExtensions_PR_rrcSetupComplete;
auto &ies = setupComplete->criticalExtensions.choice.rrcSetupComplete = asn::New<ASN_RRC_RRCSetupComplete_IEs>();
ies->selectedPLMN_Identity = 1;
asn::SetOctetString(ies->dedicatedNAS_Message, m_initialNasPdu);
m_initialNasPdu = {};
m_logger->info("RRC connection established");
m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_SETUP));
sendRrcMessage(pdu);
}
void UeRrcTask::receiveRrcReject(const ASN_RRC_RRCReject &msg)
{
// TODO
m_logger->err("RRC Reject received");
}
void UeRrcTask::receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg)
{
OctetString nasPdu =
......
......@@ -36,4 +36,18 @@ void UeRrcTask::performCycle()
}
}
void UeRrcTask::switchState(ERrcState state)
{
ERrcState oldState = m_state;
m_state = state;
m_logger->info("UE switches to state [%s]", ToJson(state).str().c_str());
onSwitchState(oldState, state);
}
void UeRrcTask::onSwitchState(ERrcState oldState, ERrcState newState)
{
}
} // namespace nr::ue
\ No newline at end of file
......@@ -76,13 +76,9 @@ class UeRrcTask : public NtsTask
/* Handlers */
void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu);
void deliverUplinkNas(OctetString &&nasPdu);
void receiveRrcSetup(const ASN_RRC_RRCSetup &msg);
void receiveRrcReject(const ASN_RRC_RRCReject &msg);
void receiveRrcRelease(const ASN_RRC_RRCRelease &msg);
void receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg);
void receivePaging(const ASN_RRC_Paging &msg);
void handleRadioLinkFailure();
/* RRC Message Transmission and Receive */
......@@ -102,6 +98,8 @@ class UeRrcTask : public NtsTask
/* State Management */
void triggerCycle();
void performCycle();
void switchState(ERrcState state);
void onSwitchState(ERrcState oldState, ERrcState newState);
/* Idle Mode Operations */
void performCellSelection();
......@@ -125,6 +123,8 @@ class UeRrcTask : public NtsTask
/* Connection Control */
void startConnectionSetup(OctetString &&nasPdu);
void receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg);
void receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg);
};
} // namespace nr::ue
......@@ -68,6 +68,21 @@ Json ToJson(const EMmState &state)
}
}
Json ToJson(const ERrcState &state)
{
switch (state)
{
case ERrcState::RRC_IDLE:
return "RRC-IDLE";
case ERrcState::RRC_CONNECTED:
return "RRC-CONNECTED";
case ERrcState::RRC_INACTIVE:
return "RRC-INACTIVE";
default:
return "?";
}
}
Json ToJson(const EMmSubState &state)
{
switch (state)
......
......@@ -547,5 +547,6 @@ Json ToJson(const ERegUpdateCause &v);
Json ToJson(const EPsState &v);
Json ToJson(const UePduSessionInfo &v);
Json ToJson(const EServiceReqCause &v);
Json ToJson(const ERrcState &v);
} // namespace nr::ue
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