From 0e7887de76c82ecc100571e1112d0f77136856af Mon Sep 17 00:00:00 2001
From: Bing-Kai Hong <Bing-Kai.Hong@eurecom.fr>
Date: Sun, 16 Sep 2018 21:51:15 +0800
Subject: [PATCH] Handle DL\UL RRC MESSAGE TRANSFER at f1ap_handlers

---
 openair2/F1AP/f1ap_cu_rrc_message_transfer.c |  79 +++++++++++--
 openair2/F1AP/f1ap_decoder.c                 |  27 +++--
 openair2/F1AP/f1ap_du_rrc_message_transfer.c | 110 +++++++++++++++++--
 openair2/F1AP/f1ap_handlers.c                |   5 +-
 4 files changed, 191 insertions(+), 30 deletions(-)

diff --git a/openair2/F1AP/f1ap_cu_rrc_message_transfer.c b/openair2/F1AP/f1ap_cu_rrc_message_transfer.c
index 78090104bb..f7d8ac929d 100644
--- a/openair2/F1AP/f1ap_cu_rrc_message_transfer.c
+++ b/openair2/F1AP/f1ap_cu_rrc_message_transfer.c
@@ -246,16 +246,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance) {
     printf("Failed to encode F1 setup request\n");
     return -1;
   }
-
-  printf("\n");
-
-  /* decode */
-  if (f1ap_decode_pdu(&pdu, buffer, len) > 0) {
-    printf("Failed to decode F1 setup request\n");
-    return -1;
-  }
-
-  return 0;
+  
 }
 
 /*
@@ -266,5 +257,71 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t       instance,
                                       uint32_t         assoc_id,
                                       uint32_t         stream,
                                       F1AP_F1AP_PDU_t *pdu) {
-  AssertFatal(1==0,"Not implemented yet\n");
+
+  printf("CU_handle_UL_RRC_MESSAGE_TRANSFER \n");
+  
+  MessageDef                     *message_p;
+  F1AP_ULRRCMessageTransfer_t    *container;
+  F1AP_ULRRCMessageTransferIEs_t *ie;
+
+  uint8_t  *buffer;
+  uint32_t  len;
+  
+  uint64_t        cu_ue_f1ap_id;
+  uint64_t        du_ue_f1ap_id;
+  uint64_t        srb_id;
+  int             executeDuplication;
+  sdu_size_t      ccch_sdu_len;
+  uint64_t        subscriberProfileIDforRFP;
+  uint64_t        rAT_FrequencySelectionPriority;
+
+  DevAssert(pdu != NULL);
+  
+  if (stream != 0) {
+    LOG_E(F1AP, "[SCTP %d] Received F1 on stream != 0 (%d)\n",
+               assoc_id, stream);
+    return -1;
+  }
+
+  container = &pdu->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
+
+
+  /* GNB_CU_UE_F1AP_ID */
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+  cu_ue_f1ap_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
+  printf("cu_ue_f1ap_id %lu \n", cu_ue_f1ap_id);
+
+
+  /* GNB_DU_UE_F1AP_ID */
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+  du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
+  printf("du_ue_f1ap_id %lu \n", du_ue_f1ap_id);
+
+
+  /* mandatory */
+  /* SRBID */
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_SRBID, true);
+  srb_id = ie->value.choice.SRBID;
+  printf("srb_id %lu \n", srb_id);
+
+
+  // issue in here
+  /* mandatory */
+  /* RRC Container */
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_RRCContainer, true);
+  // BK: need check
+  // create an ITTI message and copy SDU
+  message_p = itti_alloc_new_message (TASK_CU_F1, RRC_MAC_CCCH_DATA_IND);
+  memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
+  ccch_sdu_len = ie->value.choice.RRCContainer.size;
+  memcpy(RRC_MAC_CCCH_DATA_IND (message_p).sdu, ie->value.choice.RRCContainer.buf,
+         ccch_sdu_len);
+  printf ("RRCContainer(CCCH) :");
+  for (int i=0;i<ie->value.choice.RRCContainer.size;i++) printf("%2x ",RRC_MAC_CCCH_DATA_IND (message_p).sdu[i]);
+
+  return 0;
 }
diff --git a/openair2/F1AP/f1ap_decoder.c b/openair2/F1AP/f1ap_decoder.c
index 80279d6258..08816bd82b 100644
--- a/openair2/F1AP/f1ap_decoder.c
+++ b/openair2/F1AP/f1ap_decoder.c
@@ -42,14 +42,25 @@ static int f1ap_decode_initiating_message(F1AP_F1AP_PDU_t *pdu)
 
   switch(pdu->choice.initiatingMessage->procedureCode) {
     
-  case F1AP_ProcedureCode_id_F1Setup:
-    res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
-    printf("f1ap_eNB_decode_initiating_message!\n");
-    break;
-  case F1AP_ProcedureCode_id_InitialULRRCMessageTransfer:
-    res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
-    printf("f1ap_eNB_decode_initiating_message!\n");
-    break;
+    case F1AP_ProcedureCode_id_F1Setup:
+      res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
+      printf("f1ap_eNB_decode_initiating_message!\n");
+      break;
+
+    case F1AP_ProcedureCode_id_InitialULRRCMessageTransfer:
+      res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
+      printf("f1ap_eNB_decode_initiating_message!\n");
+      break;
+
+    case F1AP_ProcedureCode_id_DLRRCMessageTransfer:
+      res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
+      printf("f1ap_eNB_decode_initiating_message!\n");
+      break;
+
+    case F1AP_ProcedureCode_id_ULRRCMessageTransfer:
+      res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
+      printf("f1ap_eNB_decode_initiating_message!\n");
+      break;
     // case F1AP_ProcedureCode_id_InitialContextSetup:
     //   res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
     //   message_id = F1AP_INITIAL_CONTEXT_SETUP_LOG;
diff --git a/openair2/F1AP/f1ap_du_rrc_message_transfer.c b/openair2/F1AP/f1ap_du_rrc_message_transfer.c
index fef7fac097..a2febfaa62 100644
--- a/openair2/F1AP/f1ap_du_rrc_message_transfer.c
+++ b/openair2/F1AP/f1ap_du_rrc_message_transfer.c
@@ -48,7 +48,107 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t       instance,
                                       uint32_t         assoc_id,
                                       uint32_t         stream,
                                       F1AP_F1AP_PDU_t *pdu) {
-  AssertFatal(1==0,"Not implemented yet\n");
+
+  printf("DU_handle_DL_RRC_MESSAGE_TRANSFER \n");
+  
+  MessageDef                     *message_p;
+  F1AP_DLRRCMessageTransfer_t    *container;
+  F1AP_DLRRCMessageTransferIEs_t *ie;
+
+  uint8_t  *buffer;
+  uint32_t  len;
+  
+  uint64_t        cu_ue_f1ap_id;
+  uint64_t        du_ue_f1ap_id;
+  uint64_t        srb_id;
+  int             executeDuplication;
+  sdu_size_t      ccch_sdu_len;
+  uint64_t        subscriberProfileIDforRFP;
+  uint64_t        rAT_FrequencySelectionPriority;
+
+  DevAssert(pdu != NULL);
+  
+  if (stream != 0) {
+    LOG_E(F1AP, "[SCTP %d] Received F1 on stream != 0 (%d)\n",
+               assoc_id, stream);
+    return -1;
+  }
+
+  container = &pdu->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
+
+
+  /* GNB_CU_UE_F1AP_ID */
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+  cu_ue_f1ap_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
+  printf("cu_ue_f1ap_id %lu \n", cu_ue_f1ap_id);
+
+
+  /* GNB_DU_UE_F1AP_ID */
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+  du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
+  printf("du_ue_f1ap_id %lu \n", du_ue_f1ap_id);
+
+
+  /* optional */
+  /* oldgNB_DU_UE_F1AP_ID */
+  if (0) {
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_oldgNB_DU_UE_F1AP_ID, true);
+  }
+
+  /* mandatory */
+  /* SRBID */
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_SRBID, true);
+  srb_id = ie->value.choice.SRBID;
+  printf("srb_id %lu \n", srb_id);
+
+
+  /* optional */
+  /* ExecuteDuplication */
+  if (0) {
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_ExecuteDuplication, true);
+    executeDuplication = ie->value.choice.ExecuteDuplication;
+    printf("ExecuteDuplication %d \n", executeDuplication);
+  }
+
+  // issue in here
+  /* mandatory */
+  /* RRC Container */
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_RRCContainer, true);
+  // BK: need check
+  // create an ITTI message and copy SDU
+  message_p = itti_alloc_new_message (TASK_CU_F1, RRC_MAC_CCCH_DATA_IND);
+  memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
+  ccch_sdu_len = ie->value.choice.RRCContainer.size;
+  memcpy(RRC_MAC_CCCH_DATA_IND (message_p).sdu, ie->value.choice.RRCContainer.buf,
+         ccch_sdu_len);
+  printf ("RRCContainer(CCCH) :");
+  for (int i=0;i<ie->value.choice.RRCContainer.size;i++) printf("%2x ",RRC_MAC_CCCH_DATA_IND (message_p).sdu[i]);
+
+
+  /* optional */
+  /* RAT_FrequencyPriorityInformation */
+  if (0) {
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_RAT_FrequencyPriorityInformation, true);
+
+    switch(ie->value.choice.RAT_FrequencyPriorityInformation.present) {
+      case F1AP_RAT_FrequencyPriorityInformation_PR_subscriberProfileIDforRFP:
+        subscriberProfileIDforRFP = ie->value.choice.RAT_FrequencyPriorityInformation.choice.subscriberProfileIDforRFP;
+        break;
+      case F1AP_RAT_FrequencyPriorityInformation_PR_rAT_FrequencySelectionPriority:
+        rAT_FrequencySelectionPriority = ie->value.choice.RAT_FrequencyPriorityInformation.choice.rAT_FrequencySelectionPriority;
+        break;
+    }
+  }
+
+  return 0;
+  
 }
 
 //void DU_send_UL_RRC_MESSAGE_TRANSFER(F1AP_ULRRCMessageTransfer_t *ULRRCMessageTransfer) {
