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

Code cleanup for 5GS_Registration_Result

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