From 2bf40fbd17b32af958792fceb45de30b8e7d1385 Mon Sep 17 00:00:00 2001
From: Sakthivel Velumani <mail@sakthi.me>
Date: Thu, 26 Oct 2023 14:29:58 -0400
Subject: [PATCH] Pass the NSSAI config via F1

---
 openair2/COMMON/f1ap_messages_types.h         |  2 ++
 openair2/F1AP/f1ap_cu_ue_context_management.c | 23 +++++++------------
 openair2/F1AP/f1ap_du_ue_context_management.c | 21 +++++++++++++++++
 3 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h
index 8f8a047ee5..d7d46f3bef 100644
--- a/openair2/COMMON/f1ap_messages_types.h
+++ b/openair2/COMMON/f1ap_messages_types.h
@@ -26,6 +26,7 @@
 #include <netinet/sctp.h>
 #include "rlc.h"
 #include "s1ap_messages_types.h"
+#include "ngap_messages_types.h"
 
 //-------------------------------------------------------------------------------------------//
 // Defines to access message fields.
@@ -290,6 +291,7 @@ typedef struct f1ap_drb_to_be_setup_s {
   f1ap_up_tnl_t  up_dl_tnl[2];
   uint8_t        up_dl_tnl_length;
   rlc_mode_t     rlc_mode;
+  nssai_t nssai;
 } f1ap_drb_to_be_setup_t;
 
 typedef struct f1ap_srb_to_be_setup_s {
diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c
index 876cd1e3a9..ff82cd3840 100644
--- a/openair2/F1AP/f1ap_cu_ue_context_management.c
+++ b/openair2/F1AP/f1ap_cu_ue_context_management.c
@@ -398,15 +398,12 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
         /* 12.1.2.2 sNSSAI */
         {
           /* sST */
-          OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
+          OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, (char *)&f1ap_ue_context_setup_req->drbs_to_be_setup[i].nssai.sst, 1);
 
           /* OPTIONAL */
-          /* sD */
-          if (0) {
-            asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
-            OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
-                               strlen("asdsa1d32sa1d31asd31as"));
-          }
+          const uint32_t sd = (f1ap_ue_context_setup_req->drbs_to_be_setup[i].nssai.sd & 0xffffff);
+          if (sd != 0xffffff)
+            OCTET_STRING_fromBuf(DRB_Information->sNSSAI.sD, (char *)&sd, 3);
         }
 
         /* OPTIONAL */
@@ -1313,16 +1310,12 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
         /* 12.1.2.2 sNSSAI */
         {
           /* sST */
-
-          OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
+          OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, (char *)&f1ap_ue_context_modification_req->drbs_to_be_setup[i].nssai.sst, 1);
 
           /* OPTIONAL */
-          /* sD */
-          if (0) {
-            asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
-            OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
-            strlen("asdsa1d32sa1d31asd31as"));
-          }
+          const uint32_t sd = (f1ap_ue_context_modification_req->drbs_to_be_setup[i].nssai.sd & 0xffffff);
+          if (sd != 0xffffff)
+            OCTET_STRING_fromBuf(DRB_Information->sNSSAI.sD, (char *)&sd, 3);
         }
 
         /* OPTIONAL */
diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c
index 91cb157c9d..49e19f7697 100644
--- a/openair2/F1AP/f1ap_du_ue_context_management.c
+++ b/openair2/F1AP/f1ap_du_ue_context_management.c
@@ -879,6 +879,27 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, sctp_assoc_t
         drb_p->rlc_mode = RLC_MODE_TM;
         break;
       }
+
+      if (drbs_tobesetupmod_item_p->qoSInformation.present == F1AP_QoSInformation_PR_eUTRANQoS) {
+        AssertFatal(false, "Decode of eUTRANQoS is not implemented yet");
+      } // EUTRAN QoS Information
+      else {
+        /* 12.1.2 DRB_Information */
+        if (drbs_tobesetupmod_item_p->qoSInformation.present == F1AP_QoSInformation_PR_choice_extension) {
+          F1AP_QoSInformation_ExtIEs_t *ie =
+              (F1AP_QoSInformation_ExtIEs_t *)drbs_tobesetupmod_item_p->qoSInformation.choice.choice_extension;
+          if (ie->id == F1AP_ProtocolIE_ID_id_DRB_Information && ie->criticality == F1AP_Criticality_reject
+              && ie->value.present == F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information) {
+            F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information;
+            /* S-NSSAI */
+            OCTET_STRING_TO_INT8(&DRB_Information->sNSSAI.sST, drb_p->nssai.sst);
+            if (DRB_Information->sNSSAI.sD != NULL)
+              memcpy((uint8_t *)&drb_p->nssai.sd, DRB_Information->sNSSAI.sD->buf, 3);
+            else
+              drb_p->nssai.sd = 0xffffff;
+          }
+        }
+      }
     }
   }
 
-- 
2.26.2