Ue Config Changes aligned with AAD
[o-du/l2.git] / src / cu_stub / cu_f1ap_msg_hdl.c
index ac6a842..2b651a0 100644 (file)
@@ -224,11 +224,7 @@ S16 SendF1APMsg(Region region, Pool pool)
 
 S16 BuildNrCellId(BIT_STRING_t *nrcell)
 {
-   uint8_t tmp;
-   for (tmp = 0 ; tmp < nrcell->size-1; tmp++)
-   {
-      nrcell->buf[tmp] = 0;
-   }
+   memset(nrcell->buf, 0, nrcell->size);
    nrcell->buf[4]   = 16; 
    nrcell->bits_unused = 4;
    nrcell->size = 5 * sizeof(uint8_t);
@@ -1516,20 +1512,55 @@ uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
 
 uint8_t        BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
 {
-   uint8_t ret = ROK;
-
+   uint8_t ret, bufLen;
+   
+   ret =ROK;
    if(rrcMsgType == RRC_SETUP)
    { 
       ret = fillDlCcchRrcMsg(rrcContainer);
       if(ret == RFAILED)
-         DU_LOG("\n F1AP: Failed to fill DL-CCCH Msg at BuildDLRRCContainer()");
+          DU_LOG("\n F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
+   }
+   else if(rrcMsgType == REGISTRATION_ACCEPT)
+   {
+      /*Hardcoded RRC Container from reference logs*/
+      char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
+      bufLen =14;
+      rrcContainer->size = bufLen;
+      CU_ALLOC(rrcContainer->buf, rrcContainer->size);
+      if(rrcContainer->buf != NULLP)
+      {
+         memset(rrcContainer->buf, 0, bufLen);
+        memcpy(rrcContainer->buf, buf, bufLen);
+      }
    }
    else if(rrcMsgType == RRC_RECONFIG)
    {
-      ret = fillDlDcchRrcMsg(rrcContainer);
-      if(ret == RFAILED)
-         DU_LOG("\n F1AP: Failed at fill DL-DCCH Msg at BuildDLRRCContainer()");
+      /*Hardcoded RRC Container from reference logs*/
+      char buf[196]= { 
+      0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
+      0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
+      0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
+      0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
+      0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
+      0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
+      0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
+      0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
+      0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
+      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
+      0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
+      0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
+      0x00, 0x00, 0x00, 0x00};
+      bufLen =196;
+      rrcContainer->size = bufLen;
+      CU_ALLOC(rrcContainer->buf, rrcContainer->size);
+      if(rrcContainer->buf != NULLP)
+      {
+         memset(rrcContainer->buf, 0, bufLen);
+        memcpy(rrcContainer->buf, buf, bufLen);
+      }
    }
+   
    return ret;
 }
 
@@ -1550,7 +1581,7 @@ uint8_t   BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t rrcMsgType)
+uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
 {
    uint8_t   elementCnt = 0;
    uint8_t  ieId;
@@ -1639,7 +1670,7 @@ uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t rrcMsgType)
    dlRRCMsg->protocolIEs.list.array[idx]->criticality  =   Criticality_reject;
    dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
                                                          DLRRCMessageTransferIEs__value_PR_SRBID;
-   dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = SRB1;
+   dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
 
    /* RRCContainer */
    idx++;
@@ -1708,8 +1739,11 @@ uint8_t setDlRRCMsgType()
       case RRC_SETUP:
         rrcMsgType = RRC_SETUP;
         break;
-      case RRC_SECURITY_MODE_COMMAND:
-        rrcMsgType = RRC_SECURITY_MODE_COMMAND;
+      case REGISTRATION_ACCEPT:
+        rrcMsgType = REGISTRATION_ACCEPT;
+        break;
+      case UE_CONTEXT_SETUP_REQ:
+        rrcMsgType = UE_CONTEXT_SETUP_REQ;
         break;
       case RRC_RECONFIG:
         rrcMsgType = RRC_RECONFIG;
@@ -1792,7 +1826,7 @@ uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
    {
       f1apMsgDb.dlRrcMsgCount++;
       rrcMsgType = setDlRRCMsgType();
-      ret = BuildAndSendDLRRCMessageTransfer(rrcMsgType);
+      ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
    }
    return ret;
 }
