Cleanup and other fixes to decode_registration_accept
* adopt byte array * add check on minimum buffer length * improve comments * remove call to LOG utility functions * replace magic numbers with defines * refined includes
This commit is contained in:
@@ -33,13 +33,11 @@
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "conversions.h"
|
||||
#include "TLVEncoder.h"
|
||||
#include "TLVDecoder.h"
|
||||
#include "RegistrationAccept.h"
|
||||
#include "assertions.h"
|
||||
#include "fgs_nas_utils.h"
|
||||
#include "common/utils/utils.h"
|
||||
#include "ds/byte_array.h"
|
||||
#include "fgmm_lib.h"
|
||||
|
||||
#define IEI_5G_GUTI 0x77
|
||||
#define FGS_REGISTRATION_RESULT_LEN 2
|
||||
@@ -128,56 +126,65 @@ static int decode_nssai_ie(nr_nas_msg_snssai_t *nssai, const uint8_t *buf)
|
||||
return decoded;
|
||||
}
|
||||
|
||||
int decode_registration_accept(registration_accept_msg *registration_accept, const uint8_t *buffer, uint32_t len)
|
||||
size_t decode_registration_accept(registration_accept_msg *registration_accept, const byte_array_t buffer)
|
||||
{
|
||||
int dec = 0;
|
||||
const uint8_t *end = buffer + len;
|
||||
byte_array_t ba = buffer; // local copy of buffer
|
||||
|
||||
if (ba.len < REGISTRATION_ACCEPT_MIN_LEN) {
|
||||
PRINT_NAS_ERROR("Registration Accept decoding failed: invalid buffer length\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 5GS registration result (Mandatory)
|
||||
byte_array_t ba = {.buf = buffer, .len = len};
|
||||
if ((dec = decode_fgs_registration_result(registration_accept, ba)) < 0)
|
||||
return dec;
|
||||
buffer += dec;
|
||||
return -1;
|
||||
UPDATE_BYTE_ARRAY(ba, dec);
|
||||
|
||||
if (buffer < end && *buffer == IEI_5G_GUTI) {
|
||||
// 5G-GUTI (Optional)
|
||||
if (ba.len > 0 && ba.buf[0] == IEI_5G_GUTI) {
|
||||
registration_accept->guti = calloc_or_fail(1, sizeof(*registration_accept->guti));
|
||||
if ((dec = decode_5gs_mobile_identity(registration_accept->guti, IEI_5G_GUTI, buffer, end - buffer)) < 0) {
|
||||
if ((dec = decode_5gs_mobile_identity(registration_accept->guti, IEI_5G_GUTI, ba.buf, ba.len)) < 0) {
|
||||
PRINT_NAS_ERROR("Failed to decode 5GS Mobile Identity in Registration Accept\n");
|
||||
return -1;
|
||||
}
|
||||
buffer += dec;
|
||||
UPDATE_BYTE_ARRAY(ba, dec);
|
||||
}
|
||||
|
||||
// Allowed NSSAI (O)
|
||||
/* Optional Presence IEs */
|
||||
while (buffer < end) {
|
||||
const int iei = *buffer++;
|
||||
// Decode other Optional IEs
|
||||
while (ba.len > 0) {
|
||||
uint8_t iei = ba.buf[0];
|
||||
UPDATE_BYTE_ARRAY(ba, 1);
|
||||
|
||||
switch (iei) {
|
||||
|
||||
case 0x15: // allowed NSSAI
|
||||
dec = decode_nssai_ie(registration_accept->nas_allowed_nssai, buffer);
|
||||
buffer += dec;
|
||||
dec = decode_nssai_ie(registration_accept->nas_allowed_nssai, ba.buf);
|
||||
UPDATE_BYTE_ARRAY(ba, dec);
|
||||
break;
|
||||
|
||||
case 0x31: // configured NSSAI
|
||||
dec = decode_nssai_ie(registration_accept->config_nssai, buffer);
|
||||
buffer += dec;
|
||||
dec = decode_nssai_ie(registration_accept->config_nssai, ba.buf);
|
||||
UPDATE_BYTE_ARRAY(ba, dec);
|
||||
break;
|
||||
|
||||
default:
|
||||
dec = *buffer++; // content length + 1 byte (Length IE)
|
||||
buffer += dec;
|
||||
dec = ba.buf[0] + 1; // content length + 1 byte (Length IE)
|
||||
UPDATE_BYTE_ARRAY(ba, dec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return len;
|
||||
if(ba.len != 0) {
|
||||
PRINT_NAS_ERROR("Failed to decode registration accept: ba.len = %ld\n", ba.len);
|
||||
return -1;
|
||||
}
|
||||
return buffer.len;
|
||||
}
|
||||
|
||||
int encode_registration_accept(const registration_accept_msg *registration_accept, uint8_t *buffer, uint32_t len)
|
||||
{
|
||||
int encoded = 0;
|
||||
|
||||
LOG_FUNC_IN;
|
||||
byte_array_t ba = {.buf = buffer, .len = len};
|
||||
encoded += encode_fgs_registration_result(ba, registration_accept);
|
||||
|
||||
@@ -188,6 +195,5 @@ int encode_registration_accept(const registration_accept_msg *registration_accep
|
||||
encoded += mi_enc;
|
||||
}
|
||||
|
||||
// todo ,Encoding optional fields
|
||||
LOG_FUNC_RETURN(encoded);
|
||||
return encoded;
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "SecurityHeaderType.h"
|
||||
#include "MessageType.h"
|
||||
#include "FGSMobileIdentity.h"
|
||||
#include "ds/byte_array.h"
|
||||
|
||||
#ifndef REGISTRATION_ACCEPT_H_
|
||||
#define REGISTRATION_ACCEPT_H_
|
||||
@@ -45,6 +46,8 @@ typedef enum {
|
||||
FGS_REGISTRATION_RESULT_3GPP_AND_NON_3GPP = 3
|
||||
} fgs_registration_result_t;
|
||||
|
||||
#define NAS_MAX_NUMBER_SLICES 8
|
||||
|
||||
// 9.11.3.37 of 3GPP TS 24.501
|
||||
typedef struct {
|
||||
int sst;
|
||||
@@ -66,13 +69,13 @@ typedef struct registration_accept_msg_tag {
|
||||
bool sms_allowed;
|
||||
// 5G-GUTI (Optional)
|
||||
FGSMobileIdentity *guti;
|
||||
// Allowed NSSAI (O)
|
||||
nr_nas_msg_snssai_t nas_allowed_nssai[8];
|
||||
// Configured NSSAI (O)
|
||||
nr_nas_msg_snssai_t config_nssai[8];
|
||||
// Allowed NSSAI (Optional)
|
||||
nr_nas_msg_snssai_t nas_allowed_nssai[NAS_MAX_NUMBER_SLICES];
|
||||
// Configured NSSAI (Optional)
|
||||
nr_nas_msg_snssai_t config_nssai[NAS_MAX_NUMBER_SLICES];
|
||||
} registration_accept_msg;
|
||||
|
||||
int decode_registration_accept(registration_accept_msg *registrationaccept, const uint8_t *buffer, uint32_t len);
|
||||
size_t decode_registration_accept(registration_accept_msg *registrationaccept, const byte_array_t buffer);
|
||||
|
||||
int encode_registration_accept(const registration_accept_msg *registrationaccept, uint8_t *buffer, uint32_t len);
|
||||
|
||||
|
||||
@@ -1460,7 +1460,8 @@ static void handle_registration_accept(nr_ue_nas_t *nas, const uint8_t *pdu_buff
|
||||
}
|
||||
pdu_buffer += decoded;
|
||||
// plain payload
|
||||
if ((decoded = decode_registration_accept(&msg, pdu_buffer, end - pdu_buffer)) < 0) {
|
||||
const byte_array_t ba = {.buf = (uint8_t *)pdu_buffer, .len = end - pdu_buffer};
|
||||
if ((decoded = decode_registration_accept(&msg, ba)) < 0) {
|
||||
LOG_E(NAS, "Failed to decode NAS Registration Accept\n");
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user