Add NAS 5GS header decoding functions
This commit is contained in:
@@ -301,5 +301,8 @@ typedef struct {
|
|||||||
int mm_msg_encode(const fgmm_nas_message_plain_t *mm_msg, uint8_t *buffer, uint32_t len);
|
int mm_msg_encode(const fgmm_nas_message_plain_t *mm_msg, uint8_t *buffer, uint32_t len);
|
||||||
int nas_protected_security_header_encode(uint8_t *buffer, const fgs_nas_message_security_header_t *header, int length);
|
int nas_protected_security_header_encode(uint8_t *buffer, const fgs_nas_message_security_header_t *header, int length);
|
||||||
int _nas_mm_msg_encode_header(const fgmm_msg_header_t *header, uint8_t *buffer, uint32_t len);
|
int _nas_mm_msg_encode_header(const fgmm_msg_header_t *header, uint8_t *buffer, uint32_t len);
|
||||||
|
uint8_t decode_5gmm_msg_header(fgmm_msg_header_t *mm_header, const uint8_t *buffer, uint32_t len);
|
||||||
|
uint8_t decode_5gsm_msg_header(fgsm_msg_header_t *sm_header, const uint8_t *buffer, uint32_t len);
|
||||||
|
int decode_5gs_security_protected_header(fgs_nas_message_security_header_t *header, const uint8_t *buf, uint32_t len);
|
||||||
|
|
||||||
#endif // NR_NAS_DEFS_H
|
#endif // NR_NAS_DEFS_H
|
||||||
|
|||||||
@@ -132,3 +132,57 @@ int nas_protected_security_header_encode(uint8_t *buffer, const fgs_nas_message_
|
|||||||
|
|
||||||
LOG_FUNC_RETURN(size);
|
LOG_FUNC_RETURN(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decode plain 5GMM header from buffer and return fgmm_msg_header_t instance
|
||||||
|
*/
|
||||||
|
uint8_t decode_5gmm_msg_header(fgmm_msg_header_t *mm_header, const uint8_t *buffer, uint32_t len)
|
||||||
|
{
|
||||||
|
if (len < sizeof(fgmm_msg_header_t)) {
|
||||||
|
PRINT_NAS_ERROR("Failed to decode plain 5GMM header: buffer length too short\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
mm_header->ex_protocol_discriminator = *buffer++;
|
||||||
|
mm_header->security_header_type = *buffer++;
|
||||||
|
mm_header->message_type = *buffer++;
|
||||||
|
return sizeof(*mm_header);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decode plain 5GSM header from buffer and return fgsm_msg_header_t instance
|
||||||
|
*/
|
||||||
|
uint8_t decode_5gsm_msg_header(fgsm_msg_header_t *sm_header, const uint8_t *buffer, uint32_t len)
|
||||||
|
{
|
||||||
|
if (len < sizeof(fgsm_msg_header_t)) {
|
||||||
|
PRINT_NAS_ERROR("Failed to decode plain 5GSM header: buffer length too short\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sm_header->ex_protocol_discriminator = *buffer++;
|
||||||
|
sm_header->pdu_session_id = *buffer++;
|
||||||
|
sm_header->pti = *buffer++;
|
||||||
|
sm_header->message_type = *buffer++;
|
||||||
|
return sizeof(*sm_header);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decode security protected 5GS header from buffer and return fgs_nas_message_security_header_t instance
|
||||||
|
*/
|
||||||
|
int decode_5gs_security_protected_header(fgs_nas_message_security_header_t *header, const uint8_t *buf, uint32_t len)
|
||||||
|
{
|
||||||
|
int decoded = 0;
|
||||||
|
if (len < sizeof(fgs_nas_message_security_header_t)) {
|
||||||
|
PRINT_NAS_ERROR("Failed to decode security protected 5GS header: buffer length too short\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
header->protocol_discriminator = *buf++;
|
||||||
|
decoded++;
|
||||||
|
header->security_header_type = *buf++;
|
||||||
|
decoded++;
|
||||||
|
uint32_t tmp;
|
||||||
|
memcpy(&tmp, buf, sizeof(tmp));
|
||||||
|
decoded += sizeof(tmp);
|
||||||
|
header->message_authentication_code = htonl(tmp);
|
||||||
|
header->sequence_number = *buf++;
|
||||||
|
decoded++;
|
||||||
|
return decoded;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user