Commit 63d7f26c authored by Guido Casati's avatar Guido Casati

Refactor NAS 5GMM messages structs definitions

as per legacy code, the NAS functions in nr_nas_msg.c were encoding
the header in the plain header contained in MM_msg
(e.g. plain -> mm_msg -> header in fgs_nas_message_t). The same
header was encoded in the mobility management message contained
in the same struct (e.g. plain -> mm_msg -> registration_request
-> protocoldiscriminator). As this was more complicated than
necessary, the goal of this commit is to simplify the code and
improve readability. Namely:

* Refactor MM_msg into fgmm_nas_message_plain_t to contain
  (1) 5GMM Header
  (2) 5GMM Payload union
* Use fgmm_nas_message_plain_t and fgmm_nas_msg_security_protected_t
  in the 5GMM NAS procedures
* Remove NAS header IEs from 5GMM messages structs and use
  the header in fgs_nas_message_plain_t.
  This reduce also the repetitions of header members in each
  of the 5GMM messages structs.
* Rename struct to distinguish between 5GMM and 5GSM
* Remove fgs_nas_message_t and nas_msg_header_t,
  use directly basic 5GS struct definitions, simplify the code
* The callbacks in nr_nas_msg.c are now doing
  (1) encode header with the common NAS lib
  (2) encode contents with the 5GMM libs
