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) ...@@ -162,10 +162,10 @@ void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg)
switch (c1->present) switch (c1->present)
{ {
case ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcReject: case ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcReject:
receiveRrcReject(*c1->choice.rrcReject); receiveRrcReject(cellId, *c1->choice.rrcReject);
break; break;
case ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcSetup: case ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcSetup:
receiveRrcSetup(*c1->choice.rrcSetup); receiveRrcSetup(cellId, *c1->choice.rrcSetup);
break; break;
default: default:
break; break;
......
...@@ -12,6 +12,10 @@ ...@@ -12,6 +12,10 @@
#include <ue/nas/task.hpp> #include <ue/nas/task.hpp>
#include <ue/nts.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-IEs.h>
#include <asn/rrc/ASN_RRC_RRCSetupRequest.h> #include <asn/rrc/ASN_RRC_RRCSetupRequest.h>
...@@ -55,4 +59,45 @@ void UeRrcTask::startConnectionSetup(OctetString &&nasPdu) ...@@ -55,4 +59,45 @@ void UeRrcTask::startConnectionSetup(OctetString &&nasPdu)
asn::Free(asn_DEF_ASN_RRC_UL_CCCH_Message, rrcSetupRequest); asn::Free(asn_DEF_ASN_RRC_UL_CCCH_Message, rrcSetupRequest);
} }
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 } // namespace nr::ue
...@@ -51,41 +51,6 @@ void UeRrcTask::deliverUplinkNas(OctetString &&nasPdu) ...@@ -51,41 +51,6 @@ void UeRrcTask::deliverUplinkNas(OctetString &&nasPdu)
sendRrcMessage(pdu); 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) void UeRrcTask::receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg)
{ {
OctetString nasPdu = OctetString nasPdu =
......
...@@ -36,4 +36,18 @@ void UeRrcTask::performCycle() ...@@ -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 } // namespace nr::ue
\ No newline at end of file
...@@ -76,13 +76,9 @@ class UeRrcTask : public NtsTask ...@@ -76,13 +76,9 @@ class UeRrcTask : public NtsTask
/* Handlers */ /* Handlers */
void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu); void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu);
void deliverUplinkNas(OctetString &&nasPdu); 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 receiveRrcRelease(const ASN_RRC_RRCRelease &msg);
void receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg); void receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg);
void receivePaging(const ASN_RRC_Paging &msg); void receivePaging(const ASN_RRC_Paging &msg);
void handleRadioLinkFailure(); void handleRadioLinkFailure();
/* RRC Message Transmission and Receive */ /* RRC Message Transmission and Receive */
...@@ -102,6 +98,8 @@ class UeRrcTask : public NtsTask ...@@ -102,6 +98,8 @@ class UeRrcTask : public NtsTask
/* State Management */ /* State Management */
void triggerCycle(); void triggerCycle();
void performCycle(); void performCycle();
void switchState(ERrcState state);
void onSwitchState(ERrcState oldState, ERrcState newState);
/* Idle Mode Operations */ /* Idle Mode Operations */
void performCellSelection(); void performCellSelection();
...@@ -125,6 +123,8 @@ class UeRrcTask : public NtsTask ...@@ -125,6 +123,8 @@ class UeRrcTask : public NtsTask
/* Connection Control */ /* Connection Control */
void startConnectionSetup(OctetString &&nasPdu); 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 } // namespace nr::ue
...@@ -68,6 +68,21 @@ Json ToJson(const EMmState &state) ...@@ -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) Json ToJson(const EMmSubState &state)
{ {
switch (state) switch (state)
......
...@@ -547,5 +547,6 @@ Json ToJson(const ERegUpdateCause &v); ...@@ -547,5 +547,6 @@ Json ToJson(const ERegUpdateCause &v);
Json ToJson(const EPsState &v); Json ToJson(const EPsState &v);
Json ToJson(const UePduSessionInfo &v); Json ToJson(const UePduSessionInfo &v);
Json ToJson(const EServiceReqCause &v); Json ToJson(const EServiceReqCause &v);
Json ToJson(const ERrcState &v);
} // namespace nr::ue } // 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