Commit 911008f6 authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Update EAP Message

parent b1839609
......@@ -36,7 +36,7 @@
#include "Authentication_Parameter_RAND.hpp"
#include "Authentication_Response_Parameter.hpp"
#include "DNN.hpp"
#include "EAP_Message.hpp"
#include "EapMessage.hpp"
#include "EpsBearerContextStatus.hpp"
#include "EPS_NAS_Message_Container.hpp"
#include "EPS_NAS_Security_Algorithms.hpp"
......
......@@ -19,7 +19,7 @@
* contact@openairinterface.org
*/
#include "EAP_Message.hpp"
#include "EapMessage.hpp"
#include "3gpp_24.501.hpp"
#include "common_defs.h"
......@@ -27,71 +27,92 @@
using namespace nas;
//------------------------------------------------------------------------------
EAP_Message::EAP_Message(uint8_t iei) : EAP() {
_iei = iei;
length = 0;
EapMessage::EapMessage() : Type6NasIe(), eap_() {
SetLengthIndicator(0);
SetIeName(kEapMessageIeName);
}
//------------------------------------------------------------------------------
EAP_Message::EAP_Message(const uint8_t iei, bstring eap) {
_iei = iei;
EAP = bstrcpy(eap);
length = blength(eap);
EapMessage::EapMessage(uint8_t iei) : Type6NasIe(iei), eap_() {
SetLengthIndicator(0);
SetIeName(kEapMessageIeName);
}
//------------------------------------------------------------------------------
EAP_Message::EAP_Message() : _iei(), EAP(), length() {}
EapMessage::EapMessage(const uint8_t iei, bstring eap) : Type6NasIe(iei) {
eap_ = bstrcpy(eap);
SetLengthIndicator(blength(eap));
SetIeName(kEapMessageIeName);
}
//------------------------------------------------------------------------------
EAP_Message::~EAP_Message() {}
EapMessage::~EapMessage() {}
//------------------------------------------------------------------------------
void EAP_Message::getValue(bstring& eap) {
eap = bstrcpy(EAP);
void EapMessage::getValue(bstring& eap) {
eap = bstrcpy(eap_);
}
//------------------------------------------------------------------------------
int EAP_Message::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding EAP_Message");
if ((len < kEapMessageMinimumLength) or (len < length + 3)) {
int EapMessage::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
int ie_len = GetIeLength();
if (len < ie_len) { // Length of the content + IEI/Len
Logger::nas_mm().error(
"Buffer length is less than the length of this IE (%d octet)",
kEapMessageMinimumLength);
"Size of the buffer is not enough to store this IE (IE len %d)",
ie_len);
return KEncodeDecodeError;
}
int encoded_size = 0;
ENCODE_U8(buf + encoded_size, _iei, encoded_size);
ENCODE_U16(buf + encoded_size, length, encoded_size);
int size = encode_bstring(EAP, (buf + encoded_size), len - encoded_size);
// IEI and Length (later)
int len_pos = 0;
int encoded_header_size =
Type6NasIe::Encode(buf + encoded_size, len, len_pos);
if (encoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
encoded_size += encoded_header_size;
// Value
int size = encode_bstring(eap_, (buf + encoded_size), len - encoded_size);
encoded_size += size;
Logger::nas_mm().debug("encoded EAP_Message (len %d)", encoded_size);
// Encode length
int encoded_len_ie = 0;
ENCODE_U16(buf + len_pos, encoded_size - GetHeaderLength(), encoded_len_ie);
Logger::nas_mm().debug(
"Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size;
}
//------------------------------------------------------------------------------
int EAP_Message::Decode(uint8_t* buf, int len, bool is_option) {
Logger::nas_mm().debug("Decoding EAP_Message");
int EapMessage::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
int decoded_size = 0;
if (len < kEapMessageMinimumLength) {
Logger::nas_mm().error(
"Buffer length is less than the length of this IE (%d octet)",
kEapMessageMinimumLength);
return KEncodeDecodeError;
}
// IEI and Length
uint16_t ie_len = 0;
int decoded_header_size = Type6NasIe::Decode(buf + decoded_size, len, is_iei);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
ie_len = GetLengthIndicator();
int decoded_size = 0;
if (is_option) {
DECODE_U8(buf + decoded_size, _iei, decoded_size);
if (len < GetIeLength()) {
Logger::nas_mm().error("Len is less than %d", ie_len);
return KEncodeDecodeError;
}
DECODE_U16(buf + decoded_size, length, decoded_size);
decode_bstring(&EAP, length, (buf + decoded_size), len - decoded_size);
decoded_size += length;
for (int i = 0; i < length; i++) {
// Value
decode_bstring(&eap_, ie_len, (buf + decoded_size), len - decoded_size);
decoded_size += ie_len;
for (int i = 0; i < ie_len; i++) {
Logger::nas_mm().debug(
"Decoded EAP_Message value (0x%x)", (uint8_t) EAP->data[i]);
"Decoded NasMessageContainer value 0x%x", (uint8_t) eap_->data[i]);
}
Logger::nas_mm().debug("Decoded EAP_Message (len %d)", decoded_size);
Logger::nas_mm().debug(
"Decoded EPS_NAS_Message_Container (len %d)", decoded_size);
return decoded_size;
}
......@@ -19,36 +19,40 @@
* contact@openairinterface.org
*/
#ifndef _EAP_Message_H_
#define _EAP_Message_H_
#ifndef _EAP_MESSAGE_H_
#define _EAP_MESSAGE_H_
#include "Type6NasIe.hpp"
#include <stdint.h>
constexpr uint8_t kEapMessageMinimumLength = 7;
constexpr uint16_t kEapMessageMaximumLength = 1503;
extern "C" {
#include "TLVDecoder.h"
#include "TLVEncoder.h"
#include "bstrlib.h"
}
constexpr uint8_t kEapMessageMinimumLength = 7;
constexpr uint16_t kEapMessageMaximumLength = 1503;
constexpr auto kEapMessageIeName = "EAP Message";
namespace nas {
class EAP_Message {
class EapMessage : Type6NasIe {
public:
EAP_Message();
EAP_Message(uint8_t iei);
EAP_Message(const uint8_t iei, bstring eap);
~EAP_Message();
// void setValue(uint8_t iei, uint8_t value);
EapMessage();
EapMessage(uint8_t iei);
EapMessage(bstring eap);
EapMessage(uint8_t iei, bstring eap);
~EapMessage();
int Encode(uint8_t* buf, int len);
int Decode(uint8_t* buf, int len, bool is_option);
int Decode(uint8_t* buf, int len, bool is_iei);
// void setValue(uint8_t iei, uint8_t value);
void getValue(bstring& eap);
private:
uint8_t _iei;
uint16_t length;
bstring EAP;
bstring eap_;
};
} // namespace nas
......
......@@ -54,9 +54,8 @@ void NasMessageContainer::GetValue(bstring& value) const {
//------------------------------------------------------------------------------
int NasMessageContainer::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
int ie_len = GetIeLength();
int encoded_size = 0;
int ie_len = GetIeLength();
if (len < ie_len) { // Length of the content + IEI/Len
Logger::nas_mm().error(
"Size of the buffer is not enough to store this IE (IE len %d)",
......@@ -64,7 +63,6 @@ int NasMessageContainer::Encode(uint8_t* buf, int len) {
return KEncodeDecodeError;
}
int encoded_size = 0;
// IEI and Length (later)
int len_pos = 0;
int encoded_header_size =
......@@ -87,15 +85,20 @@ int NasMessageContainer::Encode(uint8_t* buf, int len) {
//------------------------------------------------------------------------------
int NasMessageContainer::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("Decoding EPS_NAS_Message_Container");
Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
int decoded_size = 0;
// IEI and Length
uint16_t ie_len = 0;
int decoded_header_size = Type6NasIe::Decode(buf + decoded_size, len, is_iei);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
ie_len = GetLengthIndicator();
uint16_t ie_len = 0;
ie_len = GetLengthIndicator();
if (len < GetIeLength()) {
Logger::nas_mm().error("Len is less than %d", GetIeLength());
return KEncodeDecodeError;
}
// Value
decode_bstring(&value_, ie_len, (buf + decoded_size), len - decoded_size);
......@@ -106,6 +109,6 @@ int NasMessageContainer::Decode(uint8_t* buf, int len, bool is_iei) {
}
Logger::nas_mm().debug(
"Decoded EPS_NAS_Message_Container (len %d)", decoded_size);
"Decoded %s, len (%d)", GetIeName().c_str(), decoded_size);
return decoded_size;
}
......@@ -51,7 +51,7 @@ void AuthenticationReject::setHeader(uint8_t security_header_type) {
//------------------------------------------------------------------------------
void AuthenticationReject::setEAP_Message(bstring eap) {
ie_eap_message = new EAP_Message(0x78, eap);
ie_eap_message = new EapMessage(0x78, eap);
}
//------------------------------------------------------------------------------
......@@ -93,7 +93,7 @@ int AuthenticationReject::Decode(
switch (octet) {
case 0x78: {
Logger::nas_mm().debug("Decoding IEI (0x78)");
ie_eap_message = new EAP_Message();
ie_eap_message = new EapMessage();
decoded_size += ie_eap_message->Decode(
buf + decoded_size, len - decoded_size, true);
octet = *(buf + decoded_size);
......
......@@ -44,7 +44,7 @@ class AuthenticationReject {
public:
NasMmPlainHeader* plain_header;
EAP_Message* ie_eap_message;
EapMessage* ie_eap_message;
};
} // namespace nas
......
......@@ -72,7 +72,7 @@ void AuthenticationRequest::setAuthentication_Parameter_AUTN(
//------------------------------------------------------------------------------
void AuthenticationRequest::setEAP_Message(bstring eap) {
ie_eap_message = std::make_optional<EAP_Message>(kIeiEapMessage, eap);
ie_eap_message = std::make_optional<EapMessage>(kIeiEapMessage, eap);
}
//------------------------------------------------------------------------------
......@@ -205,13 +205,13 @@ int AuthenticationRequest::Decode(uint8_t* buf, int len) {
} break;
case kIeiEapMessage: {
Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiEapMessage);
EAP_Message ie_eap_message_tmp = {};
EapMessage ie_eap_message_tmp = {};
if ((decoded_result = ie_eap_message_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
decoded_size += decoded_result;
ie_eap_message = std::optional<EAP_Message>(ie_eap_message_tmp);
ie_eap_message = std::optional<EapMessage>(ie_eap_message_tmp);
octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI 0x%x", octet);
} break;
......
......@@ -50,8 +50,8 @@ class AuthenticationRequest : public NasMmPlainHeader {
std::optional<Authentication_Parameter_RAND>
ie_authentication_parameter_rand; // Optional
std::optional<Authentication_Parameter_AUTN>
ie_authentication_parameter_autn; // Optional
std::optional<EAP_Message> ie_eap_message; // Optional
ie_authentication_parameter_autn; // Optional
std::optional<EapMessage> ie_eap_message; // Optional
};
} // namespace nas
......
......@@ -69,7 +69,7 @@ bool AuthenticationResponse::getAuthenticationResponseParameter(bstring& para) {
//------------------------------------------------------------------------------
void AuthenticationResponse::setEAP_Message(bstring eap) {
ie_eap_message = new EAP_Message(0x78, eap);
ie_eap_message = new EapMessage(0x78, eap);
}
//------------------------------------------------------------------------------
......@@ -143,7 +143,7 @@ int AuthenticationResponse::Decode(
} break;
case 0x78: {
Logger::nas_mm().debug("Decoding IEI (0x78)");
ie_eap_message = new EAP_Message();
ie_eap_message = new EapMessage();
decoded_size += ie_eap_message->Decode(
buf + decoded_size, len - decoded_size, true);
octet = *(buf + decoded_size);
......
......@@ -48,7 +48,7 @@ class AuthenticationResponse {
public:
NasMmPlainHeader* plain_header;
Authentication_Response_Parameter* ie_authentication_response_parameter;
EAP_Message* ie_eap_message;
EapMessage* ie_eap_message;
};
} // namespace nas
......
......@@ -63,7 +63,7 @@ void AuthenticationResult::setABBA(uint8_t length, uint8_t* value) {
//------------------------------------------------------------------------------
void AuthenticationResult::setEAP_Message(bstring eap) {
ie_eap_message = new EAP_Message(0x00, eap);
ie_eap_message = new EapMessage(0x00, eap);
}
//------------------------------------------------------------------------------
......@@ -124,7 +124,7 @@ int AuthenticationResult::Decode(
buf + decoded_size, len - decoded_size, false,
false); // length 1/2, low position
decoded_size++; // 1/2 octet from ie_ngKSI, 1/2 from Spare half octet
ie_eap_message = new EAP_Message();
ie_eap_message = new EapMessage();
decoded_size +=
ie_eap_message->Decode(buf + decoded_size, len - decoded_size, false);
Logger::nas_mm().debug("Decoded_size (%d)", decoded_size);
......
......@@ -47,7 +47,7 @@ class AuthenticationResult {
public:
NasMmPlainHeader* plain_header;
NasKeySetIdentifier* ie_ngKSI;
EAP_Message* ie_eap_message;
EapMessage* ie_eap_message;
ABBA* ie_abba;
};
......
......@@ -233,7 +233,7 @@ void RegistrationAccept::setSOR_Transparent_Container(
//------------------------------------------------------------------------------
void RegistrationAccept::setEAP_Message(bstring eap) {
ie_eap_message = std::make_optional<EAP_Message>(0x78, eap);
ie_eap_message = std::make_optional<EapMessage>(0x78, eap);
}
//------------------------------------------------------------------------------
......@@ -832,10 +832,10 @@ int RegistrationAccept::Decode(uint8_t* buf, int len) {
} break;
case 0x78: {
Logger::nas_mm().debug("Decoding IEI (0x78)");
EAP_Message ie_eap_message_tmp = {};
EapMessage ie_eap_message_tmp = {};
decoded_size += ie_eap_message_tmp.Decode(
buf + decoded_size, len - decoded_size, true);
ie_eap_message = std::optional<EAP_Message>(ie_eap_message_tmp);
ie_eap_message = std::optional<EapMessage>(ie_eap_message_tmp);
octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
......
......@@ -175,7 +175,7 @@ class RegistrationAccept : public NasMmPlainHeader {
// TODO: Extended emergency number list
std::optional<SOR_Transparent_Container>
ie_sor_transparent_container; // Optional
std::optional<EAP_Message> ie_eap_message; // Optional
std::optional<EapMessage> ie_eap_message; // Optional
std::optional<NSSAI_Inclusion_Mode> ie_nssai_inclusion_mode; // Optional
// TODO: Operator-defined access category definitions
std::optional<_5GS_DRX_Parameters> ie_negotiated_drx_parameters; // Optional
......
......@@ -61,7 +61,7 @@ void RegistrationReject::setGPRS_Timer_2_3502(uint8_t value) {
//------------------------------------------------------------------------------
void RegistrationReject::setEAP_Message(bstring eap) {
ie_eap_message = std::make_optional<EAP_Message>(kIeiEapMessage, eap);
ie_eap_message = std::make_optional<EapMessage>(kIeiEapMessage, eap);
}
//------------------------------------------------------------------------------
......@@ -172,10 +172,10 @@ int RegistrationReject::Decode(
} break;
case kIeiEapMessage: {
Logger::nas_mm().debug("Decoding IEI 0x78: EAP Message");
EAP_Message ie_eap_message_tmp = {};
EapMessage ie_eap_message_tmp = {};
decoded_size += ie_eap_message_tmp.Decode(
buf + decoded_size, len - decoded_size, true);
ie_eap_message = std::optional<EAP_Message>(ie_eap_message_tmp);
ie_eap_message = std::optional<EapMessage>(ie_eap_message_tmp);
octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
......
......@@ -55,7 +55,7 @@ class RegistrationReject : public NasMmPlainHeader {
_5GMM_Cause ie_5gmm_cause; // Mandatory
std::optional<GprsTimer2> ie_T3346_value; // Optional
std::optional<GprsTimer2> ie_T3502_value; // Optional
std::optional<EAP_Message> ie_eap_message; // Optional
std::optional<EapMessage> ie_eap_message; // Optional
std::optional<Rejected_NSSAI> ie_rejected_nssai; // Release 16.4.1
};
......
......@@ -103,7 +103,7 @@ void SecurityModeCommand::setAdditional_5G_Security_Information(
//------------------------------------------------------------------------------
void SecurityModeCommand::setEAP_Message(bstring eap) {
ie_eap_message = new EAP_Message(0x78, eap);
ie_eap_message = new EapMessage(0x78, eap);
}
//------------------------------------------------------------------------------
......@@ -284,7 +284,7 @@ int SecurityModeCommand::Decode(
} break;
case 0x78: {
Logger::nas_mm().debug("decoding IEI (0x78)");
ie_eap_message = new EAP_Message();
ie_eap_message = new EapMessage();
decoded_size += ie_eap_message->Decode(
buf + decoded_size, len - decoded_size, true);
octet = *(buf + decoded_size);
......
......@@ -60,7 +60,7 @@ class SecurityModeCommand {
IMEISV_Request* ie_imeisv_request;
EPS_NAS_Security_Algorithms* ie_eps_nas_security_algorithms;
Additional_5G_Security_Information* ie_additional_5G_security_information;
EAP_Message* ie_eap_message;
EapMessage* ie_eap_message;
ABBA* ie_abba;
S1_UE_Security_Capability* ie_s1_ue_security_capability;
};
......
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