Commit 4ad2b4f6 authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Code cleanup for 5GS_Registration_Result

parent e93d4aff
......@@ -19,24 +19,20 @@
* contact@openairinterface.org
*/
/*! \file _5GS_Registration_Result.cpp
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "_5GS_Registration_Result.hpp"
#include "3gpp_24.501.hpp"
#include "common_defs.h"
#include "logger.hpp"
using namespace nas;
//------------------------------------------------------------------------------
_5GS_Registration_Result::_5GS_Registration_Result(uint8_t iei) {
_iei = iei;
Emergency = false;
NSSAA = false;
SMS = false;
length = k5gsRegistrationResultLength;
emergency_registered = false;
NSSAA_performed = false;
SMS_allowed = false;
_value = 0;
}
......@@ -44,18 +40,20 @@ _5GS_Registration_Result::_5GS_Registration_Result(uint8_t iei) {
_5GS_Registration_Result::_5GS_Registration_Result(
const uint8_t iei, bool emergency, bool nssaa, bool sms, uint8_t value) {
_iei = iei;
Emergency = emergency;
NSSAA = nssaa;
SMS = sms;
length = k5gsRegistrationResultLength;
emergency_registered = emergency;
NSSAA_performed = nssaa;
SMS_allowed = sms;
_value = value;
}
//------------------------------------------------------------------------------
_5GS_Registration_Result::_5GS_Registration_Result() {
_iei = 0;
Emergency = false;
NSSAA = false;
SMS = false;
length = k5gsRegistrationResultLength;
emergency_registered = false;
NSSAA_performed = false;
SMS_allowed = false;
_value = 0;
}
_5GS_Registration_Result::~_5GS_Registration_Result() {}
......@@ -70,60 +68,82 @@ uint8_t _5GS_Registration_Result::getValue() {
return _value;
}
//------------------------------------------------------------------------------
void _5GS_Registration_Result::set(
const uint8_t iei, bool emergency, bool nssaa, bool sms, uint8_t value) {
_iei = iei;
length = k5gsRegistrationResultLength;
emergency_registered = emergency;
NSSAA_performed = nssaa;
SMS_allowed = sms;
_value = value;
}
//------------------------------------------------------------------------------
int _5GS_Registration_Result::encode2Buffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("encoding _5GS_Registration_Result iei(0x%x)", _iei);
if (len < 3) {
Logger::nas_mm().error("len is less than 3");
return 0;
Logger::nas_mm().debug("Encoding _5GS_Registration_Result");
if (len < k5gsRegistrationResultLength) {
Logger::nas_mm().error(
"Buffer length is less than the length of this IE (%d octet)",
k5gsRegistrationResultLength);
return KEncodeDecodeError;
}
uint8_t octet = 0;
int encoded_size = 0;
octet = 0x00 | (Emergency << 5) | (NSSAA << 4) | (SMS << 3) | (_value & 0x07);
if (_iei) {
*(buf + encoded_size) = _iei;
encoded_size++;
*(buf + encoded_size) = 1;
encoded_size++;
*(buf + encoded_size) = octet;
encoded_size++;
Logger::nas_mm().debug(
"encoded _5GS_Registration_Result _value(0x%x),iei(0x%x)",
*(buf + encoded_size - 1), _iei);
} else {
*(buf + encoded_size) = 1;
encoded_size++;
*(buf + encoded_size) = octet;
encoded_size++;
ENCODE_U8(buf + encoded_size, _iei, encoded_size); // IEI
}
// Length
ENCODE_U8(buf + encoded_size, length, encoded_size);
// Octet 3
uint8_t octet = 0;
octet = 0x00 | (emergency_registered << 5) | (NSSAA_performed << 4) |
(SMS_allowed << 3) | (_value & 0x07);
ENCODE_U8(buf + encoded_size, octet, encoded_size);
Logger::nas_mm().debug(
"Encoded _5GS_Registration_Result, value 0x%x, IEI 0x%x", _value, _iei);
Logger::nas_mm().debug(
"encoded _5GS_Registration_Result len(%d)", encoded_size);
"Encoded _5GS_Registration_Result (len %d)", encoded_size);
return encoded_size;
}
//------------------------------------------------------------------------------
int _5GS_Registration_Result::decodeFromBuffer(
uint8_t* buf, int len, bool is_option) {
Logger::nas_mm().debug("decoding _5GS_Registration_Result iei(0x%x)", *buf);
Logger::nas_mm().debug("Decoding _5GS_Registration_Result");
if (len < k5gsRegistrationResultLength) {
Logger::nas_mm().error(
"Buffer length is less than the length of this IE (%d octet)",
k5gsRegistrationResultLength);
return KEncodeDecodeError;
}
int decoded_size = 0;
if (is_option) {
_iei = *buf;
decoded_size++;
DECODE_U8(buf + decoded_size, _iei, decoded_size); // IEI
}
// Length
DECODE_U8(buf + decoded_size, length, decoded_size);
// Octet 3
uint8_t octet = 0;
// length = *(buf + decoded_size);
decoded_size++;
octet = *(buf + decoded_size);
decoded_size++;
Emergency = (octet & 0x20) >> 5;
NSSAA = (octet & 0x10) >> 4;
SMS = (octet & 0x08) >> 3;
DECODE_U8(buf + decoded_size, octet, decoded_size);
emergency_registered = (octet & 0x20) >> 5;
NSSAA_performed = (octet & 0x10) >> 4;
SMS_allowed = (octet & 0x08) >> 3;
_value = octet & 0x07;
Logger::nas_mm().debug(
"decoded _5GS_Registration_Result Emergency(0x%x) NSSAA(0x%x) SMS(0x%x) "
"_value(0x%x)",
Emergency, NSSAA, SMS, _value);
"Decoded _5GS_Registration_Result, Emergency Registered 0x%x, NSSAA "
"Performed 0x%x, SMS Allowed 0x%x, "
"Value 0x%x",
emergency_registered, NSSAA_performed, SMS_allowed, _value);
Logger::nas_mm().debug(
"decoded _5GS_Registration_Result len(%d)", decoded_size);
"Decoded _5GS_Registration_Result (len %d)", decoded_size);
return decoded_size;
}
......@@ -19,18 +19,13 @@
* contact@openairinterface.org
*/
/*! \file _5GS_Registration_Result.hpp
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef ___5GS_Registration_Result_H_
#define ___5GS_Registration_Result_H_
#ifndef _5GS_REGISTRATION_RESULT_H_
#define _5GS_REGISTRATION_RESULT_H_
#include <stdint.h>
constexpr uint8_t k5gsRegistrationResultLength = 3;
namespace nas {
class _5GS_Registration_Result {
......@@ -44,12 +39,15 @@ class _5GS_Registration_Result {
int decodeFromBuffer(uint8_t* buf, int len, bool is_option);
void setValue(uint8_t value);
uint8_t getValue();
void set(
const uint8_t iei, bool emergency, bool nssaa, bool sms, uint8_t value);
private:
uint8_t _iei;
bool Emergency;
bool NSSAA;
bool SMS;
uint8_t length;
bool emergency_registered;
bool NSSAA_performed;
bool SMS_allowed;
uint8_t _value;
};
} // namespace nas
......
......@@ -35,9 +35,8 @@
using namespace nas;
//------------------------------------------------------------------------------
RegistrationAccept::RegistrationAccept() {
plain_header = nullptr;
ie_5gs_registration_result = nullptr;
RegistrationAccept::RegistrationAccept()
: NasMmPlainHeader(EPD_5GS_MM_MSG, REGISTRATION_ACCEPT) {
ie_5g_guti = nullptr;
ie_equivalent_plmns = nullptr;
ie_allowed_nssai = nullptr;
......@@ -72,16 +71,13 @@ RegistrationAccept::~RegistrationAccept() {}
//------------------------------------------------------------------------------
void RegistrationAccept::setHeader(uint8_t security_header_type) {
plain_header = new NasMmPlainHeader();
plain_header->setHeader(
EPD_5GS_MM_MSG, security_header_type, REGISTRATION_ACCEPT);
NasMmPlainHeader::SetSecurityHeaderType(security_header_type);
}
//------------------------------------------------------------------------------
void RegistrationAccept::set_5GS_Registration_Result(
bool emergency, bool nssaa, bool sms, uint8_t value) {
ie_5gs_registration_result =
new _5GS_Registration_Result(0x00, emergency, nssaa, sms, value);
ie_5gs_registration_result.set(0x00, emergency, nssaa, sms, value);
}
//------------------------------------------------------------------------------
......@@ -272,23 +268,23 @@ void RegistrationAccept::setTaiList(std::vector<p_tai_t> tai_list) {
int RegistrationAccept::encode2Buffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding RegistrationAccept message");
int encoded_size = 0;
if (!plain_header) {
Logger::nas_mm().error("Mandatory IE missing Header");
return 0;
int encoded_ie_size = 0;
// Header
if ((encoded_ie_size = NasMmPlainHeader::encode2Buffer(buf, len)) ==
KEncodeDecodeError) {
Logger::nas_mm().error("Encoding NAS Header error");
return KEncodeDecodeError;
}
if (!(plain_header->encode2Buffer(buf, len))) return 0;
encoded_size += 3;
if (!ie_5gs_registration_result) {
Logger::nas_mm().warn("IE ie_5gs_registration_result is not available");
} else {
if (int size = ie_5gs_registration_result->encode2Buffer(
encoded_size += encoded_ie_size;
if (int size = ie_5gs_registration_result.encode2Buffer(
buf + encoded_size, len - encoded_size)) {
encoded_size += size;
} else {
Logger::nas_mm().error("Encoding ie_5gs_registration_result error");
return 0;
}
}
if (!ie_5g_guti) {
Logger::nas_mm().warn("IE ie_5g_guti is not available");
} else {
......@@ -617,9 +613,8 @@ int RegistrationAccept::decodeFromBuffer(
NasMmPlainHeader* header, uint8_t* buf, int len) {
Logger::nas_mm().debug("Decoding RegistrationAccept message");
int decoded_size = 3;
plain_header = header;
ie_5gs_registration_result = new _5GS_Registration_Result();
decoded_size += ie_5gs_registration_result->decodeFromBuffer(
decoded_size += ie_5gs_registration_result.decodeFromBuffer(
buf + decoded_size, len - decoded_size, false);
Logger::nas_mm().debug("Decoded_size(%d)", decoded_size);
uint8_t octet = *(buf + decoded_size);
......
......@@ -19,31 +19,30 @@
* contact@openairinterface.org
*/
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef _RegistrationAccept_H_
#define _RegistrationAccept_H_
#ifndef _REGISTRATION_ACCEPT_H_
#define _REGISTRATION_ACCEPT_H_
#include "NasIeHeader.hpp"
namespace nas {
class RegistrationAccept {
class RegistrationAccept : public NasMmPlainHeader {
public:
RegistrationAccept();
~RegistrationAccept();
void setHeader(uint8_t security_header_type);
void getSecurityHeaderType(uint8_t security_header_type); // TODO
bool verifyHeader(); // TODO
int encode2Buffer(uint8_t* buf, int len);
int decodeFromBuffer(NasMmPlainHeader* header, uint8_t* buf, int len);
void setHeader(uint8_t security_header_type);
void setSOR_Transparent_Container(uint8_t header, uint8_t* value);
void set_5GS_Registration_Result(
bool emergency, bool nssaa, bool sms, uint8_t value);
/*** belongs to _5GSMobileIdentity**/
// TODO: Get
// 5GSMobileIdentity
void setSUCI_SUPI_format_IMSI(
const string mcc, const string mnc, const string routingInd,
uint8_t protection_sch_id, const string msin);
......@@ -55,66 +54,137 @@ class RegistrationAccept {
const string amfSetId, const string amfPointer, const uint32_t tmsi);
void setIMEI_IMEISV();
void set5G_S_TMSI();
/*** belongs to _5GSMobileIdentity**/
// TODO: Get
// Equivalent PLMNs
void setEquivalent_PLMNs(
uint8_t MNC_MCC1, uint8_t MNC_MCC2, uint8_t MNC_MCC3);
// TODO: Get
void setTaiList(std::vector<p_tai_t> tai_list);
// TODO: Get
void setALLOWED_NSSAI(std::vector<struct SNSSAI_s> nssai);
// TODO: Get
void setRejected_NSSAI(uint8_t cause, uint8_t value);
// TODO: Get
void setCONFIGURED_NSSAI(std::vector<struct SNSSAI_s> nssai);
// TODO: Get
void set_5GS_Network_Feature_Support(uint8_t value, uint8_t value2);
// TODO: Get
void setPDU_session_status(uint16_t value);
// TODO: Get
void setPDU_session_reactivation_result(uint16_t value);
// TODO: Get
void setPDU_session_reactivation_result_error_cause(
uint8_t session_id, uint8_t value);
// TODO: Get
// TODO: LADN information
void setMICO_Indication(bool sprti, bool raai);
// TODO: Get
void setNetwork_Slicing_Indication(bool dcni, bool nssci);
// TODO: Get
// TODO: Service Area List
void setT3512_Value(uint8_t unit, uint8_t value);
// TODO: Get
void setNon_3GPP_de_registration_timer_value(uint8_t value);
// TODO: Get
void setT3502_value(uint8_t value);
// TODO: Get
// TODO: Emergency number list
// TODO: Extended emergency number list
void setSOR_Transparent_Container(uint8_t header, uint8_t* value);
// TODO: Get
void setEAP_Message(bstring eap);
// TODO: Get
void setNSSAI_Inclusion_Mode(uint8_t value);
// TODO: Get
// TODO: Operator-defined access category definitions
void set_5GS_DRX_arameters(uint8_t value);
// TODO: Get
void setNon_3GPP_NW_Provided_Policies(uint8_t value);
// TODO: Get
void setEPS_Bearer_Context_Status(uint16_t value);
// TODO: Get
void setExtended_DRX_Parameters(uint8_t paging_time, uint8_t value);
// TODO: Get
void setT3447_Value(uint8_t unit, uint8_t value);
// TODO: Get
void setT3448_Value(uint8_t unit, uint8_t value);
// TODO: Get
void setT3324_Value(uint8_t unit, uint8_t value);
// TODO: Get
void setUE_Radio_Capability_ID(uint8_t value);
// TODO: Get
void setPending_NSSAI(std::vector<struct SNSSAI_s> nssai);
void setTaiList(std::vector<p_tai_t> tai_list);
// TODO: Get
public:
NasMmPlainHeader* plain_header;
_5GS_Registration_Result* ie_5gs_registration_result;
_5GSMobileIdentity* ie_5g_guti;
PLMN_List* ie_equivalent_plmns;
NSSAI* ie_allowed_nssai;
Rejected_NSSAI* ie_rejected_nssai;
NSSAI* ie_configured_nssai;
_5GS_Network_Feature_Support* ie_5gs_network_feature_support;
PDUSessionStatus* ie_PDU_session_status;
PDU_Session_Reactivation_Result* ie_pdu_session_reactivation_result;
_5GS_Registration_Result ie_5gs_registration_result; // Mandatory
_5GSMobileIdentity* ie_5g_guti; // Optional
PLMN_List* ie_equivalent_plmns; // Optional
_5GSTrackingAreaIdList* ie_tai_list; // Optional
NSSAI* ie_allowed_nssai; // Optional
Rejected_NSSAI* ie_rejected_nssai; // Optional
NSSAI* ie_configured_nssai; // Optional
_5GS_Network_Feature_Support* ie_5gs_network_feature_support; // Optional
PDUSessionStatus* ie_PDU_session_status; // Optional
PDU_Session_Reactivation_Result*
ie_pdu_session_reactivation_result; // Optional
PDU_Session_Reactivation_Result_Error_Cause*
ie_pdu_session_reactivation_result_error_cause;
MICOIndication* ie_MICO_indicationl;
NetworkSlicingIndication* ie_network_slicing_indication;
GPRS_Timer_3* ie_T3512_value;
GPRS_Timer_2* ie_Non_3GPP_de_registration_timer_value;
GPRS_Timer_2* ie_T3502_value;
SOR_Transparent_Container* ie_sor_transparent_container;
EAP_Message* ie_eap_message;
NSSAI_Inclusion_Mode* ie_nssai_inclusion_mode;
_5GS_DRX_Parameters* ie_negotiated_drx_parameters;
Non_3GPP_NW_Provided_Policies* ie_non_3gpp_nw_policies;
EPS_Bearer_Context_Status* ie_eps_bearer_context_status;
Extended_DRX_Parameters* ie_extended_drx_parameters;
GPRS_Timer_3* ie_T3447_value;
GPRS_Timer_3* ie_T3448_value;
GPRS_Timer_3* ie_T3324_value;
UE_Radio_Capability_ID* ie_ue_radio_capability_id;
NSSAI* ie_pending_nssai;
_5GSTrackingAreaIdList* ie_tai_list;
ie_pdu_session_reactivation_result_error_cause; // Optional
// TODO: LADN information
MICOIndication* ie_MICO_indicationl; // Optional
NetworkSlicingIndication* ie_network_slicing_indication; // Optional
// TODO: Service Area List
GPRS_Timer_3* ie_T3512_value; // Optional
GPRS_Timer_2* ie_Non_3GPP_de_registration_timer_value; // Optional
GPRS_Timer_2* ie_T3502_value; // Optional
// TODO: Emergency number list
// TODO: Extended emergency number list
SOR_Transparent_Container* ie_sor_transparent_container; // Optional
EAP_Message* ie_eap_message; // Optional
NSSAI_Inclusion_Mode* ie_nssai_inclusion_mode; // Optional
// TODO: Operator-defined access category definitions
_5GS_DRX_Parameters* ie_negotiated_drx_parameters; // Optional
Non_3GPP_NW_Provided_Policies* ie_non_3gpp_nw_policies; // Optional
EPS_Bearer_Context_Status* ie_eps_bearer_context_status; // Optional
Extended_DRX_Parameters* ie_extended_drx_parameters; // Optional
GPRS_Timer_3* ie_T3447_value; // Optional
GPRS_Timer_3* ie_T3448_value; // Optional
GPRS_Timer_3* ie_T3324_value; // Optional
UE_Radio_Capability_ID* ie_ue_radio_capability_id; // Which Release 16.x.x?
NSSAI* ie_pending_nssai; // Which Release 16.x.x?
};
} // namespace nas
......
......@@ -82,6 +82,7 @@ int RegistrationReject::encode2Buffer(uint8_t* buf, int len) {
return KEncodeDecodeError;
}
encoded_size += encoded_ie_size;
// 5GMM Cause
if (int size =
ie_5gmm_cause.encode2Buffer(buf + encoded_size, len - encoded_size)) {
......
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