From 3156a9df06d9cad8bfec602b13c14006b48d4fc5 Mon Sep 17 00:00:00 2001
From: francescomani <email@francescomani.it>
Date: Thu, 21 Dec 2023 16:36:00 +0100
Subject: [PATCH] function to handle NAS registraction accept

---
 .../NAS/COMMON/EMM/MSG/RegistrationAccept.c   |  2 +-
 .../NAS/COMMON/EMM/MSG/RegistrationAccept.h   |  2 +-
 openair3/NAS/COMMON/IES/FGSMobileIdentity.c   |  6 +-
 openair3/NAS/COMMON/IES/FGSMobileIdentity.h   |  2 +-
 openair3/NAS/NR_UE/nr_nas_msg_sim.c           | 59 ++++++++-----------
 5 files changed, 32 insertions(+), 39 deletions(-)

diff --git a/openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.c b/openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.c
index c34d777bd5..d7c5c5d719 100644
--- a/openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.c
+++ b/openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.c
@@ -39,7 +39,7 @@
 #include "RegistrationAccept.h"
 #include "assertions.h"
 
-int decode_registration_accept(registration_accept_msg *registration_accept, uint8_t *buffer, uint32_t len)
+int decode_registration_accept(registration_accept_msg *registration_accept, const uint8_t *buffer, uint32_t len)
 {
   uint32_t decoded = 0;
   int decoded_result = 0;
diff --git a/openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.h b/openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.h
index e0d3ade23a..30c434c662 100644
--- a/openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.h
+++ b/openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.h
@@ -62,7 +62,7 @@ typedef struct registration_accept_msg_tag {
   FGSMobileIdentity *guti;
 } registration_accept_msg;
 
-int decode_registration_accept(registration_accept_msg *registrationaccept, uint8_t *buffer, uint32_t len);
+int decode_registration_accept(registration_accept_msg *registrationaccept, const uint8_t *buffer, uint32_t len);
 
 int encode_registration_accept(registration_accept_msg *registrationaccept, uint8_t *buffer, uint32_t len);
 
diff --git a/openair3/NAS/COMMON/IES/FGSMobileIdentity.c b/openair3/NAS/COMMON/IES/FGSMobileIdentity.c
index ea877481e6..c0b60f101f 100644
--- a/openair3/NAS/COMMON/IES/FGSMobileIdentity.c
+++ b/openair3/NAS/COMMON/IES/FGSMobileIdentity.c
@@ -37,13 +37,13 @@
 #include "TLVDecoder.h"
 #include "FGSMobileIdentity.h"
 
-static int decode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_t *buffer);
+static int decode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, const uint8_t *buffer);
 
 static int encode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_t *buffer);
 static int encode_suci_5gs_mobile_identity(Suci5GSMobileIdentity_t *suci, uint8_t *buffer);
 static int encode_imeisv_5gs_mobile_identity(Imeisv5GSMobileIdentity_t *imeisv, uint8_t *buffer);
 
-int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, uint8_t *buffer, uint32_t len)
+int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, const uint8_t *buffer, uint32_t len)
 {
   int decoded_rc = TLV_DECODE_VALUE_DOESNT_MATCH;
   int decoded = 0;
@@ -117,7 +117,7 @@ int encode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei
   return (encoded + encoded_rc);
 }
 
-static int decode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_t *buffer)
+static int decode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, const uint8_t *buffer)
 {
   int decoded = 0;
   uint16_t temp;
diff --git a/openair3/NAS/COMMON/IES/FGSMobileIdentity.h b/openair3/NAS/COMMON/IES/FGSMobileIdentity.h
index 82d943fd19..9356a46eff 100644
--- a/openair3/NAS/COMMON/IES/FGSMobileIdentity.h
+++ b/openair3/NAS/COMMON/IES/FGSMobileIdentity.h
@@ -149,7 +149,7 @@ typedef union FGSMobileIdentity_tag {
 
 int encode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, uint8_t *buffer, uint32_t len);
 
-int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, uint8_t *buffer, uint32_t len);
+int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, const uint8_t *buffer, uint32_t len);
 
 #endif /* FGS MOBILE IDENTITY_H_ */
 
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.c b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
index f83f1138b6..d188500853 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.c
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
@@ -617,7 +617,7 @@ static void generateSecurityModeComplete(nr_ue_nas_t *nas, as_nas_info_t *initia
   }
 }
 
