From cf406af4f0ed9b0bc73a4594e9e1d25efea70dfe Mon Sep 17 00:00:00 2001
From: Prateek Bidwalkar <prateek.bidwalkar@ipaccess.com>
Date: Tue, 26 Nov 2019 17:45:47 +0530
Subject: [PATCH] ASN encoding for SIB1 in SA mode

Signed-off-by: Prateek Bidwalkar <prateek.bidwalkar@ipaccess.com>
---
 openair2/RRC/NR/MESSAGES/asn1_msg.c | 152 ++++++++++++++++++++++++++++
 openair2/RRC/NR/MESSAGES/asn1_msg.h |  14 ++-
 openair2/RRC/NR/nr_rrc_defs.h       |  10 +-
 3 files changed, 166 insertions(+), 10 deletions(-)

diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index ee21f4e966..7671b0a9d1 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -290,6 +290,157 @@ uint8_t do_MIB_NR(rrc_gNB_carrier_data_t *carrier,
   AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
                enc_rval.failed_type->name, enc_rval.encoded);
 
+
+  if (enc_rval.encoded==-1) {
+    return(-1);
+  }
+
+  return((enc_rval.encoded+7)/8);
+}
+
+
+uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier
+#if defined(ENABLE_ITTI)
+		, gNB_RrcConfigurationReq *configuration
+#endif
+               )
+{
+  asn_enc_rval_t enc_rval;
+
+  NR_BCCH_DL_SCH_Message_t *sib1_message ;
+  struct NR_SIB1 *sib1 ;
+ 
+  int i;
+  struct NR_PLMN_IdentityInfo nr_plmn_info;
+
+#if defined(ENABLE_ITTI)
+ // TODO : Add support for more than one PLMN 
+  //int num_plmn = configuration->num_plmn;
+  int num_plmn = 1;
+#else
+  int num_plmn = 1;
+#endif
+
+  struct NR_PLMN_Identity nr_plmn[num_plmn];
+  NR_MCC_MNC_Digit_t nr_mcc_digit[num_plmn][3];
+  NR_MCC_MNC_Digit_t nr_mnc_digit[num_plmn][3];
+
+//  struct NR_UAC_BarringInfoSet nr_uac_BarringInfoSet;
+
+  sib1_message = CALLOC(1,sizeof(NR_BCCH_DL_SCH_Message_t));
+  memset(sib1_message,0,sizeof(NR_BCCH_DL_SCH_Message_t));
+
+  carrier->siblock1 = sib1_message;
+
+  sib1_message->message.present = NR_BCCH_DL_SCH_MessageType_PR_c1;
+  sib1_message->message.choice.c1 = CALLOC(1,sizeof(struct NR_BCCH_DL_SCH_MessageType__c1));
+  memset(sib1_message->message.choice.c1,0,sizeof(struct NR_BCCH_DL_SCH_MessageType__c1));
+  sib1_message->message.choice.c1->present = NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1;
+
+  sib1_message->message.choice.c1->choice.systemInformationBlockType1 = CALLOC(1,sizeof(struct NR_SIB1));
+  sib1 = sib1_message->message.choice.c1->choice.systemInformationBlockType1;
+  memset(sib1,0,sizeof(struct NR_SIB1));
+
+
+  sib1->cellSelectionInfo = CALLOC(1,sizeof(struct NR_SIB1__cellSelectionInfo));
+  memset(sib1->cellSelectionInfo,0,sizeof(struct NR_SIB1__cellSelectionInfo));
+
+  sib1->cellSelectionInfo->q_RxLevMin = -50;
+
+
+  memset(&nr_plmn_info.plmn_IdentityList,0,sizeof(struct NR_PLMN_IdentityInfo__plmn_IdentityList));
+  asn_set_empty(&nr_plmn_info.plmn_IdentityList.list);
+
+  memset(&nr_plmn_info,0,sizeof(struct NR_PLMN_IdentityInfo));
+
+  memset(nr_plmn,0,num_plmn*sizeof(struct NR_PLMN_Identity));
+
+  for (i = 0; i < num_plmn; ++i) {
+
+      
+#ifdef ENABLE_ITTI
+      nr_mcc_digit[i][0] = (configuration->mcc[i]/100)%10;
+      nr_mcc_digit[i][1] = (configuration->mcc[i]/10)%10;
+      nr_mcc_digit[i][2] = (configuration->mcc[i])%10;
+#else
+      nr_mcc_digit[i][0] = 0;
+      nr_mcc_digit[i][1] = 0;
+      nr_mcc_digit[i][2] = 1;
+#endif
+
+      nr_plmn[i].mcc = CALLOC(1,sizeof(struct NR_MCC));
+      memset(nr_plmn[i].mcc,0,sizeof(struct NR_MCC));
+      asn_set_empty(&nr_plmn[i].mcc->list);
+      ASN_SEQUENCE_ADD(&nr_plmn[i].mcc->list, &nr_mcc_digit[i][0]);
+      ASN_SEQUENCE_ADD(&nr_plmn[i].mcc->list, &nr_mcc_digit[i][1]);
+      ASN_SEQUENCE_ADD(&nr_plmn[i].mcc->list, &nr_mcc_digit[i][2]);
+
+
+#ifdef ENABLE_ITTI
+      nr_mnc_digit[i][0] = (configuration->mnc[i]/100)%10;
+      nr_mnc_digit[i][1] = (configuration->mnc[i]/10)%10;
+      nr_mnc_digit[i][2] = (configuration->mnc[i])%10;
+#else
+      nr_mnc_digit[i][0] = 0;
+      nr_mnc_digit[i][1] = 0;
+      nr_mnc_digit[i][2] = 1;
+#endif
+
+      memset(&nr_plmn[i].mnc,0,sizeof(NR_MNC_t));
+      nr_plmn[i].mnc.list.size=0;
+      nr_plmn[i].mnc.list.count=0;
+      ASN_SEQUENCE_ADD(&nr_plmn[i].mnc.list, &nr_mnc_digit[i][0]);
+      ASN_SEQUENCE_ADD(&nr_plmn[i].mnc.list, &nr_mnc_digit[i][1]);
+      ASN_SEQUENCE_ADD(&nr_plmn[i].mnc.list, &nr_mnc_digit[i][2]);
+  
+      ASN_SEQUENCE_ADD(&nr_plmn_info.plmn_IdentityList.list, &nr_plmn[i]);
+  }//end plmn loop
+
+  nr_plmn_info.cellIdentity.buf = MALLOC(8);
+  memset(nr_plmn_info.cellIdentity.buf,0,8);
+
+#ifdef ENABLE_ITTI
+  nr_plmn_info.cellIdentity.buf[0]= (configuration->cell_identity >> 20) & 0xff;
+  nr_plmn_info.cellIdentity.buf[1]= (configuration->cell_identity >> 12) & 0xff;
+  nr_plmn_info.cellIdentity.buf[2]= (configuration->cell_identity >> 4) & 0xff;
+  nr_plmn_info.cellIdentity.buf[3]= (configuration->cell_identity << 4) & 0xff;
+#else
+  nr_plmn_info.cellIdentity.buf[0]= 0x00;
+  nr_plmn_info.cellIdentity.buf[1]= 0x00;
+  nr_plmn_info.cellIdentity.buf[2]= 0x00;
+  nr_plmn_info.cellIdentity.buf[3]= 0x10;
+#endif
+  nr_plmn_info.cellIdentity.size= 4;
+  nr_plmn_info.cellIdentity.bits_unused= 4;
+
+  nr_plmn_info.cellReservedForOperatorUse = 0;
+
+  memset(&sib1->cellAccessRelatedInfo,0,sizeof(NR_CellAccessRelatedInfo_t));
+  ASN_SEQUENCE_ADD(&sib1->cellAccessRelatedInfo.plmn_IdentityList.list, &nr_plmn_info);
+
+#if 0
+  sib1->uac_BarringInfo = CALLOC(1, sizeof(struct NR_SIB1__uac_BarringInfo));
+  memset(sib1->uac_BarringInfo, 0, sizeof(struct NR_SIB1__uac_BarringInfo));
+
+  nr_uac_BarringInfoSet.uac_BarringFactor = NR_UAC_BarringInfoSet__uac_BarringFactor_p95;
+  nr_uac_BarringInfoSet.uac_BarringTime = NR_UAC_BarringInfoSet__uac_BarringTime_s4;
+  nr_uac_BarringInfoSet.uac_BarringForAccessIdentity.buf = MALLOC(1);
+  memset(nr_uac_BarringInfoSet.uac_BarringForAccessIdentity.buf,0,1);
+  nr_uac_BarringInfoSet.uac_BarringForAccessIdentity.size = 1;
+  nr_uac_BarringInfoSet.uac_BarringForAccessIdentity.bits_unused = 1;
+  ASN_SEQUENCE_ADD(&sib1->uac_BarringInfo->uac_BarringInfoSetList, &nr_uac_BarringInfoSet);
+#endif
+
+  //encode SIB1 to data
+  enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_DL_SCH_Message,
+                                   NULL,
+                                   (void*)sib1_message,
+                                   carrier->SIB1,
+                                   100);
+  AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+               enc_rval.failed_type->name, enc_rval.encoded);
+
+
   if (enc_rval.encoded==-1) {
     return(-1);
   }
