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
#define StdDef
-3. Start Netopeer2-server:
- $cd l2/build/scripts
- $sudo ./netopeer-server.sh start
-
D. How to Clean and Build:
--------------------------
./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:
-----------------------------
./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 <id> tag to a new value e.g.
- user: netconf
- pwd: netconf!
+ <id>rrm-2</id
- 3. Send a Netconf get request for alarms xpath
- Here are the steps as executed in the terminal
+I. How to execute the Health Check using netopeer-cli : get alarm-list
+-----------------------------------------------------------------------
+
+ In case the SMO is not available the alarm list can be checked using netopeer-cli as follows:
$netopeer2-cli
> connect --login netconf
Interactive SSH Authentication
Type your password:
- Password:
+ Password: netconf!
> get --filter-xpath /o-ran-sc-odu-alarm-v1:odu/alarms
DATA
<odu xmlns="urn:o-ran:odu:alarm:1.0">
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
----------------------------------------
$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
| 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 <O-DU High Directory>/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 <O-DU High Directory>/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
===========
- ./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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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
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 <id> tag to a new value e.g.
- | user: netconf
- | pwd: netconf!
+ <id>rrm-2</id
- 3. Send a Netconf get request for alarms xpath
+E. How to execute the Health Check using netopeer-cli : get alarm-list
+-----------------------------------------------------------------------
-Here are the steps as executed in the terminal
+ In case the SMO is not available the alarm list can be checked using netopeer-cli as follows:
| netopeer2-cli
| > connect --login netconf
| Interactive SSH Authentication
| Type your password:
- | Password:
+ | Password: netconf!
| > get --filter-xpath /o-ran-sc-odu-alarm-v1\:odu/alarms
| DATA
| <odu xmlns=\"urn\:o-ran\:odu\:alarm\:1.0\">
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 <O-DU High Directory>/l2/build/config
- | $edit-config --target candidate --config=cellConfig.xml
- | $edit-config --target candidate --config=rrmPolicy.xml
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;
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)
*******************************************************************/
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;
break;
}
}
-
+
if(k2Found == true)
{
ret = schCalculateUlTbs(ueCb, puschTime, symbLen, &startPrb, &totDataReq, isRetx, *hqP);
updateBsrAndLcList(&((*hqP)->ulLcPrbEst.defLcList), ueCb->bsrInfo, RFAILED);
}
}
- return (ret);
+ else
+ {
+ DU_LOG("\nERROR --> SCH : schProcessSrOrBsrReq(): K2 value is not found");
+ return false;
+ }
+ return true;
}
}
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);
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);
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;
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);
{
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,
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 */
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;
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)
{
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
*
* 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, \