Commit 8fbd98ca authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Process UserLocationInformation in UEContextReleaseComplete msg

parent 113144f6
...@@ -47,6 +47,7 @@ class UserLocationInformation { ...@@ -47,6 +47,7 @@ class UserLocationInformation {
// void setInformation(const UserLocationInformationN3IWF&); // void setInformation(const UserLocationInformationN3IWF&);
// void getInformation(UserLocationInformationN3IWF&); // void getInformation(UserLocationInformationN3IWF&);
// TODO: use reference instead of raw pointer
bool encode(Ngap_UserLocationInformation_t* user_location_information); bool encode(Ngap_UserLocationInformation_t* user_location_information);
bool decode(Ngap_UserLocationInformation_t* user_location_information); bool decode(Ngap_UserLocationInformation_t* user_location_information);
Ngap_UserLocationInformation_PR getChoiceOfUserLocationInformation(); Ngap_UserLocationInformation_PR getChoiceOfUserLocationInformation();
......
...@@ -31,7 +31,8 @@ using namespace ngap; ...@@ -31,7 +31,8 @@ using namespace ngap;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
UEContextReleaseCompleteMsg::UEContextReleaseCompleteMsg() : NgapUEMessage() { UEContextReleaseCompleteMsg::UEContextReleaseCompleteMsg() : NgapUEMessage() {
ies = nullptr; ies = nullptr;
userLocationInformation = nullptr; userLocationInformation = std::nullopt;
;
pduSessionResourceListCxtRelCpl = std::nullopt; pduSessionResourceListCxtRelCpl = std::nullopt;
setMessageType(NgapMessageType::UE_CONTEXT_RELEASE_COMPLETE); setMessageType(NgapMessageType::UE_CONTEXT_RELEASE_COMPLETE);
...@@ -91,8 +92,7 @@ void UEContextReleaseCompleteMsg::setRanUeNgapId( ...@@ -91,8 +92,7 @@ void UEContextReleaseCompleteMsg::setRanUeNgapId(
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void UEContextReleaseCompleteMsg::setUserLocationInfoNR( void UEContextReleaseCompleteMsg::setUserLocationInfoNR(
const NrCgi_t& cig, const Tai_t& tai) { const NrCgi_t& cig, const Tai_t& tai) {
if (!userLocationInformation) UserLocationInformation m_userLocationInformation = {};
userLocationInformation = new UserLocationInformation();
UserLocationInformationNR information_nr = {}; UserLocationInformationNR information_nr = {};
NR_CGI nr_cgi = {}; NR_CGI nr_cgi = {};
...@@ -101,7 +101,8 @@ void UEContextReleaseCompleteMsg::setUserLocationInfoNR( ...@@ -101,7 +101,8 @@ void UEContextReleaseCompleteMsg::setUserLocationInfoNR(
TAI tai_nr = {}; TAI tai_nr = {};
tai_nr.setTAI(tai); tai_nr.setTAI(tai);
information_nr.set(nr_cgi, tai_nr); information_nr.set(nr_cgi, tai_nr);
userLocationInformation->setInformation(information_nr);
m_userLocationInformation.setInformation(information_nr);
Ngap_UEContextReleaseComplete_IEs* ie = Ngap_UEContextReleaseComplete_IEs* ie =
(Ngap_UEContextReleaseComplete_IEs*) calloc( (Ngap_UEContextReleaseComplete_IEs*) calloc(
...@@ -111,13 +112,17 @@ void UEContextReleaseCompleteMsg::setUserLocationInfoNR( ...@@ -111,13 +112,17 @@ void UEContextReleaseCompleteMsg::setUserLocationInfoNR(
ie->value.present = ie->value.present =
Ngap_UEContextReleaseComplete_IEs__value_PR_UserLocationInformation; Ngap_UEContextReleaseComplete_IEs__value_PR_UserLocationInformation;
int ret = userLocationInformation->encode( int ret = m_userLocationInformation.encode(
&ie->value.choice.UserLocationInformation); &ie->value.choice.UserLocationInformation);
if (!ret) { if (!ret) {
Logger::ngap().error("Encode NGAP UserLocationInformation IE error"); Logger::ngap().error("Encode NGAP UserLocationInformation IE error");
free_wrapper((void**) &ie); free_wrapper((void**) &ie);
return; return;
} }
userLocationInformation =
std::optional<UserLocationInformation>{m_userLocationInformation};
ret = ASN_SEQUENCE_ADD(&ies->protocolIEs.list, ie); ret = ASN_SEQUENCE_ADD(&ies->protocolIEs.list, ie);
if (ret != 0) if (ret != 0)
Logger::ngap().error("Encode NGAP UserLocationInformation IE error"); Logger::ngap().error("Encode NGAP UserLocationInformation IE error");
...@@ -126,9 +131,9 @@ void UEContextReleaseCompleteMsg::setUserLocationInfoNR( ...@@ -126,9 +131,9 @@ void UEContextReleaseCompleteMsg::setUserLocationInfoNR(
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void UEContextReleaseCompleteMsg::getUserLocationInfoNR( void UEContextReleaseCompleteMsg::getUserLocationInfoNR(
NrCgi_t& cig, Tai_t& tai) { NrCgi_t& cig, Tai_t& tai) {
if (userLocationInformation) { if (userLocationInformation.has_value()) {
UserLocationInformationNR information_nr = {}; UserLocationInformationNR information_nr = {};
if (!userLocationInformation->getInformation(information_nr)) return; if (!userLocationInformation.value().getInformation(information_nr)) return;
NR_CGI nr_cgi = {}; NR_CGI nr_cgi = {};
TAI tai_nr = {}; TAI tai_nr = {};
...@@ -241,9 +246,9 @@ bool UEContextReleaseCompleteMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) { ...@@ -241,9 +246,9 @@ bool UEContextReleaseCompleteMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) {
} else { } else {
Logger::ngap().error( Logger::ngap().error(
"TypeOfMessage of UEContextReleaseComplete is not SuccessfulOutcome"); "TypeOfMessage of UEContextReleaseComplete is not SuccessfulOutcome");
return false; return false;
} }
for (int i = 0; i < ies->protocolIEs.list.count; i++) { for (int i = 0; i < ies->protocolIEs.list.count; i++) {
switch (ies->protocolIEs.list.array[i]->id) { switch (ies->protocolIEs.list.array[i]->id) {
case Ngap_ProtocolIE_ID_id_AMF_UE_NGAP_ID: { case Ngap_ProtocolIE_ID_id_AMF_UE_NGAP_ID: {
...@@ -262,6 +267,7 @@ bool UEContextReleaseCompleteMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) { ...@@ -262,6 +267,7 @@ bool UEContextReleaseCompleteMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) {
return false; return false;
} }
} break; } break;
case Ngap_ProtocolIE_ID_id_RAN_UE_NGAP_ID: { case Ngap_ProtocolIE_ID_id_RAN_UE_NGAP_ID: {
if (ies->protocolIEs.list.array[i]->criticality == if (ies->protocolIEs.list.array[i]->criticality ==
Ngap_Criticality_ignore && Ngap_Criticality_ignore &&
...@@ -277,8 +283,31 @@ bool UEContextReleaseCompleteMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) { ...@@ -277,8 +283,31 @@ bool UEContextReleaseCompleteMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) {
return false; return false;
} }
} break; } break;
// TODO: User Location Information
case Ngap_ProtocolIE_ID_id_UserLocationInformation: {
if (ies->protocolIEs.list.array[i]->criticality ==
Ngap_Criticality_ignore &&
ies->protocolIEs.list.array[i]->value.present ==
Ngap_UEContextReleaseComplete_IEs__value_PR_UserLocationInformation) {
UserLocationInformation m_userLocationInformation = {};
if (!m_userLocationInformation.decode(
&ies->protocolIEs.list.array[i]
->value.choice.UserLocationInformation)) {
Logger::ngap().error(
"Decode NGAP UserLocationInformation IE error");
return false;
}
userLocationInformation =
std::optional<UserLocationInformation>{m_userLocationInformation};
} else {
Logger::ngap().error("Decode NGAP UserLocationInformation IE error");
return false;
}
} break;
// TODO: Information on Recommended Cells and RAN Nodes for Paging // TODO: Information on Recommended Cells and RAN Nodes for Paging
case Ngap_ProtocolIE_ID_id_PDUSessionResourceListCxtRelCpl: { case Ngap_ProtocolIE_ID_id_PDUSessionResourceListCxtRelCpl: {
if (ies->protocolIEs.list.array[i]->criticality == if (ies->protocolIEs.list.array[i]->criticality ==
Ngap_Criticality_reject && Ngap_Criticality_reject &&
...@@ -307,8 +336,9 @@ bool UEContextReleaseCompleteMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) { ...@@ -307,8 +336,9 @@ bool UEContextReleaseCompleteMsg::decodeFromPdu(Ngap_NGAP_PDU_t* ngapMsgPdu) {
// TODO: Criticality Diagnostics // TODO: Criticality Diagnostics
default: { default: {
Logger::ngap().error("Decoded NGAP message PDU error!"); Logger::ngap().error(
return false; "Unknown IE 0x%x", ies->protocolIEs.list.array[i]->id);
return true;
} }
} }
} }
......
...@@ -55,7 +55,7 @@ class UEContextReleaseCompleteMsg : public NgapUEMessage { ...@@ -55,7 +55,7 @@ class UEContextReleaseCompleteMsg : public NgapUEMessage {
Ngap_UEContextReleaseComplete_t* ies; Ngap_UEContextReleaseComplete_t* ies;
// AMF_UE_NGAP_ID //Mandatory // AMF_UE_NGAP_ID //Mandatory
// RAN_UE_NGAP_ID //Mandatory // RAN_UE_NGAP_ID //Mandatory
UserLocationInformation* userLocationInformation; // Optional std::optional<UserLocationInformation> userLocationInformation; // Optional
// TODO: Information on Recommended Cells and RAN Nodes for Paging (Optional) // TODO: Information on Recommended Cells and RAN Nodes for Paging (Optional)
std::optional<PDUSessionResourceListCxtRelCpl> std::optional<PDUSessionResourceListCxtRelCpl>
pduSessionResourceListCxtRelCpl; // Optional pduSessionResourceListCxtRelCpl; // Optional
......
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