@@ -421,6 +572,7 @@ void do_SERVINGCELLCONFIGCOMMON(uint8_t Mod_id,
 
     bwp_dl_timedomainresourceallocation->k0 = CALLOC(1,sizeof(long));
 
+    pusch_configcommontimedomainresourceallocation      = CALLOC(1,sizeof(NR_PUSCH_TimeDomainResourceAllocation_t));
     pusch_configcommontimedomainresourceallocation->k2  = CALLOC(1,sizeof(long));
 
     ratematchpattern->patternType.choice.bitmaps                                             = CALLOC(1,sizeof(struct NR_RateMatchPattern__patternType__bitmaps));
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index 3f5fadae63..fe542bc324 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -72,17 +72,15 @@ uint8_t do_MIB_NR(rrc_gNB_carrier_data_t *carrier,
                   uint32_t subCarrierSpacingCommon, 
                   uint32_t dmrs_TypeA_Position);
 /**
-\brief Generate configuration for SIB1 (eNB).
+\brief Generate configuration for SIB1 (gNB).
 @param carrier pointer to Carrier information
-@param Mod_id Instance of eNB
-@param Component carrier Component carrier to configure
 @param configuration Pointer Configuration Request structure  
 @return size of encoded bit stream in bytes*/
-
-uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
-		           int Mod_id,
-				   int CC_id,
-				   gNB_RrcConfigurationReq *configuration);
+uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier
+	#if defined(ENABLE_ITTI)
+		, gNB_RrcConfigurationReq *configuration
+	#endif
+		);
 
 void do_SERVINGCELLCONFIGCOMMON(uint8_t Mod_id,
                                 int CC_id,
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index 5f552dbfba..e3ce802bf9 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -56,8 +56,10 @@
 //#include "RRCConnectionRequest.h"
 //#include "RRCConnectionReestablishmentRequest.h"
 #include "NR_RRCReestablishmentRequest.h"
-//#include "BCCH-DL-SCH-Message.h"
+#include "NR_BCCH-DL-SCH-Message.h"
 #include "NR_BCCH-BCH-Message.h"
+#include "NR_PLMN-IdentityInfo.h"
+#include "NR_MCC-MNC-Digit.h"
 //#include "MCCH-Message.h"
 //#include "MBSFNAreaConfiguration-r9.h"
 //#include "SCellToAddMod-r10.h"
@@ -374,6 +376,9 @@ typedef struct {
   uint8_t                                   *MIB;
   uint8_t                                   sizeof_MIB;
 
+  uint8_t                                   *SIB1;
+  uint8_t                                   sizeof_SIB1;
+  
   uint8_t                                   *ServingCellConfigCommon;
   uint8_t                                   sizeof_servingcellconfigcommon;
 
@@ -388,7 +393,8 @@ typedef struct {
 
   //are the only static one (memory has been already allocated)
   NR_BCCH_BCH_Message_t                     mib;
-
+  NR_BCCH_DL_SCH_Message_t                  *siblock1;
+  
   NR_ServingCellConfigCommon_t              *servingcellconfigcommon;
 
 
-- 
2.26.2