Commit a478167b authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Update NAS Message Container

parent c1fe24fb
......@@ -23,66 +23,99 @@
#include "3gpp_24.501.hpp"
#include "common_defs.h"
#include "Ie_Const.hpp"
#include "logger.hpp"
using namespace nas;
//------------------------------------------------------------------------------
NAS_Message_Container::NAS_Message_Container(uint8_t iei) : _value() {
_iei = iei;
length = 0;
NAS_Message_Container::NAS_Message_Container()
: Type6NasIe(kIeiNasMessageContainer), _value() {
SetLengthIndicator(0);
SetIeName(kNasMessageContainerIeName);
}
//------------------------------------------------------------------------------
NAS_Message_Container::NAS_Message_Container(const uint8_t iei, bstring value) {
_iei = iei;
NAS_Message_Container::NAS_Message_Container(bstring value)
: Type6NasIe(kIeiNasMessageContainer) {
_value = bstrcpy(value);
length = blength(value);
SetLengthIndicator(blength(value));
SetIeName(kNasMessageContainerIeName);
}
//------------------------------------------------------------------------------
NAS_Message_Container::NAS_Message_Container() : _iei(), length(), _value() {}
//------------------------------------------------------------------------------
NAS_Message_Container::~NAS_Message_Container() {}
//------------------------------------------------------------------------------
void NAS_Message_Container::setValue(uint8_t iei, uint8_t value) {
_iei = iei;
//_value = value;
}
//------------------------------------------------------------------------------
void NAS_Message_Container::getValue(bstring& value) {
void NAS_Message_Container::getValue(bstring& value) const {
value = bstrcpy(_value);
}
//------------------------------------------------------------------------------
int NAS_Message_Container::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding NAS_Message_Container IEI");
if (len < kNasMessageContainerMinimumLength) {
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 minimum length of this IE (%d octet)",
kNasMessageContainerMinimumLength);
"Size of the buffer is not enough to store this IE (IE len %d)",
ie_len);
return KEncodeDecodeError;
}
int encoded_size = 0;
if (_iei) {
ENCODE_U8(buf + encoded_size, _iei, encoded_size);
}
// Length
ENCODE_U16(buf + encoded_size, length, 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;
/*
Logger::nas_mm().debug("Encoding NAS_Message_Container IEI");
if (len < kNasMessageContainerMinimumLength) {
Logger::nas_mm().error(
"Buffer length is less than the minimum length of this IE (%d octet)",
kNasMessageContainerMinimumLength);
return KEncodeDecodeError;
}
int encoded_size = 0;
if (_iei) {
ENCODE_U8(buf + encoded_size, _iei, encoded_size);
}
// Length
ENCODE_U16(buf + encoded_size, length, encoded_size);
*/
// Value
int size = encode_bstring(_value, (buf + encoded_size), len - encoded_size);
encoded_size += size;
// Encode length
int encoded_len_ie = 0;
ENCODE_U16(buf + len_pos, encoded_size - GetHeaderLength(), encoded_len_ie);
Logger::nas_mm().debug(
"Encoded NAS_Message_Container (len %d)", encoded_size);
"Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size;
}
//------------------------------------------------------------------------------
int NAS_Message_Container::Decode(uint8_t* buf, int len, bool is_option) {
int NAS_Message_Container::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("Decoding EPS_NAS_Message_Container");
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();
/*
Logger::nas_mm().debug("Decoding NAS_Message_Container");
int decoded_size = 0;
if (is_option) {
......@@ -90,14 +123,17 @@ int NAS_Message_Container::Decode(uint8_t* buf, int len, bool is_option) {
}
// Length
DECODE_U16(buf + decoded_size, length, decoded_size);
*/
// Value
decode_bstring(&_value, length, (buf + decoded_size), len - decoded_size);
decoded_size += length;
for (int i = 0; i < length; i++) {
decode_bstring(&_value, 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 NAS_Message_Container value 0x%x", (uint8_t) _value->data[i]);
}
Logger::nas_mm().debug(
"Decoded NAS_Message_Container (len %d)", decoded_size);
"Decoded EPS_NAS_Message_Container (len %d)", decoded_size);
return decoded_size;
}
......@@ -19,8 +19,10 @@
* contact@openairinterface.org
*/
#ifndef _NAS_Message_Container_H_
#define _NAS_Message_Container_H_
#ifndef _NAS_MESSAGE_CONTAINER_H_
#define _NAS_MESSAGE_CONTAINER_H_
#include "Type6NasIe.hpp"
#include <stdint.h>
extern "C" {
......@@ -31,23 +33,22 @@ extern "C" {
constexpr uint8_t kNasMessageContainerMinimumLength = 3;
constexpr uint32_t kNasMessageContainerMaximumLength = 65535;
constexpr auto kNasMessageContainerIeName = "NAS Message Container";
namespace nas {
class NAS_Message_Container {
class NAS_Message_Container : Type6NasIe {
public:
NAS_Message_Container();
NAS_Message_Container(uint8_t iei);
NAS_Message_Container(const uint8_t iei, bstring value);
NAS_Message_Container(bstring value);
~NAS_Message_Container();
void setValue(uint8_t iei, uint8_t value);
void getValue(bstring& value) const;
int Encode(uint8_t* buf, int len);
int Decode(uint8_t* buf, int len, bool is_option);
void getValue(bstring& value);
private:
uint8_t _iei;
uint16_t length;
bstring _value;
};
......
......@@ -498,8 +498,7 @@ bool RegistrationRequest::get5GSUpdateType(
//------------------------------------------------------------------------------
void RegistrationRequest::setNAS_Message_Container(bstring value) {
ie_nas_message_container =
std::make_optional<NAS_Message_Container>(kIeiNasMessageContainer, value);
ie_nas_message_container = std::make_optional<NAS_Message_Container>(value);
}
//------------------------------------------------------------------------------
......
......@@ -62,7 +62,7 @@ void SecurityModeComplete::SetImeisv(IMEISV_t imeisv) {
//------------------------------------------------------------------------------
void SecurityModeComplete::setNAS_Message_Container(bstring value) {
ie_nas_message_container = new NAS_Message_Container(0x71, value);
ie_nas_message_container = new NAS_Message_Container(value);
}
//------------------------------------------------------------------------------
......
......@@ -89,7 +89,7 @@ void ServiceRequest::setAllowed_PDU_Session_Status(uint16_t value) {
//------------------------------------------------------------------------------
void ServiceRequest::setNAS_Message_Container(bstring value) {
ie_nas_message_container = new NAS_Message_Container(0x71, value);
ie_nas_message_container = new NAS_Message_Container(value);
}
//------------------------------------------------------------------------------
......
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