Commit 10bda644 authored by Ali GÜNGÖR's avatar Ali GÜNGÖR

PS list included in UEContextReleaseRequest

parent 29fc1f70
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <asn/ngap/ASN_NGAP_InitialContextSetupRequest.h> #include <asn/ngap/ASN_NGAP_InitialContextSetupRequest.h>
#include <asn/ngap/ASN_NGAP_InitialContextSetupResponse.h> #include <asn/ngap/ASN_NGAP_InitialContextSetupResponse.h>
#include <asn/ngap/ASN_NGAP_NGAP-PDU.h> #include <asn/ngap/ASN_NGAP_NGAP-PDU.h>
#include <asn/ngap/ASN_NGAP_PDUSessionResourceItemCxtRelReq.h>
#include <asn/ngap/ASN_NGAP_ProtocolIE-Field.h> #include <asn/ngap/ASN_NGAP_ProtocolIE-Field.h>
#include <asn/ngap/ASN_NGAP_SuccessfulOutcome.h> #include <asn/ngap/ASN_NGAP_SuccessfulOutcome.h>
#include <asn/ngap/ASN_NGAP_UE-NGAP-ID-pair.h> #include <asn/ngap/ASN_NGAP_UE-NGAP-ID-pair.h>
...@@ -117,13 +118,37 @@ void NgapTask::sendContextRelease(int ueId, NgapCause cause) ...@@ -117,13 +118,37 @@ void NgapTask::sendContextRelease(int ueId, NgapCause cause)
{ {
m_logger->debug("Sending UE Context release request (NG-RAN node initiated)"); m_logger->debug("Sending UE Context release request (NG-RAN node initiated)");
auto *ue = findUeContext(ueId);
if (ue == nullptr)
return;
std::vector<ASN_NGAP_UEContextReleaseRequest_IEs *> ies;
if (!ue->pduSessions.empty())
{
auto *ieSessionList = asn::New<ASN_NGAP_UEContextReleaseRequest_IEs>();
ieSessionList->id = ASN_NGAP_ProtocolIE_ID_id_PDUSessionResourceListCxtRelReq;
ieSessionList->criticality = ASN_NGAP_Criticality_reject;
ieSessionList->value.present = ASN_NGAP_UEContextReleaseRequest_IEs__value_PR_PDUSessionResourceListCxtRelReq;
for (int psi : ue->pduSessions)
{
auto *sessionItem = asn::New<ASN_NGAP_PDUSessionResourceItemCxtRelReq>();
sessionItem->pDUSessionID = static_cast<ASN_NGAP_PDUSessionID_t>(psi);
asn::SequenceAdd(ieSessionList->value.choice.PDUSessionResourceListCxtRelReq, sessionItem);
}
ies.push_back(ieSessionList);
}
auto *ieCause = asn::New<ASN_NGAP_UEContextReleaseRequest_IEs>(); auto *ieCause = asn::New<ASN_NGAP_UEContextReleaseRequest_IEs>();
ieCause->id = ASN_NGAP_ProtocolIE_ID_id_Cause; ieCause->id = ASN_NGAP_ProtocolIE_ID_id_Cause;
ieCause->criticality = ASN_NGAP_Criticality_ignore; ieCause->criticality = ASN_NGAP_Criticality_ignore;
ieCause->value.present = ASN_NGAP_UEContextReleaseRequest_IEs__value_PR_Cause; ieCause->value.present = ASN_NGAP_UEContextReleaseRequest_IEs__value_PR_Cause;
ngap_utils::ToCauseAsn_Ref(cause, ieCause->value.choice.Cause); ngap_utils::ToCauseAsn_Ref(cause, ieCause->value.choice.Cause);
ies.push_back(ieCause);
auto *pdu = asn::ngap::NewMessagePdu<ASN_NGAP_UEContextReleaseRequest>({ieCause}); auto *pdu = asn::ngap::NewMessagePdu<ASN_NGAP_UEContextReleaseRequest>(ies);
sendNgapUeAssociated(ueId, pdu); sendNgapUeAssociated(ueId, pdu);
} }
......
...@@ -106,7 +106,7 @@ void NgapTask::receiveSessionResourceSetupRequest(int amfId, ASN_NGAP_PDUSession ...@@ -106,7 +106,7 @@ void NgapTask::receiveSessionResourceSetupRequest(int amfId, ASN_NGAP_PDUSession
resource->qosFlows = asn::WrapUnique(ptr, asn_DEF_ASN_NGAP_QosFlowSetupRequestList); resource->qosFlows = asn::WrapUnique(ptr, asn_DEF_ASN_NGAP_QosFlowSetupRequestList);
} }
auto error = setupPduSessionResource(resource); auto error = setupPduSessionResource(ue, resource);
if (error.has_value()) if (error.has_value())
{ {
auto *tr = asn::New<ASN_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer>(); auto *tr = asn::New<ASN_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer>();
...@@ -213,7 +213,7 @@ void NgapTask::receiveSessionResourceSetupRequest(int amfId, ASN_NGAP_PDUSession ...@@ -213,7 +213,7 @@ void NgapTask::receiveSessionResourceSetupRequest(int amfId, ASN_NGAP_PDUSession
static_cast<int>(successList.size()), static_cast<int>(failedList.size())); static_cast<int>(successList.size()), static_cast<int>(failedList.size()));
} }
std::optional<NgapCause> NgapTask::setupPduSessionResource(PduSessionResource *resource) std::optional<NgapCause> NgapTask::setupPduSessionResource(NgapUeContext *ue, PduSessionResource *resource)
{ {
if (resource->sessionType != PduSessionType::IPv4) if (resource->sessionType != PduSessionType::IPv4)
{ {
...@@ -242,6 +242,8 @@ std::optional<NgapCause> NgapTask::setupPduSessionResource(PduSessionResource *r ...@@ -242,6 +242,8 @@ std::optional<NgapCause> NgapTask::setupPduSessionResource(PduSessionResource *r
w->resource = resource; w->resource = resource;
m_base->gtpTask->push(w); m_base->gtpTask->push(w);
ue->pduSessions.insert(resource->psi);
return {}; return {};
} }
...@@ -283,6 +285,8 @@ void NgapTask::receiveSessionResourceReleaseCommand(int amfId, ASN_NGAP_PDUSessi ...@@ -283,6 +285,8 @@ void NgapTask::receiveSessionResourceReleaseCommand(int amfId, ASN_NGAP_PDUSessi
w->ueId = ue->ctxId; w->ueId = ue->ctxId;
w->psi = psi; w->psi = psi;
m_base->gtpTask->push(w); m_base->gtpTask->push(w);
ue->pduSessions.erase(psi);
} }
for (auto &psi : psIds) for (auto &psi : psIds)
......
...@@ -108,7 +108,7 @@ class NgapTask : public NtsTask ...@@ -108,7 +108,7 @@ class NgapTask : public NtsTask
/* PDU session management */ /* PDU session management */
void receiveSessionResourceSetupRequest(int amfId, ASN_NGAP_PDUSessionResourceSetupRequest *msg); void receiveSessionResourceSetupRequest(int amfId, ASN_NGAP_PDUSessionResourceSetupRequest *msg);
void receiveSessionResourceReleaseCommand(int amfId, ASN_NGAP_PDUSessionResourceReleaseCommand *msg); void receiveSessionResourceReleaseCommand(int amfId, ASN_NGAP_PDUSessionResourceReleaseCommand *msg);
std::optional<NgapCause> setupPduSessionResource(PduSessionResource *resource); std::optional<NgapCause> setupPduSessionResource(NgapUeContext* ue, PduSessionResource *resource);
/* UE context management */ /* UE context management */
void receiveInitialContextSetup(int amfId, ASN_NGAP_InitialContextSetupRequest *msg); void receiveInitialContextSetup(int amfId, ASN_NGAP_InitialContextSetupRequest *msg);
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#pragma once #pragma once
#include <set>
#include <lib/app/monitor.hpp> #include <lib/app/monitor.hpp>
#include <lib/asn/utils.hpp> #include <lib/asn/utils.hpp>
#include <utils/common_types.hpp> #include <utils/common_types.hpp>
...@@ -132,6 +134,7 @@ struct NgapUeContext ...@@ -132,6 +134,7 @@ struct NgapUeContext
int uplinkStream{}; int uplinkStream{};
int downlinkStream{}; int downlinkStream{};
AggregateMaximumBitRate ueAmbr{}; AggregateMaximumBitRate ueAmbr{};
std::set<int> pduSessions{};
explicit NgapUeContext(int ctxId) : ctxId(ctxId) explicit NgapUeContext(int ctxId) : ctxId(ctxId)
{ {
......
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