From: Harshita Lal Date: Tue, 11 Oct 2022 06:47:30 +0000 (+0000) Subject: Merge "[JIRA ID- ODUHIGH-462] [ISSUE ID ODUHIGH-477] Adding support for drx configura... X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=0ba7b600f85b2975e1d60e5b8ad1523349b5f396;hp=2bd852089c3226f721d83b30f816b90f803237f6;p=o-du%2Fl2.git Merge "[JIRA ID- ODUHIGH-462] [ISSUE ID ODUHIGH-477] Adding support for drx configuration in UE Context setup" --- diff --git a/docs/README b/docs/README index 8b5056d3a..e64a0935b 100644 --- a/docs/README +++ b/docs/README @@ -55,12 +55,18 @@ C. Pre-requisite for O1 Interface (Required only if run with O1 interface enable d. Open the oamVesConfig.json and edit the details of OAM VES collector. e. Open the smoVesConfig.json and edit the details of SMO VES collector. f. Open the netconfConfig.json and edit the details of Netopeer server. - g. Install the yang modules and load initial configuration + +3. Install the yang modules and load initial configuration: $cd l2/build/scripts $sudo ./load_yang.sh - h. To enable Standard Defined VES format: +4. Start Netopeer2-server: + + $cd l2/build/scripts + $sudo ./netopeer-server.sh start + +5. In case standard defined VES format is to be enabled (this step is optional): cd l2/src/o1/ves @@ -68,10 +74,6 @@ C. Pre-requisite for O1 Interface (Required only if run with O1 interface enable #define StdDef -3. Start Netopeer2-server: - $cd l2/build/scripts - $sudo ./netopeer-server.sh start - D. How to Clean and Build: -------------------------- @@ -178,7 +180,7 @@ PS: If O1 interface is enabled, IP should match those configured in step C.2.a. ./odu PS: CU stub and RIC stub must be run (in no particular sequence) before ODU - + In case O1 is enabled and SMO is not available run section H to start the stack. G. How to test with Intel L1: ----------------------------- @@ -250,27 +252,40 @@ II. Execution ./odu -H. How to execute the Health Check : get alarm-list ----------------------------------------------------- - - Steps: +H. Push cell and slice configuration over O1 using netopeer-cli +--------------------------------------------------------------- + When O-DU High is run with O1 enabled it waits for initial cell configuration to be pushed by SMO before starting the stack. In case the SMO is not available then these configurations can be pushed via netopeer-cli as follows: - 1. Start Netconf netopeer client - - 2. Connect to the server with + $cd l2/build/config + $netopeer2-cli + > connect --login netconf + Interactive SSH Authentication + Type your password: + Password: netconf! + > edit-config --target candidate --config=cellConfig.xml + > OK + > commit + > OK + > edit-config --target candidate --config=rrmPolicy.xml + > OK + > commit + > OK + + For pushing these configurations in subsequent runs please edit cellConfig.xml and rrmPolicy.xml and increment number in the tag to a new value e.g. - user: netconf - pwd: netconf! + rrm-2 connect --login netconf Interactive SSH Authentication Type your password: - Password: + Password: netconf! > get --filter-xpath /o-ran-sc-odu-alarm-v1:odu/alarms DATA @@ -287,15 +302,6 @@ H. How to execute the Health Check : get alarm-list The XML output is a list of active alarms in the O-DU High system. -I. Push cell and slice configuration over O1 using netopeer-cli ---------------------------------------------------------------- - When O-DU High is run with O1 enabled it waits for cell configuration to be pushed by SMO. In case the SMO is not available then these configurations can be pushed via netopeer-cli as follows. - 1. Follow step H.1 and H.2. - 2. update cellConfig.xml and rrmPolicy.xml. - $cd l2/build/config - $edit-config --target candidate --config=cellConfig.xml - $edit-config --target candidate --config=rrmPolicy.xml - J. Troubleshooting Netconf server issues ---------------------------------------- @@ -303,4 +309,4 @@ J. Troubleshooting Netconf server issues $cd l2/build/scripts $sudo ./troubleshoot_netconf.sh cleanup - execute section C.2.f, C.3 again + execute section C.3 and C.4 again diff --git a/docs/installation-guide.rst b/docs/installation-guide.rst index aced1ed4b..3a7489117 100644 --- a/docs/installation-guide.rst +++ b/docs/installation-guide.rst @@ -150,26 +150,26 @@ Setting up Netconf server (Only if O1 interface enabled) | Open the oamVesConfig.json and edit the details of OAM VES collector. | Open the smoVesConfig.json and edit the details of SMO VES collector. | Open the netconfConfig.json and edit the details of Netopeer server. - | Install the yang modules and load initial configuration. + +- Install the yang modules and load initial configuration. - Ubuntu : | $cd /l2/build/scripts | $sudo ./load_yang.sh - - To enable Standard Defined VES format: - - | cd l2/src/o1/ves - - | Enable the Macro "StdDef" in file VesUtils.h - | #define StdDef - - Start Netopeer2-server: - Ubuntu : | cd /l2/build/scripts | sudo ./netopeer-server.sh start +- In case standard defined VES format is to be enabled (this step is optional): + + | cd l2/src/o1/ves + + | Enable the Macro "StdDef" in file VesUtils.h + | #define StdDef Compilation =========== diff --git a/docs/user-guide.rst b/docs/user-guide.rst index 18dac0e53..b24fb63a4 100644 --- a/docs/user-guide.rst +++ b/docs/user-guide.rst @@ -57,8 +57,8 @@ PS: If O1 interface is enabled, IPs should match those configured in "startup_co - ./odu -PS: CU stub and RIC stub must be run (in no particular sequence) before ODU. - In case O1 is enabled and SMO is not available follow section E below. +PS: CU stub and RIC stub must be run (in no particular sequence) before ODU. + In case O1 is enabled and SMO is not available run section D to start the stack. II. Execution - Using Docker Images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -66,17 +66,17 @@ II. Execution - Using Docker Images The call flow between O-DU High and CU Stub can be achieved by executing docker containers. - Pull the last built docker images: - - docker pull nexus3.o-ran-sc.org:10004/o-ran-sc/o-du-l2:6.0.4 - - docker pull nexus3.o-ran-sc.org:10004/o-ran-sc/o-du-l2-cu-stub:6.0.4 + - docker pull nexus3.o-ran-sc.org:10004/o-ran-sc/o-du-l2:6.0.3 + - docker pull nexus3.o-ran-sc.org:10004/o-ran-sc/o-du-l2-cu-stub:6.0.3 - Run CU Stub docker: - docker run -it --privileged --net=host --entrypoint bash - nexus3.o-ran-sc.org:10004/o-ran-sc/o-du-l2-cu-stub:6.0.4 + nexus3.o-ran-sc.org:10004/o-ran-sc/o-du-l2-cu-stub:6.0.3 - ./cu_stub - Run ODU docker: - docker run -it --privileged --net=host --entrypoint bash - nexus3.o-ran-sc.org:10004/o-ran-sc/o-du-l2:6.0.4 + nexus3.o-ran-sc.org:10004/o-ran-sc/o-du-l2:6.0.3 - ./odu @@ -205,28 +205,39 @@ Note: UL IQ-Sample request and response are needed by Intel O-DU Low in timer mo these are guarded under INTEL_TIMER_MODE flag which can be enabled using compilation option "PHY_MODE=TIMER", as mentioned in section B.I.1.d . +D. Push cell and slice configuration over O1 using netopeer-cli +--------------------------------------------------------------- + When O-DU High is run with O1 enabled it waits for initial cell configuration to be pushed by SMO before starting the stack. In case the SMO is not available then these configurations can be pushed via netopeer-cli as follows: -D. Health Check execution: get alarm-list -------------------------------------------- - -To execute the get alarm-list flow, following steps are required to be executed: + | $cd l2/build/config + | $netopeer2-cli + | > connect --login netconf + | Interactive SSH Authentication + | Type your password: + | Password: netconf! + | > edit-config --target candidate --config=cellConfig.xml + | > OK + | > commit + | > OK + | > edit-config --target candidate --config=rrmPolicy.xml + | > OK + | > commit + | > OK - 1. Start Netconf netopeer client - - 2. Connect to the server with + For pushing these configurations in subsequent runs please edit cellConfig.xml and rrmPolicy.xml and increment number in the tag to a new value e.g. - | user: netconf - | pwd: netconf! + rrm-2 connect --login netconf | Interactive SSH Authentication | Type your password: - | Password: + | Password: netconf! | > get --filter-xpath /o-ran-sc-odu-alarm-v1\:odu/alarms | DATA | @@ -243,14 +254,3 @@ Here are the steps as executed in the terminal The XML output is a list of active alarms in the O-DU High system. -E. Push cell and slice configuration over O1 using netopeer-cli ---------------------------------------------------------------- - -When O-DU High is run with O1 enabled it waits for cell configuration to be pushed by SMO. In case the SMO is not available then these configurations can be pushed via netopeer-cli as follows. - - 1. Follow step D.1 and D.2. - 2. update cellConfig.xml and rrmPolicy.xml. - - | $cd /l2/build/config - | $edit-config --target candidate --config=cellConfig.xml - | $edit-config --target candidate --config=rrmPolicy.xml diff --git a/src/5gnrmac/lwr_mac_fsm.c b/src/5gnrmac/lwr_mac_fsm.c index e3d256f30..63a86c54c 100644 --- a/src/5gnrmac/lwr_mac_fsm.c +++ b/src/5gnrmac/lwr_mac_fsm.c @@ -2001,7 +2001,7 @@ uint8_t lwr_mac_procConfigReqEvt(void *msg) uint8_t slotIdx = 0; uint8_t symbolIdx =0; #endif - uint8_t index = 0; + uint16_t index = 0; uint16_t *cellId =NULLP; uint16_t cellIdx =0; uint32_t msgLen = 0; @@ -2062,7 +2062,11 @@ uint8_t lwr_mac_procConfigReqEvt(void *msg) configReq = (fapi_config_req_t *)(cfgReqQElem + 1); memset(configReq, 0, sizeof(fapi_config_req_t)); fillMsgHeader(&configReq->header, FAPI_CONFIG_REQUEST, sizeof(fapi_config_req_t)); +#ifdef NR_TDD + configReq->number_of_tlvs = 25 + 1 + MAX_TDD_PERIODICITY_SLOTS * MAX_SYMB_PER_SLOT; +#else configReq->number_of_tlvs = 25; +#endif msgLen = sizeof(configReq->number_of_tlvs); if(macCfgParams.dlCarrCfg.pres) diff --git a/src/5gnrsch/sch_common.c b/src/5gnrsch/sch_common.c index a16cda542..bc5ca0f15 100644 --- a/src/5gnrsch/sch_common.c +++ b/src/5gnrsch/sch_common.c @@ -1972,7 +1972,8 @@ uint8_t schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbL *******************************************************************/ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId, bool isRetx, SchUlHqProcCb **hqP) { - bool k2Found = FALSE, ret = RFAILED; + bool k2Found = FALSE; + uint8_t ret = RFAILED; uint8_t startSymb = 0, symbLen = 0; uint8_t k2TblIdx = 0, k2Index = 0, k2Val = 0; uint16_t startPrb = 0; @@ -2047,7 +2048,7 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId break; } } - + if(k2Found == true) { ret = schCalculateUlTbs(ueCb, puschTime, symbLen, &startPrb, &totDataReq, isRetx, *hqP); @@ -2097,7 +2098,12 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId updateBsrAndLcList(&((*hqP)->ulLcPrbEst.defLcList), ueCb->bsrInfo, RFAILED); } } - return (ret); + else + { + DU_LOG("\nERROR --> SCH : schProcessSrOrBsrReq(): K2 value is not found"); + return false; + } + return true; } diff --git a/src/cu_stub/cu_f1ap_msg_hdl.c b/src/cu_stub/cu_f1ap_msg_hdl.c index 3b8ac6ef5..f292045e3 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@ -1514,8 +1514,27 @@ uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rr } else if(rrcMsgType == RRC_SETUP_COMPLETE) { - DU_LOG("\nINFO --> F1AP : Sending Security mode command"); - char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00}; + DU_LOG("\nINFO --> F1AP : Sending NAS Security mode command"); + char secModeBuf[30]={0x00, 0x02, 0x2e, 0x82, 0xaf, 0xc0, 0x7d, 0x1c, 0x4e, 0xfc, 0x80, 0x0f, 0xc0, + 0x0b, 0xa0, 0x20, 0x40, 0x9e, 0x0e, 0x1e, 0x0e, 0x1c, 0x26, 0xc0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00}; + bufLen =30; + rrcContainer->size = bufLen; + CU_ALLOC(rrcContainer->buf, rrcContainer->size); + if(rrcContainer->buf != NULLP) + { + memset(rrcContainer->buf, 0, bufLen); + memcpy(rrcContainer->buf, secModeBuf, bufLen); + } + else + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer"); + ret = RFAILED; + } + } + else if(rrcMsgType == NAS_SECURITY_MODE_COMPLETE) + { + DU_LOG("\nINFO --> F1AP : Sending RRC Security mode command"); + char secModeBuf[9]={0x00, 0x03, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00}; bufLen =9; rrcContainer->size = bufLen; CU_ALLOC(rrcContainer->buf, rrcContainer->size); @@ -1530,11 +1549,11 @@ uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rr ret = RFAILED; } } - else if(rrcMsgType == SECURITY_MODE_COMPLETE) + else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE) { /*Hardcoded RRC Container from reference logs*/ DU_LOG("\nINFO --> F1AP : Sending Registration accept"); - char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00}; + char buf[14] ={0x00, 0x04, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00}; bufLen =14; rrcContainer->size = bufLen; CU_ALLOC(rrcContainer->buf, rrcContainer->size); @@ -1768,8 +1787,11 @@ uint8_t setDlRRCMsgType(CuUeCb *ueCb) case RRC_SETUP_COMPLETE: rrcMsgType = RRC_SETUP_COMPLETE; break; - case SECURITY_MODE_COMPLETE: - rrcMsgType = SECURITY_MODE_COMPLETE; + case NAS_SECURITY_MODE_COMPLETE: + rrcMsgType = NAS_SECURITY_MODE_COMPLETE; + break; + case RRC_SECURITY_MODE_COMPLETE: + rrcMsgType = RRC_SECURITY_MODE_COMPLETE; break; case REGISTRATION_COMPLETE: rrcMsgType = REGISTRATION_COMPLETE; @@ -9772,10 +9794,15 @@ uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg) rrcMsgType = setDlRRCMsgType(ueCb); if(rrcMsgType == RRC_SETUP_COMPLETE) { - DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for Security Mode Command"); + 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 == SECURITY_MODE_COMPLETE) + else if(rrcMsgType == RRC_SECURITY_MODE_COMPLETE) { DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept"); BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType); diff --git a/src/cu_stub/cu_f1ap_msg_hdl.h b/src/cu_stub/cu_f1ap_msg_hdl.h index 100b6ed14..1de45b92a 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.h +++ b/src/cu_stub/cu_f1ap_msg_hdl.h @@ -151,7 +151,8 @@ typedef enum { RRC_SETUP=1, RRC_SETUP_COMPLETE, - SECURITY_MODE_COMPLETE, + NAS_SECURITY_MODE_COMPLETE, + RRC_SECURITY_MODE_COMPLETE, REGISTRATION_COMPLETE, UE_CONTEXT_SETUP_RSP, RRC_RECONFIG_COMPLETE, diff --git a/src/phy_stub/phy_stub.h b/src/phy_stub/phy_stub.h index 48097cf3a..ecc4b2b3d 100644 --- a/src/phy_stub/phy_stub.h +++ b/src/phy_stub/phy_stub.h @@ -70,7 +70,8 @@ typedef struct ueCb bool msg5ShortBsrSent; bool msg5Sent; bool dlDedMsg; - bool msgSecurityModeComp; + bool msgNasSecurityModeComp; + bool msgRrcSecurityModeComp; bool msgRrcReconfigComp; bool msgRegistrationComp; uint8_t rlcSnForSrb1; /* Sequence number of PDU at RLC for AM mode */ @@ -105,7 +106,8 @@ typedef enum MSG_TYPE_MSG3, MSG_TYPE_SHORT_BSR, MSG_TYPE_MSG5, - MSG_TYPE_SECURITY_MODE_COMPLETE, + MSG_TYPE_NAS_SECURITY_MODE_COMPLETE, + MSG_TYPE_RRC_SECURITY_MODE_COMPLETE, MSG_TYPE_REGISTRATION_COMPLETE, MSG_TYPE_RRC_RECONFIG_COMPLETE }MsgType; diff --git a/src/phy_stub/phy_stub_msg_hdl.c b/src/phy_stub/phy_stub_msg_hdl.c index 1b1694d34..269d44463 100644 --- a/src/phy_stub/phy_stub_msg_hdl.c +++ b/src/phy_stub/phy_stub_msg_hdl.c @@ -419,10 +419,15 @@ 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].msgSecurityModeComp) + else if(!phyDb.ueDb.ueCb[ueId-1].msgNasSecurityModeComp) { - phyDb.ueDb.ueCb[ueId-1].msgSecurityModeComp = true; - type = MSG_TYPE_SECURITY_MODE_COMPLETE; + phyDb.ueDb.ueCb[ueId-1].msgNasSecurityModeComp = true; + type = MSG_TYPE_NAS_SECURITY_MODE_COMPLETE; + } + else if(!phyDb.ueDb.ueCb[ueId-1].msgRrcSecurityModeComp) + { + phyDb.ueDb.ueCb[ueId-1].msgRrcSecurityModeComp = true; + type = MSG_TYPE_RRC_SECURITY_MODE_COMPLETE; } else if(!phyDb.ueDb.ueCb[ueId-1].msgRegistrationComp) { @@ -533,8 +538,35 @@ 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_SECURITY_MODE_COMPLETE: + { + /* For NAS security mode complete 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 NAS SECURITY MODE COMPLETE PDU"); + uint8_t pduLen = 93; /* 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, 0x2a, 0x3f, + 0x02, 0x75, 0xa0, 0xa0, 0xc0, 0x80, 0x3f, 0x00, 0x2f, 0x3b, 0x80, 0x04, 0x9a, 0xa2, 0x81, 0x09, 0x80, 0xc0, + 0x28, 0x04, 0xf8, 0xb8, 0x80, 0x1d, 0xbf, 0x00, 0x20, 0x8c, 0x80, 0x05, 0xf9, 0x00, 0x78, 0x88, 0x7a, 0x88, + 0xd9, 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x81, 0x97, 0x02, 0x78, 0x38, 0x78, 0x38, 0x17, 0x82, 0x82, 0x00, + 0x80, 0x00, 0x00, 0xa9, 0x00, 0x78, 0x88, 0x00, 0x00, 0x00, 0x8b, 0x83, 0xf8, 0x38, 0x60, 0x20, 0x0c, 0xc0, + 0x50, 0x0c, 0x00, 0x80, 0x3a, 0x00, 0x00, 0x48, 0x29, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00}; - case MSG_TYPE_SECURITY_MODE_COMPLETE: + pduLen += 2; /* 2 bytes of MAC header */ + memcpy(pdu, &msg, pduLen); + byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */ +break; + } + case MSG_TYPE_RRC_SECURITY_MODE_COMPLETE: { /* For security mode complete where RRC Container is dummy * @@ -546,7 +578,7 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ * 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 SECURITY MODE COMPLETE PDU"); + DU_LOG("\nDEBUG --> PHY_STUB: Forming RRC SECURITY MODE COMPLETE PDU"); uint8_t pduLen = 12; /* 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++, 0x2a, 0x40, \