Commit 414f19d6 authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Update DNN

parent 3397bfc4
...@@ -98,7 +98,7 @@ int AuthenticationResponseParameter::Decode( ...@@ -98,7 +98,7 @@ int AuthenticationResponseParameter::Decode(
decoded_size += decoded_header_size; decoded_size += decoded_header_size;
// RES or RES* // RES or RES*
uint16_t ie_len = GetLengthIndicator(); uint8_t ie_len = GetLengthIndicator();
decode_bstring( decode_bstring(
&res_or_res_star_, ie_len, (buf + decoded_size), len - decoded_size); &res_or_res_star_, ie_len, (buf + decoded_size), len - decoded_size);
decoded_size += ie_len; decoded_size += ie_len;
......
...@@ -19,82 +19,90 @@ ...@@ -19,82 +19,90 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "DNN.hpp" #include "DNN.hpp"
#include "logger.hpp" #include "logger.hpp"
using namespace nas; using namespace nas;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
DNN::DNN(uint8_t iei) : _DNN() { DNN::DNN() : Type4NasIe(kIeiDnn), _DNN() {
_iei = iei; SetLengthIndicator(1);
length = 0; SetIeName(kDnnIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
DNN::DNN(const uint8_t iei, bstring dnn) { DNN::DNN(bstring dnn) : Type4NasIe(kIeiDnn) {
_iei = iei;
_DNN = bstrcpy(dnn); _DNN = bstrcpy(dnn);
length = blength(dnn) + 2; SetLengthIndicator(blength(dnn));
SetIeName(kDnnIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
DNN::DNN() : _iei(), _DNN(), length() {} DNN::~DNN() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
DNN::~DNN() {} void DNN::SetValue(const bstring& dnn) {
_DNN = bstrcpy(dnn);
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DNN::getValue(bstring& dnn) { void DNN::GetValue(bstring& dnn) const {
dnn = blk2bstr((uint8_t*) bdata(_DNN) + 1, blength(_DNN) - 1); dnn = bstrcpy(_DNN);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int DNN::Encode(uint8_t* buf, int len) { int DNN::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding DNN IEI (0x%x)", _iei); Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
if (len < length) { int ie_len = GetIeLength();
Logger::nas_mm().error("len is less than %d", length);
return 0; if (len < ie_len) {
Logger::nas_mm().error("Len is less than %d", ie_len);
return KEncodeDecodeError;
} }
int encoded_size = 0; int encoded_size = 0;
if (_iei) { // IEI and Length
*(buf + encoded_size) = _iei; int encoded_header_size = Type4NasIe::Encode(buf + encoded_size, len);
encoded_size++; if (encoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
*(buf + encoded_size) = (length - 2); encoded_size += encoded_header_size;
encoded_size++;
int size = encode_bstring(_DNN, (buf + encoded_size), len - encoded_size);
encoded_size += size;
} else { // Value
*(buf + encoded_size) = (length - 1);
encoded_size++;
int size = encode_bstring(_DNN, (buf + encoded_size), len - encoded_size); int size = encode_bstring(_DNN, (buf + encoded_size), len - encoded_size);
encoded_size += size; encoded_size += size;
}
Logger::nas_mm().debug("encoded DNN len: %d", encoded_size); Logger::nas_mm().debug(
"Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int DNN::Decode(uint8_t* buf, int len, bool is_option) { int DNN::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("Decoding DNN IEI (0x%x)", *buf); if (len < kDnnMinimumLength) {
int decoded_size = 0; Logger::nas_mm().error(
if (is_option) { "Buffer length is less than the minimum length of this IE (%d octet)",
decoded_size++; kDnnMinimumLength);
return KEncodeDecodeError;
} }
length = *(buf + decoded_size);
decoded_size++; uint8_t decoded_size = 0;
decode_bstring(&_DNN, length, (buf + decoded_size), len - decoded_size); uint8_t octet = 0;
decoded_size += length; Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
for (int i = 0; i < blength(_DNN); i++) {
Logger::nas_mm().debug("Decoded DNN value: 0x%x", (uint8_t) bdata(_DNN)[i]); // IEI and Length
int decoded_header_size = Type4NasIe::Decode(buf + decoded_size, len, is_iei);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
// DNN
uint8_t ie_len = GetLengthIndicator();
decode_bstring(&_DNN, 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 value 0x%x", (uint8_t) _DNN->data[i]);
} }
Logger::nas_mm().debug("Decoded DNN len: %d", decoded_size);
Logger::nas_mm().debug(
"Decoded %s, len (%d)", GetIeName().c_str(), decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -19,39 +19,30 @@ ...@@ -19,39 +19,30 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef __DNN_H_ #ifndef __DNN_H_
#define __DNN_H_ #define __DNN_H_
#include <stdint.h>
#include "Type4NasIe.hpp"
#include <iostream>
extern "C" { constexpr uint8_t kDnnMinimumLength = 3;
#include "TLVDecoder.h" constexpr uint8_t kDnnMaximumLength = 102;
#include "TLVEncoder.h" constexpr auto kDnnIeName = "DNN";
#include "bstrlib.h"
}
namespace nas { namespace nas {
class DNN { class DNN : public Type4NasIe {
public: public:
DNN(); DNN();
DNN(uint8_t iei); DNN(bstring dnn);
DNN(const uint8_t iei, bstring dnn);
~DNN(); ~DNN();
// void setValue(uint8_t iei, uint8_t value);
int Encode(uint8_t* buf, int len); 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_option);
void getValue(bstring& dnn);
void SetValue(const bstring& dnn);
void GetValue(bstring& dnn) const;
private: private:
uint8_t _iei;
uint8_t length;
bstring _DNN; bstring _DNN;
}; };
......
...@@ -138,13 +138,13 @@ bool ULNASTransport::GetSNssai(SNSSAI_s& snssai) { ...@@ -138,13 +138,13 @@ bool ULNASTransport::GetSNssai(SNSSAI_s& snssai) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void ULNASTransport::setDNN(bstring dnn) { void ULNASTransport::setDNN(bstring dnn) {
ie_dnn = std::make_optional<DNN>(0x25, dnn); ie_dnn = std::make_optional<DNN>(dnn);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
bool ULNASTransport::getDnn(bstring& dnn) { bool ULNASTransport::getDnn(bstring& dnn) {
if (ie_dnn.has_value()) { if (ie_dnn.has_value()) {
ie_dnn.value().getValue(dnn); ie_dnn.value().GetValue(dnn);
return true; return true;
} else { } else {
return false; return false;
......
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