Commit 7d160e83 authored by Tien-Thinh Nguyen's avatar Tien-Thinh Nguyen

Fix issue with Create Subscription

parent 6f9f2097
...@@ -37,6 +37,10 @@ AMF_CONF[@SD_1@]='12' ...@@ -37,6 +37,10 @@ AMF_CONF[@SD_1@]='12'
AMF_CONF[@AMF_INTERFACE_NAME_FOR_NGAP@]='wlo1' AMF_CONF[@AMF_INTERFACE_NAME_FOR_NGAP@]='wlo1'
AMF_CONF[@AMF_INTERFACE_NAME_FOR_N11@]='wlo1' AMF_CONF[@AMF_INTERFACE_NAME_FOR_N11@]='wlo1'
AMF_CONF[@EXTERNAL_AUSF@]='no'
AMF_CONF[@EXTERNAL_UDM@]='no'
AMF_CONF[@USE_FQDN_DNS@]='no'
AMF_CONF[@NF_REGISTRATION@]='no' AMF_CONF[@NF_REGISTRATION@]='no'
AMF_CONF[@SMF_SELECTION@]='no' AMF_CONF[@SMF_SELECTION@]='no'
......
...@@ -61,6 +61,7 @@ file(GLOB AMF_src_files ...@@ -61,6 +61,7 @@ file(GLOB AMF_src_files
${CMAKE_CURRENT_SOURCE_DIR}/amf_statistics.cpp ${CMAKE_CURRENT_SOURCE_DIR}/amf_statistics.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mysql_db.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mysql_db.cpp
${CMAKE_CURRENT_SOURCE_DIR}/amf_msg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/amf_msg.cpp
${CMAKE_CURRENT_SOURCE_DIR}/amf_subscription.cpp
${SRC_TOP_DIR}/nas/msgs/*.cpp ${SRC_TOP_DIR}/nas/msgs/*.cpp
${SRC_TOP_DIR}/nas/ies/*.cpp ${SRC_TOP_DIR}/nas/ies/*.cpp
${SRC_TOP_DIR}/nas/utils/*.c ${SRC_TOP_DIR}/nas/utils/*.c
......
...@@ -403,27 +403,25 @@ evsub_id_t amf_app::handle_event_exposure_subscription( ...@@ -403,27 +403,25 @@ evsub_id_t amf_app::handle_event_exposure_subscription(
// map (subscription id, info) // map (subscription id, info)
evsub_id_t evsub_id = generate_ev_subscription_id(); evsub_id_t evsub_id = generate_ev_subscription_id();
std::shared_ptr<amf_subscription> ss =
std::shared_ptr<amf_subscription>(new amf_subscription());
ss.get()->sub_id = evsub_id;
// TODO:
if (msg->event_exposure.is_supi_is_set()) {
supi64_t supi64 = amf_supi_to_u64(msg->event_exposure.get_supi());
ss.get()->supi = supi64;
}
ss.get()->notify_correlation_id =
msg->event_exposure.get_notify_correlation_id();
ss.get()->notify_uri = msg->event_exposure.get_notify_uri();
ss.get()->nf_id = msg->event_exposure.get_nf_id();
std::vector<amf_event_t> event_subscriptions = std::vector<amf_event_t> event_subscriptions =
msg->event_exposure.get_event_subs(); msg->event_exposure.get_event_subs();
// store subscription // store subscription
for (auto i : event_subscriptions) { for (auto i : event_subscriptions) {
ss.get()->ev_type = i.type; std::shared_ptr<amf_subscription> ss = std::make_shared<amf_subscription>();
ss.get()->sub_id = evsub_id;
// TODO:
if (msg->event_exposure.is_supi_is_set()) {
ss.get()->supi = msg->event_exposure.get_supi();
ss.get()->supi_is_set = true;
}
ss.get()->notify_correlation_id =
msg->event_exposure.get_notify_correlation_id();
ss.get()->notify_uri = msg->event_exposure.get_notify_uri();
ss.get()->nf_id = msg->event_exposure.get_nf_id();
ss.get()->ev_type = i.type;
add_event_subscription(evsub_id, i.type, ss); add_event_subscription(evsub_id, i.type, ss);
ss.get()->display();
} }
return evsub_id; return evsub_id;
} }
...@@ -587,7 +585,7 @@ void amf_app::get_ee_subscriptions( ...@@ -587,7 +585,7 @@ void amf_app::get_ee_subscriptions(
//--------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------
void amf_app::get_ee_subscriptions( void amf_app::get_ee_subscriptions(
amf_event_type_t ev, supi64_t supi, amf_event_type_t ev, std::string& supi,
std::vector<std::shared_ptr<amf_subscription>>& subscriptions) { std::vector<std::shared_ptr<amf_subscription>>& subscriptions) {
for (auto const& i : amf_event_subscriptions) { for (auto const& i : amf_event_subscriptions) {
if ((i.first.second == ev) && (i.second->supi == supi)) { if ((i.first.second == ev) && (i.second->supi == supi)) {
......
...@@ -208,13 +208,13 @@ class amf_app { ...@@ -208,13 +208,13 @@ class amf_app {
/* /*
* Get a list of subscription associated with a particular event * Get a list of subscription associated with a particular event
* @param [amf_event_t] ev: Event type * @param [amf_event_t] ev: Event type
* @param [supi64_t] supi: SUPI * @param [std::string&] supi: SUPI
* @param [std::vector<std::shared_ptr<amf_subscription>>&] subscriptions: * @param [std::vector<std::shared_ptr<amf_subscription>>&] subscriptions:
* store the list of the subscription associated with this event type * store the list of the subscription associated with this event type
* @return void * @return void
*/ */
void get_ee_subscriptions( void get_ee_subscriptions(
amf_event_type_t ev, supi64_t supi, amf_event_type_t ev, std::string& supi,
std::vector<std::shared_ptr<amf_subscription>>& subscriptions); std::vector<std::shared_ptr<amf_subscription>>& subscriptions);
/* /*
......
...@@ -35,12 +35,12 @@ using namespace amf_application; ...@@ -35,12 +35,12 @@ using namespace amf_application;
*/ */
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
supi_t event_exposure_msg::get_supi() const { std::string event_exposure_msg::get_supi() const {
return m_supi; return m_supi;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void event_exposure_msg::set_supi(const supi_t& value) { void event_exposure_msg::set_supi(const std::string& value) {
m_supi = value; m_supi = value;
m_supi_is_set = true; m_supi_is_set = true;
} }
...@@ -109,6 +109,10 @@ void event_exposure_msg::set_event_subs(std::vector<amf_event_t> const& value) { ...@@ -109,6 +109,10 @@ void event_exposure_msg::set_event_subs(std::vector<amf_event_t> const& value) {
} }
} }
//-----------------------------------------------------------------------------
void event_exposure_msg::add_event_sub(amf_event_t const& value) {
m_event_list.push_back(value);
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void event_exposure_msg::set_any_ue(bool value) { void event_exposure_msg::set_any_ue(bool value) {
m_any_ue = value; m_any_ue = value;
......
...@@ -37,8 +37,8 @@ namespace amf_application { ...@@ -37,8 +37,8 @@ namespace amf_application {
class event_exposure_msg { class event_exposure_msg {
public: public:
supi_t get_supi() const; std::string get_supi() const;
void set_supi(const supi_t& value); void set_supi(const std::string& value);
bool is_supi_is_set() const; bool is_supi_is_set() const;
void set_sub_id(std::string const& value); void set_sub_id(std::string const& value);
...@@ -56,6 +56,7 @@ class event_exposure_msg { ...@@ -56,6 +56,7 @@ class event_exposure_msg {
std::vector<amf_event_t> get_event_subs() const; std::vector<amf_event_t> get_event_subs() const;
void set_event_subs(std::vector<amf_event_t> const& value); void set_event_subs(std::vector<amf_event_t> const& value);
void add_event_sub(amf_event_t const& value);
void set_any_ue(bool value); void set_any_ue(bool value);
...@@ -68,7 +69,8 @@ class event_exposure_msg { ...@@ -68,7 +69,8 @@ class event_exposure_msg {
std::string m_notify_correlation_id; // notifyCorrelationId, Mandatory std::string m_notify_correlation_id; // notifyCorrelationId, Mandatory
std::string m_nf_id; // nfId, Mandatory std::string m_nf_id; // nfId, Mandatory
supi_t m_supi; // Supi, Conditional // supi_t m_supi; // Supi, Conditional
std::string m_supi;
bool m_supi_is_set; bool m_supi_is_set;
bool m_any_ue; // anyUE, Conditional bool m_any_ue; // anyUE, Conditional
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include "3gpp_ts24501.hpp" #include "3gpp_ts24501.hpp"
#include "3gpp_29.500.h"
#include "amf.hpp" #include "amf.hpp"
#include "amf_app.hpp" #include "amf_app.hpp"
#include "amf_config.hpp" #include "amf_config.hpp"
......
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the
* License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file amf_subscription.cpp
\brief
\author
\company
\date 2021
\email:
*/
#include "amf_subscription.hpp"
#include "logger.hpp"
#include "3gpp_conversions.hpp"
using namespace amf_application;
void amf_subscription::display() {
Logger::amf_app().debug("Subscription info");
Logger::amf_app().debug("\tSubscription ID: %d", (uint32_t) sub_id);
Logger::amf_app().debug(
"\tEvent type: %s", xgpp_conv::amf_event_type_to_string(ev_type).c_str());
if (supi_is_set) Logger::amf_app().debug("\tSUPI: %s", supi.c_str());
Logger::amf_app().debug(
"\tNotify Correlation ID: %s", notify_correlation_id.c_str());
Logger::amf_app().debug("\tNF ID: %s", nf_id.c_str());
};
...@@ -35,14 +35,25 @@ namespace amf_application { ...@@ -35,14 +35,25 @@ namespace amf_application {
/* /*
* Manage the Subscription Info * Manage the Subscription Info
*/ */
class amf_subscription { class amf_subscription {
public: public:
amf_subscription() {} amf_subscription()
: sub_id(),
ev_type(),
supi(),
notify_correlation_id(),
notify_uri(),
nf_id() {
supi_is_set = false;
}
void display();
public: public:
evsub_id_t sub_id; evsub_id_t sub_id;
amf_event_type_t ev_type; amf_event_type_t ev_type;
supi64_t supi; bool supi_is_set;
std::string supi;
std::string notify_correlation_id; std::string notify_correlation_id;
std::string notify_uri; // subsChangeNotifyUri ? std::string notify_uri; // subsChangeNotifyUri ?
std::string nf_id; std::string nf_id;
......
...@@ -19,38 +19,34 @@ ...@@ -19,38 +19,34 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
#ifndef FILE_3GPP_29_500_SMF_SEEN #ifndef FILE_3GPP_29_500_SEEN
#define FILE_3GPP_29_500_SMF_SEEN #define FILE_3GPP_29_500_SEEN
enum http_status_code_e { // SMF + AMF + 3GPP TS 29.571 (Common data)
HTTP_STATUS_CODE_100_CONTINUE = 100, enum class http_response_codes_e {
HTTP_STATUS_CODE_200_OK = 200, HTTP_RESPONSE_CODE_0 = 0,
HTTP_STATUS_CODE_201_CREATED = 201, HTTP_RESPONSE_CODE_200_OK = 200,
HTTP_STATUS_CODE_202_ACCEPTED = 202, HTTP_RESPONSE_CODE_201_CREATED = 201,
HTTP_STATUS_CODE_204_NO_CONTENT = 204, HTTP_RESPONSE_CODE_202_ACCEPTED = 202,
HTTP_STATUS_CODE_300_MULTIPLE_CHOICES = 300, HTTP_RESPONSE_CODE_204_UPDATED = 204,
HTTP_STATUS_CODE_303_SEE_OTHER = 303, HTTP_RESPONSE_CODE_BAD_REQUEST = 400,
HTTP_STATUS_CODE_307_TEMPORARY_REDIRECT = 307, HTTP_RESPONSE_CODE_UNAUTHORIZED = 401,
HTTP_STATUS_CODE_308_PERMANENT_REDIRECT = 308, HTTP_RESPONSE_CODE_FORBIDDEN = 403,
HTTP_STATUS_CODE_400_BAD_REQUEST = 400, HTTP_RESPONSE_CODE_NOT_FOUND = 404,
HTTP_STATUS_CODE_401_UNAUTHORIZED = 401, HTTP_RESPONSE_CODE_METHOD_NOT_ALLOWED = 405,
HTTP_STATUS_CODE_403_FORBIDDEN = 403, HTTP_RESPONSE_CODE_REQUEST_TIMEOUT = 408,
HTTP_STATUS_CODE_404_NOT_FOUND = 404, HTTP_RESPONSE_CODE_406_NOT_ACCEPTED = 406,
HTTP_STATUS_CODE_405_METHOD_NOT_ALLOWED = 405, HTTP_RESPONSE_CODE_CONFLICT = 409,
HTTP_STATUS_CODE_406_NOT_ACCEPTABLE = 406, HTTP_RESPONSE_CODE_GONE = 410,
HTTP_STATUS_CODE_408_REQUEST_TIMEOUT = 408, HTTP_RESPONSE_CODE_LENGTH_REQUIRED = 411,
HTTP_STATUS_CODE_409_CONFLICT = 409, HTTP_RESPONSE_CODE_PRECONDITION_FAILED = 412,
HTTP_STATUS_CODE_410_GONE = 410, HTTP_RESPONSE_CODE_PAYLOAD_TOO_LARGE = 413,
HTTP_STATUS_CODE_411_LENGTH_REQUIRED = 411, HTTP_RESPONSE_CODE_URI_TOO_LONG = 414,
HTTP_STATUS_CODE_412_PRECONDITION_FAILED = 412, HTTP_RESPONSE_CODE_UNSUPPORTED_MEDIA_TYPE = 415,
HTTP_STATUS_CODE_413_PAYLOAD_TOO_LARGE = 413, HTTP_RESPONSE_CODE_TOO_MANY_REQUESTS = 429,
HTTP_STATUS_CODE_414_URI_TOO_LONG = 414, HTTP_RESPONSE_CODE_INTERNAL_SERVER_ERROR = 500,
HTTP_STATUS_CODE_415_UNSUPPORTED_MEDIA_TYPE_NA = 415, HTTP_RESPONSE_CODE_NOT_IMPLEMENTED = 501,
HTTP_STATUS_CODE_429_TOO_MANY_REQUESTS = 429, HTTP_RESPONSE_CODE_SERVICE_UNAVAILABLE = 503,
HTTP_STATUS_CODE_500_INTERNAL_SERVER_ERROR = 500, HTTP_RESPONSE_CODE_GATEWAY_TIMEOUT = 504
HTTP_STATUS_CODE_501_NOT_IMPLEMENTED = 501,
HTTP_STATUS_CODE_503_SERVICE_UNAVAILABLE = 503,
HTTP_STATUS_CODE_504_GATEWAY_TIMEOUT = 504
}; };
#endif #endif
...@@ -33,101 +33,6 @@ ...@@ -33,101 +33,6 @@
#include "inttypes.h" #include "inttypes.h"
#include "stdio.h" #include "stdio.h"
typedef uint64_t supi64_t;
#define SUPI_64_FMT "%" SCNu64
#define SUPI_DIGITS_MAX 15
typedef struct {
uint32_t length;
char data[SUPI_DIGITS_MAX + 1];
} supi_t;
static void amf_string_to_supi(supi_t* const supi, char const* const supi_str) {
// strncpy(supi->data, supi_str, SUPI_DIGITS_MAX + 1);
memcpy((void*) supi->data, (void*) supi_str, SUPI_DIGITS_MAX + 1);
supi->length = strlen(supi->data);
return;
}
static std::string amf_supi_to_string(supi_t const supi) {
std::string supi_str;
supi_str.assign(supi.data, SUPI_DIGITS_MAX + 1);
return supi_str;
}
static uint64_t amf_supi_to_u64(supi_t supi) {
uint64_t uint_supi;
sscanf(supi.data, SUPI_64_FMT, &uint_supi);
return uint_supi;
}
/*
typedef struct {
std::string mcc;
std::string mnc;
uint32_t tac;
} plmn_t;
typedef struct s_nssai // section 28.4, TS23.003
{
uint8_t sST;
//uint32_t sD:24;
std::string sD;
s_nssai(const uint8_t &sst, const std::string sd)
:
sST(sst),
sD(sd) {
}
s_nssai()
:
sST(),
sD() {
}
s_nssai(const s_nssai &p)
:
sST(p.sST),
sD(p.sD) {
}
bool operator==(const struct s_nssai &s) const {
if ((s.sST == this->sST) && (s.sD.compare(this->sD) == 0)) {
return true;
} else {
return false;
}
}
} snssai_t;
*/
// SMF + AMF + 3GPP TS 29.571 (Common data)
enum class http_response_codes_e {
HTTP_RESPONSE_CODE_0 = 0,
HTTP_RESPONSE_CODE_200_OK = 200,
HTTP_RESPONSE_CODE_201_CREATED = 201,
HTTP_RESPONSE_CODE_202_ACCEPTED = 202,
HTTP_RESPONSE_CODE_204_UPDATED = 204,
HTTP_RESPONSE_CODE_BAD_REQUEST = 400,
HTTP_RESPONSE_CODE_UNAUTHORIZED = 401,
HTTP_RESPONSE_CODE_FORBIDDEN = 403,
HTTP_RESPONSE_CODE_NOT_FOUND = 404,
HTTP_RESPONSE_CODE_METHOD_NOT_ALLOWED = 405,
HTTP_RESPONSE_CODE_REQUEST_TIMEOUT = 408,
HTTP_RESPONSE_CODE_406_NOT_ACCEPTED = 406,
HTTP_RESPONSE_CODE_CONFLICT = 409,
HTTP_RESPONSE_CODE_GONE = 410,
HTTP_RESPONSE_CODE_LENGTH_REQUIRED = 411,
HTTP_RESPONSE_CODE_PRECONDITION_FAILED = 412,
HTTP_RESPONSE_CODE_PAYLOAD_TOO_LARGE = 413,
HTTP_RESPONSE_CODE_URI_TOO_LONG = 414,
HTTP_RESPONSE_CODE_UNSUPPORTED_MEDIA_TYPE = 415,
HTTP_RESPONSE_CODE_TOO_MANY_REQUESTS = 429,
HTTP_RESPONSE_CODE_INTERNAL_SERVER_ERROR = 500,
HTTP_RESPONSE_CODE_NOT_IMPLEMENTED = 501,
HTTP_RESPONSE_CODE_SERVICE_UNAVAILABLE = 503,
HTTP_RESPONSE_CODE_GATEWAY_TIMEOUT = 504
};
// for CURL // for CURL
#define SMF_CURL_TIMEOUT_MS 100L #define SMF_CURL_TIMEOUT_MS 100L
#define SMF_NUMBER_RETRIES 3 #define SMF_NUMBER_RETRIES 3
......
...@@ -13,6 +13,9 @@ ...@@ -13,6 +13,9 @@
#include "SubscriptionsCollectionDocumentApiEventExposure.h" #include "SubscriptionsCollectionDocumentApiEventExposure.h"
#include "Helpers.h" #include "Helpers.h"
#include "amf_config.hpp"
extern config::amf_config amf_cfg;
namespace oai::amf::api { namespace oai::amf::api {
...@@ -32,7 +35,7 @@ void SubscriptionsCollectionDocumentApiEventExposure::setupRoutes() { ...@@ -32,7 +35,7 @@ void SubscriptionsCollectionDocumentApiEventExposure::setupRoutes() {
using namespace Pistache::Rest; using namespace Pistache::Rest;
Routes::Post( Routes::Post(
*router, base + "/subscriptions", *router, base + amf_cfg.sbi_api_version + "/subscriptions",
Routes::bind( Routes::bind(
&SubscriptionsCollectionDocumentApiEventExposure:: &SubscriptionsCollectionDocumentApiEventExposure::
create_subscription_handler, create_subscription_handler,
......
...@@ -42,7 +42,7 @@ void SubscriptionsCollectionDocumentApiImplEventExposure::create_subscription( ...@@ -42,7 +42,7 @@ void SubscriptionsCollectionDocumentApiImplEventExposure::create_subscription(
// Create a message and store the necessary information // Create a message and store the necessary information
Logger::amf_server().debug( Logger::amf_server().debug(
"Create a Event Exposure message and store the necessary information"); "Create an Event Exposure message and store the necessary information");
amf_application::event_exposure_msg event_exposure = {}; amf_application::event_exposure_msg event_exposure = {};
......
...@@ -66,12 +66,13 @@ void xgpp_conv::amf_event_subscription_from_openapi( ...@@ -66,12 +66,13 @@ void xgpp_conv::amf_event_subscription_from_openapi(
} else { } else {
ev.type = amf_event_type_e::AMF_EVENT_UNKNOWN; ev.type = amf_event_type_e::AMF_EVENT_UNKNOWN;
} }
event_exposure.add_event_sub(ev);
} }
if (event_subscription.getSubscription().supiIsSet()) { if (event_subscription.getSubscription().supiIsSet()) {
supi_t supi = {}; // supi_t supi = {};
std::string supi_str = event_subscription.getSubscription().getSupi(); std::string supi = event_subscription.getSubscription().getSupi();
amf_string_to_supi(&supi, supi_str.c_str()); // amf_string_to_supi(&supi, supi_str.c_str());
event_exposure.set_supi(supi); event_exposure.set_supi(supi);
} }
...@@ -83,3 +84,12 @@ void xgpp_conv::amf_event_subscription_from_openapi( ...@@ -83,3 +84,12 @@ void xgpp_conv::amf_event_subscription_from_openapi(
// TODO: // TODO:
} }
std::string xgpp_conv::amf_event_type_to_string(amf_event_type_t type) {
uint8_t t = (uint8_t) type;
if ((t > 0) and (t <= 12)) {
return amf_event_type_e2str.at(t);
} else {
return amf_event_type_e2str.at(0);
}
}
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "amf_msg.hpp" #include "amf_msg.hpp"
#include "AmfCreateEventSubscription.h" #include "AmfCreateEventSubscription.h"
#include "3gpp_29.518.h"
using namespace amf_application; using namespace amf_application;
using namespace oai::amf::model; using namespace oai::amf::model;
...@@ -48,6 +49,7 @@ void amf_event_subscription_from_openapi( ...@@ -48,6 +49,7 @@ void amf_event_subscription_from_openapi(
const oai::amf::model::AmfCreateEventSubscription& event_subscription, const oai::amf::model::AmfCreateEventSubscription& event_subscription,
amf_application::event_exposure_msg& event_exposure); amf_application::event_exposure_msg& event_exposure);
std::string amf_event_type_to_string(amf_event_type_t type);
} // namespace xgpp_conv } // namespace xgpp_conv
#endif /* FILE_3GPP_CONVERSIONS_HPP_SEEN */ #endif /* FILE_3GPP_CONVERSIONS_HPP_SEEN */
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