X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fcu_stub%2Fcu_f1ap_msg_hdl.c;h=2b651a0242a5c5dbf95d4b666b49f2ead87e88a0;hb=791615463ef2fcc0d6e0697d7860e6e6a56bd9a6;hp=ac6a8428a84638f98d6bcfcb5020c62b1b515e1a;hpb=def50dc175cebc67238db5f1acd5ff322a2279bd;p=o-du%2Fl2.git diff --git a/src/cu_stub/cu_f1ap_msg_hdl.c b/src/cu_stub/cu_f1ap_msg_hdl.c index ac6a8428a..2b651a024 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@ -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: