From 91d4cd3cfda468a58974ee415573a5cbea3f3d9c Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Fri, 14 Sep 2018 18:58:46 +0200
Subject: [PATCH] debugging of F1AP-Setup-Resp procedure in DU. DU
 configuration is ok now.

---
 openair2/ENB_APP/enb_config.c                | 179 ++++++++++---------
 openair2/F1AP/f1ap_cu_interface_management.c |   4 +-
 openair2/F1AP/f1ap_decoder.c                 |   1 +
 openair2/F1AP/f1ap_du_interface_management.c | 100 ++++++++++-
 4 files changed, 192 insertions(+), 92 deletions(-)

diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index b6e16f35ae..e4355e8e29 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -800,10 +800,10 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc) {
 	rrc->sctp_out_streams                      = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr);
 
   // MCC and MNC
-  rrc->mcc= (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX].strptr) );
-  rrc->mnc= (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr) );
-  rrc->mnc_digit_length= strlen(*(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
-  rrc->tac= (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].strptr) );
+	rrc->mcc= (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX].strptr) );
+	rrc->mnc= (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr) );
+	rrc->mnc_digit_length= strlen(*(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
+	rrc->tac= (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].strptr) );
 
       }
       
@@ -2891,6 +2891,7 @@ void extract_and_decode_SI(int inst,int si_ind,uint8_t *si_container,int si_cont
 
   AssertFatal(si_ind==0,"Can only handle a single SI block for now\n");
 
+  LOG_I(ENB_APP, "rrc inst %d: Trying to decode SI block %d @ %p, length %d\n",inst,si_ind,si_container,si_container_length);
   // point to first SI block
   bcch_message = &carrier->systemInformation;
   asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
@@ -2903,101 +2904,101 @@ void extract_and_decode_SI(int inst,int si_ind,uint8_t *si_container,int si_cont
     AssertFatal(1==0, "[ENB_APP][RRC inst %"PRIu8"] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)\n",
 		inst,
 		dec_rval.consumed );
-
-    if (bcch_message->message.present == BCCH_DL_SCH_MessageType_PR_c1) {
-      switch (bcch_message->message.choice.c1.present) {
-      case BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1:
-	AssertFatal(1==0,"Should have received SIB1 from CU\n");
-	break;
-      case BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
-	{
-	  SystemInformation_t *si = &bcch_message->message.choice.c1.choice.systemInformation;
+  }
+  if (bcch_message->message.present == BCCH_DL_SCH_MessageType_PR_c1) {
+    switch (bcch_message->message.choice.c1.present) {
+    case BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1:
+      AssertFatal(1==0,"Should have received SIB1 from CU\n");
+      break;
+    case BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
+      {
+	SystemInformation_t *si = &bcch_message->message.choice.c1.choice.systemInformation;
+	
+	for (int i=0; i<si->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count; i++) {
+	  struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *typeandinfo;
+	  typeandinfo = si->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.array[i];
 	  
-	  for (int i=0; i<si->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count; i++) {
-	    struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *typeandinfo;
-	    typeandinfo = si->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.array[i];
+	  switch(typeandinfo->present) {
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2:
+	    carrier->sib2 = &typeandinfo->choice.sib2;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB2 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3:
+	    carrier->sib3 = &typeandinfo->choice.sib3;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB3 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4:
+	    //carrier->sib4 = &typeandinfo->choice.sib4;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB4 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5:
+	    //carrier->sib5 = &typeandinfo->choice.sib5;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB5 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6:
+	    //carrier->sib6 = &typeandinfo->choice.sib6;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB6 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7:
+	    //carrier->sib7 = &typeandinfo->choice.sib7;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB7 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8:
+	    //carrier->sib8 = &typeandinfo->choice.sib8;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB8 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9:
+	    //carrier->sib9 = &typeandinfo->choice.sib9;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB9 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10:
+	    //carrier->sib10 = &typeandinfo->choice.sib10;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB10 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11:
+	    //carrier->sib11 = &typeandinfo->choice.sib11;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB11 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
 	    
-	    switch(typeandinfo->present) {
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2:
-	      carrier->sib2 = &typeandinfo->choice.sib2;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB2 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3:
-	      carrier->sib3 = &typeandinfo->choice.sib3;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB3 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4:
-	      //carrier->sib4 = &typeandinfo->choice.sib4;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB4 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5:
-	      //carrier->sib5 = &typeandinfo->choice.sib5;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB5 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6:
-	      //carrier->sib6 = &typeandinfo->choice.sib6;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB6 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7:
-	      //carrier->sib7 = &typeandinfo->choice.sib7;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB7 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8:
-	      //carrier->sib8 = &typeandinfo->choice.sib8;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB8 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9:
-	      //carrier->sib9 = &typeandinfo->choice.sib9;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB9 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10:
-	      //carrier->sib10 = &typeandinfo->choice.sib10;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB10 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11:
-	      //carrier->sib11 = &typeandinfo->choice.sib11;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB11 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-
 #if (RRC_VERSION >= MAKE_VERSION(9, 2, 0))
-
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920:
-	      //carrier->sib12 = &typeandinfo->choice.sib12;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB12 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	      
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920:
-	      carrier->sib13 = &typeandinfo->choice.sib13_v920;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB13 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
+	    
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920:
+	    //carrier->sib12 = &typeandinfo->choice.sib12;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB12 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	    
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920:
+	    carrier->sib13 = &typeandinfo->choice.sib13_v920;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB13 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
 #endif
 #if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
-	      //SIB18
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib18_v1250:
-	      carrier->sib18 = &typeandinfo->choice.sib18_v1250;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB18 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	      //SIB19
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib19_v1250:
-	      carrier->sib19 = &typeandinfo->choice.sib19_v1250;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB19 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
-	      //SIB21
-	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib21_v1430:
-	      carrier->sib21 = &typeandinfo->choice.sib21_v1430;
-	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB21 in CU F1AP_SETUP_RESP message\n", inst);
-	      break;
+	    //SIB18
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib18_v1250:
+	    carrier->sib18 = &typeandinfo->choice.sib18_v1250;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB18 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	    //SIB19
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib19_v1250:
+	    carrier->sib19 = &typeandinfo->choice.sib19_v1250;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB19 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
+	    //SIB21
+	  case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib21_v1430:
+	    carrier->sib21 = &typeandinfo->choice.sib21_v1430;
+	    LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB21 in CU F1AP_SETUP_RESP message\n", inst);
+	    break;
 #endif
-	    default:
-	      AssertFatal(1==0,"Shouldn't have received this SI %d\n",typeandinfo->present);
-	      break;
-	    }
+	  default:
+	    AssertFatal(1==0,"Shouldn't have received this SI %d\n",typeandinfo->present);
+	    break;
 	  }
-	  break;
 	}
+	break;
       }
     }
-    }
+  }
+    
   else AssertFatal(1==0,"No SI messages\n");
 
 
diff --git a/openair2/F1AP/f1ap_cu_interface_management.c b/openair2/F1AP/f1ap_cu_interface_management.c
index e28a1ac811..ca1f590573 100644
--- a/openair2/F1AP/f1ap_cu_interface_management.c
+++ b/openair2/F1AP/f1ap_cu_interface_management.c
@@ -297,7 +297,7 @@ void CU_send_F1_SETUP_RESPONSE(instance_t instance, f1ap_setup_resp_t *f1ap_setu
     /* - nRPCI */
     if (1) {
       cells_to_be_activated_list_item.nRPCI = (F1AP_NRPCI_t *)calloc(1, sizeof(F1AP_NRPCI_t));
-      *cells_to_be_activated_list_item.nRPCI = 321L;  // int 0..1007
+      *cells_to_be_activated_list_item.nRPCI = f1ap_setup_resp->nrpci[i];  // int 0..1007
     }
 
     /* optional */
@@ -764,4 +764,4 @@ void CU_handle_gNB_CU_CONFIGURATION_UPDATE_FALIURE(F1AP_GNBCUConfigurationUpdate
 
 void CU_send_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(F1AP_GNBCUConfigurationUpdateAcknowledge_t *GNBCUConfigurationUpdateAcknowledge) {
   AssertFatal(1==0,"Not implemented yet\n");
-}
\ No newline at end of file
+}
diff --git a/openair2/F1AP/f1ap_decoder.c b/openair2/F1AP/f1ap_decoder.c
index 53d68c09ca..6a6a761866 100644
--- a/openair2/F1AP/f1ap_decoder.c
+++ b/openair2/F1AP/f1ap_decoder.c
@@ -77,6 +77,7 @@ static int f1ap_decode_successful_outcome(F1AP_F1AP_PDU_t *pdu)
   switch(pdu->choice.successfulOutcome->procedureCode) {
     case F1AP_ProcedureCode_id_F1Setup:
       LOG_I(F1AP, "get F1AP_ProcedureCode_id_F1Setup\n");
+      
       break;
 
     default:
diff --git a/openair2/F1AP/f1ap_du_interface_management.c b/openair2/F1AP/f1ap_du_interface_management.c
index 2efd22fb23..c83095447f 100644
--- a/openair2/F1AP/f1ap_du_interface_management.c
+++ b/openair2/F1AP/f1ap_du_interface_management.c
@@ -32,6 +32,7 @@
 
 #include "f1ap_common.h"
 #include "f1ap_du_interface_management.h"
+#include "assertions.h"
 
 extern f1ap_setup_req_t *f1ap_du_data;
 
@@ -309,8 +310,105 @@ int DU_handle_F1_SETUP_RESPONSE(uint32_t               assoc_id,
                                  uint32_t               stream,
                                  F1AP_F1AP_PDU_t       *pdu)
 {
+
    printf("DU_handle_F1_SETUP_RESPONSE\n");
 
+   AssertFatal(pdu->present == F1AP_F1AP_PDU_PR_successfulOutcome,
+	       "pdu->present != F1AP_F1AP_PDU_PR_successfulOutcome\n");
+   AssertFatal(pdu->choice.successfulOutcome->procedureCode  == F1AP_ProcedureCode_id_F1Setup,
+	       "pdu->choice.successfulOutcome->procedureCode != F1AP_ProcedureCode_id_F1Setup\n");
+   AssertFatal(pdu->choice.successfulOutcome->criticality  == F1AP_Criticality_reject,
+	       "pdu->choice.successfulOutcome->criticality != F1AP_Criticality_reject\n");
+   AssertFatal(pdu->choice.successfulOutcome->value.present  == F1AP_SuccessfulOutcome__value_PR_F1SetupResponse,
+	       "pdu->choice.successfulOutcome->value.present != F1AP_SuccessfulOutcome__value_PR_F1SetupResponse\n");
+
+   F1AP_F1SetupResponse_t    *in = &pdu->choice.successfulOutcome->value.choice.F1SetupResponse;
+
+
+   F1AP_F1SetupResponseIEs_t *ie;
+   int TransactionId = -1;
+   int num_cells_to_activate = 0;
+   F1AP_Cells_to_be_Activated_List_Item_t *cell;
+
+   MessageDef *msg_p = itti_alloc_new_message (TASK_ENB_APP, F1AP_SETUP_RESP);
+
+   printf("F1AP: F1Setup-Resp: protocolIEs.list.count %d\n",
+	  in->protocolIEs.list.count);
+   for (int i=0;i < in->protocolIEs.list.count; i++) {
+     ie = in->protocolIEs.list.array[i];
+     switch (ie->id) {
+     case F1AP_ProtocolIE_ID_id_TransactionID:
+       AssertFatal(ie->criticality == F1AP_Criticality_reject,
+		   "ie->criticality != F1AP_Criticality_reject\n");
+       AssertFatal(ie->value.present == F1AP_F1SetupResponseIEs__value_PR_TransactionID,
+		   "ie->value.present != F1AP_F1SetupResponseIEs__value_PR_TransactionID\n");
+       TransactionId=ie->value.choice.TransactionID;
+       printf("F1AP: F1Setup-Resp: TransactionId %d\n",
+	     TransactionId);
+       break;
+     case F1AP_ProtocolIE_ID_id_gNB_CU_Name:
+       AssertFatal(ie->criticality == F1AP_Criticality_ignore,
+		   "ie->criticality != F1AP_Criticality_ignore\n");
+       AssertFatal(ie->value.present == F1AP_F1SetupResponseIEs__value_PR_GNB_CU_Name,
+		   "ie->value.present != F1AP_F1SetupResponseIEs__value_PR_TransactionID\n");
+       F1AP_SETUP_RESP (msg_p).gNB_CU_name = malloc(ie->value.choice.GNB_CU_Name.size+1);
+       memcpy(F1AP_SETUP_RESP (msg_p).gNB_CU_name,ie->value.choice.GNB_CU_Name.buf,ie->value.choice.GNB_CU_Name.size);
+       F1AP_SETUP_RESP (msg_p).gNB_CU_name[ie->value.choice.GNB_CU_Name.size]='\0';
+       printf("F1AP: F1Setup-Resp: gNB_CU_name %s\n",
+	      F1AP_SETUP_RESP (msg_p).gNB_CU_name);
+       break;
+     case F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List:
+       AssertFatal(ie->criticality == F1AP_Criticality_reject,
+		   "ie->criticality != F1AP_Criticality_reject\n");
+       AssertFatal(ie->value.present == F1AP_F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List,
+		   "ie->value.present != F1AP_F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List\n");
+       num_cells_to_activate = ie->value.choice.Cells_to_be_Activated_List.list.count;
+       printf("F1AP: Activating %d cells\n",num_cells_to_activate);
+       for (int i=0;i<num_cells_to_activate;i++) {
+	 
+	 F1AP_Cells_to_be_Activated_List_ItemIEs_t *cells_to_be_activated_list_item_ies = ie->value.choice.Cells_to_be_Activated_List.list.array[i];
+
+	 AssertFatal(cells_to_be_activated_list_item_ies->id == F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item,
+		   "cells_to_be_activated_list_item_ies->id != F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item");
+	 AssertFatal(cells_to_be_activated_list_item_ies->criticality == F1AP_Criticality_reject,
+		     "cells_to_be_activated_list_item_ies->criticality == F1AP_Criticality_reject");
+	 AssertFatal(cells_to_be_activated_list_item_ies->value.present == F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item,
+		     "cells_to_be_activated_list_item_ies->value.present == F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item");
+
+	 cell = &cells_to_be_activated_list_item_ies->value.choice.Cells_to_be_Activated_List_Item;
+
+	 TBCD_TO_MCC_MNC(&cell->nRCGI.pLMN_Identity, F1AP_SETUP_RESP (msg_p).mcc[i], F1AP_SETUP_RESP (msg_p).mnc[i], F1AP_SETUP_RESP (msg_p).mnc_digit_length[i]);
+	 AssertFatal(cell->nRPCI != NULL, "nRPCI is null\n");
+
+	 F1AP_SETUP_RESP (msg_p).nrpci[i] = *cell->nRPCI;
+
+	 F1AP_ProtocolExtensionContainer_160P9_t *ext = cell->iE_Extensions;
+	 AssertFatal(ext!=NULL,"Extension for SI is null\n");
+	 F1AP_SETUP_RESP (msg_p).num_SI[i] = ext->list.count;
+	 AssertFatal(ext->list.count==1,"At least one SI message should be there, and only 1 for now!\n");
+	 printf("F1AP: F1Setup-Resp Cell %d MCC %d MNC %d NRPCI %d\n",i,F1AP_SETUP_RESP (msg_p).mcc[i],F1AP_SETUP_RESP (msg_p).mnc[i],F1AP_SETUP_RESP (msg_p).nrpci[i],F1AP_SETUP_RESP (msg_p).num_SI[i]);
+	 for (int si =0;si < ext->list.count;si++) {
+	   size_t size = ext->list.array[si]->extensionValue.choice.GNB_CUSystemInformation.sImessage.size;
+	   F1AP_SETUP_RESP (msg_p).SI_container_length[i][si] = size;
+           printf("F1AP: F1Setup-Resp SI_container_length[%d][%d] %d bytes\n",i,si,size);
+	   F1AP_SETUP_RESP (msg_p).SI_container[i][si] = ext->list.array[si]->extensionValue.choice.GNB_CUSystemInformation.sImessage.buf;
+	 }
+       }
+       break;
+     }
+   }
+   AssertFatal(TransactionId!=-1,"TransactionId was not sent\n");
+   AssertFatal(num_cells_to_activate>0,"No cells activated\n");
+   F1AP_SETUP_RESP (msg_p).num_cells_to_activate = num_cells_to_activate;
+
+   for (int i=0;i<num_cells_to_activate;i++)  
+     AssertFatal(F1AP_SETUP_RESP (msg_p).num_SI[i] > 0, "System Information %d is missing",i);
+
+
+   printf("Sending F1AP_SETUP_RESP ITTI message to ENB_APP with assoc_id (%d->%d)\n",
+	  assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
+   itti_send_msg_to_task(TASK_ENB_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
+
    return 0;
 }
 
@@ -789,4 +887,4 @@ void DU_send_gNB_CU_CONFIGURATION_UPDATE_FALIURE(F1AP_GNBCUConfigurationUpdateFa
 
 void DU_send_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(F1AP_GNBCUConfigurationUpdateAcknowledge_t *GNBCUConfigurationUpdateAcknowledge) {
   AssertFatal(1==0,"Not implemented yet\n");
-}
\ No newline at end of file
+}
-- 
GitLab