-static void decodeRegistrationAccept(uint8_t *buf, int len, nr_ue_nas_t *nas)
+static void decodeRegistrationAccept(const uint8_t *buf, int len, nr_ue_nas_t *nas)
 {
   registration_accept_msg reg_acc = {0};
   /* it seems there is no 5G corresponding emm_msg_decode() function, so here
@@ -1033,6 +1033,29 @@ void *nas_nrue_task(void *args_p)
   }
 }
 
+static void handle_registration_accept(instance_t instance,
+                                       nr_ue_nas_t *nas,
+                                       const uint8_t *pdu_buffer,
+                                       uint32_t msg_length)
+{
+  LOG_I(NAS, "[UE] Received REGISTRATION ACCEPT message\n");
+  decodeRegistrationAccept(pdu_buffer, msg_length, nas);
+  get_allowed_nssai(nas_allowed_nssai, pdu_buffer, msg_length);
+
+  as_nas_info_t initialNasMsg = {0};
+  generateRegistrationComplete(nas, &initialNasMsg, NULL);
+  if (initialNasMsg.length > 0) {
+    send_nas_uplink_data_req(instance, &initialNasMsg);
+    LOG_I(NAS, "Send NAS_UPLINK_DATA_REQ message(RegistrationComplete)\n");
+  }
+  const int nssai_idx = get_user_nssai_idx(nas_allowed_nssai, nas);
+  if (nssai_idx < 0) {
+    LOG_E(NAS, "NSSAI parameters not match with allowed NSSAI. Couldn't request PDU session.\n");
+  } else {
+    request_default_pdusession(instance, nssai_idx);
+  }
+}
+
 void *nas_nrue(void *args_p)
 {
   // Wait for a message or an event
@@ -1112,24 +1135,8 @@ void *nas_nrue(void *args_p)
         int msg_type = get_msg_type(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length);
 
         if (msg_type == REGISTRATION_ACCEPT) {
-          LOG_I(NAS, "[UE] Received REGISTRATION ACCEPT message\n");
           nr_ue_nas_t *nas = get_ue_nas_info(0);
-          decodeRegistrationAccept(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length, nas);
-          get_allowed_nssai(nas_allowed_nssai, pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length);
-
-          as_nas_info_t initialNasMsg = {0};
-          generateRegistrationComplete(nas, &initialNasMsg, NULL);
-          if (initialNasMsg.length > 0) {
-            send_nas_uplink_data_req(instance, &initialNasMsg);
-            LOG_I(NAS, "Send NAS_UPLINK_DATA_REQ message(RegistrationComplete)\n");
-          }
-
-          const int nssai_idx = get_user_nssai_idx(nas_allowed_nssai, nas);
-          if (nssai_idx < 0) {
-            LOG_E(NAS, "NSSAI parameters not match with allowed NSSAI. Couldn't request PDU session.\n");
-          } else {
-            request_default_pdusession(instance, nssai_idx);
-          }
+          handle_registration_accept(instance, nas, pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length);
         } else if (msg_type == FGS_PDU_SESSION_ESTABLISHMENT_ACC) {
           capture_pdu_session_establishment_accept_msg(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length);
         }
@@ -1198,21 +1205,7 @@ void *nas_nrue(void *args_p)
             decodeDownlinkNASTransport(&initialNasMsg, pdu_buffer);
             break;
           case REGISTRATION_ACCEPT:
-            LOG_I(NAS, "[UE] Received REGISTRATION ACCEPT message\n");
-            decodeRegistrationAccept(pdu_buffer, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length, nas);
-
-            as_nas_info_t initialNasMsg = {0};
-            generateRegistrationComplete(nas, &initialNasMsg, NULL);
-            if (initialNasMsg.length > 0) {
-              send_nas_uplink_data_req(instance, &initialNasMsg);
-              LOG_I(NAS, "Send NAS_UPLINK_DATA_REQ message(RegistrationComplete)\n");
-            }
-            const int nssai_idx = get_user_nssai_idx(nas_allowed_nssai, nas);
-            if (nssai_idx < 0) {
-              LOG_E(NAS, "NSSAI parameters not match with allowed NSSAI. Couldn't request PDU session.\n");
-            } else {
-              request_default_pdusession(instance, nssai_idx);
-            }
+            handle_registration_accept(instance, nas, pdu_buffer, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length);
             break;
           case FGS_DEREGISTRATION_ACCEPT:
             LOG_I(NAS, "received deregistration accept\n");
-- 
2.26.2