[Task-ID: ODUHIGH-484] Support for NAS Authentication Messages 11/10211/3
authorlal.harshita <Harshita.Lal@radisys.com>
Thu, 22 Dec 2022 08:13:49 +0000 (13:43 +0530)
committerlal.harshita <Harshita.Lal@radisys.com>
Thu, 22 Dec 2022 09:34:19 +0000 (15:04 +0530)
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
Change-Id: I08fc779c2fa37d4a6cb8b752ec8f7e86355d3502
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
build/odu/makefile
src/cu_stub/cu_f1ap_msg_hdl.c
src/cu_stub/cu_f1ap_msg_hdl.h
src/phy_stub/phy_stub.h
src/phy_stub/phy_stub_msg_hdl.c

index 2a7efea..d2d994e 100644 (file)
@@ -44,7 +44,7 @@ PARALLEL_COMP=-j $(NUM_PARALLEL)
 # # Other apsects of tool chain set here
 # # These should be made available appropriately to the builds
 ifeq ($(MACHINE),BIT64)
-ifeq ($(COVERAGE),1)
+ifeq ($(COVERAGE),ENABLE)
 CC          =gcc -m64 --coverage
 else
 CC          =gcc -m64
@@ -158,6 +158,7 @@ help:
                @echo -e "$(OPTS)    MODE=TDD             - If not specified, MODE=FDD$(NORM)"
                @echo -e "$(OPTS)    PHY=INTEL_L1         - If not specified, Phy stub is used$(NORM)"
                @echo -e "$(OPTS)    PHY_MODE=TIMER       - Testing mode for INTEL_L1"
+               @echo -e "$(OPTS)    COVERAGE=ENABLE      - To record the code coverage stats. Disabled by default"
                @echo -e "******************************************************************"
 
 prepare_dirs:
index 6fd26b6..4f1858e 100644 (file)
@@ -1519,6 +1519,28 @@ uint8_t  BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rr
          DU_LOG("\nERROR  -->  F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
    }
    else if(rrcMsgType == RRC_SETUP_COMPLETE)
+   {
+      DU_LOG("\nINFO --> F1AP : Sending NAS Authentication Request");
+      char authReqBuf[51] = {0x00, ueCb->pdcpSn++, 0x2a, 0x85, 0x4f, 0xc0, 0x0a, 0xc0, 0x40, 0x40, 0x00, 0x04, 0x2f, 0x58, 0x39, 0x12,\
+                             0x37, 0x15, 0x74, 0x16, 0x4c, 0x8d, 0xd3, 0x95, 0xa6, 0x9e, 0x94, 0x03, 0x24, 0x02, 0x00, 0x6f,\
+                             0x0b, 0x39, 0x5e, 0xbc, 0xb0, 0x00, 0x1a, 0xb1, 0xc1, 0x3f, 0x84, 0x4f, 0x77, 0xe3, 0x20, 0x00,\
+                             0x00, 0x00, 0x00};
+      bufLen = 51;
+      rrcContainer->size = bufLen;
+      CU_ALLOC(rrcContainer->buf, rrcContainer->size);
+      if(rrcContainer->buf != NULLP)
+      {
+         memset(rrcContainer->buf, 0, bufLen); 
+         memcpy(rrcContainer->buf, authReqBuf, bufLen);
+      }
+      else
+      {
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation failure for RRC Container buffer");
+         ret = RFAILED;
+
+      }     
+   }
+   else if(rrcMsgType == NAS_AUTHENTICATION_RSP)
    {
       DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command");
       char secModeBuf[30]={0x00, ueCb->pdcpSn++, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0, 
@@ -1807,6 +1829,9 @@ uint8_t setDlRRCMsgType(CuUeCb *ueCb)
       case RRC_SETUP_COMPLETE:
          rrcMsgType = RRC_SETUP_COMPLETE;
          break;
+      case NAS_AUTHENTICATION_RSP:
+         rrcMsgType = NAS_AUTHENTICATION_RSP;
+         break;
       case NAS_SECURITY_MODE_COMPLETE:
          rrcMsgType = NAS_SECURITY_MODE_COMPLETE;
          break;
@@ -9829,22 +9854,7 @@ uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
       ueCb = &duDb->ueCb[duUeF1apId-1];
       ueCb->f1apMsgDb.dlRrcMsgCount++;
       rrcMsgType = setDlRRCMsgType(ueCb);
-      if(rrcMsgType == RRC_SETUP_COMPLETE)
-      {
-         DU_LOG("\nINFO  -->  F1AP: Sending DL RRC MSG for NAS Security Mode Command");
-         ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
-      }
-      if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE)
-      {
-         DU_LOG("\nINFO  -->  F1AP: Sending DL RRC MSG for RRC Security Mode Command"); 
-         ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
-      }
-      else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE)
-      {
-         DU_LOG("\nINFO  -->  F1AP: Sending DL RRC MSG for RRC Registration Accept");
-         BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
-      }
-      else if(rrcMsgType == REGISTRATION_COMPLETE)
+      if(rrcMsgType == REGISTRATION_COMPLETE)
       {
          DU_LOG("\nINFO  -->  F1AP: Sending Ue Context Setup Request"); 
          ret = BuildAndSendUeContextSetupReq(duId, ueCb);
@@ -9854,6 +9864,11 @@ uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
          DU_LOG("\nINFO  -->  F1AP: Sending UE Context Modification Request");
          BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND);
       }
