Commit 3279fc64 authored by Tien-Thinh Nguyen's avatar Tien-Thinh Nguyen

Fix issue after merging

parents 28af841f 0ace9b7f
......@@ -321,20 +321,20 @@ check_install_amf_deps(){
ret=$?;[[ $ret -ne 0 ]] && return $ret
# Use fmt lib included in spdlog
#install_fmt $1
#ret=$?;[[ $ret -ne 0 ]] && return $ret
install_fmt $1
ret=$?;[[ $ret -ne 0 ]] && return $ret
#install_spdlog_from_git $1 $2
#ret=$?;[[ $ret -ne 0 ]] && return $ret
install_spdlog_from_git $1 $2
ret=$?;[[ $ret -ne 0 ]] && return $ret
#install_fb_folly_from_source $1 $2
#ret=$?;[[ $ret -ne 0 ]] && return $ret
install_fb_folly_from_source $1 $2
ret=$?;[[ $ret -ne 0 ]] && return $ret
install_pistache_from_git $1 $2
ret=$?;[[ $ret -ne 0 ]] && return $ret
#install_nlohmann_from_git $1 $2
#ret=$?;[[ $ret -ne 0 ]] && return $ret
install_nlohmann_from_git $1 $2
ret=$?;[[ $ret -ne 0 ]] && return $ret
$SUDO ldconfig
return 0
......
......@@ -90,60 +90,90 @@ class HtmlReport():
self.file.write(' <br>\n')
# Build Info Summary
self.file.write(' <table class="table-bordered" width = "80%" align = "center" border = "1">\n')
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-time"></span> Build Start Time</td>\n')
buildSummary = ''
buildSummary += ' <table class="table-bordered" width = "80%" align = "center" border = "1">\n'
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-time"></span> Build Start Time</td>\n'
#date_formatted = re.sub('\..*', '', self.created)
self.file.write(' <td>' + self.job_start_time + '</td>\n')
self.file.write(' </tr>\n')
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-wrench"></span> Build Trigger</td>\n')
buildSummary += ' <td>' + self.job_start_time + '</td>\n'
buildSummary += ' </tr>\n'
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-wrench"></span> Build Trigger</td>\n'
if self.git_pull_request:
self.file.write(' <td>Pull Request</td>\n')
buildSummary += ' <td>Pull Request</td>\n'
else:
self.file.write(' <td>Push Event</td>\n')
self.file.write(' </tr>\n')
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-cloud-upload"></span> GIT Repository</td>\n')
self.file.write(' <td><a href="' + self.git_url + '">' + self.git_url + '</a></td>\n')
self.file.write(' </tr>\n')
buildSummary += ' <td>Push Event</td>\n'
buildSummary += ' </tr>\n'
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-cloud-upload"></span> GIT Repository</td>\n'
buildSummary += ' <td><a href="' + self.git_url + '">' + self.git_url + '</a></td>\n'
buildSummary += ' </tr>\n'
if self.git_pull_request:
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-log-out"></span> Source Branch</td>\n')
self.file.write(' <td>' + self.git_src_branch + '</td>\n')
self.file.write(' </tr>\n')
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-tag"></span> Source Commit ID</td>\n')
self.file.write(' <td>' + self.git_src_commit + '</td>\n')
self.file.write(' </tr>\n')
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-log-out"></span> Source Branch</td>\n'
buildSummary += ' <td>' + self.git_src_branch + '</td>\n'
buildSummary += ' </tr>\n'
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-tag"></span> Source Commit ID</td>\n'
buildSummary += ' <td>' + self.git_src_commit + '</td>\n'
buildSummary += ' </tr>\n'
if (self.git_src_commit_msg is not None):
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-comment"></span> Source Commit Message</td>\n')
self.file.write(' <td>' + self.git_src_commit_msg + '</td>\n')
self.file.write(' </tr>\n')
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-log-in"></span> Target Branch</td>\n')
self.file.write(' <td>' + self.git_target_branch + '</td>\n')
self.file.write(' </tr>\n')
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-tag"></span> Target Commit ID</td>\n')
self.file.write(' <td>' + self.git_target_commit + '</td>\n')
self.file.write(' </tr>\n')
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-comment"></span> Source Commit Message</td>\n'
buildSummary += ' <td>' + self.git_src_commit_msg + '</td>\n'
buildSummary += ' </tr>\n'
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-log-in"></span> Target Branch</td>\n'
buildSummary += ' <td>' + self.git_target_branch + '</td>\n'
buildSummary += ' </tr>\n'
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-tag"></span> Target Commit ID</td>\n'
buildSummary += ' <td>' + self.git_target_commit + '</td>\n'
buildSummary += ' </tr>\n'
else:
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-tree-deciduous"></span> Branch</td>\n')
self.file.write(' <td>' + self.git_src_branch + '</td>\n')
self.file.write(' </tr>\n')
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-tag"></span> Commit ID</td>\n')
self.file.write(' <td>' + self.git_src_commit + '</td>\n')
self.file.write(' </tr>\n')
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-tree-deciduous"></span> Branch</td>\n'
buildSummary += ' <td>' + self.git_src_branch + '</td>\n'
buildSummary += ' </tr>\n'
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-tag"></span> Commit ID</td>\n'
buildSummary += ' <td>' + self.git_src_commit + '</td>\n'
buildSummary += ' </tr>\n'
if (self.git_src_commit_msg is not None):
self.file.write(' <tr>\n')
self.file.write(' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-comment"></span> Commit Message</td>\n')
self.file.write(' <td>' + self.git_src_commit_msg + '</td>\n')
self.file.write(' </tr>\n')
self.file.write(' </table>\n')
self.file.write(' <br>\n')
buildSummary += ' <tr>\n'
buildSummary += ' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-comment"></span> Commit Message</td>\n'
buildSummary += ' <td>' + self.git_src_commit_msg + '</td>\n'
buildSummary += ' </tr>\n'
buildSummary += ' </table>\n'
buildSummary += ' <br>\n'
self.file.write(buildSummary)
cwd = os.getcwd()
if os.path.isfile(cwd + '/ds_tester_results_oai_cn5g.html'):
newEpcReport = open(cwd + '/ds_tester_results_oai_cn5g_new.html', 'w')
buildSummaryDone = True
with open(cwd + '/ds_tester_results_oai_cn5g.html', 'r') as originalEpcReport:
for line in originalEpcReport:
result = re.search('DS Tester Summary', line)
if (result is not None) and buildSummaryDone:
newEpcReport.write(buildSummary)
buildSummaryDone = False
newEpcReport.write(line)
originalEpcReport.close()
newEpcReport.close()
os.rename(cwd + '/ds_tester_results_oai_cn5g_new.html', cwd + '/ds_tester_results_oai_cn5g.html')
if os.path.isfile(cwd + '/deploy_results_oai_cn5g.html'):
newEpcReport = open(cwd + '/deploy_results_oai_cn5g_new.html', 'w')
buildSummaryDone = True
with open(cwd + '/deploy_results_oai_cn5g.html', 'r') as originalEpcReport:
for line in originalEpcReport:
result = re.search('Deployment Summary', line)
if (result is not None) and buildSummaryDone:
newEpcReport.write(buildSummary)
buildSummaryDone = False
newEpcReport.write(line)
originalEpcReport.close()
newEpcReport.close()
os.rename(cwd + '/deploy_results_oai_cn5g_new.html', cwd + '/deploy_results_oai_cn5g.html')
def generateFooter(self):
self.file.write(' <div class="well well-lg">End of Build Report -- Copyright <span class="glyphicon glyphicon-copyright-mark"></span> 2020 <a href="http://www.openairinterface.org/">OpenAirInterface</a>. All Rights Reserved.</div>\n')
......
## amf configuration file
################################################################################
# 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
################################################################################
AMF =
{
INSTANCE_ID = 10;
PID_DIRECTORY = "/var/run";
######################################################################## NG SETUP RESPONSE IEs ############################################################
AMF_NAME = "bupt-amf";
GUAMI:{MCC = "110"; MNC = "11"; RegionID = "128"; AMFSetID = "4"; AMFPointer = "1"}
INSTANCE_ID = @INSTANCE@; # 0 is the default
PID_DIRECTORY = "@PID_DIRECTORY@"; # /var/run is the default
AMF_NAME = "OAI-AMF";
RELATIVE_CAPACITY = 30;
# Display statistics about whole system (in seconds)
STATISTICS_TIMER_INTERVAL = 20; # YOUR CONFIG HERE
CORE_CONFIGURATION:
{
EMERGENCY_SUPPORT = "false";
};
GUAMI:
{
MCC = "@MCC@"; MNC = "@MNC@"; RegionID = "@REGION_ID@"; AMFSetID = "@AMF_SET_ID@"; AMFPointer = "1" # YOUR GUAMI CONFIG HERE
}
SERVED_GUAMI_LIST = (
{MCC = "110"; MNC = "11"; RegionID = "10"; AMFSetID = "1"; AMFPointer = "0"}, #48bits <MCC><MNC><RegionID><AMFSetID><AMFPointer>
{MCC = "110"; MNC = "11"; RegionID = "10"; AMFSetID = "1"; AMFPointer = "1"} #48bits <MCC><MNC><RegionID><AMFSetID><AMFPointer>
{MCC = "@SERVED_GUAMI_MCC_0@"; MNC = "@SERVED_GUAMI_MNC_0@"; RegionID = "@SERVED_GUAMI_REGION_ID_0@"; AMFSetID = "@SERVED_GUAMI_AMF_SET_ID_0@"; AMFPointer = "0"}, #48bits <MCC><MNC><RegionID><AMFSetID><AMFPointer>
{MCC = "@SERVED_GUAMI_MCC_1@"; MNC = "@SERVED_GUAMI_MNC_1@"; RegionID = "@SERVED_GUAMI_REGION_ID_1@"; AMFSetID = "@SERVED_GUAMI_AMF_SET_ID_1@"; AMFPointer = "1"} #48bits <MCC><MNC><RegionID><AMFSetID><AMFPointer>
);
RELATIVE_CAPACITY = 30;
PLMN_SUPPORT_LIST = (
{MCC = "110"; MNC = "11"; TAC = 100;
SLICE_SUPPORT_LIST = (
{SST = "1"; SD = "none"},
{SST = "1"; SD = "12"}
{
MCC = "@PLMN_SUPPORT_MCC@"; MNC = "@PLMN_SUPPORT_MNC@"; TAC = @PLMN_SUPPORT_TAC@; # YOUR PLMN CONFIG HERE
SLICE_SUPPORT_LIST = (
{SST = "@SST_0@"; SD = "@SD_0@"}, # YOUR NSSAI CONFIG HERE
{SST = "@SST_1@"; SD = "@SD_1@"} # YOUR NSSAI CONFIG HERE
)
}
}
);
##################################################################### clause 9.2.6.2, 3gpp ts38.413 ####################################################
STATISTICS_TIMER_INTERVAL = 20; #second
INTERFACES:{
NGAP_AMF:{
INTERFACE_NAME = "ens32";
INTERFACES:
{
# AMF binded interface for N1/N2 interface (NGAP)
NGAP_AMF:
{
INTERFACE_NAME = "@AMF_INTERFACE_NAME_FOR_NGAP@"; # YOUR NETWORK CONFIG HERE
IPV4_ADDRESS = "read";
PORT = 38412;
PPID = 60;
PORT = 38412; # YOUR NETWORK CONFIG HERE
PPID = 60; # YOUR NETWORK CONFIG HERE
};
N11:{
# AMF binded interface for N11
N11:
{
INTERFACE_NAME = "@AMF_INTERFACE_NAME_FOR_N11@"; # YOUR NETWORK CONFIG HERE
IPV4_ADDRESS = "read";
PORT = 80; # YOUR NETWORK CONFIG HERE
SMF_INSTANCES_POOL = (
{SMF_INSTANCE_ID = 1; IPV4_ADDRESS = "192.168.199.203"; PORT = "8889"; VERSION = "v2"; SELECTED = "true"},
{SMF_INSTANCE_ID = 2; IPV4_ADDRESS = "10.103.238.21"; PORT = "8181"; VERSION = "v1"; SELECTED = "false"}
{SMF_INSTANCE_ID = @SMF_INSTANCE_ID_0@; IPV4_ADDRESS = "@SMF_IPV4_ADDR_0@"; PORT = "80"; VERSION = "@SMF_HTTP_VERSION_0@"; SELECTED = "true"}, # YOUR SMF CONFIG HERE
{SMF_INSTANCE_ID = @SMF_INSTANCE_ID_1@; IPV4_ADDRESS = "@SMF_IPV4_ADDR_1@"; PORT = "80"; VERSION = "@SMF_HTTP_VERSION_1@"; SELECTED = "false"} # YOUR SMF CONFIG HERE
);
};
};
CORE_CONFIGURATION:{
EMERGENCY_SUPPORT = "false";
};
AUTHENTICATION:{
MYSQL_server = "127.0.0.1";
MYSQL_user = "bupt"; # Database server login
MYSQL_pass = "linux"; # Database server password
MYSQL_db = "OAI_DB";
OPERATOR_key = "1006020f0a478bf6b699f15c062e42b3"; # op
AUTHENTICATION:
{
## MySQL mandatory options
MYSQL_server = "@MYSQL_SERVER@"; # MySQL Server address
MYSQL_user = "@MYSQL_USER@"; # Database server login
MYSQL_pass = "@MYSQL_PASS@"; # Database server password
MYSQL_db = "@MYSQL_DB@"; # Your database name
## OP
OPERATOR_key = "@OPERATOR_KEY@"; # OP key matching your database
RANDOM = "true";
};
NAS:{
#ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "NIA2" , "NIA1" , "NIA0" ];
ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "NIA1" , "NIA1" , "NIA1" ];
NAS:
{
ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "NIA0" , "NIA1" , "NIA2" ];
ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST = [ "NEA0" , "NEA1" , "NEA2" ];
#ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST = [ "NEA1" , "NEA1" , "NEA1" ];
};
};
......
This diff is collapsed.
......@@ -30,18 +30,14 @@
#define _AMF_APP_H_
#include <map>
#include <set>
#include <shared_mutex>
#include <string>
#include <thread>
#include <sstream>
#include "amf_config.hpp"
#include "amf_module_from_config.hpp"
#include "itti_msg_amf_app.hpp"
#include "ue_context.hpp"
using namespace config;
using namespace std;
static uint32_t amf_app_ue_ngap_id_generator = 1;
......@@ -66,16 +62,21 @@ class amf_app {
mutable std::shared_mutex m_ue_ctx_key;
bool is_amf_ue_id_2_ue_context(const long &amf_ue_ngap_id) const;
std::shared_ptr<ue_context> amf_ue_id_2_ue_context(const long &amf_ue_ngap_id) const;
void set_amf_ue_ngap_id_2_ue_context(const long &amf_ue_ngap_id, std::shared_ptr<ue_context> uc);
std::shared_ptr<ue_context> amf_ue_id_2_ue_context(
const long &amf_ue_ngap_id) const;
void set_amf_ue_ngap_id_2_ue_context(const long &amf_ue_ngap_id,
std::shared_ptr<ue_context> uc);
bool is_ran_amf_id_2_ue_context(const std::string &ue_context_key) const;
std::shared_ptr<ue_context> ran_amf_id_2_ue_context(const std::string &ue_context_key) const;
void set_ran_amf_id_2_ue_context(const std::string &ue_context_key, std::shared_ptr<ue_context> uc);
std::shared_ptr<ue_context> ran_amf_id_2_ue_context(
const std::string &ue_context_key) const;
void set_ran_amf_id_2_ue_context(const std::string &ue_context_key,
std::shared_ptr<ue_context> uc);
// SMF Client response handlers
void handle_post_sm_context_response_error_400();
//others
bool generate_5g_guti(uint32_t ranid, long amfid, std::string &mcc, std::string &mnc, uint32_t &tmsi);
bool generate_5g_guti(uint32_t ranid, long amfid, std::string &mcc,
std::string &mnc, uint32_t &tmsi);
};
}
......
This diff is collapsed.
......@@ -35,15 +35,10 @@
#include <libconfig.h++>
#include <netinet/in.h>
#include <sys/socket.h>
#include <mutex>
#include <vector>
#include <string>
#include "thread_sched.hpp"
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
#define AMF_CONFIG_STRING_AMF_CONFIG "AMF"
#define AMF_CONFIG_STRING_PID_DIRECTORY "PID_DIRECTORY"
#define AMF_CONFIG_STRING_INSTANCE_ID "INSTANCE_ID"
......@@ -164,7 +159,9 @@ class amf_config {
~amf_config();
int load(const std::string &config_file);
int load_interface(const Setting &if_cfg, interface_cfg_t &cfg);
int load_thread_sched_params(const libconfig::Setting &thread_sched_params_cfg, util::thread_sched_params &cfg);
int load_thread_sched_params(
const libconfig::Setting &thread_sched_params_cfg,
util::thread_sched_params &cfg);
void display();
unsigned int instance;
std::string pid_dir;
......
......@@ -37,15 +37,18 @@ namespace config {
//------------------------------------------------------------------------------
int amf_modules::load(const std::string &config_file) {
Logger::amf_app().debug("\nLoad AMF module configuration file (%s)", config_file.c_str());
Logger::amf_app().debug("\nLoad AMF module configuration file (%s)",
config_file.c_str());
Config cfg;
try {
cfg.readFile(config_file.c_str());
} catch (const FileIOException &fioex) {
Logger::amf_app().error("I/O error while reading file %s - %s", config_file.c_str(), fioex.what());
Logger::amf_app().error("I/O error while reading file %s - %s",
config_file.c_str(), fioex.what());
throw;
} catch (const ParseException &pex) {
Logger::amf_app().error("Parse error at %s:%d - %s", pex.getFile(), pex.getLine(), pex.getError());
Logger::amf_app().error("Parse error at %s:%d - %s", pex.getFile(),
pex.getLine(), pex.getError());
throw;
}
const Setting &root = cfg.getRoot();
......@@ -62,9 +65,13 @@ int amf_modules::load(const std::string &config_file) {
const Setting &item = msg[i];
std::string typeOfMessage;
int procedure_code;
item.lookupValue(MODULES_CONFIG_STRING_AMF_MODULES_NGAP_MESSAGE_NAME, msgName);
item.lookupValue(MODULES_CONFIG_STRING_AMF_MODULES_NGAP_MESSAGE_PROCEDURECODE, procedure_code);
item.lookupValue(MODULES_CONFIG_STRING_AMF_MODULES_NGAP_MESSAGE_TYPEOFMSG, typeOfMessage);
item.lookupValue(MODULES_CONFIG_STRING_AMF_MODULES_NGAP_MESSAGE_NAME,
msgName);
item.lookupValue(
MODULES_CONFIG_STRING_AMF_MODULES_NGAP_MESSAGE_PROCEDURECODE,
procedure_code);
item.lookupValue(MODULES_CONFIG_STRING_AMF_MODULES_NGAP_MESSAGE_TYPEOFMSG,
typeOfMessage);
procedureCode = (Ngap_ProcedureCode_t) procedure_code;
if (!(typeOfMessage.compare("initialMessage"))) {
typeOfMsg = Ngap_NGAP_PDU_PR_initiatingMessage;
......@@ -82,7 +89,8 @@ int amf_modules::load(const std::string &config_file) {
void amf_modules::display() {
Logger::config().info("======= AMF Registered Modules =======");
Logger::config().info("NGAP Message Modules:");
Logger::config().info("- %s(Procedure code %d, Type of Msg %d)\n", msgName.c_str(), procedureCode, typeOfMsg);
Logger::config().info("- %s(Procedure code %d, Type of Msg %d)\n",
msgName.c_str(), procedureCode, typeOfMsg);
}
}
......@@ -29,14 +29,7 @@
#ifndef _AMF_MODULE_FROM_CONFIG_H_
#define _AMF_MODULE_FROM_CONFIG_H_
#include <arpa/inet.h>
#include <libconfig.h++>
#include <netinet/in.h>
#include <sys/socket.h>
#include <mutex>
#include <vector>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
......@@ -21,7 +21,7 @@
/*! \file amf_n11.hpp
\brief
\author Keliang DU, BUPT
\author Keliang DU (BUPT), Tien-Thinh NGUYEN (EURECOM)
\date 2020
\email: contact@openairinterface.org
*/
......@@ -44,23 +44,35 @@ class amf_n11 {
~amf_n11();
void handle_itti_message(itti_smf_services_consumer&);
void handle_pdu_session_initial_request(std::string supi, std::shared_ptr<pdu_session_context> psc, std::string smf_addr, bstring sm_msg, std::string dnn);
void handle_itti_message(itti_pdu_session_resource_setup_response &itti_msg);
void handle_pdu_session_initial_request(
std::string supi, std::shared_ptr<pdu_session_context> psc,
std::string smf_addr, bstring sm_msg, std::string dnn);
void handle_itti_message(itti_nsmf_pdusession_update_sm_context &itti_msg);
void handle_itti_message(itti_nsmf_pdusession_release_sm_context &itti_msg);
void handle_itti_message(itti_pdu_session_resource_setup_response &itti_msg);
void send_pdu_session_update_sm_context_request(
std::string supi, std::shared_ptr<pdu_session_context> psc,
std::string smf_addr, bstring sm_msg, std::string dnn);
std::map<std::string, std::shared_ptr<pdu_session_context>> supi2pdu; // amf ue ngap id
mutable std::shared_mutex m_supi2pdu;
bool is_supi_to_pdu_ctx(const std::string &supi) const;
std::shared_ptr<pdu_session_context> supi_to_pdu_ctx(const std::string &supi) const;
void set_supi_to_pdu_ctx(const std::string &supi, std::shared_ptr<pdu_session_context> psc);
std::shared_ptr<pdu_session_context> supi_to_pdu_ctx(
const std::string &supi) const;
void set_supi_to_pdu_ctx(const std::string &supi,
std::shared_ptr<pdu_session_context> psc);
std::map<uint8_t, std::string> pduid2supi;
bool smf_selection_from_configuration(std::string &smf_addr);
bool smf_selection_from_context(std::string &smf_addr);
void handle_post_sm_context_response_error_400();
void handle_post_sm_context_response_error(long code, std::string cause, bstring n1sm, std::string supi, uint8_t pdu_session_id);
void handle_post_sm_context_response_error(long code, std::string cause,
bstring n1sm, std::string supi,
uint8_t pdu_session_id);
void curl_http_client(std::string remoteUri, std::string jsonData, std::string n1SmMsg, std::string n2SmMsg, std::string supi, uint8_t pdu_session_id);
void curl_http_client(std::string remoteUri, std::string jsonData,
std::string n1SmMsg, std::string n2SmMsg,
std::string supi, uint8_t pdu_session_id);
};
}
......
This diff is collapsed.
......@@ -21,7 +21,7 @@
/*! \file amf_n2.hpp
\brief
\author Keliang DU, BUPT
\author Keliang DU (BUPT), Tien-Thinh NGUYEN (EURECOM)
\date 2020
\email: contact@openairinterface.org
*/
......@@ -39,9 +39,9 @@
#include "amf.hpp"
namespace amf_application{
namespace amf_application {
class amf_n2 : public ngap::ngap_app{
class amf_n2 : public ngap::ngap_app {
public:
amf_n2(const std::string &address, const uint16_t port_num);
~amf_n2();
......@@ -62,15 +62,22 @@ class amf_n2 : public ngap::ngap_app{
void handle_itti_message(itti_uplinkranstatsutransfer &itti_msg);
bool verifyPlmn(std::vector<SupportedItem_t> list);
std::vector<SupportedItem_t> get_common_plmn(std::vector<SupportedItem_t> list);
public:
std::map<uint32_t, std::shared_ptr<ue_ngap_context>> ranid2uecontext;// ran ue ngap id
std::vector<SupportedItem_t> get_common_plmn(
std::vector<SupportedItem_t> list);
std::shared_ptr<ue_ngap_context> ran_ue_id_2_ue_ngap_context(
const uint32_t &ran_ue_ngap_id) const;
bool is_ran_ue_id_2_ue_ngap_context(const uint32_t &ran_ue_ngap_id) const;
void set_ran_ue_ngap_id_2_ue_ngap_context(
const uint32_t &ran_ue_ngap_id, std::shared_ptr<ue_ngap_context> unc);
private:
std::map<uint32_t, std::shared_ptr<ue_ngap_context>> ranid2uecontext; // ran ue ngap id
mutable std::shared_mutex m_ranid2uecontext;
bool is_ran_ue_id_2_ue_ngap_context(const uint32_t & ran_ue_ngap_id) const;
std::shared_ptr<ue_ngap_context> ran_ue_id_2_ue_ngap_context(const uint32_t & ran_ue_ngap_id) const;
void set_ran_ue_ngap_id_2_ue_ngap_context(const uint32_t & ran_ue_ngap_id, std::shared_ptr<ue_ngap_context> unc);
};
};
}
......
......@@ -21,15 +21,13 @@
/*! \file amf_statistics.cpp
\brief
\author Keliang DU, BUPT
\author Keliang DU (BUPT), Tien-Thinh NGUYEN (EURECOM)
\date 2020
\email: contact@openairinterface.org
*/
#include "amf_statistics.hpp"
#include <iostream>
#include "logger.hpp"
//------------------------------------------------------------------------------
......@@ -40,31 +38,47 @@ void statistics::display() {
//Logger::amf_app().info("--------------------------------------------------");
//Logger::amf_app().info("| %d | %d | %d |",gNB_connected,UE_connected,UE_registred);
//Logger::amf_app().info("--------------------------------------------------");
Logger::amf_app().info("|----------------------------------------------------------------------------------------------------------------|");
Logger::amf_app().info("|----------------------------------------------------gNBs' information-------------------------------------------|");
Logger::amf_app().info("| Index | Status | Global ID | gNB Name | Tracking Area (PLMN, TAC) |");
Logger::amf_app().info("| - | - | - | - | - |");
//if (gnbs.size() ==0 ) {
// Logger::amf_app().info("| - | - | - | - | - |");
//}
Logger::amf_app().info(
"|----------------------------------------------------------------------------------------------------------------|");
Logger::amf_app().info(
"|----------------------------------------------------gNBs' information-------------------------------------------|");
Logger::amf_app().info(
"| Index | Status | Global ID | gNB Name | Tracking Area (PLMN, TAC) |");
if (gnbs.size() == 0) {
Logger::amf_app().info(
"| - | - | - | - | - |");
}
//TODO: Show the list of common PLMNs
for (int i = 0; i < gnbs.size(); i++) {
Logger::amf_app().info("| %d | Connected | 0x%x | %s | %s, %d | ", i + 1, gnbs[i].gnb_id, gnbs[i].gnb_name.c_str(), (gnbs[i].mcc + gnbs[i].mnc).c_str(), gnbs[i].tac);
}
Logger::amf_app().info("|----------------------------------------------------------------------------------------------------------------|");
Logger::amf_app().info(
"| %d | Connected | 0x%x | %s | %s, %d | ",
i + 1, gnbs[i].gnb_id, gnbs[i].gnb_name.c_str(),
(gnbs[i].mcc + gnbs[i].mnc).c_str(), gnbs[i].tac);
}
Logger::amf_app().info(
"|----------------------------------------------------------------------------------------------------------------|");
Logger::amf_app().info("");
Logger::amf_app().info("|----------------------------------------------------------------------------------------------------------------|");
Logger::amf_app().info("|----------------------------------------------------UEs' information--------------------------------------------|");
Logger::amf_app().info("| Index | Connection state | Registration state | IMSI | GUTI | RAN UE NGAP ID | AMF UE ID |");
for (int i = 0; i < ues.size(); i++) {
Logger::amf_app().info("| %d | %s | %s | %s | %s | %d | %d | ", i + 1, ues[i].connStatus.c_str(), ues[i].registerStatus.c_str(), ues[i].imsi.c_str(), ues[i].guti.c_str(), ues[i].ranid, ues[i].amfid);
//Logger::amf_app().info("Current ran_ue_ngap_id[%d]; Current amf_ue_ngap_id[%d]", ues[i].ranid, ues[i].amfid);
Logger::amf_app().info("Location [NrCgi][PLMN(%s), cellID(%d)]", (ues[i].mcc + ues[i].mnc).c_str(), ues[i].cellId);
Logger::amf_app().info("");
Logger::amf_app().info(
"|----------------------------------------------------------------------------------------------------------------|");
Logger::amf_app().info(
"|----------------------------------------------------UEs' information--------------------------------------------|");
Logger::amf_app().info(
"| Index | 5GMM state | IMSI | GUTI | RAN UE NGAP ID | AMF UE ID | PLMN |Cell ID|");
int i = 0;
for (auto const &ue : ue_infos) {
Logger::amf_app().info("|%7d|%22s|%18s|%15s|%16d|%11d|%9s|%7d|", i + 1,
ue.second.registerStatus.c_str(),
ue.second.imsi.c_str(), ue.second.guti.c_str(),
ue.second.ranid, ue.second.amfid,
(ue.second.mcc + ue.second.mnc).c_str(),
ue.second.cellId);
i++;
}
Logger::amf_app().info("|----------------------------------------------------------------------------------------------------------------|");
Logger::amf_app().info(
"|----------------------------------------------------------------------------------------------------------------|");
Logger::amf_app().info("");
}
......@@ -75,6 +89,40 @@ statistics::statistics() {
UE_registred = 0;
}
//------------------------------------------------------------------------------
void statistics::update_ue_info(const ue_info_t &ue_info) {
if (!(ue_info.imsi.size() > 0)) {
Logger::amf_app().warn("Update UE Info with invalid IMSI");
}
if (ue_infos.count(ue_info.imsi) > 0) {
ue_infos.erase(ue_info.imsi);
ue_infos.insert(std::pair<std::string, ue_info_t>(ue_info.imsi, ue_info));
Logger::amf_app().debug("Update UE Info (IMSI %s) success",
ue_info.imsi.c_str());
} else {
ue_infos.insert(std::pair<std::string, ue_info_t>(ue_info.imsi, ue_info));
Logger::amf_app().debug("Add UE Info (IMSI %s) success",
ue_info.imsi.c_str());
}
}
//------------------------------------------------------------------------------
void statistics::update_5gmm_state(const std::string &imsi,
const std::string &state) {
if (ue_infos.count(imsi) > 0) {
ue_info_t ue_info = ue_infos.at(imsi);
ue_info.registerStatus = state;
ue_infos.erase(ue_info.imsi);
ue_infos.insert(std::pair<std::string, ue_info_t>(imsi, ue_info));
Logger::amf_app().debug("Update UE State (IMSI %s, State %s) success",
imsi.c_str(), state.c_str());
} else {
Logger::amf_app().warn("Update UE State (IMSI %s), UE does not exist!",
imsi.c_str());
}
}
//------------------------------------------------------------------------------
statistics::~statistics() {
}
......@@ -29,9 +29,6 @@
#ifndef _STATISTICS_H_
#define _STATISTICS_H_
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <vector>
#include <string>
......@@ -49,7 +46,7 @@ typedef struct {
//long nrCellId;
} gnb_infos;
typedef struct {
typedef struct ue_info_s {
std::string connStatus;
std::string registerStatus;
uint32_t ranid;
......@@ -59,20 +56,22 @@ typedef struct {
std::string mcc;
std::string mnc;
uint32_t cellId;
} ue_infos;
} ue_info_t;
class statistics {
public:
void display();
statistics();
~statistics();
void update_ue_info(const ue_info_t &ue_info);
void update_5gmm_state(const std::string &imsi, const std::string &state);
public:
uint32_t gNB_connected;
uint32_t UE_connected;
uint32_t UE_registred;
//uint32_t system_pdu_sessions;
std::vector<gnb_infos> gnbs;
std::vector<ue_infos> ues;
std::map<std::string, ue_info_t> ue_infos;
};
......
......@@ -45,11 +45,13 @@ bool amf_n1::get_mysql_auth_info(std::string imsi, mysql_auth_info_t &resp) { /
Logger::amf_n1().error("Cannot connect to MySQL DB");
return false;
}
query = "SELECT `key`,`sqn`,`rand`,`OPc` FROM `users` WHERE `users`.`imsi`='" + imsi + "' ";
query = "SELECT `key`,`sqn`,`rand`,`OPc` FROM `users` WHERE `users`.`imsi`='"
+ imsi + "' ";
pthread_mutex_lock(&db_desc->db_cs_mutex);
if (mysql_query(db_desc->db_conn, query.c_str())) {
pthread_mutex_unlock(&db_desc->db_cs_mutex);
Logger::amf_n1().error("Query execution failed: %s\n", mysql_error(db_desc->db_conn));
Logger::amf_n1().error("Query execution failed: %s\n",
mysql_error(db_desc->db_conn));
return false;
}
res = mysql_store_result(db_desc->db_conn);
......@@ -84,7 +86,8 @@ bool amf_n1::connect_to_mysql() {
const int mysql_reconnect_val = 1;
db_desc = (database_t*) calloc(1, sizeof(database_t));
if (!db_desc) {
Logger::amf_n1().error("An error occurs when allocating memory for DB_DESC");
Logger::amf_n1().error(
"An error occurs when allocating memory for DB_DESC");
return false;
}
pthread_mutex_init(&db_desc->db_cs_mutex, NULL);
......@@ -94,8 +97,11 @@ bool amf_n1::connect_to_mysql() {
db_desc->database = amf_cfg.auth_para.mysql_db;
db_desc->db_conn = mysql_init(NULL);
mysql_options(db_desc->db_conn, MYSQL_OPT_RECONNECT, &mysql_reconnect_val);
if (!mysql_real_connect(db_desc->db_conn, db_desc->server.c_str(), db_desc->user.c_str(), db_desc->password.c_str(), db_desc->database.c_str(), 0, NULL, 0)) {
Logger::amf_n1().error("An error occurred while connecting to db: %s", mysql_error(db_desc->db_conn));
if (!mysql_real_connect(db_desc->db_conn, db_desc->server.c_str(),
db_desc->user.c_str(), db_desc->password.c_str(),
db_desc->database.c_str(), 0, NULL, 0)) {
Logger::amf_n1().error("An error occurred while connecting to db: %s",
mysql_error(db_desc->db_conn));
mysql_thread_end();
return false;
}
......@@ -104,7 +110,8 @@ bool amf_n1::connect_to_mysql() {
}
//------------------------------------------------------------------------------
void amf_n1::mysql_push_rand_sqn(std::string imsi, uint8_t *rand_p, uint8_t *sqn) {
void amf_n1::mysql_push_rand_sqn(std::string imsi, uint8_t *rand_p,
uint8_t *sqn) {
int status = 0;
MYSQL_RES *res;
char query[1000];
......@@ -118,18 +125,21 @@ void amf_n1::mysql_push_rand_sqn(std::string imsi, uint8_t *rand_p, uint8_t *sqn
Logger::amf_n1().error("Need sqn and rand");
return;
}
sqn_decimal = ((uint64_t) sqn[0] << 40) | ((uint64_t) sqn[1] << 32) | ((uint64_t) sqn[2] << 24) | (sqn[3] << 16) | (sqn[4] << 8) | sqn[5];
sqn_decimal = ((uint64_t) sqn[0] << 40) | ((uint64_t) sqn[1] << 32)
| ((uint64_t) sqn[2] << 24) | (sqn[3] << 16) | (sqn[4] << 8) | sqn[5];
query_length = sprintf(query, "UPDATE `users` SET `rand`=UNHEX('");
for (int i = 0; i < RAND_LENGTH; i++) {
query_length += sprintf(&query[query_length], "%02x", rand_p[i]);
}
query_length += sprintf (&query[query_length], "'),`sqn`=%" PRIu64, sqn_decimal);
query_length += sprintf(&query[query_length], " WHERE `users`.`imsi`='%s'", imsi.c_str());
query_length += sprintf(&query[query_length], " WHERE `users`.`imsi`='%s'",
imsi.c_str());
pthread_mutex_lock(&db_desc->db_cs_mutex);
if (mysql_query(db_desc->db_conn, query)) {
pthread_mutex_unlock(&db_desc->db_cs_mutex);
Logger::amf_n1().error("Query execution failed: %s", mysql_error(db_desc->db_conn));
Logger::amf_n1().error("Query execution failed: %s",
mysql_error(db_desc->db_conn));
return;
}
do {
......@@ -138,7 +148,8 @@ void amf_n1::mysql_push_rand_sqn(std::string imsi, uint8_t *rand_p, uint8_t *sqn
mysql_free_result(res);
} else {
if (mysql_field_count(db_desc->db_conn) == 0) {
Logger::amf_n1().error("[MySQL] %lld rows affected", mysql_affected_rows(db_desc->db_conn));
Logger::amf_n1().error("[MySQL] %lld rows affected",
mysql_affected_rows(db_desc->db_conn));
} else { /* some error occurred */
Logger::amf_n1().error("Could not retrieve result set");
break;
......@@ -160,13 +171,16 @@ void amf_n1::mysql_increment_sqn(std::string imsi) {
Logger::amf_n1().error("Cannot connect to MySQL DB");
return;
}
sprintf(query, "UPDATE `users` SET `sqn` = `sqn` + 32 WHERE `users`.`imsi`='%s'", imsi.c_str());
sprintf(query,
"UPDATE `users` SET `sqn` = `sqn` + 32 WHERE `users`.`imsi`='%s'",
imsi.c_str());
pthread_mutex_lock(&db_desc->db_cs_mutex);
if (mysql_query(db_desc->db_conn, query)) {
pthread_mutex_unlock(&db_desc->db_cs_mutex);
Logger::amf_n1().error("Query execution failed: %s", mysql_error(db_desc->db_conn));
Logger::amf_n1().error("Query execution failed: %s",
mysql_error(db_desc->db_conn));
return;
}
do {
......@@ -175,7 +189,8 @@ void amf_n1::mysql_increment_sqn(std::string imsi) {
mysql_free_result(res);
} else {
if (mysql_field_count(db_desc->db_conn) == 0) {
Logger::amf_n1().error("[MySQL] %lld rows affected", mysql_affected_rows(db_desc->db_conn));
Logger::amf_n1().error("[MySQL] %lld rows affected",
mysql_affected_rows(db_desc->db_conn));
} else {
Logger::amf_n1().error("Could not retrieve result set");
break;
......
......@@ -29,10 +29,8 @@
#ifndef _MYSQL_DB_HANDLERS_H_
#define _MYSQL_DB_HANDLERS_H_
#include <stdint.h>
#include <pthread.h>
#include <mysql/mysql.h>
#include <netinet/in.h>
#include <string>
#define KEY_LENGTH (16)
......
/*
* 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
*/
#ifndef FILE_3GPP_29_502_SMF_SEEN
#define FILE_3GPP_29_502_SMF_SEEN
enum pdu_session_application_error_e {
PDU_SESSION_APPLICATION_ERROR_N1_SM_ERROR = 1,
PDU_SESSION_APPLICATION_ERROR_SNSSAI_DENIED = 2,
PDU_SESSION_APPLICATION_ERROR_DNN_DENIED = 3,
PDU_SESSION_APPLICATION_ERROR_PDUTYPE_DENIED = 4,
PDU_SESSION_APPLICATION_ERROR_SSC_DENIED = 5,
PDU_SESSION_APPLICATION_ERROR_SUBSCRIPTION_DENIED = 6,
PDU_SESSION_APPLICATION_ERROR_DNN_NOT_SUPPORTED = 7,
PDU_SESSION_APPLICATION_ERROR_PDUTYPE_NOT_SUPPORTED = 8,
PDU_SESSION_APPLICATION_ERROR_SSC_NOT_SUPPORTED = 9,
PDU_SESSION_APPLICATION_ERROR_HOME_ROUTED_ROAMING_REQUIRED = 10,
PDU_SESSION_APPLICATION_ERROR_OUT_OF_LADN_SERVICE_AREA = 11,
PDU_SESSION_APPLICATION_ERROR_N2_SM_ERROR = 12,
PDU_SESSION_APPLICATION_ERROR_PRIORITIZED_SERVICES_ONLY = 13,
PDU_SESSION_APPLICATION_ERROR_PDU_SESSION_ANCHOR_CHANGE = 14,
PDU_SESSION_APPLICATION_ERROR_TARGET_MME_CAPABILITY = 15,
PDU_SESSION_APPLICATION_ERROR_NO_EPS_5GS_CONTINUITY = 16,
PDU_SESSION_APPLICATION_ERROR_UNABLE_TO_PAGE_UE = 17,
PDU_SESSION_APPLICATION_ERROR_UE_NOT_RESPONDING = 18,
PDU_SESSION_APPLICATION_ERROR_REJECTED_BY_UE = 19,
PDU_SESSION_APPLICATION_ERROR_REJECTED_DUE_VPLMN_POLICY = 20,
PDU_SESSION_APPLICATION_ERROR_HO_TAU_IN_PROGRESS = 21,
PDU_SESSION_APPLICATION_ERROR_INTEGRITY_PROTECTED_MDR_NOT_ACCEPTABLE = 22,
PDU_SESSION_APPLICATION_ERROR_EBI_EXHAUSTED = 23,
PDU_SESSION_APPLICATION_ERROR_EBI_REJECTED_LOCAL_POLICY = 24,
PDU_SESSION_APPLICATION_ERROR_EBI_REJECTED_NO_N26 = 25,
PDU_SESSION_APPLICATION_ERROR_DEFAULT_EPS_BEARER_INACTIVE = 26,
PDU_SESSION_APPLICATION_ERROR_HANDOVER_RESOURCE_ALLOCATION_FAILURE = 27,
PDU_SESSION_APPLICATION_ERROR_CONTEXT_NOT_FOUND = 28,
PDU_SESSION_APPLICATION_ERROR_INSUFFICIENT_RESOURCES_SLICE = 29,
PDU_SESSION_APPLICATION_ERROR_INSUFFICIENT_RESOURCES_SLICE_DNN = 30,
PDU_SESSION_APPLICATION_ERROR_DNN_CONGESTION = 31,
PDU_SESSION_APPLICATION_ERROR_S_NSSAI_CONGESTION = 32,
PDU_SESSION_APPLICATION_ERROR_PEER_NOT_RESPONDING = 33,
PDU_SESSION_APPLICATION_ERROR_NETWORK_FAILURE = 34
};
static const std::vector<std::string> pdu_session_application_error_e2str = {
"UNKNOWN ERROR", "N1_SM_ERROR", "SNSSAI_DENIED", "DNN_DENIED",
"PDUTYPE_DENIED", "SSC_DENIED", "SUBSCRIPTION_DENIED", "DNN_NOT_SUPPORTED",
"PDUTYPE_NOT_SUPPORTED", "SSC_NOT_SUPPORTED",
"HOME_ROUTED_ROAMING_REQUIRED", "OUT_OF_LADN_SERVICE_AREA", "N2_SM_ERROR",
"PRIORITIZED_SERVICES_ONLY", "PDU_SESSION_ANCHOR_CHANGE",
"TARGET_MME_CAPABILITY", "NO_EPS_5GS_CONTINUITY", "UNABLE_TO_PAGE_UE",
"UE_NOT_RESPONDING", "REJECTED_BY_UE", "REJECTED_DUE_VPLMN_POLICY",
"HO_TAU_IN_PROGRESS", "INTEGRITY_PROTECTED_MDR_NOT_ACCEPTABLE",
"EBI_EXHAUSTED", "EBI_REJECTED_LOCAL_POLICY", "EBI_REJECTED_NO_N26",
"DEFAULT_EPS_BEARER_INACTIVE", "HANDOVER_RESOURCE_ALLOCATION_FAILURE",
"CONTEXT_NOT_FOUND", "INSUFFICIENT_RESOURCES_SLICE",
"INSUFFICIENT_RESOURCES_SLICE_DNN", "DNN_CONGESTION", "S_NSSAI_CONGESTION",
"PEER_NOT_RESPONDING", "NETWORK_FAILURE" };
//6.1.6.3.12 Enumeration: N2SmInfoType @3GPP TS 29.502 V16.0.0
enum n2_sm_info_type_e {
PDU_RES_SETUP_REQ = 1, //PDU Session Resource Setup Request Transfer
PDU_RES_SETUP_RSP = 2, //PDU Session Resource Setup Response Transfer
PDU_RES_SETUP_FAIL = 3, //PDU Session Resource Setup Unsuccessful Transfer
PDU_RES_REL_CMD = 4, //PDU Session Resource Release Command Transfer
PDU_RES_REL_RSP = 5, //PDU Session Resource Release Response Transfer
PDU_RES_MOD_REQ = 6, //PDU Session Resource Modify Request Transfer
PDU_RES_MOD_RSP = 7, //PDU Session Resource Modify Response Transfer
PDU_RES_MOD_FAIL = 8, //PDU Session Resource Modify Unsuccessful Transfer
PDU_RES_NTY = 9, //PDU Session Resource Notify Transfer
PDU_RES_NTY_REL = 10, //PDU Session Resource Notify Released Transfer
PDU_RES_MOD_IND = 11, //PDU Session Resource Modify Indication Transfer
PDU_RES_MOD_CFM = 12, //PDU Session Resource Modify Confirm Transfer
PATH_SWITCH_REQ = 13, //Path Switch Request Transfer
PATH_SWITCH_SETUP_FAIL = 14, //Path Switch Request Setup Failed Transfer
PATH_SWITCH_REQ_ACK = 15, //Path Switch Request Acknowledge Transfer
PATH_SWITCH_REQ_FAIL = 16, //Path Switch Request Unsuccessful Transfer
HANDOVER_REQUIRED = 17, //Handover Required Transfer
HANDOVER_CMD = 18, //Handover Command Transfer
HANDOVER_PREP_FAIL = 19, //Handover Preparation Unsuccessful Transfer
HANDOVER_REQ_ACK = 20, //Handover Request Acknowledge Transfer
HANDOVER_RES_ALLOC_FAIL = 21, //Handover Resource Allocation Unsuccessful Transfer
SECONDARY_RAT_USAGE = 22 //Secondary RAT Data Usage Report Transfer
};
static const std::vector<std::string> n2_sm_info_type_e2str = { "UNKNOWN_TYPE",
"PDU_RES_SETUP_REQ", "PDU_RES_SETUP_RSP", "PDU_RES_SETUP_FAIL",
"PDU_RES_REL_CMD", "PDU_RES_REL_RSP", "PDU_RES_MOD_REQ", "PDU_RES_MOD_RSP",
"PDU_RES_MOD_FAIL", "PDU_RES_NTY", "PDU_RES_NTY_REL", "PDU_RES_MOD_IND",
"PDU_RES_MOD_CFM", "PATH_SWITCH_REQ", "PATH_SWITCH_SETUP_FAIL",
"PATH_SWITCH_REQ_ACK", "PATH_SWITCH_REQ_FAIL", "HANDOVER_REQUIRED",
"HANDOVER_CMD", "HANDOVER_PREP_FAIL", "HANDOVER_REQ_ACK",
"HANDOVER_RES_ALLOC_FAIL", "SECONDARY_RAT_USAGE" };
#endif
......@@ -34,7 +34,6 @@ typedef struct {
uint32_t tac;
} plmn_t;
typedef struct s_nssai // section 28.4, TS23.003
{
uint8_t sST;
......@@ -65,9 +64,9 @@ typedef struct s_nssai // section 28.4, TS23.003
} 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,
......@@ -91,16 +90,16 @@ enum class http_response_codes_e {
HTTP_RESPONSE_CODE_NOT_IMPLEMENTED = 501,
HTTP_RESPONSE_CODE_SERVICE_UNAVAILABLE = 503,
HTTP_RESPONSE_CODE_GATEWAY_TIMEOUT = 504
};
//for CURL
#define SMF_CURL_TIMEOUT_MS 100L
#define SMF_NUMBER_RETRIES 3
constexpr auto CURL_MIME_BOUNDARY = "----Boundary";
#define BUFFER_SIZE_1024 1024
#define BUFFER_SIZE_512 512
#define BUFFER_SIZE_256 256
#endif
......@@ -33,7 +33,8 @@
#include <string>
//------------------------------------------------------------------------------
void print_buffer(const std::string app, const std::string commit, uint8_t *buf, int len) {
void print_buffer(const std::string app, const std::string commit, uint8_t *buf,
int len) {
if (!app.compare("amf_app"))
Logger::amf_app().debug(commit.c_str());
if (!app.compare("amf_n1"))
......
......@@ -33,12 +33,24 @@
#include <inttypes.h>
#include <arpa/inet.h>
static const char hex_to_ascii_table[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', };
static const signed char ascii_to_hex_table[0x100] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
static const char hex_to_ascii_table[16] = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', };
static const signed char ascii_to_hex_table[0x100] = { -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1,
10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1 };
//------------------------------------------------------------------------------
void conv::hexa_to_ascii(uint8_t *from, char *to, size_t length) {
......@@ -88,7 +100,8 @@ int conv::ascii_to_hex(uint8_t *dst, const char *h) {
}
//------------------------------------------------------------------------------
std::string conv::mccToString(const uint8_t digit1, const uint8_t digit2, const uint8_t digit3) {
std::string conv::mccToString(const uint8_t digit1, const uint8_t digit2,
const uint8_t digit3) {
std::string s = { };
uint16_t mcc16 = digit1 * 100 + digit2 * 10 + digit3;
//s.append(std::to_string(digit1)).append(std::to_string(digit2)).append(std::to_string(digit3));
......@@ -97,7 +110,8 @@ std::string conv::mccToString(const uint8_t digit1, const uint8_t digit2, const
}
//------------------------------------------------------------------------------
std::string conv::mncToString(const uint8_t digit1, const uint8_t digit2, const uint8_t digit3) {
std::string conv::mncToString(const uint8_t digit1, const uint8_t digit2,
const uint8_t digit3) {
std::string s = { };
uint16_t mcc16 = 0;
......@@ -122,7 +136,8 @@ struct in_addr conv::fromString(const std::string addr4) {
std::string conv::toString(const struct in_addr &inaddr) {
std::string s = { };
char str[INET6_ADDRSTRLEN] = { };
if (inet_ntop(AF_INET, (const void*) &inaddr, str, INET6_ADDRSTRLEN) == NULL) {
if (inet_ntop(AF_INET, (const void*) &inaddr, str, INET6_ADDRSTRLEN)
== NULL) {
s.append("Error in_addr");
} else {
s.append(str);
......@@ -134,7 +149,8 @@ std::string conv::toString(const struct in_addr &inaddr) {
std::string conv::toString(const struct in6_addr &in6addr) {
std::string s = { };
char str[INET6_ADDRSTRLEN] = { };
if (inet_ntop(AF_INET6, (const void*) &in6addr, str, INET6_ADDRSTRLEN) == nullptr) {
if (inet_ntop(AF_INET6, (const void*) &in6addr, str, INET6_ADDRSTRLEN)
== nullptr) {
s.append("Error in6_addr");
} else {
s.append(str);
......
......@@ -50,7 +50,9 @@ class conv {
static struct in_addr fromString(const std::string addr4);
static std::string toString(const struct in_addr &inaddr);
static std::string toString(const struct in6_addr &in6addr);
static std::string mccToString(const uint8_t digit1, const uint8_t digit2, const uint8_t digit3);
static std::string mncToString(const uint8_t digit1, const uint8_t digit2, const uint8_t digit3);
static std::string mccToString(const uint8_t digit1, const uint8_t digit2,
const uint8_t digit3);
static std::string mncToString(const uint8_t digit1, const uint8_t digit2,
const uint8_t digit3);
};
#endif /* FILE_CONVERSIONS_HPP_SEEN */
......@@ -36,7 +36,8 @@
Logger *Logger::m_singleton = NULL;
//------------------------------------------------------------------------------
void Logger::_init(const char *app, const bool log_stdout, const bool log_rot_file) {
void Logger::_init(const char *app, const bool log_stdout,
const bool log_rot_file) {
int num_sinks = 0;
spdlog::set_async_mode(2048);
#if TRACE_IS_ON
......@@ -51,12 +52,15 @@ void Logger::_init(const char *app, const bool log_stdout, const bool log_rot_fi
if (log_stdout) {
std::string filename = fmt::format("./{}.log", app);
m_sinks.push_back(std::make_shared<spdlog::sinks::ansicolor_stdout_sink_mt>());
m_sinks.push_back(
std::make_shared<spdlog::sinks::ansicolor_stdout_sink_mt>());
m_sinks[num_sinks++].get()->set_level(llevel);
}
if (log_rot_file) {
std::string filename = fmt::format("./{}.log", app);
m_sinks.push_back(std::make_shared < spdlog::sinks::rotating_file_sink_mt > (filename, 5 * 1024 * 1024, 3));
m_sinks.push_back(
std::make_shared < spdlog::sinks::rotating_file_sink_mt
> (filename, 5 * 1024 * 1024, 3));
}
std::stringstream ss;
......@@ -78,7 +82,8 @@ void Logger::_init(const char *app, const bool log_stdout, const bool log_rot_fi
}
//------------------------------------------------------------------------------
_Logger::_Logger(const char *category, std::vector<spdlog::sink_ptr> &sinks, const char *pattern)
_Logger::_Logger(const char *category, std::vector<spdlog::sink_ptr> &sinks,
const char *pattern)
:
m_log(category, sinks.begin(), sinks.end()) {
m_log.set_pattern(pattern);
......
......@@ -51,7 +51,8 @@ class LoggerException : public std::runtime_error {
class _Logger {
public:
_Logger(const char *category, std::vector<spdlog::sink_ptr> &sinks, const char *pattern);
_Logger(const char *category, std::vector<spdlog::sink_ptr> &sinks,
const char *pattern);
void trace(const char *format, ...);
void trace(const std::string &format, ...);
......@@ -84,10 +85,12 @@ class _Logger {
class Logger {
public:
static void init(const char *app, const bool log_stdout, const bool log_rot_file) {
static void init(const char *app, const bool log_stdout,
const bool log_rot_file) {
singleton()._init(app, log_stdout, log_rot_file);
}
static void init(const std::string &app, const bool log_stdout, const bool log_rot_file) {
static void init(const std::string &app, const bool log_stdout,
const bool log_rot_file) {
init(app.c_str(), log_stdout, log_rot_file);
}
......
......@@ -37,6 +37,27 @@
#include "security_def.hpp"
#include "authentication_algorithms_with_5gaka.hpp"
typedef enum {
_5GMM_STATE_MIN = 0,
_5GMM_STATE_INVALID = _5GMM_STATE_MIN,
_5GMM_DEREGISTERED,
_5GMM_REGISTERED,
_5GMM_DEREGISTERED_INITIATED,
_5GMM_COMMON_PROCEDURE_INITIATED,
_5GMM_STATE_MAX
} _5gmm_state_t;
static const std::vector<std::string> _5gmm_state_e2str = {
"_5GMM_STATE_INVALID",
"_5GMM_DEREGISTERED",
"_5GMM_REGISTERED",
"_5GMM_DEREGISTERED_INITIATED",
"_5GMM_COMMON_PROCEDURE_INITIATED",
"_5GMM_STATE_MAX"
};
class nas_context {
public:
nas_context();
......@@ -46,6 +67,7 @@ class nas_context {
long amf_ue_ngap_id;
uint32_t ran_ue_ngap_id;
std::string nas_status;
_5gmm_state_t _5gmm_state;
/************ parameters from Registration request *************/
uint8_t registration_type :3;
......
......@@ -33,9 +33,8 @@
#include "bstrlib.h"
#include "amf.hpp"
class pdu_session_context
{
public:
class pdu_session_context {
public:
pdu_session_context();
~pdu_session_context();
......@@ -48,7 +47,7 @@ public:
bstring n1sm;
bool isn1sm_avaliable;
std::string dnn;
std::string remote_smf_addr[0]; //"192.168.12.10:8080"
std::string remote_smf_addr[0]; //"192.168.12.10:8080"
bool smf_available;
std::string location;
snssai_t snssai;
......
......@@ -30,8 +30,6 @@
#define _UE_CONTEXT_H_
#include <stdint.h>
#include <map>
#include <shared_mutex>
#include "NgapIEsStruct.hpp"
......
......@@ -31,7 +31,6 @@
#include <stdint.h>
#include <map>
#include <shared_mutex>
#include "gNB_context.hpp"
......
......@@ -36,10 +36,12 @@
extern itti_mw *itti_inst;
static itti_timer null_timer(ITTI_INVALID_TIMER_ID, TASK_NONE, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0);
static itti_timer null_timer(ITTI_INVALID_TIMER_ID, TASK_NONE, 0xFFFFFFFF,
0xFFFFFFFF, 0, 0);
//------------------------------------------------------------------------------
void itti_mw::timer_manager_task(const util::thread_sched_params &sched_params) {
void itti_mw::timer_manager_task(
const util::thread_sched_params &sched_params) {
Logger::itti().info("Starting timer_manager_task");
sched_params.apply(TASK_ITTI_TIMER, Logger::itti());
while (true) {
......@@ -56,15 +58,22 @@ void itti_mw::timer_manager_task(const util::thread_sched_params &sched_params)
lx.unlock();
// check time-out
if (itti_inst->current_timer.time_out > std::chrono::system_clock::now()) {
if (itti_inst->current_timer.time_out
> std::chrono::system_clock::now()) {
std::unique_lock < std::mutex > lto(itti_inst->m_timeout);
auto diff = itti_inst->current_timer.time_out - std::chrono::system_clock::now();
auto diff = itti_inst->current_timer.time_out
- std::chrono::system_clock::now();
auto rc = itti_inst->c_timeout.wait_for(lto, diff);
lto.unlock();
if (std::cv_status::timeout == rc) {
// signal time-out
itti_msg_timeout mto(TASK_ITTI_TIMER, itti_inst->current_timer.task_id, itti_inst->current_timer.id, itti_inst->current_timer.arg1_user, itti_inst->current_timer.arg2_user);
std::shared_ptr<itti_msg_timeout> msgsh = std::make_shared < itti_msg_timeout > (mto);
itti_msg_timeout mto(TASK_ITTI_TIMER,
itti_inst->current_timer.task_id,
itti_inst->current_timer.id,
itti_inst->current_timer.arg1_user,
itti_inst->current_timer.arg2_user);
std::shared_ptr<itti_msg_timeout> msgsh = std::make_shared
< itti_msg_timeout > (mto);
int ret = itti_inst->send_msg(msgsh);
} else {
// other timer required ?
......@@ -78,8 +87,12 @@ void itti_mw::timer_manager_task(const util::thread_sched_params &sched_params)
}
} else {
// signal time-out
itti_msg_timeout mto(TASK_ITTI_TIMER, itti_inst->current_timer.task_id, itti_inst->current_timer.id, itti_inst->current_timer.arg1_user, itti_inst->current_timer.arg2_user);
std::shared_ptr<itti_msg_timeout> msgsh = std::make_shared < itti_msg_timeout > (mto);
itti_msg_timeout mto(TASK_ITTI_TIMER, itti_inst->current_timer.task_id,
itti_inst->current_timer.id,
itti_inst->current_timer.arg1_user,
itti_inst->current_timer.arg2_user);
std::shared_ptr<itti_msg_timeout> msgsh = std::make_shared
< itti_msg_timeout > (mto);
itti_inst->send_msg(msgsh);
}
}
......@@ -133,7 +146,8 @@ unsigned int itti_mw::increment_message_number() {
}
//------------------------------------------------------------------------------
int itti_mw::create_task(const task_id_t task_id, void (*start_routine)(void*), void *args_p) {
int itti_mw::create_task(const task_id_t task_id, void (*start_routine)(void*),
void *args_p) {
if (nullptr == start_routine) {
Logger::itti().error("Null start routine for task %d", task_id);
return RETURNerror ;
......@@ -150,7 +164,8 @@ int itti_mw::create_task(const task_id_t task_id, void (*start_routine)(void*),
lk.unlock();
}
itti_task_ctxts[task_id]->thread = std::thread(start_routine, args_p);
while ((itti_task_ctxts[task_id]->task_state != TASK_STATE_READY) && (itti_task_ctxts[task_id]->task_state != TASK_STATE_ENDED))
while ((itti_task_ctxts[task_id]->task_state != TASK_STATE_READY)
&& (itti_task_ctxts[task_id]->task_state != TASK_STATE_ENDED))
usleep(1000);
return 0;
} else {
......@@ -172,7 +187,8 @@ int itti_mw::notify_task_ready(const task_id_t task_id) {
return RETURNok ;
}
itti_task_ctxts[task_id]->m_state.unlock();
Logger::itti().error("Notify task ready, bad state %d", itti_task_ctxts[task_id]->task_state);
Logger::itti().error("Notify task ready, bad state %d",
itti_task_ctxts[task_id]->task_state);
} else {
Logger::itti().error("Notify task ready, task not starting %d", task_id);
}
......@@ -182,21 +198,29 @@ int itti_mw::notify_task_ready(const task_id_t task_id) {
//------------------------------------------------------------------------------
int itti_mw::send_msg(std::shared_ptr<itti_msg> message) {
if ((TASK_FIRST <= message->destination) && (TASK_MAX > message->destination)) {
if ((TASK_FIRST <= message->destination)
&& (TASK_MAX > message->destination)) {
if (itti_task_ctxts[message->destination]) {
if (itti_task_ctxts[message->destination]->task_state == TASK_STATE_READY) {
std::unique_lock < std::mutex > l(itti_task_ctxts[message->destination]->m_queue);
if (itti_task_ctxts[message->destination]->task_state
== TASK_STATE_READY) {
std::unique_lock < std::mutex
> l(itti_task_ctxts[message->destination]->m_queue);
//res =
itti_task_ctxts[message->destination]->msg_queue.push(message);
itti_task_ctxts[message->destination]->c_queue.notify_one();
return RETURNok ;
} else if (itti_task_ctxts[message->destination]->task_state == TASK_STATE_ENDED) {
Logger::itti().warn("Unicast message number %lu can not be sent from %d to %d, ended destination task!", message->msg_num, message->origin, message->destination);
} else if (itti_task_ctxts[message->destination]->task_state
== TASK_STATE_ENDED) {
Logger::itti().warn(
"Unicast message number %lu can not be sent from %d to %d, ended destination task!",
message->msg_num, message->origin, message->destination);
return RETURNerror ;
}
} else {
Logger::itti().warn("Unicast message number %lu can not be sent from %d to %d, not started destination task!", message->msg_num, message->origin, message->destination);
Logger::itti().warn(
"Unicast message number %lu can not be sent from %d to %d, not started destination task!",
message->msg_num, message->origin, message->destination);
}
} else if (message->destination == TASK_ALL) {
return send_broadcast_msg(message);
......@@ -215,9 +239,14 @@ int itti_mw::send_broadcast_msg(std::shared_ptr<itti_msg> message) {
itti_task_ctxts[t]->msg_queue.push(message);
itti_task_ctxts[t]->c_queue.notify_one();
} else if (itti_task_ctxts[t]->task_state == TASK_STATE_ENDED) {
Logger::itti().warn("Broadcast message number %lu can not be sent from %d to %d, ended destination task!", message->msg_num, message->origin, t);
Logger::itti().warn(
"Broadcast message number %lu can not be sent from %d to %d, ended destination task!",
message->msg_num, message->origin, t);
} else {
Logger::itti().warn("Broadcast message number %lu can not be sent from %d to %d, unknown state %d !", message->msg_num, message->origin, t, itti_task_ctxts[t]->task_state);
Logger::itti().warn(
"Broadcast message number %lu can not be sent from %d to %d, unknown state %d !",
message->msg_num, message->origin, t,
itti_task_ctxts[t]->task_state);
}
}
}
......@@ -231,7 +260,8 @@ int itti_mw::send_terminate_msg(task_id_t src_task_id) {
itti_msg_terminate msg(src_task_id, TASK_ALL);
terminate = true;
std::shared_ptr<itti_msg_terminate> smsg = std::make_shared < itti_msg_terminate > (msg);
std::shared_ptr<itti_msg_terminate> smsg = std::make_shared
< itti_msg_terminate > (msg);
int ret = itti_inst->send_broadcast_msg(smsg);
return ret;
......@@ -244,7 +274,8 @@ std::shared_ptr<itti_msg> itti_mw::receive_msg(task_id_t task_id) {
while (itti_task_ctxts[task_id]->msg_queue.empty()) {
itti_task_ctxts[task_id]->c_queue.wait(lk);
}
std::shared_ptr<itti_msg> msg = itti_task_ctxts[task_id]->msg_queue.front();
std::shared_ptr<itti_msg> msg =
itti_task_ctxts[task_id]->msg_queue.front();
itti_task_ctxts[task_id]->msg_queue.pop();
return msg;
}
......@@ -259,7 +290,8 @@ std::shared_ptr<itti_msg> itti_mw::poll_msg(task_id_t task_id) {
if (itti_task_ctxts[task_id]) {
std::lock_guard < std::mutex > lk(itti_task_ctxts[task_id]->m_queue);
if (!itti_task_ctxts[task_id]->msg_queue.empty()) {
std::shared_ptr<itti_msg> msg = itti_task_ctxts[task_id]->msg_queue.front();
std::shared_ptr<itti_msg> msg = itti_task_ctxts[task_id]->msg_queue
.front();
itti_task_ctxts[task_id]->msg_queue.pop();
return msg;
}
......@@ -286,10 +318,13 @@ void itti_mw::wait_tasks_end(void) {
}
//------------------------------------------------------------------------------
timer_id_t itti_mw::timer_setup(uint32_t interval_sec, uint32_t interval_us, task_id_t task_id, uint64_t arg1_user, uint64_t arg2_user) {
timer_id_t itti_mw::timer_setup(uint32_t interval_sec, uint32_t interval_us,
task_id_t task_id, uint64_t arg1_user,
uint64_t arg2_user) {
// Not sending to task timer
if ((TASK_FIRST < task_id) && (TASK_MAX > task_id)) {
itti_timer t(increment_timer_id(), task_id, interval_sec, interval_us, arg1_user, arg2_user);
itti_timer t(increment_timer_id(), task_id, interval_sec, interval_us,
arg1_user, arg2_user);
timer_id_t id = t.id;
std::unique_lock < std::mutex > l(m_timers);
timers.insert(t);
......
......@@ -19,15 +19,14 @@
* contact@openairinterface.org
*/
/*! \file itti.hpp
\brief
\author Lionel GAUTHIER
\date 2018
\email: lionel.gauthier@eurecom.fr
*/
\brief
\author Lionel GAUTHIER
\date 2018
\email: lionel.gauthier@eurecom.fr
*/
#ifndef SRC_OAI_ITTI_ITTI_HPP_INCLUDED_
#define SRC_OAI_ITTI_ITTI_HPP_INCLUDED_
#include <chrono>
#include <condition_variable>
//#include <iomanip>
......@@ -42,104 +41,137 @@
#include "thread_sched.hpp"
typedef volatile enum task_state_s {
TASK_STATE_NOT_CONFIGURED, TASK_STATE_STARTING, TASK_STATE_READY, TASK_STATE_ENDED, TASK_STATE_MAX,
TASK_STATE_NOT_CONFIGURED,
TASK_STATE_STARTING,
TASK_STATE_READY,
TASK_STATE_ENDED,
TASK_STATE_MAX,
} task_state_t;
typedef uint32_t timer_id_t;
#define ITTI_INVALID_TIMER_ID (timer_id_t)0
class itti_timer {
public:
itti_timer(const timer_id_t id, const task_id_t task_id, const uint32_t interval_sec, const uint32_t interval_us, uint64_t arg1_user, uint64_t arg2_user) :
id(id), task_id(task_id), arg1_user(arg1_user), arg2_user(arg2_user) {
time_out = std::chrono::system_clock::now() + std::chrono::seconds(interval_sec) + std::chrono::microseconds(interval_us);
public:
itti_timer(const timer_id_t id, const task_id_t task_id,
const uint32_t interval_sec, const uint32_t interval_us,
uint64_t arg1_user, uint64_t arg2_user)
:
id(id),
task_id(task_id),
arg1_user(arg1_user),
arg2_user(arg2_user) {
time_out = std::chrono::system_clock::now()
+ std::chrono::seconds(interval_sec)
+ std::chrono::microseconds(interval_us);
}
itti_timer(const timer_id_t id, const task_id_t task_id, const std::chrono::system_clock::time_point time_out, uint64_t arg1_user, uint64_t arg2_user) :
id(id), task_id(task_id), time_out(time_out), arg1_user(arg1_user), arg2_user(arg2_user) {
itti_timer(const timer_id_t id, const task_id_t task_id,
const std::chrono::system_clock::time_point time_out,
uint64_t arg1_user, uint64_t arg2_user)
:
id(id),
task_id(task_id),
time_out(time_out),
arg1_user(arg1_user),
arg2_user(arg2_user) {
}
itti_timer(const itti_timer &t)
:
id(t.id),
task_id(t.task_id),
time_out(t.time_out),
arg1_user(t.arg1_user),
arg2_user(t.arg2_user) {
}
itti_timer(const itti_timer &t) : id(t.id), task_id(t.task_id) , time_out(t.time_out), arg1_user(t.arg1_user), arg2_user(t.arg2_user) {}
//itti_timer(itti_timer&& t) noexcept : id(std::move(t.id)), task_id(std::move(t.task_id)) , time_out(std::move(t.time_out)) {}
bool operator<(const itti_timer& t) const { return time_out < t.time_out; }
~itti_timer() {}
timer_id_t id;
task_id_t task_id;
bool operator<(const itti_timer &t) const {
return time_out < t.time_out;
}
~itti_timer() {
}
timer_id_t id;
task_id_t task_id;
std::chrono::system_clock::time_point time_out;
uint64_t arg1_user;
uint64_t arg2_user;
uint64_t arg1_user;
uint64_t arg2_user;
};
//------------------------------------------------------------------------------
struct timer_comparator {
bool operator()(const itti_timer &left, const itti_timer &right) const
{
return (left.time_out < right.time_out);
}
bool operator()(const itti_timer &left, const itti_timer &right) const {
return (left.time_out < right.time_out);
}
};
class itti_task_ctxt {
public:
explicit itti_task_ctxt(const task_id_t task_id) :
task_id(task_id), m_state(), task_state(TASK_STATE_STARTING), msg_queue() , m_queue(), c_queue() {}
~itti_task_ctxt() {}
public:
explicit itti_task_ctxt(const task_id_t task_id)
:
task_id(task_id),
m_state(),
task_state(TASK_STATE_STARTING),
msg_queue(),
m_queue(),
c_queue() {
}
~itti_task_ctxt() {
}
const task_id_t task_id;
const task_id_t task_id;
/*
* pthread associated with the thread
*/
//std::thread::id thread_id;
std::thread thread;
std::thread thread;
/*
* State of the thread
*/
std::mutex m_state;
volatile task_state_t task_state;
std::mutex m_state;
volatile task_state_t task_state;
std::queue<std::shared_ptr<itti_msg>> msg_queue;
std::mutex m_queue;
std::condition_variable c_queue;
std::queue<std::shared_ptr<itti_msg>> msg_queue;
std::mutex m_queue;
std::condition_variable c_queue;
};
class itti_mw {
private:
itti_task_ctxt *itti_task_ctxts[TASK_MAX];
private:
itti_task_ctxt *itti_task_ctxts[TASK_MAX];
/*
* Current message number. Incremented every call to send_msg_to_task
*/
unsigned long msg_number;
timer_id_t timer_id;
std::mutex m_timer_id;
std::thread timer_thread;
unsigned long msg_number;
timer_id_t timer_id;
std::mutex m_timer_id;
std::thread timer_thread;
std::atomic<int> created_tasks;
std::atomic<int> ready_tasks;
std::atomic<int> created_tasks;
std::atomic<int> ready_tasks;
std::set<itti_timer, timer_comparator> timers;
itti_timer current_timer;
std::mutex m_timers;
std::condition_variable c_timers;
std::set<itti_timer, timer_comparator> timers;
itti_timer current_timer;
std::mutex m_timers;
std::condition_variable c_timers;
std::mutex m_timeout;
std::condition_variable c_timeout;
std::mutex m_timeout;
std::condition_variable c_timeout;
bool terminate;
bool terminate;
static void timer_manager_task(const util::thread_sched_params& sched_params);
static void timer_manager_task(const util::thread_sched_params &sched_params);
public:
public:
itti_mw();
itti_mw(itti_mw const&) = delete;
void operator=(itti_mw const&) = delete;
itti_mw(itti_mw const&) = delete;
void operator=(itti_mw const&) = delete;
~itti_mw();
void start(const util::thread_sched_params& sched_params);
void start(const util::thread_sched_params &sched_params);
timer_id_t increment_timer_id ();
unsigned int increment_message_number ();
timer_id_t increment_timer_id();
unsigned int increment_message_number();
/** \brief Send a broadcast message to every task
\param message_p Pointer to the message to send
......@@ -158,13 +190,13 @@ public:
\param task_id Task ID of the receiving task
\param received_msg Pointer to the allocated message
**/
std::shared_ptr<itti_msg> receive_msg (task_id_t task_id);
std::shared_ptr<itti_msg> receive_msg(task_id_t task_id);
/** \brief Try to retrieves a message in the queue associated to task_id.
\param task_id Task ID of the receiving task
\param received_msg Pointer to the allocated message
**/
std::shared_ptr<itti_msg> poll_msg(task_id_t task_id);
std::shared_ptr<itti_msg> poll_msg(task_id_t task_id);
/** \brief Start thread associated to the task
* \param task_id task to start
......@@ -172,9 +204,8 @@ public:
* \param args_p Optional argument to pass to the start routine
* @returns -1 on failure, 0 otherwise
**/
int create_task (const task_id_t task_id,
void (*start_routine) (void *),
void *args_p);
int create_task(const task_id_t task_id, void (*start_routine)(void*),
void *args_p);
/** \brief Notify ITTI of a started thread
* \param task_id of started task
......@@ -188,12 +219,10 @@ public:
* \param wait_tasks non 0 to make new created tasks to wait, 0 to let created tasks to run
**/
//void wait_ready(int wait_tasks);
/** \brief Mark the task as in ready state
* \param task_id task to mark as ready
**/
//void mark_task_ready(task_id_t task_id);
/** \brief handle signals and wait for all threads to join when the process complete.
* This function should be called from the main thread after having created all ITTI tasks.
**/
......@@ -210,21 +239,18 @@ public:
* \param task_id task id of the task requesting the timer
* @returns 0 on failure, timer id otherwise
**/
timer_id_t timer_setup(
uint32_t interval_sec,
uint32_t interval_us,
task_id_t task_id,
uint64_t arg1_user = 0,
uint64_t arg2_user = 0);
timer_id_t timer_setup(uint32_t interval_sec, uint32_t interval_us,
task_id_t task_id, uint64_t arg1_user = 0,
uint64_t arg2_user = 0);
/** \brief Remove the timer from list
* \param timer_id unique timer id
* \param task_id task id of the task that requested the timer
* @returns -1 on failure, 0 otherwise
**/
int timer_remove (timer_id_t timer_id);
int timer_remove(timer_id_t timer_id);
static void signal_handler( int signum );
static void signal_handler(int signum);
};
......
......@@ -20,32 +20,45 @@
*/
/*! \file itti_msg.cpp
\brief
\author Lionel GAUTHIER
\date 2018
\email: lionel.gauthier@eurecom.fr
*/
\brief
\author Lionel GAUTHIER
\date 2018
\email: lionel.gauthier@eurecom.fr
*/
#include "itti_msg.hpp"
#include "itti.hpp"
extern itti_mw *itti_inst;
itti_msg::itti_msg() :
msg_type(ITTI_MSG_TYPE_NONE), origin(TASK_NONE), destination(TASK_NONE) {
itti_msg::itti_msg()
:
msg_type(ITTI_MSG_TYPE_NONE),
origin(TASK_NONE),
destination(TASK_NONE) {
msg_num = itti_inst->increment_message_number();
};
}
;
itti_msg::itti_msg(const itti_msg_type_t msg_type, task_id_t origin, task_id_t destination) :
msg_type(msg_type), origin(origin), destination(destination) {
itti_msg::itti_msg(const itti_msg_type_t msg_type, task_id_t origin,
task_id_t destination)
:
msg_type(msg_type),
origin(origin),
destination(destination) {
msg_num = itti_inst->increment_message_number();
};
}
;
itti_msg::itti_msg(const itti_msg& i) :
msg_type(i.msg_type),msg_num(i.msg_num), origin(i.origin), destination(i.destination) {
};
itti_msg::itti_msg(const itti_msg &i)
:
msg_type(i.msg_type),
msg_num(i.msg_num),
origin(i.origin),
destination(i.destination) {
}
;
const char* itti_msg::get_msg_name()
{
const char* itti_msg::get_msg_name() {
return "UNINITIALIZED";
}
......@@ -19,19 +19,18 @@
* contact@openairinterface.org
*/
/*! \file itti_msg.hpp
\brief
\author Lionel GAUTHIER
\date 2018
\email: lionel.gauthier@eurecom.fr
*/
\brief
\author Lionel GAUTHIER
\date 2018
\email: lionel.gauthier@eurecom.fr
*/
#ifndef SRC_ITTI_ITTI_MSG_HPP_INCLUDED_
#define SRC_ITTI_ITTI_MSG_HPP_INCLUDED_
#include <stdint.h>
#include <utility>
typedef enum
{
typedef enum {
TASK_FIRST = 0,
TASK_ITTI_TIMER = TASK_FIRST,
TASK_ASYNC_SHELL_CMD,
......@@ -46,8 +45,7 @@ typedef enum
TASK_ALL = 255
} task_id_t;
typedef enum message_priorities_e
{
typedef enum message_priorities_e {
MESSAGE_PRIORITY_MAX = 100,
MESSAGE_PRIORITY_MAX_LEAST = 85,
MESSAGE_PRIORITY_MED_PLUS = 70,
......@@ -57,8 +55,7 @@ typedef enum message_priorities_e
MESSAGE_PRIORITY_MIN = 10,
} message_priorities_t;
typedef enum
{
typedef enum {
ITTI_MSG_TYPE_NONE = -1,
ITTI_MSG_TYPE_FIRST = 0,
ASYNC_SHELL_CMD = ITTI_MSG_TYPE_FIRST,
......@@ -69,16 +66,16 @@ typedef enum
ITTI_DL_NAS_TRANSPORT,
INITIAL_CONTEXT_SETUP_REQUEST,
PDU_SESSION_RESOURCE_SETUP_REQUEST,
PDU_SESSION_RESOURCE_RELEASE_COMMAND,
UE_CONTEXT_RELEASE_REQUEST,
UE_RADIO_CAP_IND,
UL_NAS_DATA_IND, //task amf_n1 message id
UL_NAS_DATA_IND, //task amf_n1 message id
DOWNLINK_NAS_TRANSFER,
NAS_SIG_ESTAB_REQ, //task amf_app
NAS_SIG_ESTAB_REQ, //task amf_app
N1N2_MESSAGE_TRANSFER_REQ,
SMF_SERVICES_CONSUMER,
NSMF_PDU_SESSION_UPDATE_SM_CTX,
UE_CONTEXT_RELEASE_COMMAND,
PDU_SESSION_RESOURCE_RELEASE_COMMAND,
NSMF_PDU_SESS_RELEASE_SMCTX,
HANDOVER_REQUIRED,
HANDOVER_REQUEST_ACK,
......@@ -93,15 +90,14 @@ typedef enum
typedef unsigned long message_number_t;
class itti_msg
{
public:
class itti_msg {
public:
itti_msg();
itti_msg(const itti_msg_type_t msg_type, const task_id_t origin, const task_id_t destination);
itti_msg(const itti_msg_type_t msg_type, const task_id_t origin,
const task_id_t destination);
itti_msg(const itti_msg &i);
itti_msg &operator=(itti_msg other)
{
itti_msg& operator=(itti_msg other) {
std::swap(msg_num, other.msg_num);
std::swap(origin, other.origin);
std::swap(destination, other.destination);
......@@ -110,7 +106,7 @@ public:
}
virtual ~itti_msg() = default;
static const char *get_msg_name();
static const char* get_msg_name();
message_number_t msg_num;
task_id_t origin;
......@@ -118,32 +114,66 @@ public:
itti_msg_type_t msg_type;
};
class itti_msg_timeout : public itti_msg
{
public:
itti_msg_timeout(const task_id_t origin, const task_id_t destination, uint32_t timer_id, uint64_t arg1_user, uint64_t arg2_user) : itti_msg(TIME_OUT, origin, destination), timer_id(timer_id), arg1_user(arg1_user), arg2_user(arg2_user) {}
itti_msg_timeout(const itti_msg_timeout &i) : itti_msg(i), timer_id(i.timer_id), arg1_user(i.arg1_user), arg2_user(i.arg2_user) {}
static const char *get_msg_name() { return "TIME_OUT"; };
class itti_msg_timeout : public itti_msg {
public:
itti_msg_timeout(const task_id_t origin, const task_id_t destination,
uint32_t timer_id, uint64_t arg1_user, uint64_t arg2_user)
:
itti_msg(TIME_OUT, origin, destination),
timer_id(timer_id),
arg1_user(arg1_user),
arg2_user(arg2_user) {
}
itti_msg_timeout(const itti_msg_timeout &i)
:
itti_msg(i),
timer_id(i.timer_id),
arg1_user(i.arg1_user),
arg2_user(i.arg2_user) {
}
static const char* get_msg_name() {
return "TIME_OUT";
}
;
uint32_t timer_id;
uint64_t arg1_user;
uint64_t arg2_user;
};
class itti_msg_ping : public itti_msg
{
public:
itti_msg_ping(const task_id_t origin, const task_id_t destination, uint32_t seq) : itti_msg(HEALTH_PING, origin, destination), seq(seq) {}
itti_msg_ping(const itti_msg_ping &i) : itti_msg(i), seq(i.seq) {}
static const char *get_msg_name() { return "HEALTH_PING"; };
class itti_msg_ping : public itti_msg {
public:
itti_msg_ping(const task_id_t origin, const task_id_t destination,
uint32_t seq)
:
itti_msg(HEALTH_PING, origin, destination),
seq(seq) {
}
itti_msg_ping(const itti_msg_ping &i)
:
itti_msg(i),
seq(i.seq) {
}
static const char* get_msg_name() {
return "HEALTH_PING";
}
;
uint32_t seq;
};
class itti_msg_terminate : public itti_msg
{
public:
itti_msg_terminate(const task_id_t origin, const task_id_t destination) : itti_msg(TERMINATE, origin, destination) {}
itti_msg_terminate(const itti_msg_terminate &i) : itti_msg(i) {}
static const char *get_msg_name() { return "TERMINATE"; };
class itti_msg_terminate : public itti_msg {
public:
itti_msg_terminate(const task_id_t origin, const task_id_t destination)
:
itti_msg(TERMINATE, origin, destination) {
}
itti_msg_terminate(const itti_msg_terminate &i)
:
itti_msg(i) {
}
static const char* get_msg_name() {
return "TERMINATE";
}
;
};
#endif /* SRC_ITTI_ITTI_MSG_HPP_INCLUDED_ */
......@@ -7,50 +7,68 @@
using namespace ngap;
#include "bstrlib.h"
class itti_msg_amf_app : public itti_msg{
public:
itti_msg_amf_app(const itti_msg_type_t msg_type, const task_id_t origin, const task_id_t destination):itti_msg(msg_type,origin,destination){}
itti_msg_amf_app(const itti_msg_amf_app& i) : itti_msg(i){
class itti_msg_amf_app : public itti_msg {
public:
itti_msg_amf_app(const itti_msg_type_t msg_type, const task_id_t origin,
const task_id_t destination)
:
itti_msg(msg_type, origin, destination) {
}
itti_msg_amf_app(const itti_msg_amf_app &i)
:
itti_msg(i) {
ran_ue_ngap_id = i.ran_ue_ngap_id;
amf_ue_ngap_id = i.amf_ue_ngap_id;
}
uint32_t ran_ue_ngap_id;
long amf_ue_ngap_id;
long amf_ue_ngap_id;
};
class itti_nas_signalling_establishment_request : public itti_msg_amf_app{
public:
itti_nas_signalling_establishment_request(const task_id_t origin, const task_id_t destination):itti_msg_amf_app(NAS_SIG_ESTAB_REQ, origin, destination){}
itti_nas_signalling_establishment_request(const itti_nas_signalling_establishment_request & i) : itti_msg_amf_app(i){}
class itti_nas_signalling_establishment_request : public itti_msg_amf_app {
public:
itti_nas_signalling_establishment_request(const task_id_t origin,
const task_id_t destination)
:
itti_msg_amf_app(NAS_SIG_ESTAB_REQ, origin, destination) {
}
itti_nas_signalling_establishment_request(
const itti_nas_signalling_establishment_request &i)
:
itti_msg_amf_app(i) {
}
int rrc_cause;
int ueCtxReq;
NrCgi_t cgi;
Tai_t tai;
Tai_t tai;
bstring nas_buf;
bool is_5g_s_tmsi_present;
std::string _5g_s_tmsi;
};
class itti_n1n2_message_transfer_request : public itti_msg_amf_app{
public:
itti_n1n2_message_transfer_request(const task_id_t origin, const task_id_t destination) : itti_msg_amf_app(N1N2_MESSAGE_TRANSFER_REQ, origin, destination){}
itti_n1n2_message_transfer_request(const itti_n1n2_message_transfer_request & i) : itti_msg_amf_app(i){}
class itti_n1n2_message_transfer_request : public itti_msg_amf_app {
public:
itti_n1n2_message_transfer_request(const task_id_t origin,
const task_id_t destination)
:
itti_msg_amf_app(N1N2_MESSAGE_TRANSFER_REQ, origin, destination) {
}
itti_n1n2_message_transfer_request(
const itti_n1n2_message_transfer_request &i)
:
itti_msg_amf_app(i) {
}
std::string supi;
bstring n1sm;
bstring n2sm;
bool is_n2sm_set;
bool is_n1sm_set;
uint8_t pdu_session_id;
std::string n2sm_info_type;
//other parameters
};
#endif
......@@ -4,27 +4,38 @@
#include "bstrlib.h"
#include "itti_msg.hpp"
class itti_msg_n1 : public itti_msg{
public:
itti_msg_n1(const itti_msg_type_t msg_type, const task_id_t origin, const task_id_t destination):itti_msg(msg_type,origin,destination){
class itti_msg_n1 : public itti_msg {
public:
itti_msg_n1(const itti_msg_type_t msg_type, const task_id_t origin,
const task_id_t destination)
:
itti_msg(msg_type, origin, destination) {
}
itti_msg_n1(const itti_msg_n1& i) : itti_msg(i){
is_nas_signalling_estab_req =i.is_nas_signalling_estab_req;
itti_msg_n1(const itti_msg_n1 &i)
:
itti_msg(i) {
is_nas_signalling_estab_req = i.is_nas_signalling_estab_req;
ran_ue_ngap_id = i.ran_ue_ngap_id;
}
public:
public:
bool is_nas_signalling_estab_req;
long amf_ue_ngap_id;
uint32_t ran_ue_ngap_id;
};
class itti_uplink_nas_data_ind : public itti_msg_n1{
public:
itti_uplink_nas_data_ind(const task_id_t origin, const task_id_t destination):itti_msg_n1(UL_NAS_DATA_IND,origin,destination){}
itti_uplink_nas_data_ind(const itti_uplink_nas_data_ind &i) : itti_msg_n1(i){}
class itti_uplink_nas_data_ind : public itti_msg_n1 {
public:
itti_uplink_nas_data_ind(const task_id_t origin, const task_id_t destination)
:
itti_msg_n1(UL_NAS_DATA_IND, origin, destination) {
}
itti_uplink_nas_data_ind(const itti_uplink_nas_data_ind &i)
:
itti_msg_n1(i) {
}
public:
public:
bstring nas_msg;
std::string mcc;
std::string mnc;
......@@ -32,27 +43,23 @@ public:
std::string guti;
};
class itti_downlink_nas_transfer : public itti_msg_n1{
public:
itti_downlink_nas_transfer(const task_id_t origin, const task_id_t destination) : itti_msg_n1(DOWNLINK_NAS_TRANSFER, origin,destination){}
itti_downlink_nas_transfer(const itti_downlink_nas_transfer &i) : itti_msg_n1(i){}
public:
class itti_downlink_nas_transfer : public itti_msg_n1 {
public:
itti_downlink_nas_transfer(const task_id_t origin,
const task_id_t destination)
:
itti_msg_n1(DOWNLINK_NAS_TRANSFER, origin, destination) {
}
itti_downlink_nas_transfer(const itti_downlink_nas_transfer &i)
:
itti_msg_n1(i) {
}
public:
bstring dl_nas;
bstring n2sm;
bool is_n2sm_set;
bool is_n2sm_set;
uint8_t pdu_session_id;
std::string n2sm_info_type;
};
#endif
......@@ -6,29 +6,40 @@
#include <string>
#include "amf.hpp"
class itti_msg_n11 : public itti_msg{
public:
itti_msg_n11(const itti_msg_type_t msg_type, const task_id_t origin, const task_id_t destination):itti_msg(msg_type,origin,destination){}
itti_msg_n11(const itti_msg_n11& i) : itti_msg(i){
class itti_msg_n11 : public itti_msg {
public:
itti_msg_n11(const itti_msg_type_t msg_type, const task_id_t origin,
const task_id_t destination)
:
itti_msg(msg_type, origin, destination) {
}
itti_msg_n11(const itti_msg_n11 &i)
:
itti_msg(i) {
ran_ue_ngap_id = i.ran_ue_ngap_id;
amf_ue_ngap_id = i.amf_ue_ngap_id;
}
public:
public:
long amf_ue_ngap_id;
uint32_t ran_ue_ngap_id;
};
class itti_smf_services_consumer : public itti_msg_n11{
public:
itti_smf_services_consumer(const task_id_t origin, const task_id_t destination):itti_msg_n11(SMF_SERVICES_CONSUMER, origin, destination){
class itti_smf_services_consumer : public itti_msg_n11 {
public:
itti_smf_services_consumer(const task_id_t origin,
const task_id_t destination)
:
itti_msg_n11(SMF_SERVICES_CONSUMER, origin, destination) {
}
itti_smf_services_consumer(const itti_smf_services_consumer& i) : itti_msg_n11(i){
itti_smf_services_consumer(const itti_smf_services_consumer &i)
:
itti_msg_n11(i) {
}
public:
public:
uint8_t req_type;
uint8_t pdu_sess_id;
uint8_t pdu_sess_id;
bstring dnn;
bstring sm_msg;
snssai_t snssai;
......@@ -44,15 +55,35 @@ public:
bstring n2sm;
};
class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11{
public:
itti_nsmf_pdusession_update_sm_context(const task_id_t origin, const task_id_t destination) : itti_msg_n11(NSMF_PDU_SESSION_UPDATE_SM_CTX, origin, destination){}
itti_nsmf_pdusession_update_sm_context(const itti_nsmf_pdusession_update_sm_context &i) : itti_msg_n11(i){}
public:
class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 {
public:
itti_nsmf_pdusession_update_sm_context(const task_id_t origin,
const task_id_t destination)
:
itti_msg_n11(NSMF_PDU_SESSION_UPDATE_SM_CTX, origin, destination) {
is_n2sm_set = false;
}
itti_nsmf_pdusession_update_sm_context(
const itti_nsmf_pdusession_update_sm_context &i)
:
itti_msg_n11(i) {
pdu_session_id = i.pdu_session_id;
n2sm = i.n2sm;
is_n2sm_set = i.is_n2sm_set;
n2sm_info_type = i.n2sm_info_type;
}
public:
std::string supi;
uint8_t pdu_session_id;
bstring n2sm;
bool is_n2sm_set;
std::string n2sm_info_type;
};
class itti_nsmf_pdusession_release_sm_context : public itti_msg_n11
{
public:
......
......@@ -15,14 +15,16 @@
using namespace ngap;
using namespace sctp;
class itti_msg_n2 : public itti_msg
{
public:
itti_msg_n2(const itti_msg_type_t msg_type, const task_id_t origin, const task_id_t destination) : itti_msg(msg_type, origin, destination)
{
class itti_msg_n2 : public itti_msg {
public:
itti_msg_n2(const itti_msg_type_t msg_type, const task_id_t origin,
const task_id_t destination)
:
itti_msg(msg_type, origin, destination) {
}
itti_msg_n2(const itti_msg_n2 &i) : itti_msg(i)
{
itti_msg_n2(const itti_msg_n2 &i)
:
itti_msg(i) {
assoc_id = i.assoc_id;
stream = i.stream;
}
......@@ -30,49 +32,67 @@ public:
sctp_stream_id_t stream;
};
class itti_new_sctp_association : public itti_msg_n2
{
public:
itti_new_sctp_association(const task_id_t origin, const task_id_t destination) : itti_msg_n2(NEW_SCTP_ASSOCIATION, origin, destination) {}
class itti_new_sctp_association : public itti_msg_n2 {
public:
itti_new_sctp_association(const task_id_t origin, const task_id_t destination)
:
itti_msg_n2(NEW_SCTP_ASSOCIATION, origin, destination) {
}
};
class itti_ng_setup_request : public itti_msg_n2
{
public:
itti_ng_setup_request(const task_id_t origin, const task_id_t destination) : itti_msg_n2(NG_SETUP_REQ, origin, destination) {}
itti_ng_setup_request(const itti_ng_setup_request &i) : itti_msg_n2(i)
{
class itti_ng_setup_request : public itti_msg_n2 {
public:
itti_ng_setup_request(const task_id_t origin, const task_id_t destination)
:
itti_msg_n2(NG_SETUP_REQ, origin, destination) {
}
public:
itti_ng_setup_request(const itti_ng_setup_request &i)
:
itti_msg_n2(i) {
}
public:
NGSetupRequestMsg *ngSetupReq;
};
class itti_initial_ue_message : public itti_msg_n2
{
public:
itti_initial_ue_message(const task_id_t origin, const task_id_t destination) : itti_msg_n2(INITIAL_UE_MSG, origin, destination) {}
itti_initial_ue_message(const itti_initial_ue_message &i) : itti_msg_n2(i) {}
class itti_initial_ue_message : public itti_msg_n2 {
public:
itti_initial_ue_message(const task_id_t origin, const task_id_t destination)
:
itti_msg_n2(INITIAL_UE_MSG, origin, destination) {
}
itti_initial_ue_message(const itti_initial_ue_message &i)
:
itti_msg_n2(i) {
}
InitialUEMessageMsg *initUeMsg;
};
class itti_ul_nas_transport : public itti_msg_n2
{
public:
itti_ul_nas_transport(const task_id_t origin, const task_id_t destination) : itti_msg_n2(ITTI_UL_NAS_TRANSPORT, origin, destination) {}
itti_ul_nas_transport(const itti_ul_nas_transport &i) : itti_msg_n2(i) {}
class itti_ul_nas_transport : public itti_msg_n2 {
public:
itti_ul_nas_transport(const task_id_t origin, const task_id_t destination)
:
itti_msg_n2(ITTI_UL_NAS_TRANSPORT, origin, destination) {
}
itti_ul_nas_transport(const itti_ul_nas_transport &i)
:
itti_msg_n2(i) {
}
UplinkNASTransportMsg *ulNas;
};
class itti_dl_nas_transport : public itti_msg_n2
{
public:
itti_dl_nas_transport(const task_id_t origin, const task_id_t destination) : itti_msg_n2(ITTI_DL_NAS_TRANSPORT, origin, destination) {}
itti_dl_nas_transport(const itti_dl_nas_transport &i) : itti_msg_n2(i) {}
public:
class itti_dl_nas_transport : public itti_msg_n2 {
public:
itti_dl_nas_transport(const task_id_t origin, const task_id_t destination)
:
itti_msg_n2(ITTI_DL_NAS_TRANSPORT, origin, destination) {
}
itti_dl_nas_transport(const itti_dl_nas_transport &i)
:
itti_msg_n2(i) {
}
public:
uint32_t ran_ue_ngap_id;
long amf_ue_ngap_id;
bstring nas;
......@@ -85,6 +105,7 @@ public:
itti_initial_context_setup_request(const itti_initial_context_setup_request &i) : itti_msg_n2(i) {
is_pdu_exist = false;
isn2sm_avaliable = false;
}
uint32_t ran_ue_ngap_id;
long amf_ue_ngap_id;
......@@ -97,11 +118,18 @@ public:
bool isn2sm_avaliable;
};
class itti_pdu_session_resource_setup_request : public itti_msg_n2
{
public:
itti_pdu_session_resource_setup_request(const task_id_t origin, const task_id_t destination) : itti_msg_n2(PDU_SESSION_RESOURCE_SETUP_REQUEST, origin, destination) {}
itti_pdu_session_resource_setup_request(const itti_pdu_session_resource_setup_request &i) : itti_msg_n2(i) {}
class itti_pdu_session_resource_setup_request : public itti_msg_n2 {
public:
itti_pdu_session_resource_setup_request(const task_id_t origin,
const task_id_t destination)
:
itti_msg_n2(PDU_SESSION_RESOURCE_SETUP_REQUEST, origin, destination) {
}
itti_pdu_session_resource_setup_request(
const itti_pdu_session_resource_setup_request &i)
:
itti_msg_n2(i) {
}
bstring nas;
bstring n2sm;
uint32_t ran_ue_ngap_id;
......@@ -109,23 +137,40 @@ public:
uint8_t pdu_session_id;
};
class itti_ue_context_release_request : public itti_msg_n2
{
public:
itti_ue_context_release_request(const task_id_t origin, const task_id_t destination) : itti_msg_n2(UE_CONTEXT_RELEASE_REQUEST, origin, destination) {}
itti_ue_context_release_request(const itti_ue_context_release_request &i) : itti_msg_n2(i) {}
UEContextReleaseRequestMsg *ueCtxRel;
};
class itti_pdu_session_resource_release_command : public itti_msg_n2
{
public:
itti_pdu_session_resource_release_command(const task_id_t origin, const task_id_t destination) : itti_msg_n2(PDU_SESSION_RESOURCE_RELEASE_COMMAND, origin, destination) {}
itti_pdu_session_resource_release_command(const itti_dl_nas_transport &i) : itti_msg_n2(i) {}
public:
class itti_pdu_session_resource_release_command : public itti_msg_n2 {
public:
itti_pdu_session_resource_release_command(const task_id_t origin,
const task_id_t destination)
:
itti_msg_n2(PDU_SESSION_RESOURCE_RELEASE_COMMAND, origin, destination) {
}
itti_pdu_session_resource_release_command(
const itti_pdu_session_resource_release_command &i)
:
itti_msg_n2(i) {
}
bstring nas;
bstring n2sm;
uint32_t ran_ue_ngap_id;
long amf_ue_ngap_id;
uint8_t pdu_session_id;
};
class itti_ue_context_release_request : public itti_msg_n2 {
public:
itti_ue_context_release_request(const task_id_t origin,
const task_id_t destination)
:
itti_msg_n2(UE_CONTEXT_RELEASE_REQUEST, origin, destination) {
}
itti_ue_context_release_request(const itti_ue_context_release_request &i)
:
itti_msg_n2(i) {
}
UEContextReleaseRequestMsg *ueCtxRel;
};
class itti_ue_context_release_command : public itti_msg_n2
{
public:
......@@ -137,6 +182,7 @@ public:
long amf_ue_ngap_id;
Cause cause;
};
class itti_ue_radio_capability_indication : public itti_msg_n2
{
public:
......@@ -144,6 +190,7 @@ public:
itti_ue_radio_capability_indication(const itti_ue_radio_capability_indication &i) : itti_msg_n2(i) {}
UeRadioCapabilityInfoIndicationMsg *ueRadioCap;
};
class itti_handover_required : public itti_msg_n2
{
public:
......@@ -151,6 +198,7 @@ public:
itti_handover_required(const itti_handover_required &i) : itti_msg_n2(i) {}
HandoverRequiredMsg *handvoerRequ;
};
class itti_handover_request_Ack : public itti_msg_n2
{
public:
......@@ -158,6 +206,7 @@ public:
itti_handover_request_Ack(const itti_handover_request_Ack &i) : itti_msg_n2(i) {}
HandoverRequestAck *handoverrequestAck;
};
class itti_handover_notify : public itti_msg_n2
{
public:
......@@ -165,6 +214,7 @@ public:
itti_handover_notify(const itti_handover_notify &i) : itti_msg_n2(i) {}
HandoverNotifyMsg *handovernotify;
};
class itti_uplinkranstatsutransfer : public itti_msg_n2
{
public:
......
......@@ -44,25 +44,38 @@
/********** message type ********************/
#define REGISTRATION_REQUEST 0b01000001
#define REGISTRATION_REJECT 0b01000100
#define AUTHENTICATION_REQUEST 0b01010110
#define AUTHENTICATION_RESPONSE 0b01010111
#define AUTHENTICATION_RESULT 0b01011010
#define AUTHENTICATION_FAILURE 0b01011001
#define AUTHENTICATION_REJECT 0b01011000
#define SECURITY_MODE_COMMAND 0b01011101
#define SECURITY_MODE_COMPLETE 0b01011110
#define SECURITY_MODE_REJECT 0b01011111
#define REGISTRATION_COMPLETE 0b01000011
#define REGISTRATION_ACCEPT 0b01000010
#define IDENTITY_REQUEST 0b01011011
#define IDENTITY_RESPONSE 0b01011100
#define UL_NAS_TRANSPORT 0b01100111
#define DL_NAS_TRANSPORT 0b01101000
#define SERVICE_REQUEST 0b01001100
#define SERVICE_REJECT 0b01001101
#define SERVICE_ACCEPT 0b01001110
#define REGISTRATION_REQUEST 0b01000001
#define REGISTRATION_ACCEPT 0b01000010
#define REGISTRATION_COMPLETE 0b01000011
#define REGISTRATION_REJECT 0b01000100
#define DEREGISTRATION_REQUEST_UE_ORIGINATING 0b01000101
#define DEREGISTRATION_ACCEPT_UE_ORIGINATING 0b01000110
#define DEREGISTRATION_REQUEST_UE_TERMINATED 0b01000111
#define DEREGISTRATION_ACCEPT_UE_TERMINATED 0b01001000
#define SERVICE_REQUEST 0b01001100
#define SERVICE_REJECT 0b01001101
#define SERVICE_ACCEPT 0b01001110
#define CONFIGURATION_UPDATE_COMMAND 0b01010100
#define CONFIGURATION_UPDATE_COMPLETE 0b01010101
#define AUTHENTICATION_REQUEST 0b01010110
#define AUTHENTICATION_RESPONSE 0b01010111
#define AUTHENTICATION_REJECT 0b01011000
#define AUTHENTICATION_FAILURE 0b01011001
#define AUTHENTICATION_RESULT 0b01011010
#define IDENTITY_REQUEST 0b01011011
#define IDENTITY_RESPONSE 0b01011100
#define SECURITY_MODE_COMMAND 0b01011101
#define SECURITY_MODE_COMPLETE 0b01011110
#define SECURITY_MODE_REJECT 0b01011111
#define _5GMM_STATUS 0b01100100
#define MESSAGE_TYPE_NOTIFICATION 0b01100101
#define MESSAGE_TYPE_NOTIFICATION_RESPONSE 0b01100110
#define UL_NAS_TRANSPORT 0b01100111
#define DL_NAS_TRANSPORT 0b01101000
#define UE_INIT_DEREGISTER 0b01000101
/********* registration type ***************/
......@@ -142,7 +155,26 @@
#define EXISTING_PDU_SESSION 0b010
#define PDU_SESSION_INITIAL_EMERGENCY_REQUEST 0b011
#define EXISTING_EMERGENCY_PDU_SESSION 0b100
#define PDU_SESSION_MODIFICATION_REQUEST 0b101
#define PDU_SESSION_TYPE_MODIFICATION_REQUEST 0b101
#define MA_PDU_REQUEST 0b110
#define PDU_SESSION_MESSAGE_TYPE_UNKNOWN 0b11000000
#define PDU_SESSION_ESTABLISHMENT_REQUEST 0b11000001
#define PDU_SESSION_ESTABLISHMENT_ACCEPT 0b11000010
#define PDU_SESSION_ESTABLISHMENT_REJECT 0b11000011
#define PDU_SESSION_AUTHENTICATION_COMMAND 0b11000101
#define PDU_SESSION_AUTHENTICATION_COMPLETE 0b11000110
#define PDU_SESSION_AUTHENTICATION_RESULT 0b11000111
#define PDU_SESSION_MODIFICATION_REQUEST 0b11001001
#define PDU_SESSION_MODIFICATION_REJECT 0b11001010
#define PDU_SESSION_MODIFICATION_COMMAND 0b11001011
#define PDU_SESSION_MODIFICATION_COMPLETE 0b11001100
#define PDU_SESSION_MODIFICATION_COMMAND_REJECT 0b11001101
#define PDU_SESSION_RELEASE_REQUEST 0b11010001
#define PDU_SESSION_RELEASE_REJECT 0b11010010
#define PDU_SESSION_RELEASE_COMMAND 0b11010011
#define PDU_SESSION_RELEASE_COMPLETE 0b11010100
#endif
......@@ -28,6 +28,7 @@
#include "nas_mm_plain_header.hpp"
#include "5GSRegistrationType.hpp"
#include "_5GSDeregistrationType.hpp"
#include "NasKeySetIdentifier.hpp"
#include "5GSMobilityIdentity.hpp"
#include "5GMMCapability.hpp"
......
......@@ -194,7 +194,13 @@ void _5GSMobilityIdentity::getSuciWithSupiImsi(SUCI_imsi_t &ptr) {
//------------------------------------------------------------------------------
void _5GSMobilityIdentity::get5GGUTI(_5G_GUTI_t &ptr) {
ptr = *_5g_guti;
//ptr = *_5g_guti;
ptr.mcc = _5g_guti->mcc;
ptr.mnc = _5g_guti->mnc;
ptr.amf_region_id = _5g_guti->amf_region_id;
ptr.amf_set_id = _5g_guti->amf_set_id;
ptr.amf_pointer = _5g_guti->amf_pointer;
ptr._5g_tmsi = _5g_guti->_5g_tmsi;
}
//------------------------------------------------------------------------------
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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