* improve code readibility in the process
parent 9719f5e5
...@@ -50,10 +50,6 @@ ...@@ -50,10 +50,6 @@
typedef struct fgs_authentication_response_msg_tag { typedef struct fgs_authentication_response_msg_tag {
/* Mandatory fields */ /* Mandatory fields */
uint8_t protocoldiscriminator;
SecurityHeaderType securityheadertype: 4;
uint8_t sparehalfoctet: 4;
MessageType messagetype;
AuthenticationResponseParameter authenticationresponseparameter; AuthenticationResponseParameter authenticationresponseparameter;
} fgs_authentication_response_msg; } fgs_authentication_response_msg;
......
...@@ -38,10 +38,6 @@ ...@@ -38,10 +38,6 @@
typedef struct fgs_deregistration_request_ue_originating_msg_tag { typedef struct fgs_deregistration_request_ue_originating_msg_tag {
/* Mandatory fields */ /* Mandatory fields */
uint8_t protocoldiscriminator;
SecurityHeaderType securityheadertype: 4;
uint8_t sparehalfoctet: 4;
MessageType messagetype;
FGSDeregistrationType deregistrationtype; FGSDeregistrationType deregistrationtype;
NasKeySetIdentifier naskeysetidentifier; NasKeySetIdentifier naskeysetidentifier;
FGSMobileIdentity fgsmobileidentity; FGSMobileIdentity fgsmobileidentity;
......
...@@ -45,10 +45,6 @@ ...@@ -45,10 +45,6 @@
typedef struct fgmm_identity_response_msg_s { typedef struct fgmm_identity_response_msg_s {
/* Mandatory fields */ /* Mandatory fields */
uint8_t protocoldiscriminator;
SecurityHeaderType securityheadertype: 4;
uint8_t sparehalfoctet: 4;
MessageType messagetype;
FGSMobileIdentity fgsmobileidentity; FGSMobileIdentity fgsmobileidentity;
} fgmm_identity_response_msg; } fgmm_identity_response_msg;
......
...@@ -46,10 +46,6 @@ ...@@ -46,10 +46,6 @@
typedef struct fgs_security_mode_complete_msg_tag { typedef struct fgs_security_mode_complete_msg_tag {
/* Mandatory fields */ /* Mandatory fields */
uint8_t protocoldiscriminator;
SecurityHeaderType securityheadertype: 4;
uint8_t sparehalfoctet: 4;
MessageType messagetype;
FGSMobileIdentity fgsmobileidentity; FGSMobileIdentity fgsmobileidentity;
FGCNasMessageContainer fgsnasmessagecontainer; FGCNasMessageContainer fgsnasmessagecontainer;
} fgs_security_mode_complete_msg; } fgs_security_mode_complete_msg;
......
...@@ -53,10 +53,6 @@ typedef struct FGSPayloadContainer_tag { ...@@ -53,10 +53,6 @@ typedef struct FGSPayloadContainer_tag {
typedef struct fgs_uplink_nas_transport_msg_tag { typedef struct fgs_uplink_nas_transport_msg_tag {
/* Mandatory fields */ /* Mandatory fields */
uint8_t protocoldiscriminator;
SecurityHeaderType securityheadertype: 4;
uint8_t sparehalfoctet: 4;
MessageType messagetype;
PayloadContainerType payloadcontainertype; PayloadContainerType payloadcontainertype;
FGSPayloadContainer fgspayloadcontainer; FGSPayloadContainer fgspayloadcontainer;
/* Optional fields */ /* Optional fields */
......
...@@ -49,12 +49,7 @@ ...@@ -49,12 +49,7 @@
typedef struct registration_accept_msg_tag { typedef struct registration_accept_msg_tag {
/* Mandatory fields */ /* Mandatory fields */
uint8_t protocoldiscriminator;
SecurityHeaderType securityheadertype: 4;
uint8_t sparehalfoctet: 4;
MessageType messagetype;
FGSRegistrationResult fgsregistrationresult; FGSRegistrationResult fgsregistrationresult;
/* Optional fields */ /* Optional fields */
FGSMobileIdentity *guti; FGSMobileIdentity *guti;
} registration_accept_msg; } registration_accept_msg;
......
...@@ -98,14 +98,9 @@ typedef enum registration_request_iei_tag { ...@@ -98,14 +98,9 @@ typedef enum registration_request_iei_tag {
typedef struct registration_request_msg_tag { typedef struct registration_request_msg_tag {
/* Mandatory fields */ /* Mandatory fields */
uint8_t protocoldiscriminator;
SecurityHeaderType securityheadertype: 4;
uint8_t sparehalfoctet: 4;
MessageType messagetype;
FGSRegistrationType fgsregistrationtype; FGSRegistrationType fgsregistrationtype;
NasKeySetIdentifier naskeysetidentifier; NasKeySetIdentifier naskeysetidentifier;
FGSMobileIdentity fgsmobileidentity; FGSMobileIdentity fgsmobileidentity;
/* Optional fields */ /* Optional fields */
uint32_t presencemask; uint32_t presencemask;
FGMMCapability fgmmcapability; FGMMCapability fgmmcapability;
......
...@@ -258,45 +258,26 @@ typedef struct { ...@@ -258,45 +258,26 @@ typedef struct {
uint8_t message_type; uint8_t message_type;
} fgmm_msg_header_t; } fgmm_msg_header_t;
/// 5GS legacy defs /* Plain 5GMM NAS message (5GS) */
typedef union {
fgmm_msg_header_t header;
registration_request_msg registration_request;
fgs_service_request_msg_t service_request;
fgmm_identity_response_msg fgs_identity_response;
fgs_authentication_response_msg fgs_auth_response;
fgs_deregistration_request_ue_originating_msg fgs_deregistration_request_ue_originating;
fgs_security_mode_complete_msg fgs_security_mode_complete;
registration_complete_msg registration_complete;
fgs_uplink_nas_transport_msg uplink_nas_transport;
} MM_msg;
typedef struct { typedef struct {
MM_msg mm_msg; /* 5GS Mobility Management messages */ fgmm_msg_header_t header;
} fgs_nas_message_plain_t; union {
registration_request_msg registration_request;
fgs_service_request_msg_t service_request;
fgmm_identity_response_msg fgs_identity_response;
fgs_authentication_response_msg fgs_auth_response;
fgs_deregistration_request_ue_originating_msg fgs_deregistration_request_ue_originating;
fgs_security_mode_complete_msg fgs_security_mode_complete;
registration_complete_msg registration_complete;
fgs_uplink_nas_transport_msg uplink_nas_transport;
} mm_msg; /* 5GS Mobility Management messages */
} fgmm_nas_message_plain_t;
/* Security protected 5GMM NAS message (5GS) */
typedef struct { typedef struct {
fgs_nas_message_security_header_t header; fgs_nas_message_security_header_t header;
fgs_nas_message_plain_t plain; fgmm_nas_message_plain_t plain;
} fgs_nas_message_security_protected_t; } fgmm_nas_msg_security_protected_t;
typedef union {
fgs_nas_message_security_header_t header;
fgs_nas_message_security_protected_t security_protected;
fgs_nas_message_plain_t plain;
} fgs_nas_message_t;
typedef struct {
union {
fgmm_msg_header_t plain_nas_msg_header;
struct security_protected_nas_msg_header_s {
uint8_t ex_protocol_discriminator;
uint8_t security_header_type;
uint16_t message_authentication_code1;
uint16_t message_authentication_code2;
uint8_t sequence_number;
} security_protected_nas_msg_header_t;
} choice;
} nas_msg_header_t;
/// 5GSM - 5GS session management /// 5GSM - 5GS session management
...@@ -317,7 +298,7 @@ typedef struct { ...@@ -317,7 +298,7 @@ typedef struct {
/// Function prototypes /// Function prototypes
int mm_msg_encode(const MM_msg *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);
......
...@@ -48,15 +48,15 @@ int _nas_mm_msg_encode_header(const fgmm_msg_header_t *header, uint8_t *buffer, ...@@ -48,15 +48,15 @@ int _nas_mm_msg_encode_header(const fgmm_msg_header_t *header, uint8_t *buffer,
return (size); return (size);
} }
int mm_msg_encode(const MM_msg *mm_msg, uint8_t *buffer, uint32_t len) int mm_msg_encode(const fgmm_nas_message_plain_t *p, uint8_t *buffer, uint32_t len)
{ {
LOG_FUNC_IN; LOG_FUNC_IN;
int header_result; int header_result;
int encode_result; int encode_result;
uint8_t msg_type = mm_msg->header.message_type; uint8_t msg_type = p->header.message_type;
/* First encode the EMM message header */ /* First encode the 5GMM message header */
header_result = _nas_mm_msg_encode_header(&mm_msg->header, buffer, len); header_result = _nas_mm_msg_encode_header(&p->header, buffer, len);
if (header_result < 0) { if (header_result < 0) {
LOG_TRACE(ERROR, LOG_TRACE(ERROR,
...@@ -71,29 +71,29 @@ int mm_msg_encode(const MM_msg *mm_msg, uint8_t *buffer, uint32_t len) ...@@ -71,29 +71,29 @@ int mm_msg_encode(const MM_msg *mm_msg, uint8_t *buffer, uint32_t len)
switch (msg_type) { switch (msg_type) {
case FGS_REGISTRATION_REQUEST: case FGS_REGISTRATION_REQUEST:
encode_result = encode_registration_request(&mm_msg->registration_request, buffer, len); encode_result = encode_registration_request(&p->mm_msg.registration_request, buffer, len);
break; break;
case FGS_IDENTITY_RESPONSE: case FGS_IDENTITY_RESPONSE:
encode_result = encode_fgmm_identity_response(buffer, &mm_msg->fgs_identity_response, len); encode_result = encode_fgmm_identity_response(buffer, &p->mm_msg.fgs_identity_response, len);
break; break;
case FGS_AUTHENTICATION_RESPONSE: case FGS_AUTHENTICATION_RESPONSE:
encode_result = encode_fgs_authentication_response(&mm_msg->fgs_auth_response, buffer, len); encode_result = encode_fgs_authentication_response(&p->mm_msg.fgs_auth_response, buffer, len);
break; break;
case FGS_SECURITY_MODE_COMPLETE: case FGS_SECURITY_MODE_COMPLETE:
encode_result = encode_fgs_security_mode_complete(&mm_msg->fgs_security_mode_complete, buffer, len); encode_result = encode_fgs_security_mode_complete(&p->mm_msg.fgs_security_mode_complete, buffer, len);
break; break;
case FGS_UPLINK_NAS_TRANSPORT: case FGS_UPLINK_NAS_TRANSPORT:
encode_result = encode_fgs_uplink_nas_transport(&mm_msg->uplink_nas_transport, buffer, len); encode_result = encode_fgs_uplink_nas_transport(&p->mm_msg.uplink_nas_transport, buffer, len);
break; break;
case FGS_DEREGISTRATION_REQUEST_UE_ORIGINATING: case FGS_DEREGISTRATION_REQUEST_UE_ORIGINATING:
encode_result = encode_result =
encode_fgs_deregistration_request_ue_originating(&mm_msg->fgs_deregistration_request_ue_originating, buffer, len); encode_fgs_deregistration_request_ue_originating(&p->mm_msg.fgs_deregistration_request_ue_originating, buffer, len);
break; break;
case FGS_SERVICE_REQUEST: case FGS_SERVICE_REQUEST:
encode_result = encode_fgs_service_request(buffer, &mm_msg->service_request, len); encode_result = encode_fgs_service_request(buffer, &p->mm_msg.service_request, len);
break; break;
default: default:
LOG_TRACE(ERROR, " Unexpected message type: 0x%x", mm_msg->header.message_type); LOG_TRACE(ERROR, " Unexpected message type: 0x%x", p->header.message_type);
encode_result = TLV_ENCODE_WRONG_MESSAGE_TYPE; encode_result = TLV_ENCODE_WRONG_MESSAGE_TYPE;
break; break;
/* TODO: Handle not standard layer 3 messages: SERVICE_REQUEST */ /* TODO: Handle not standard layer 3 messages: SERVICE_REQUEST */
...@@ -103,7 +103,7 @@ int mm_msg_encode(const MM_msg *mm_msg, uint8_t *buffer, uint32_t len) ...@@ -103,7 +103,7 @@ int mm_msg_encode(const MM_msg *mm_msg, uint8_t *buffer, uint32_t len)
LOG_TRACE(ERROR, LOG_TRACE(ERROR,
" Failed to encode L3 EMM message 0x%x " " Failed to encode L3 EMM message 0x%x "
"(%d)", "(%d)",
mm_msg->header.message_type, p->header.message_type,
encode_result); encode_result);
} }
......
This diff is collapsed.
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