+      else
+      {
+         /* In case rrcMsgType is RRC_SETUP_COMPLETE / NAS_AUTHENTICATION_RSP / NAS_SECURITY_MODE_COMPLETE / RRC_SECURITY_MODE_COMPLETE */
+         BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
+      }
    }
    return ret;
 }
index 1de45b9..6b97c90 100644 (file)
@@ -151,6 +151,7 @@ typedef enum
 {
    RRC_SETUP=1,
    RRC_SETUP_COMPLETE,
+   NAS_AUTHENTICATION_RSP,
    NAS_SECURITY_MODE_COMPLETE,
    RRC_SECURITY_MODE_COMPLETE,
    REGISTRATION_COMPLETE,
index ecc4b2b..fc23df6 100644 (file)
@@ -70,6 +70,7 @@ typedef struct ueCb
    bool     msg5ShortBsrSent;
    bool     msg5Sent;
    bool     dlDedMsg;
+   bool     msgNasAuthenticationComp;
    bool     msgNasSecurityModeComp;
    bool     msgRrcSecurityModeComp;
    bool     msgRrcReconfigComp;
@@ -106,6 +107,7 @@ typedef enum
    MSG_TYPE_MSG3,
    MSG_TYPE_SHORT_BSR,
    MSG_TYPE_MSG5,
+   MSG_TYPE_NAS_AUTHENTICATION_COMPLETE,
    MSG_TYPE_NAS_SECURITY_MODE_COMPLETE,
    MSG_TYPE_RRC_SECURITY_MODE_COMPLETE,
    MSG_TYPE_REGISTRATION_COMPLETE,
index e086982..2e8378d 100644 (file)
@@ -450,6 +450,11 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
          phyDb.ueDb.ueCb[ueId-1].msg5Sent = true;
          type = MSG_TYPE_MSG5;
       }
+      else if(!phyDb.ueDb.ueCb[ueId-1].msgNasAuthenticationComp)
+      {
+        phyDb.ueDb.ueCb[ueId-1].msgNasAuthenticationComp = true;
+        type = MSG_TYPE_NAS_AUTHENTICATION_COMPLETE;
+      }
       else if(!phyDb.ueDb.ueCb[ueId-1].msgNasSecurityModeComp)
       {
          phyDb.ueDb.ueCb[ueId-1].msgNasSecurityModeComp = true;
@@ -569,6 +574,31 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
          byteIdx += msg5PduLen; /* 4 bytes of header : MAC+RLC */
          break;
       }
+
+      case MSG_TYPE_NAS_AUTHENTICATION_COMPLETE:
+      {
+        /* For Authentication response where RRC Container is dummy
+          *
+          * MAC subheader format is R/F/LCId/L (2/3 bytes)
+          * LCId is 1 for SRB1
+          * L is length of PDU i.e 6bytes here 
+          * From 38.321 section 6.1.1
+          *
+          * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN)
+          * From 38.322, section 6.2.2.4
+          */
+         DU_LOG("\nDEBUG  -->  PHY_STUB: Forming AUTHENTICATION RESPONSE PDU");
+         uint8_t  pduLen = 37; /* Length of PDU */
+         pduLen += 2; /* RLC subheader */
+         uint8_t msg[] = {1, pduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 0x3a, \
+                          0x0e, 0x3f, 0x00, 0xca, 0x95, 0xe9, 0x19, 0x41, 0x3f, 0x00, 0x2b, 0x96, 0x88, 0x06, 0xd7, 0x16, 0xc6, \
+                          0x8b, 0xea, 0xae, 0x45, 0xd1, 0x01, 0xfd, 0x34, 0xd4, 0xfd, 0xd5, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+         pduLen += 2;  /* 2 bytes of MAC header */
+         memcpy(pdu, &msg, pduLen);
+         byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */
+         break;
+      }
       
       case MSG_TYPE_NAS_SECURITY_MODE_COMPLETE:
       {
@@ -595,8 +625,9 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
          pduLen += 2;  /* 2 bytes of MAC header */
          memcpy(pdu, &msg, pduLen);
          byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */
-break;
+         break;
       }
+
       case MSG_TYPE_RRC_SECURITY_MODE_COMPLETE:
       {
          /* For security mode complete where RRC Container is dummy