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

Update DL NAS Transport

parent 1987179c
...@@ -96,12 +96,11 @@ Payload_Container::Payload_Container( ...@@ -96,12 +96,11 @@ Payload_Container::Payload_Container(
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Payload_Container::~Payload_Container() {} Payload_Container::~Payload_Container() {}
/*
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void Payload_Container::setValue(uint8_t iei, uint8_t value) { void Payload_Container::SetValue(const bstring& cnt) {
_iei = iei; content = std::optional<bstring>(cnt);
SetLengthIndicator(blength(cnt));
} }
*/
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void Payload_Container::SetValue( void Payload_Container::SetValue(
......
...@@ -55,9 +55,11 @@ class Payload_Container : Type6NasIe { ...@@ -55,9 +55,11 @@ class Payload_Container : Type6NasIe {
int Encode(uint8_t* buf, int len, uint8_t type); int Encode(uint8_t* buf, int len, uint8_t type);
int Decode(uint8_t* buf, int len, bool is_iei, uint8_t type); int Decode(uint8_t* buf, int len, bool is_iei, uint8_t type);
void SetValue(const bstring& cnt);
bool GetValue(bstring& cnt) const;
void SetValue(const std::vector<PayloadContainerEntry>& content); void SetValue(const std::vector<PayloadContainerEntry>& content);
bool GetValue(std::vector<PayloadContainerEntry>& content) const; bool GetValue(std::vector<PayloadContainerEntry>& content) const;
bool GetValue(bstring& cnt) const;
private: private:
std::optional<bstring> content; std::optional<bstring> content;
......
...@@ -28,14 +28,12 @@ ...@@ -28,14 +28,12 @@
using namespace nas; using namespace nas;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
DLNASTransport::DLNASTransport() { DLNASTransport::DLNASTransport()
plain_header = NULL; : NasMmPlainHeader(EPD_5GS_MM_MSG, DL_NAS_TRANSPORT) {
ie_payload_container_type = NULL; ie_pdu_session_identity_2 = std::nullopt;
ie_payload_container = NULL; ie_additional_information = std::nullopt;
ie_pdu_session_identity_2 = NULL; ie_5gmm_cause = std::nullopt;
ie_additional_information = NULL; ie_back_off_timer_value = std::nullopt;
ie_5gmm_cause = NULL;
ie_back_off_timer_value = NULL;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -43,178 +41,228 @@ DLNASTransport::~DLNASTransport() {} ...@@ -43,178 +41,228 @@ DLNASTransport::~DLNASTransport() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DLNASTransport::SetHeader(uint8_t security_header_type) { void DLNASTransport::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, DL_NAS_TRANSPORT);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DLNASTransport::SetPayloadContainerType(uint8_t value) { void DLNASTransport::SetPayloadContainerType(uint8_t value) {
ie_payload_container_type = new PayloadContainerType(value); ie_payload_container_type.SetValue(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DLNASTransport::SetPayloadContainer( void DLNASTransport::SetPayloadContainer(
std::vector<PayloadContainerEntry> content) { std::vector<PayloadContainerEntry> content) {
ie_payload_container = new Payload_Container(content); ie_payload_container.SetValue(content);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DLNASTransport::SetPayloadContainer(uint8_t* buf, int len) { void DLNASTransport::SetPayloadContainer(uint8_t* buf, int len) {
bstring b = blk2bstr(buf, len); bstring b = blk2bstr(buf, len);
ie_payload_container = new Payload_Container(b); ie_payload_container.SetValue(b);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DLNASTransport::SetPduSessionId(uint8_t value) { void DLNASTransport::SetPduSessionId(uint8_t value) {
ie_pdu_session_identity_2 = new PduSessionIdentity2(0x12, value); ie_pdu_session_identity_2 =
std::make_optional<PduSessionIdentity2>(0x12, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DLNASTransport::SetAdditionalInformation(const bstring& value) { void DLNASTransport::SetAdditionalInformation(const bstring& value) {
ie_additional_information = new AdditionalInformation(value); ie_additional_information = std::make_optional<AdditionalInformation>(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DLNASTransport::Set5gmmCause(uint8_t value) { void DLNASTransport::Set5gmmCause(uint8_t value) {
ie_5gmm_cause = new _5GMM_Cause(0x58, value); ie_5gmm_cause = std::make_optional<_5GMM_Cause>(0x58, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void DLNASTransport::SetBackOffTimerValue(uint8_t unit, uint8_t value) { void DLNASTransport::SetBackOffTimerValue(uint8_t unit, uint8_t value) {
ie_back_off_timer_value = new GprsTimer3(0x37, unit, value); ie_back_off_timer_value = std::make_optional<GprsTimer3>(0x37, unit, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int DLNASTransport::Encode(uint8_t* buf, int len) { int DLNASTransport::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding DLNASTransport message"); Logger::nas_mm().debug("Encoding DLNASTransport message");
int encoded_size = 0;
if (!plain_header) { int encoded_size = 0;
Logger::nas_mm().error("Mandatory IE missing Header"); int encoded_ie_size = 0;
return 0;
// Header
if ((encoded_ie_size = NasMmPlainHeader::Encode(buf, len)) ==
KEncodeDecodeError) {
Logger::nas_mm().error("Encoding NAS Header error");
return KEncodeDecodeError;
} }
if (!(plain_header->Encode(buf, len))) return 0; encoded_size += encoded_ie_size;
encoded_size += 3;
if (!ie_payload_container_type) { // Payload container type
Logger::nas_mm().warn("IE ie_payload_container_type is not available"); int size =
} else { ie_payload_container_type.Encode(buf + encoded_size, len - encoded_size);
int size = ie_payload_container_type->Encode( if (size == KEncodeDecodeError) {
buf + encoded_size, len - encoded_size); Logger::nas_mm().error("Encoding ie_payload_container_type error");
if (size == KEncodeDecodeError) { return KEncodeDecodeError;
Logger::nas_mm().error("Encoding ie_payload_container_type error");
return 0;
}
if (size == 0)
size++; // 1/2 octet for ie_payload_container_type, 1/2 octet for spare
encoded_size += size;
} }
if (!ie_payload_container or !ie_payload_container_type) { if (size == 0)
Logger::nas_mm().warn("IE ie_payload_container is not available"); size++; // 1/2 octet for ie_payload_container_type, 1/2 octet for spare
encoded_size += size;
// Payload container
size = ie_payload_container.Encode(
buf + encoded_size, len - encoded_size,
ie_payload_container_type.GetValue());
if (size != KEncodeDecodeError) {
encoded_size += size;
} else { } else {
if (int size = ie_payload_container->Encode( Logger::nas_mm().error("Encoding ie_payload_container error");
buf + encoded_size, len - encoded_size, return KEncodeDecodeError;
ie_payload_container_type->GetValue())) {
encoded_size += size;
} else {
Logger::nas_mm().error("Encoding ie_payload_container error");
return 0;
}
} }
if (!ie_pdu_session_identity_2) {
// PDU session ID
if (!ie_pdu_session_identity_2.has_value()) {
Logger::nas_mm().warn("IE ie_pdu_session_identity_2 is not available"); Logger::nas_mm().warn("IE ie_pdu_session_identity_2 is not available");
} else { } else {
if (int size = ie_pdu_session_identity_2->Encode( size = ie_pdu_session_identity_2->Encode(
buf + encoded_size, len - encoded_size)) { buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size; encoded_size += size;
} else { } else {
Logger::nas_mm().error("Encoding IE ie_pdu_session_identity_2 error"); Logger::nas_mm().error("Encoding IE ie_pdu_session_identity_2 error");
return 0; return KEncodeDecodeError;
} }
} }
if (!ie_additional_information) {
// Additional information
if (!ie_additional_information.has_value()) {
Logger::nas_mm().warn("IE ie_additional_information is not available"); Logger::nas_mm().warn("IE ie_additional_information is not available");
} else { } else {
if (int size = ie_additional_information->Encode( size = ie_additional_information->Encode(
buf + encoded_size, len - encoded_size)) { buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size; encoded_size += size;
} else { } else {
Logger::nas_mm().error("Encoding IE ie_additional_information error"); Logger::nas_mm().error("Encoding IE ie_additional_information error");
return 0; return KEncodeDecodeError;
} }
} }
if (!ie_5gmm_cause) {
// 5GMM cause
if (!ie_5gmm_cause.has_value()) {
Logger::nas_mm().warn("IE ie_5gmm_cause is not available"); Logger::nas_mm().warn("IE ie_5gmm_cause is not available");
} else { } else {
if (int size = size = ie_5gmm_cause->Encode(buf + encoded_size, len - encoded_size);
ie_5gmm_cause->Encode(buf + encoded_size, len - encoded_size)) { if (size != KEncodeDecodeError) {
encoded_size += size; encoded_size += size;
} else { } else {
Logger::nas_mm().error("Encoding ie_5gmm_cause error"); Logger::nas_mm().error("Encoding ie_5gmm_cause error");
return KEncodeDecodeError;
} }
} }
if (!ie_back_off_timer_value) {
// Back-off timer value
if (!ie_back_off_timer_value.has_value()) {
Logger::nas_mm().warn("IE ie_back_off_timer_value is not available"); Logger::nas_mm().warn("IE ie_back_off_timer_value is not available");
} else { } else {
if (int size = ie_back_off_timer_value->Encode( size =
buf + encoded_size, len - encoded_size)) { ie_back_off_timer_value->Encode(buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size; encoded_size += size;
} else { } else {
Logger::nas_mm().error("Encoding ie_back_off_timer_value error"); Logger::nas_mm().error("Encoding ie_back_off_timer_value error");
return 0; return KEncodeDecodeError;
} }
} }
Logger::nas_mm().debug( Logger::nas_mm().debug(
"Encoded DLNASTransport message len (%d)", encoded_size); "Encoded DLNASTransport message len (%d)", encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int DLNASTransport::Decode(NasMmPlainHeader* header, uint8_t* buf, int len) { int DLNASTransport::Decode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Decoding DLNASTransport message"); Logger::nas_mm().debug("Decoding DLNASTransport message");
int decoded_size = 3;
plain_header = header; int decoded_size = 0;
ie_payload_container_type = new PayloadContainerType(); int decoded_result = 0;
decoded_size += ie_payload_container_type->Decode(
// Header
decoded_result = NasMmPlainHeader::Decode(buf, len);
if (decoded_result == KEncodeDecodeError) {
Logger::nas_mm().error("Decoding NAS Header error");
return KEncodeDecodeError;
}
decoded_size += decoded_result;
// Payload container type
decoded_size += ie_payload_container_type.Decode(
buf + decoded_size, len - decoded_size, false); buf + decoded_size, len - decoded_size, false);
decoded_size++; // 1/2 octet for PayloadContainerType, 1/2 octet for spare decoded_size++; // 1/2 octet for PayloadContainerType, 1/2 octet for spare
ie_payload_container = new Payload_Container();
decoded_size += ie_payload_container->Decode( // Payload container
decoded_size += ie_payload_container.Decode(
buf + decoded_size, len - decoded_size, false, buf + decoded_size, len - decoded_size, false,
N1_SM_INFORMATION); // TODO: verified Typeb of Payload Container N1_SM_INFORMATION); // TODO: verified Typeb of Payload Container
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);
Logger::nas_mm().debug("First option IEI (0x%x)", octet); Logger::nas_mm().debug("First option IEI (0x%x)", octet);
while ((octet != 0x0)) { while ((octet != 0x0)) {
switch (octet) { switch (octet) {
case 0x12: { case kIeiPduSessionId: {
Logger::nas_mm().debug("Decoding IEI (0x12)"); Logger::nas_mm().debug("Decoding IEI (0x12)");
ie_pdu_session_identity_2 = new PduSessionIdentity2(); PduSessionIdentity2 ie_pdu_session_identity_2_tmp = {};
decoded_size += ie_pdu_session_identity_2->Decode( if ((decoded_result = ie_pdu_session_identity_2_tmp.Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
decoded_size += decoded_result;
ie_pdu_session_identity_2 =
std::optional<PduSessionIdentity2>(ie_pdu_session_identity_2_tmp);
octet = *(buf + decoded_size); octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI (0x%x)", octet); Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break; } break;
case 0x24: { case kIeiAdditionalInformation: {
Logger::nas_mm().debug("Decoding IEI (0x24)"); Logger::nas_mm().debug("Decoding IEI (0x24)");
ie_additional_information = new AdditionalInformation(); AdditionalInformation ie_additional_information_tmp = {};
decoded_size += ie_additional_information->Decode( if ((decoded_result = ie_additional_information_tmp.Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
decoded_size += decoded_result;
ie_additional_information =
std::optional<AdditionalInformation>(ie_additional_information_tmp);
octet = *(buf + decoded_size); octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI (0x%x)", octet); Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break; } break;
case 0x58: { case kIei5gmmCause: {
Logger::nas_mm().debug("Decoding IEI (0x58)"); Logger::nas_mm().debug("Decoding IEI (0x58)");
ie_5gmm_cause = new _5GMM_Cause();
decoded_size += _5GMM_Cause ie_5gmm_cause_tmp = {};
ie_5gmm_cause->Decode(buf + decoded_size, len - decoded_size, true); if ((decoded_result = ie_5gmm_cause_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
decoded_size += decoded_result;
ie_5gmm_cause = std::optional<_5GMM_Cause>(ie_5gmm_cause_tmp);
octet = *(buf + decoded_size); octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI (0x%x)", octet); Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break; } break;
case 0x37: { case kIeiGprsTimer3BackOffTimer: {
Logger::nas_mm().debug("Decoding IEI (0x37)"); Logger::nas_mm().debug("Decoding IEI (0x37)");
ie_back_off_timer_value = new GprsTimer3(kIeiGprsTimer3BackOffTimer);
decoded_size += ie_back_off_timer_value->Decode( GprsTimer3 ie_back_off_timer_value_tmp(kIeiGprsTimer3BackOffTimer);
buf + decoded_size, len - decoded_size, true); if ((decoded_result = ie_back_off_timer_value_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
decoded_size += decoded_result;
ie_back_off_timer_value =
std::optional<GprsTimer3>(ie_back_off_timer_value_tmp);
octet = *(buf + decoded_size); octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI (0x%x)", octet); Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break; } break;
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
namespace nas { namespace nas {
class DLNASTransport { class DLNASTransport : public NasMmPlainHeader {
public: public:
DLNASTransport(); DLNASTransport();
~DLNASTransport(); ~DLNASTransport();
...@@ -34,7 +34,7 @@ class DLNASTransport { ...@@ -34,7 +34,7 @@ class DLNASTransport {
void SetHeader(uint8_t security_header_type); void SetHeader(uint8_t security_header_type);
int Encode(uint8_t* buf, int len); int Encode(uint8_t* buf, int len);
int Decode(NasMmPlainHeader* header, uint8_t* buf, int len); int Decode(uint8_t* buf, int len);
void SetPayloadContainerType(uint8_t value); void SetPayloadContainerType(uint8_t value);
...@@ -42,18 +42,24 @@ class DLNASTransport { ...@@ -42,18 +42,24 @@ class DLNASTransport {
void SetPayloadContainer(uint8_t* buf, int len); void SetPayloadContainer(uint8_t* buf, int len);
void SetPduSessionId(uint8_t value); void SetPduSessionId(uint8_t value);
// TODO: Get
void SetAdditionalInformation(const bstring& value); void SetAdditionalInformation(const bstring& value);
// TODO: Get
void Set5gmmCause(uint8_t value); void Set5gmmCause(uint8_t value);
// TODO: Get
void SetBackOffTimerValue(uint8_t unit, uint8_t value); void SetBackOffTimerValue(uint8_t unit, uint8_t value);
// TODO: Get
public: public:
NasMmPlainHeader* plain_header; PayloadContainerType ie_payload_container_type; // Mandatory
PayloadContainerType* ie_payload_container_type; Payload_Container ie_payload_container; // Mandatory
Payload_Container* ie_payload_container; std::optional<PduSessionIdentity2> ie_pdu_session_identity_2; // Optional
PduSessionIdentity2* ie_pdu_session_identity_2; std::optional<AdditionalInformation> ie_additional_information; // Optional
AdditionalInformation* ie_additional_information; std::optional<_5GMM_Cause> ie_5gmm_cause; // Optional
_5GMM_Cause* ie_5gmm_cause; std::optional<GprsTimer3> ie_back_off_timer_value; // Optional
GprsTimer3* ie_back_off_timer_value;
}; };
} // namespace nas } // namespace nas
......
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