@@ -207,20 +307,12 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(
     ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
   }
 
-
     /* encode */
   if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
     printf("Failed to encode F1 setup request\n");
     return -1;
   }
 
-  printf("\n");
-
   du_f1ap_itti_send_sctp_data_req(0, f1ap_du_data->assoc_id, buffer, len, 0);
   return 0;
-  /* decode */
-  // if (f1ap_decode_pdu(&pdu, buffer, len) > 0) {
-  //   printf("Failed to decode F1 setup request\n");
-  // }
-  //AssertFatal(1==0,"Not implemented yet\n");
 }
diff --git a/openair2/F1AP/f1ap_handlers.c b/openair2/F1AP/f1ap_handlers.c
index 3957a7e2c9..168f6deaa9 100644
--- a/openair2/F1AP/f1ap_handlers.c
+++ b/openair2/F1AP/f1ap_handlers.c
@@ -36,6 +36,7 @@
 #include "f1ap_cu_interface_management.h"
 #include "f1ap_du_interface_management.h"
 #include "f1ap_cu_rrc_message_transfer.h"
+#include "f1ap_du_rrc_message_transfer.h"
 
 extern f1ap_setup_req_t *f1ap_du_data_from_du;
 
@@ -55,8 +56,8 @@ f1ap_message_decoded_callback f1ap_messages_callback[][3] = {
   { 0, 0, 0 }, /* UEMobilityCommand */
   { 0, 0, 0 }, /* UEContextReleaseRequest */
   { CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER, 0, 0 }, /* InitialULRRCMessageTransfer */
-  { 0, 0, 0 }, /* DLRRCMessageTransfer */
-  { 0, 0, 0 }, /* ULRRCMessageTransfer */
+  { DU_handle_DL_RRC_MESSAGE_TRANSFER, 0, 0 }, /* DLRRCMessageTransfer */
+  { CU_handle_UL_RRC_MESSAGE_TRANSFER, 0, 0 }, /* ULRRCMessageTransfer */
   { 0, 0, 0 }, /* privateMessage */
   { 0, 0, 0 }, /* UEInactivityNotification */
   { 0, 0, 0 }, /* GNBDUResourceCoordination */
-- 
GitLab