Commit edc4ab04 authored by Tien-Thinh Nguyen's avatar Tien-Thinh Nguyen

add api root for header (location)

parent 1c4a02b0
......@@ -695,7 +695,7 @@ components:
anyOf:
- type: string
enum:
- oIPV4
- IPV4
- IPV6
- IPV4V6
- UNSTRUCTURED
......
......@@ -18,8 +18,8 @@ namespace api {
using namespace oai::smf_server::model;
IndividualPDUSessionHSMFApiImpl::IndividualPDUSessionHSMFApiImpl(std::shared_ptr<Pistache::Rest::Router> rtr, smf::smf_app *smf_app_inst)
: IndividualPDUSessionHSMFApi(rtr), m_smf_app(smf_app_inst)
IndividualPDUSessionHSMFApiImpl::IndividualPDUSessionHSMFApiImpl(std::shared_ptr<Pistache::Rest::Router> rtr, smf::smf_app *smf_app_inst, std::string address)
: IndividualPDUSessionHSMFApi(rtr), m_smf_app(smf_app_inst), m_address(address)
{ }
void IndividualPDUSessionHSMFApiImpl::release_pdu_session(const std::string &pduSessionRef, const ReleaseData &releaseData, Pistache::Http::ResponseWriter &response) {
......
......@@ -45,13 +45,14 @@ using namespace oai::smf_server::model;
class IndividualPDUSessionHSMFApiImpl : public oai::smf_server::api::IndividualPDUSessionHSMFApi {
public:
IndividualPDUSessionHSMFApiImpl(std::shared_ptr<Pistache::Rest::Router>, smf::smf_app *smf_app_inst);
IndividualPDUSessionHSMFApiImpl(std::shared_ptr<Pistache::Rest::Router>, smf::smf_app *smf_app_inst, std::string address);
~IndividualPDUSessionHSMFApiImpl() {}
void release_pdu_session(const std::string &pduSessionRef, const ReleaseData &releaseData, Pistache::Http::ResponseWriter &response);
void update_pdu_session(const std::string &pduSessionRef, const HsmfUpdateData &hsmfUpdateData, Pistache::Http::ResponseWriter &response);
private:
smf::smf_app *m_smf_app;
std::string m_address;
};
}
......
......@@ -18,26 +18,32 @@ namespace api {
using namespace oai::smf_server::model;
IndividualSMContextApiImpl::IndividualSMContextApiImpl(std::shared_ptr<Pistache::Rest::Router> rtr, smf::smf_app *smf_app_inst)
: IndividualSMContextApi(rtr), m_smf_app(smf_app_inst)
IndividualSMContextApiImpl::IndividualSMContextApiImpl(std::shared_ptr<Pistache::Rest::Router> rtr, smf::smf_app *smf_app_inst, std::string address)
: IndividualSMContextApi(rtr), m_smf_app(smf_app_inst), m_address(address)
{ }
void IndividualSMContextApiImpl::release_sm_context(const std::string &smContextRef, const SmContextReleaseData &smContextReleaseData, Pistache::Http::ResponseWriter &response) {
response.send(Pistache::Http::Code::Ok, "Do some magic\n");
Logger::smf_api_server().info("release_sm_context...");
response.send(Pistache::Http::Code::Ok, "This API has not been implemented yet!\n");
}
void IndividualSMContextApiImpl::retrieve_sm_context(const std::string &smContextRef, const SmContextRetrieveData &smContextRetrieveData, Pistache::Http::ResponseWriter &response) {
response.send(Pistache::Http::Code::Ok, "Do some magic\n");
Logger::smf_api_server().info("retrieve_sm_context...");
response.send(Pistache::Http::Code::Ok, "This API has not been implemented yet!\n");
}
void IndividualSMContextApiImpl::update_sm_context(const std::string &smContextRef, const SmContextUpdateData &smContextUpdateData, Pistache::Http::ResponseWriter &response) {
//handle Nsmf_PDUSession_UpdateSMContext Request
Logger::smf_api_server().info("update_sm_contexts...");
//Get the SmContextUpdateData from this message and process in smf_app
//Get the SmContextUpdateData from this message and process in smf_app
smf::pdu_session_update_sm_context_request sm_context_req_msg = {};
//TODO: initialize necessary values for sm context req from smContextUpdateData
//set smContextRef
sm_context_req_msg.set_sm_context_ref(smContextRef);
//TODO: initialize necessary values for sm context req from smContextUpdateData and smContextRef
std::shared_ptr<itti_n11_update_sm_context_request> itti_msg = std::make_shared<itti_n11_update_sm_context_request>(TASK_SMF_N11, TASK_SMF_APP, response);
itti_msg->req = sm_context_req_msg;
m_smf_app->handle_amf_msg(itti_msg);
std::shared_ptr<itti_n11_update_sm_context_request> itti_msg = std::make_shared<itti_n11_update_sm_context_request>(TASK_SMF_N11, TASK_SMF_APP, response);
itti_msg->req = sm_context_req_msg;
m_smf_app->handle_amf_msg(itti_msg);
}
......
......@@ -47,7 +47,7 @@ using namespace oai::smf_server::model;
class IndividualSMContextApiImpl : public oai::smf_server::api::IndividualSMContextApi {
public:
IndividualSMContextApiImpl(std::shared_ptr<Pistache::Rest::Router>, smf::smf_app *smf_app_inst);
IndividualSMContextApiImpl(std::shared_ptr<Pistache::Rest::Router>, smf::smf_app *smf_app_inst, std::string address);
~IndividualSMContextApiImpl() {}
void release_sm_context(const std::string &smContextRef, const SmContextReleaseData &smContextReleaseData, Pistache::Http::ResponseWriter &response);
......@@ -55,6 +55,7 @@ public:
void update_sm_context(const std::string &smContextRef, const SmContextUpdateData &smContextUpdateData, Pistache::Http::ResponseWriter &response);
private:
smf::smf_app *m_smf_app;
std::string m_address;
};
}
......
......@@ -18,8 +18,8 @@ namespace api {
using namespace oai::smf_server::model;
PDUSessionsCollectionApiImpl::PDUSessionsCollectionApiImpl(std::shared_ptr<Pistache::Rest::Router> rtr, smf::smf_app *smf_app_inst)
: PDUSessionsCollectionApi(rtr), m_smf_app(smf_app_inst)
PDUSessionsCollectionApiImpl::PDUSessionsCollectionApiImpl(std::shared_ptr<Pistache::Rest::Router> rtr, smf::smf_app *smf_app_inst, std::string address)
: PDUSessionsCollectionApi(rtr), m_smf_app(smf_app_inst), m_address(address)
{ }
void PDUSessionsCollectionApiImpl::post_pdu_sessions(const PduSessionCreateData &pduSessionCreateData, Pistache::Http::ResponseWriter &response) {
......
......@@ -43,12 +43,13 @@ using namespace oai::smf_server::model;
class PDUSessionsCollectionApiImpl : public oai::smf_server::api::PDUSessionsCollectionApi {
public:
PDUSessionsCollectionApiImpl(std::shared_ptr<Pistache::Rest::Router>, smf::smf_app *smf_app_inst);
PDUSessionsCollectionApiImpl(std::shared_ptr<Pistache::Rest::Router>, smf::smf_app *smf_app_inst, std::string address);
~PDUSessionsCollectionApiImpl() {}
void post_pdu_sessions(const PduSessionCreateData &pduSessionCreateData, Pistache::Http::ResponseWriter &response);
private:
smf::smf_app *m_smf_app;
std::string m_address;
};
}
......
......@@ -28,8 +28,8 @@ namespace api {
using namespace oai::smf_server::model;
SMContextsCollectionApiImpl::SMContextsCollectionApiImpl(std::shared_ptr<Pistache::Rest::Router> rtr, smf::smf_app *smf_app_inst)
: SMContextsCollectionApi(rtr), m_smf_app(smf_app_inst)
SMContextsCollectionApiImpl::SMContextsCollectionApiImpl(std::shared_ptr<Pistache::Rest::Router> rtr, smf::smf_app *smf_app_inst, std::string address)
: SMContextsCollectionApi(rtr), m_smf_app(smf_app_inst), m_address(address)
{ }
......@@ -90,6 +90,10 @@ void SMContextsCollectionApiImpl::post_sm_contexts(const SmContextMessage &smCon
//Step 2. Create a pdu_session_create_sm_context_request message and store the necessary information
smf::pdu_session_create_sm_context_request sm_context_req_msg = {};
//"/nsmf-pdusession/v1";
sm_context_req_msg.set_api_root(m_address + base + "/sm-contexts");
//supi
supi_t supi = {.length = 0};
smf_string_to_supi(&supi, smContextCreateData.getSupi().c_str());
......
......@@ -43,12 +43,13 @@ using namespace oai::smf_server::model;
class SMContextsCollectionApiImpl : public oai::smf_server::api::SMContextsCollectionApi {
public:
SMContextsCollectionApiImpl(std::shared_ptr<Pistache::Rest::Router>, smf::smf_app *smf_app_inst);
SMContextsCollectionApiImpl(std::shared_ptr<Pistache::Rest::Router>, smf::smf_app *smf_app_inst, std::string address);
~SMContextsCollectionApiImpl() {}
void post_sm_contexts(const SmContextMessage &smContextMessage, Pistache::Http::ResponseWriter &response);
private:
smf::smf_app *m_smf_app;
std::string m_address;
};
}
......
......@@ -35,6 +35,7 @@ public:
m_individualSMContextApiImpl = std::make_shared<IndividualSMContextApiImpl> (m_router, smf_app_inst);
m_pduSessionsCollectionApiImpl = std::make_shared<PDUSessionsCollectionApiImpl> (m_router, smf_app_inst);
m_smContextsCollectionApiImpl = std::make_shared<SMContextsCollectionApiImpl> (m_router, smf_app_inst);
m_address = address.host() + ":"+ (address.port()).toString();
}
void init(size_t thr = 1);
......@@ -48,6 +49,7 @@ private:
std::shared_ptr <IndividualSMContextApiImpl> m_individualSMContextApiImpl;
std::shared_ptr <PDUSessionsCollectionApiImpl> m_pduSessionsCollectionApiImpl;
std::shared_ptr <SMContextsCollectionApiImpl> m_smContextsCollectionApiImpl;
std::string m_address;
};
......
......@@ -412,7 +412,7 @@ void smf_app::handle_amf_msg (std::shared_ptr<itti_n11_create_sm_context_request
send_create_session_response(smreq->http_response, smContextCreateError, Pistache::Http::Code::Forbidden);
return;
}
}container with a PDU Session Establishment Reject message (see clause 8.3.3 of TS 24.501 [25]) in the
}
//Step 5. let the context handle the message
//in this step, SMF will send N4 Session Establishment/Modification to UPF (step 10a, section 4.3.2 3GPP 23.502)
......
......@@ -541,6 +541,12 @@ void smf_context::handle_amf_msg (std::shared_ptr<itti_n11_create_sm_context_req
to_json(jsonData, smContextCreatedData);
std::string resBody = jsonData.dump();
//headers: Location:
//Contains the URI of the newly created resource, according to the structure: {apiRoot}/nsmf-pdusession/{apiVersion}/sm-contexts/{smContextRef}
std::string uri = sm_context_req_msg.get_api_root() + std::to_string(supi64); //smContextRef
sm_context_resp->http_response.headers().add<Pistache::Http::Header::Location>(uri);
sm_context_resp->http_response.send(Pistache::Http::Code::Created, resBody);
session_create_sm_context_procedure* proc = new session_create_sm_context_procedure(sp);
......@@ -625,6 +631,7 @@ void smf_context::handle_amf_msg (std::shared_ptr<itti_n11_update_sm_context_req
// if these contexts existed > create a procedure for update sm context and let the procedure handle the request
//else
//TODO:
session_update_sm_context_procedure* proc = new session_update_sm_context_procedure(sp);
std::shared_ptr<smf_procedure> sproc = std::shared_ptr<smf_procedure>(proc);
......
......@@ -91,6 +91,17 @@ void pdu_session_msg::set_snssai(snssai_t const& snssai)
m_snssai = snssai;
}
//-----------------------------------------------------------------------------
void pdu_session_msg::set_api_root(std::string const& value)
{
m_api_root = value;
}
std::string pdu_session_msg::get_api_root() const
{
return m_api_root;
}
//-----------------------------------------------------------------------------
std::string pdu_session_create_sm_context_request::get_serving_nf_id() const
{
......@@ -226,3 +237,13 @@ void pdu_session_create_sm_context_response::set_qos_flow_context(const qos_flow
qos_flow_context = qos_flow;
}
void pdu_session_update_sm_context_request::set_sm_context_ref(std::string const& value)
{
m_smContextRef = value;
}
std::string pdu_session_update_sm_context_request::get_sm_context_ref() const
{
return m_smContextRef;
}
......@@ -66,7 +66,11 @@ public:
snssai_t get_snssai() const;
void set_snssai(snssai_t const& value);
void set_api_root(std::string const& value);
std::string get_api_root() const;
private:
std::string m_api_root;
supi_t m_supi;
pdu_session_id_t m_pdu_session_id;
std::string m_dnn;
......@@ -76,99 +80,117 @@ private:
//for PDU session update
class pdu_session_update_sm_context_request: public pdu_session_msg {
public:
pdu_session_update_sm_context_request(): pdu_session_msg(){ }
pdu_session_update_sm_context_request(): pdu_session_msg(){ };
void set_sm_context_ref(std::string const& value);
std::string get_sm_context_ref() const;
private:
//std::string m_Ppei;
std::string m_NfInstanceId;
Guami m_Guami;
PlmnId servingNetwork;
//BackupAmfInfo
AcessType anType;
/* SmContextUpdateData:
servingNetwork:
$ref: '../TS29571_CommonData.yaml#/components/schemas/PlmnId'
backupAmfInfo:
type: array
items:
$ref: '../TS29571_CommonData.yaml#/components/schemas/BackupAmfInfo'
minItems: 1
nullable: true
anType:
$ref: '../TS29571_CommonData.yaml#/components/schemas/AccessType'
secondAnType:
$ref: '../TS29571_CommonData.yaml#/components/schemas/AccessType'
ratType:
$ref: '../TS29571_CommonData.yaml#/components/schemas/RatType'
presenceInLadn:
$ref: '../TS29571_CommonData.yaml#/components/schemas/PresenceState'
ueLocation:
$ref: '../TS29571_CommonData.yaml#/components/schemas/UserLocation'
ueTimeZone:
$ref: '../TS29571_CommonData.yaml#/components/schemas/TimeZone'
addUeLocation:
$ref: '../TS29571_CommonData.yaml#/components/schemas/UserLocation'
upCnxState:
$ref: '#/components/schemas/UpCnxState'
hoState:
$ref: '#/components/schemas/HoState'
toBeSwitched:
type: boolean
default: false
failedToBeSwitched:
type: boolean
n1SmMsg:
$ref: '../TS29571_CommonData.yaml#/components/schemas/RefToBinaryData'
n2SmInfo:
$ref: '../TS29571_CommonData.yaml#/components/schemas/RefToBinaryData'
n2SmInfoType:
$ref: '#/components/schemas/N2SmInfoType'
targetId:
$ref: '../amf/TS29518_Namf_Communication.yaml#/components/schemas/NgRanTargetId'
targetServingNfId:
$ref: '../TS29571_CommonData.yaml#/components/schemas/NfInstanceId'
smContextStatusUri:
$ref: '../TS29571_CommonData.yaml#/components/schemas/Uri'
dataForwarding:
type: boolean
default: false
epsBearerSetup:
type: array
items:
$ref: '#/components/schemas/EpsBearerContainer'
minItems: 0
revokeEbiList:
type: array
items:
$ref: '#/components/schemas/EpsBearerId'
minItems: 1
release:
type: boolean
default: false
cause:
$ref: '#/components/schemas/Cause'
ngApCause:
$ref: '../TS29571_CommonData.yaml#/components/schemas/NgApCause'
5gMmCauseValue:
$ref: '../TS29571_CommonData.yaml#/components/schemas/5GMmCause'
sNssai:
$ref: '../TS29571_CommonData.yaml#/components/schemas/Snssai'
traceData:
$ref: '../TS29571_CommonData.yaml#/components/schemas/TraceData'
epsInterworkingInd:
$ref: '#/components/schemas/EpsInterworkingIndication'
anTypeCanBeChanged:
type: boolean
default: false
n2SmInfoExt1:
$ref: '../TS29571_CommonData.yaml#/components/schemas/RefToBinaryData'
n2SmInfoTypeExt1:
$ref: '#/components/schemas/N2SmInfoType'
maReleaseInd:
$ref: '#/components/schemas/MaReleaseIndication'
exemptionInd:
$ref: '#/components/schemas/ExemptionInd'
std::string m_sm_context_ref;
//std::string m_Ppei;
std::string m_nf_instanceId;
Guami m_guami;
PlmnId m_serving_network;
//BackupAmfInfo
/*
backupAmfInfo:
type: array
items:
$ref: '../TS29571_CommonData.yaml#/components/schemas/BackupAmfInfo'
minItems: 1
nullable: true
*/
AcessType m_an_type;
/*
*
secondAnType:
$ref: '../TS29571_CommonData.yaml#/components/schemas/AccessType'
*/
std::string m_rat_type; //ratType: $ref: '../TS29571_CommonData.yaml#/components/schemas/RatType
/* SmContextUpdateData:
presenceInLadn:
$ref: '../TS29571_CommonData.yaml#/components/schemas/PresenceState'
ueLocation:
$ref: '../TS29571_CommonData.yaml#/components/schemas/UserLocation'
ueTimeZone:
$ref: '../TS29571_CommonData.yaml#/components/schemas/TimeZone'
addUeLocation:
$ref: '../TS29571_CommonData.yaml#/components/schemas/UserLocation'
upCnxState:
$ref: '#/components/schemas/UpCnxState'
hoState:
$ref: '#/components/schemas/HoState'
toBeSwitched:
type: boolean
default: false
failedToBeSwitched:
type: boolean
*/
RefToBinaryData m_n1_sm_msg; //n1SmMsg
RefToBinaryData m_n2_sm_info; //n2SmInfo
std::string m_n2_sm_info_type; //$ref: '#/components/schemas/N2SmInfoType'
NgRanTargetId m_target_id; //$ref: '../amf/TS29518_Namf_Communication.yaml#/components/schemas/NgRanTargetId'
std::string m_target_serving_nfId // $ref: '../TS29571_CommonData.yaml#/components/schemas/NfInstanceId'
std::string m_sm_context_status_uri; //smContextStatusUri $ref: '../TS29571_CommonData.yaml#/components/schemas/Uri'
/*
dataForwarding:
type: boolean
default: false
*/
bool m_data_forwarding;
/*
epsBearerSetup:
type: array
items:
$ref: '#/components/schemas/EpsBearerContainer'
minItems: 0
*/
std::vector<std::string> m_eps_bearer_setup;
/*
revokeEbiList:
type: array
items:
$ref: '#/components/schemas/EpsBearerId'
minItems: 1
EpsBearerId:
type: integer
minimum: 0
maximum: 15
*/
std::vector<int> m_revoke_ebi_list;
/*
release:
type: boolean
default: false
cause:
$ref: '#/components/schemas/Cause'
*/
NgApCause m_ngAp_cause; // $ref: '../TS29571_CommonData.yaml#/components/schemas/NgApCause
unsigned int m_5gMm_cause_value; // 5GMmCause, $ref: '../TS29571_CommonData.yaml#/components/schemas/5GMmCause'
/*
sNssai:
$ref: '../TS29571_CommonData.yaml#/components/schemas/Snssai'
traceData:
$ref: '../TS29571_CommonData.yaml#/components/schemas/TraceData'
epsInterworkingInd:
$ref: '#/components/schemas/EpsInterworkingIndication'
anTypeCanBeChanged:
type: boolean
default: false
n2SmInfoExt1:
$ref: '../TS29571_CommonData.yaml#/components/schemas/RefToBinaryData'
n2SmInfoTypeExt1:
$ref: '#/components/schemas/N2SmInfoType'
maReleaseInd:
$ref: '#/components/schemas/MaReleaseIndication'
exemptionInd:
$ref: '#/components/schemas/ExemptionInd'
*/
};
......
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