@@ -1815,9 +1849,9 @@ uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
 {
    uint8_t ret;
-   uint8_t unused = 4;
+   uint8_t unused_bits = 4;
    uint8_t byteSize = 5;
-   uint8_t val = 16;
+   uint8_t val = 1;
    /* Allocate Buffer Memory */
    nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
    CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
@@ -1837,11 +1871,17 @@ uint8_t BuildNrcgi(NRCGI_t *nrcgi)
    {
       return RFAILED;
    }
+#if 0
    ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
    if(ret != ROK)
    {
       return RFAILED;
    }
+#endif
+   memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
+   nrcgi->nRCellIdentity.buf[0] |= val;
+   nrcgi->nRCellIdentity.bits_unused = unused_bits;
+
    return ROK;
 }
 /*******************************************************************
@@ -5698,7 +5738,7 @@ uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
    uint8_t   SplCellListret;
    uint8_t   SrbSetupret;
    uint8_t   elementCnt;
-   uint8_t   idx;
+   uint8_t   idx, bufLen;
    uint8_t   idx1;
    F1AP_PDU_t          *f1apMsg = NULLP;
    UEContextSetupRequest_t *ueSetReq = NULLP;
@@ -5733,7 +5773,7 @@ uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
       ueSetReq =
         &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
 
-      elementCnt = 11;
+      elementCnt = 12;
       ueSetReq->protocolIEs.list.count = elementCnt;
       ueSetReq->protocolIEs.list.size = \
                                        elementCnt * sizeof(UEContextSetupRequestIEs_t *);
@@ -5856,14 +5896,15 @@ uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
       {        
         break;
       }
-      
-      /* RRC Container */
+      /* RRC Container for security mode */
       idx++;
       ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
       ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
       ueSetReq->protocolIEs.list.array[idx]->value.present = \
          UEContextSetupRequestIEs__value_PR_RRCContainer;
-      ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = rrcContLen;
+      char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
+      bufLen =9;
+      ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
       CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
           ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
       if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
@@ -5871,8 +5912,8 @@ uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
          DU_LOG(" F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
          break;
       }
-      memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
-         rrcContainer, ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size); 
+      memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
+      memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
 
       /* RRC delivery status request */
       idx++;
@@ -5883,7 +5924,27 @@ uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
          UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
       ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
          RRCDeliveryStatusRequest_true;
-      
+
+      /* Bit Rate hardcoded as in reference logs */
+      idx++;
+      ueSetReq->protocolIEs.list.array[idx]->id = \
+         ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
+      ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
+      ueSetReq->protocolIEs.list.array[idx]->value.present = \
+         UEContextSetupRequestIEs__value_PR_BitRate;
+      char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
+      bufLen = 4;
+      ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
+      CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
+         ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
+      if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
+      {
+         DU_LOG(" F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
+         break;
+      }
+      memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
+      memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
+
       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
 
       /* Encode the F1SetupRequest type as APER */
@@ -5988,13 +6049,16 @@ uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
    {
       f1apMsgDb.dlRrcMsgCount++;
       rrcMsgType = setDlRRCMsgType();
-      if(rrcMsgType == RRC_SECURITY_MODE_COMMAND)
+      if(rrcMsgType == REGISTRATION_ACCEPT)
       {
-         ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId, rrcContLen, rrcContainer);
+         DU_LOG("\nSending DL RRC MSG for RRC Registration Complete"); 
+         ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
       }
-      if(rrcMsgType == RRC_RECONFIG)
+      if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
       {
-         ret = BuildAndSendDLRRCMessageTransfer(rrcMsgType);
+         DU_LOG("\nSending Ue Context Setup Req"); 
+         ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
+           rrcContLen, rrcContainer);
       }
    }
    return ret;
@@ -6288,7 +6352,16 @@ void F1APMsgHdlr(Buffer *mBuf)
            }
             case SuccessfulOutcome__value_PR_UEContextSetupResponse:
            {
+              uint8_t rrcMsgType;
+
                DU_LOG("\nF1AP : UE ContextSetupResponse received");
+               f1apMsgDb.dlRrcMsgCount++;
+               rrcMsgType = setDlRRCMsgType();
+               if(rrcMsgType == RRC_RECONFIG)
+               {
+                  DU_LOG("\nImplementing DL RRC MSG for RRC Reconfig Complete");
+                  BuildAndSendDLRRCMessageTransfer(SRB1, rrcMsgType);
+               }
                break;
            }
             default: