c-plane is ok
This commit is contained in:
@@ -199,6 +199,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
f1ap_dl_rrc_message_t *f1ap_dl_rrc)
|
f1ap_dl_rrc_message_t *f1ap_dl_rrc)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
LOG_D(F1AP, "CU send DL_RRC_MESSAGE_TRANSFER \n");
|
||||||
F1AP_F1AP_PDU_t pdu;
|
F1AP_F1AP_PDU_t pdu;
|
||||||
F1AP_DLRRCMessageTransfer_t *out;
|
F1AP_DLRRCMessageTransfer_t *out;
|
||||||
F1AP_DLRRCMessageTransferIEs_t *ie;
|
F1AP_DLRRCMessageTransferIEs_t *ie;
|
||||||
@@ -280,10 +281,10 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
OCTET_STRING_fromBuf(&ie->value.choice.RRCContainer, (const char*)f1ap_dl_rrc->rrc_container, f1ap_dl_rrc->rrc_container_length);
|
OCTET_STRING_fromBuf(&ie->value.choice.RRCContainer, (const char*)f1ap_dl_rrc->rrc_container, f1ap_dl_rrc->rrc_container_length);
|
||||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||||
|
|
||||||
//LOG_I(F1AP, "%s() RRCContainer size %d: ", __func__, f1ap_dl_rrc->rrc_container_length);
|
LOG_I(F1AP, "%s() RRCContainer size %d: ", __func__, f1ap_dl_rrc->rrc_container_length);
|
||||||
//for (int i = 0; i < ie->value.choice.RRCContainer.size; i++)
|
for (int i = 0; i < ie->value.choice.RRCContainer.size; i++)
|
||||||
// printf("%02x ", f1ap_dl_rrc->rrc_container[i]);
|
printf("%02x ", f1ap_dl_rrc->rrc_container[i]);
|
||||||
//printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
/* optional */
|
/* optional */
|
||||||
/* c7. RAT_FrequencyPriorityInformation */
|
/* c7. RAT_FrequencyPriorityInformation */
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
extern f1ap_setup_req_t *f1ap_du_data_from_du;
|
extern f1ap_setup_req_t *f1ap_du_data_from_du;
|
||||||
extern f1ap_cudu_inst_t f1ap_cu_inst[MAX_eNB];
|
extern f1ap_cudu_inst_t f1ap_cu_inst[MAX_eNB];
|
||||||
extern RAN_CONTEXT_t RC;
|
extern RAN_CONTEXT_t RC;
|
||||||
|
extern uint32_t f1ap_assoc_id;
|
||||||
|
|
||||||
int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
||||||
f1ap_ue_context_setup_req_t *f1ap_ue_context_setup_req) {
|
f1ap_ue_context_setup_req_t *f1ap_ue_context_setup_req) {
|
||||||
@@ -150,7 +151,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
|
|
||||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||||
|
|
||||||
|
if (0) {
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c7. Candidate_SpCell_List */
|
/* c7. Candidate_SpCell_List */
|
||||||
ie = (F1AP_UEContextSetupRequestIEs_t *)calloc(1, sizeof(F1AP_UEContextSetupRequestIEs_t));
|
ie = (F1AP_UEContextSetupRequestIEs_t *)calloc(1, sizeof(F1AP_UEContextSetupRequestIEs_t));
|
||||||
@@ -696,7 +697,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
|
|
||||||
}
|
}
|
||||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||||
|
}
|
||||||
/* OPTIONAL */
|
/* OPTIONAL */
|
||||||
/* InactivityMonitoringRequest */
|
/* InactivityMonitoringRequest */
|
||||||
if (0) {
|
if (0) {
|
||||||
@@ -754,6 +755,22 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// xer_fprint(stdout, &asn_DEF_F1AP_F1AP_PDU, (void *)pdu);
|
||||||
|
|
||||||
|
// asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
|
||||||
|
// res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
|
||||||
|
// buffer = res.buffer;
|
||||||
|
// len = res.result.encoded;
|
||||||
|
|
||||||
|
// if (res.result.encoded <= 0) {
|
||||||
|
// LOG_E(F1AP, "ASN1 message encoding failed (%s, %lu)!\n", res.result.failed_type->name, res.result.encoded);
|
||||||
|
// return -1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
LOG_D(F1AP,"F1AP UEContextSetupRequest Encoded %zd bits\n", len);
|
||||||
|
|
||||||
|
cu_f1ap_itti_send_sctp_data_req(instance, f1ap_assoc_id /* BK: fix me*/ , buffer, len, 0 /* BK: fix me*/);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,9 @@ static int f1ap_decode_initiating_message(F1AP_F1AP_PDU_t *pdu)
|
|||||||
case F1AP_ProcedureCode_id_UEContextReleaseRequest:
|
case F1AP_ProcedureCode_id_UEContextReleaseRequest:
|
||||||
LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextReleaseRequest\n", __func__);
|
LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextReleaseRequest\n", __func__);
|
||||||
break;
|
break;
|
||||||
|
case F1AP_ProcedureCode_id_UEContextSetup:
|
||||||
|
LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextSetup\n", __func__);
|
||||||
|
break;
|
||||||
// case F1AP_ProcedureCode_id_InitialContextSetup:
|
// case F1AP_ProcedureCode_id_InitialContextSetup:
|
||||||
// res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
|
// res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
|
||||||
// message_id = F1AP_INITIAL_CONTEXT_SETUP_LOG;
|
// message_id = F1AP_INITIAL_CONTEXT_SETUP_LOG;
|
||||||
|
|||||||
@@ -1350,12 +1350,6 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
break;
|
break;
|
||||||
}// switch case
|
}// switch case
|
||||||
|
|
||||||
/* for rfsim */
|
|
||||||
mem_block_t *memblock;
|
|
||||||
memblock = get_free_mem_block(rrc_dl_sdu_len, __FUNCTION__);
|
|
||||||
memcpy(memblock->data, ie->value.choice.RRCContainer.buf, rrc_dl_sdu_len);
|
|
||||||
du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, rrc_dl_sdu_len, memblock);
|
|
||||||
return(0);
|
|
||||||
} else if (srb_id == 1) {
|
} else if (srb_id == 1) {
|
||||||
|
|
||||||
NR_DL_DCCH_Message_t* dl_dcch_msg=NULL;
|
NR_DL_DCCH_Message_t* dl_dcch_msg=NULL;
|
||||||
@@ -1363,8 +1357,8 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
dec_rval = uper_decode(NULL,
|
dec_rval = uper_decode(NULL,
|
||||||
&asn_DEF_NR_DL_DCCH_Message,
|
&asn_DEF_NR_DL_DCCH_Message,
|
||||||
(void**)&dl_dcch_msg,
|
(void**)&dl_dcch_msg,
|
||||||
&ie->value.choice.RRCContainer.buf[1], // buf[0] includes the pdcp header
|
&ie->value.choice.RRCContainer.buf[2], // buf[0] includes the pdcp header
|
||||||
rrc_dl_sdu_len,0,0);
|
rrc_dl_sdu_len-6,0,0);
|
||||||
|
|
||||||
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0))
|
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0))
|
||||||
LOG_E(F1AP," Failed to decode DL-DCCH (%zu bytes)\n",dec_rval.consumed);
|
LOG_E(F1AP," Failed to decode DL-DCCH (%zu bytes)\n",dec_rval.consumed);
|
||||||
@@ -1490,7 +1484,7 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(F1AP, "Received DL RRC Transfer on srb_id %ld\n", srb_id);
|
LOG_I(F1AP, "Received DL RRC Transfer on srb_id %ld\n", srb_id);
|
||||||
#if(0)
|
|
||||||
rlc_op_status_t rlc_status;
|
rlc_op_status_t rlc_status;
|
||||||
boolean_t ret = TRUE;
|
boolean_t ret = TRUE;
|
||||||
mem_block_t *pdcp_pdu_p = NULL;
|
mem_block_t *pdcp_pdu_p = NULL;
|
||||||
@@ -1508,45 +1502,47 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
memset(pdcp_pdu_p->data, 0, rrc_dl_sdu_len);
|
memset(pdcp_pdu_p->data, 0, rrc_dl_sdu_len);
|
||||||
memcpy(&pdcp_pdu_p->data[0], ie->value.choice.RRCContainer.buf, rrc_dl_sdu_len);
|
memcpy(&pdcp_pdu_p->data[0], ie->value.choice.RRCContainer.buf, rrc_dl_sdu_len);
|
||||||
|
|
||||||
rlc_status = rlc_data_req(&ctxt
|
/* for rfsim */
|
||||||
, 1
|
du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, rrc_dl_sdu_len, pdcp_pdu_p);
|
||||||
, MBMS_FLAG_NO
|
// rlc_status = rlc_data_req(&ctxt
|
||||||
, srb_id
|
// , 1
|
||||||
, 0
|
// , MBMS_FLAG_NO
|
||||||
, 0
|
// , srb_id
|
||||||
, rrc_dl_sdu_len
|
// , 0
|
||||||
, pdcp_pdu_p
|
// , 0
|
||||||
,NULL
|
// , rrc_dl_sdu_len
|
||||||
,NULL
|
// , pdcp_pdu_p
|
||||||
);
|
// ,NULL
|
||||||
switch (rlc_status) {
|
// ,NULL
|
||||||
case RLC_OP_STATUS_OK:
|
// );
|
||||||
//LOG_I(F1AP, "Data sending request over RLC succeeded!\n");
|
// switch (rlc_status) {
|
||||||
ret=TRUE;
|
// case RLC_OP_STATUS_OK:
|
||||||
break;
|
// //LOG_I(F1AP, "Data sending request over RLC succeeded!\n");
|
||||||
|
// ret=TRUE;
|
||||||
|
// break;
|
||||||
|
|
||||||
case RLC_OP_STATUS_BAD_PARAMETER:
|
// case RLC_OP_STATUS_BAD_PARAMETER:
|
||||||
LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
|
// LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
|
||||||
ret= FALSE;
|
// ret= FALSE;
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
case RLC_OP_STATUS_INTERNAL_ERROR:
|
// case RLC_OP_STATUS_INTERNAL_ERROR:
|
||||||
LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
|
// LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
|
||||||
ret= FALSE;
|
// ret= FALSE;
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
case RLC_OP_STATUS_OUT_OF_RESSOURCES:
|
// case RLC_OP_STATUS_OUT_OF_RESSOURCES:
|
||||||
LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
|
// LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
|
||||||
ret= FALSE;
|
// ret= FALSE;
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
default:
|
// default:
|
||||||
LOG_W(F1AP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status);
|
// LOG_W(F1AP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status);
|
||||||
ret= FALSE;
|
// ret= FALSE;
|
||||||
break;
|
// break;
|
||||||
} // switch case
|
// } // switch case
|
||||||
return ret;
|
// return ret;
|
||||||
} // if pdcp_pdu_p
|
} // if pdcp_pdu_p
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,40 +118,41 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* SRBs_ToBeSetup_List */
|
/* SRBs_ToBeSetup_List */
|
||||||
/* DRBs_ToBeSetup_List */
|
/* DRBs_ToBeSetup_List */
|
||||||
/* Decode DRBs_ToBeSetup_List */
|
/* Decode DRBs_ToBeSetup_List */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ie, container,
|
if(0) {
|
||||||
F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List, true);
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ie, container,
|
||||||
f1ap_ue_context_setup_req->drbs_to_be_setup_length = ie->value.choice.DRBs_ToBeSetup_List.list.count;
|
F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List, true);
|
||||||
f1ap_ue_context_setup_req->drbs_to_be_setup = calloc(f1ap_ue_context_setup_req->drbs_to_be_setup_length,
|
f1ap_ue_context_setup_req->drbs_to_be_setup_length = ie->value.choice.DRBs_ToBeSetup_List.list.count;
|
||||||
sizeof(f1ap_drb_to_be_setup_t));
|
f1ap_ue_context_setup_req->drbs_to_be_setup = calloc(f1ap_ue_context_setup_req->drbs_to_be_setup_length,
|
||||||
AssertFatal(f1ap_ue_context_setup_req->drbs_to_be_setup,
|
sizeof(f1ap_drb_to_be_setup_t));
|
||||||
"could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup\n");
|
AssertFatal(f1ap_ue_context_setup_req->drbs_to_be_setup,
|
||||||
|
"could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup\n");
|
||||||
|
|
||||||
for (i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; ++i) {
|
for (i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; ++i) {
|
||||||
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_setup_req->drbs_to_be_setup[i];
|
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_setup_req->drbs_to_be_setup[i];
|
||||||
F1AP_DRBs_ToBeSetup_Item_t *drbs_tobesetup_item_p;
|
F1AP_DRBs_ToBeSetup_Item_t *drbs_tobesetup_item_p;
|
||||||
drbs_tobesetup_item_p = &((F1AP_DRBs_ToBeSetup_ItemIEs_t *)ie->value.choice.DRBs_ToBeSetup_List.list.array[i])->value.choice.DRBs_ToBeSetup_Item;
|
drbs_tobesetup_item_p = &((F1AP_DRBs_ToBeSetup_ItemIEs_t *)ie->value.choice.DRBs_ToBeSetup_List.list.array[i])->value.choice.DRBs_ToBeSetup_Item;
|
||||||
drb_p->drb_id = drbs_tobesetup_item_p->dRBID;
|
drb_p->drb_id = drbs_tobesetup_item_p->dRBID;
|
||||||
/* TODO in the following, assume only one UP UL TNL is present.
|
/* TODO in the following, assume only one UP UL TNL is present.
|
||||||
* this matches/assumes OAI CU implementation, can be up to 2! */
|
* this matches/assumes OAI CU implementation, can be up to 2! */
|
||||||
drb_p->up_ul_tnl_length = 1;
|
drb_p->up_ul_tnl_length = 1;
|
||||||
AssertFatal(drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
AssertFatal(drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
||||||
"no UL UP TNL Information in DRBs to be Setup list\n");
|
"no UL UP TNL Information in DRBs to be Setup list\n");
|
||||||
F1AP_ULUPTNLInformation_ToBeSetup_Item_t *ul_up_tnl_info_p = (F1AP_ULUPTNLInformation_ToBeSetup_Item_t *)drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.array[0];
|
F1AP_ULUPTNLInformation_ToBeSetup_Item_t *ul_up_tnl_info_p = (F1AP_ULUPTNLInformation_ToBeSetup_Item_t *)drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.array[0];
|
||||||
F1AP_GTPTunnel_t *ul_up_tnl0 = ul_up_tnl_info_p->uLUPTNLInformation.choice.gTPTunnel;
|
F1AP_GTPTunnel_t *ul_up_tnl0 = ul_up_tnl_info_p->uLUPTNLInformation.choice.gTPTunnel;
|
||||||
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&ul_up_tnl0->transportLayerAddress, drb_p->up_ul_tnl[0].tl_address);
|
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&ul_up_tnl0->transportLayerAddress, drb_p->up_ul_tnl[0].tl_address);
|
||||||
OCTET_STRING_TO_INT32(&ul_up_tnl0->gTP_TEID, drb_p->up_ul_tnl[0].gtp_teid);
|
OCTET_STRING_TO_INT32(&ul_up_tnl0->gTP_TEID, drb_p->up_ul_tnl[0].gtp_teid);
|
||||||
|
|
||||||
switch (drbs_tobesetup_item_p->rLCMode) {
|
switch (drbs_tobesetup_item_p->rLCMode) {
|
||||||
case F1AP_RLCMode_rlc_am:
|
case F1AP_RLCMode_rlc_am:
|
||||||
drb_p->rlc_mode = RLC_MODE_AM;
|
drb_p->rlc_mode = RLC_MODE_AM;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
drb_p->rlc_mode = RLC_MODE_TM;
|
drb_p->rlc_mode = RLC_MODE_TM;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* RRCContainer */
|
/* RRCContainer */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_RRCContainer, false);
|
F1AP_ProtocolIE_ID_id_RRCContainer, false);
|
||||||
@@ -163,7 +164,24 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
LOG_E(F1AP, "can't find RRCContainer in UEContextSetupRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer);
|
LOG_E(F1AP, "can't find RRCContainer in UEContextSetupRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
AssertFatal(0, "check configuration, send to appropriate handler\n");
|
// AssertFatal(0, "check configuration, send to appropriate handler\n");
|
||||||
|
|
||||||
|
protocol_ctxt_t ctxt;
|
||||||
|
// ctxt.rnti = f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], ie->value.choice.GNB_DU_UE_F1AP_ID);
|
||||||
|
ctxt.rnti = 0x1234;
|
||||||
|
ctxt.module_id = instance;
|
||||||
|
ctxt.instance = instance;
|
||||||
|
ctxt.enb_flag = 1;
|
||||||
|
|
||||||
|
mem_block_t *pdcp_pdu_p = NULL;
|
||||||
|
pdcp_pdu_p = get_free_mem_block(ie->value.choice.RRCContainer.size, __func__);
|
||||||
|
if (pdcp_pdu_p != NULL) {
|
||||||
|
memset(pdcp_pdu_p->data, 0, ie->value.choice.RRCContainer.size);
|
||||||
|
memcpy(&pdcp_pdu_p->data[0], ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size);
|
||||||
|
|
||||||
|
/* for rfsim */
|
||||||
|
du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ie->value.choice.RRCContainer.size, pdcp_pdu_p);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
#include "NR_RLC-BearerConfig.h"
|
#include "NR_RLC-BearerConfig.h"
|
||||||
#include "NR_RLC-Config.h"
|
#include "NR_RLC-Config.h"
|
||||||
#include "NR_CellGroupConfig.h"
|
#include "NR_CellGroupConfig.h"
|
||||||
|
#include "NR_DL-DCCH-Message.h"
|
||||||
#include "openair2/RRC/NR/nr_rrc_proto.h"
|
#include "openair2/RRC/NR/nr_rrc_proto.h"
|
||||||
|
|
||||||
/* from OAI */
|
/* from OAI */
|
||||||
@@ -47,6 +48,7 @@ static uint64_t pdcp_optmask;
|
|||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
extern RAN_CONTEXT_t RC;
|
extern RAN_CONTEXT_t RC;
|
||||||
extern ngran_node_t node_type;
|
extern ngran_node_t node_type;
|
||||||
|
uint8_t first_dcch = 0;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/* rlc_data_req queue - begin */
|
/* rlc_data_req queue - begin */
|
||||||
@@ -676,18 +678,74 @@ printf("!!!!!!! deliver_pdu_srb (srb %d) calling rlc_data_req size %d: ", srb_id
|
|||||||
//for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)memblock->data[i]);
|
//for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)memblock->data[i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
|
if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
|
||||||
MessageDef *message_p;
|
|
||||||
message_p = itti_alloc_new_message (TASK_PDCP_ENB, F1AP_DL_RRC_MESSAGE);
|
NR_DL_DCCH_Message_t* dl_dcch_msg=NULL;
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).rrc_container = buf;
|
asn_dec_rval_t dec_rval;
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = size;
|
MessageDef *message_p;
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id = 0;
|
uint8_t *message_buffer;
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0;
|
message_buffer = itti_malloc (TASK_PDCP_ENB, TASK_CU_F1, size);
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown
|
memcpy (message_buffer, buf, size);
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).rnti = ue->rnti;
|
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).srb_id = srb_id;
|
if (first_dcch == 1) {
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).execute_duplication = 1;
|
dec_rval = uper_decode(NULL,
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).RAT_frequency_priority_information.en_dc = 0;
|
&asn_DEF_NR_DL_DCCH_Message,
|
||||||
itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p);
|
(void**)&dl_dcch_msg,
|
||||||
|
&buf[2],
|
||||||
|
size-6,0,0);
|
||||||
|
if (dec_rval.code == RC_OK) {
|
||||||
|
if (dl_dcch_msg->message.choice.c1->present == NR_DL_DCCH_MessageType__c1_PR_securityModeCommand) {
|
||||||
|
LOG_I(PDCP, "CU send securityModeCommand by F1AP_UE_CONTEXT_SETUP_REQ\n");
|
||||||
|
message_p = itti_alloc_new_message (TASK_PDCP_ENB, F1AP_UE_CONTEXT_SETUP_REQ);
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).rrc_container = message_buffer;
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).rrc_container_length = size;
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).gNB_CU_ue_id = 0;
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).gNB_DU_ue_id = 0;
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).rnti = ue->rnti;
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).mcc = RC.nrrrc[0]->configuration.mcc[0];
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).mnc = RC.nrrrc[0]->configuration.mnc[0];
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).mnc_digit_length = RC.nrrrc[0]->configuration.mnc_digit_length[0];
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).nr_cellid = RC.nrrrc[0]->nr_cellid;
|
||||||
|
// for rfsim
|
||||||
|
f1ap_drb_to_be_setup_t drb;
|
||||||
|
drb.drb_id = 1;
|
||||||
|
drb.up_ul_tnl[0].tl_address = inet_addr("127.0.0.3");
|
||||||
|
drb.up_ul_tnl[0].gtp_teid = 0;
|
||||||
|
drb.up_ul_tnl_length = sizeof(drb.up_ul_tnl);
|
||||||
|
drb.rlc_mode = RLC_MODE_AM;
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).drbs_to_be_setup_length = 1;
|
||||||
|
F1AP_UE_CONTEXT_SETUP_REQ (message_p).drbs_to_be_setup = &drb;
|
||||||
|
itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p);
|
||||||
|
} else {
|
||||||
|
LOG_I(PDCP, "other NR_DL_DCCH_Message \n");
|
||||||
|
message_p = itti_alloc_new_message (TASK_PDCP_ENB, F1AP_DL_RRC_MESSAGE);
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).rrc_container = message_buffer;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = size;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id = 0;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).rnti = ue->rnti;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).srb_id = srb_id;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).execute_duplication = 1;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).RAT_frequency_priority_information.en_dc = 0;
|
||||||
|
itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOG_E(PDCP, "error NR_DL_DCCH_Message \n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
first_dcch = 1;
|
||||||
|
message_p = itti_alloc_new_message (TASK_PDCP_ENB, F1AP_DL_RRC_MESSAGE);
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).rrc_container = message_buffer;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = size;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id = 0;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).rnti = ue->rnti;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).srb_id = srb_id;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).execute_duplication = 1;
|
||||||
|
F1AP_DL_RRC_MESSAGE (message_p).RAT_frequency_priority_information.en_dc = 0;
|
||||||
|
itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
enqueue_rlc_data_req(&ctxt, 1, MBMS_FLAG_NO, srb_id, sdu_id, 0, size, memblock, NULL, NULL);
|
enqueue_rlc_data_req(&ctxt, 1, MBMS_FLAG_NO, srb_id, sdu_id, 0, size, memblock, NULL, NULL);
|
||||||
}
|
}
|
||||||
@@ -922,7 +980,7 @@ boolean_t nr_rrc_pdcp_config_asn1_req(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drb2add_list != NULL) {
|
if ((drb2add_list != NULL) && (rlc_bearer2add_list != NULL)) {
|
||||||
for (i = 0; i < drb2add_list->list.count; i++) {
|
for (i = 0; i < drb2add_list->list.count; i++) {
|
||||||
add_drb(rnti, drb2add_list->list.array[i], rlc_bearer2add_list->list.array[i]->rlc_Config);
|
add_drb(rnti, drb2add_list->list.array[i], rlc_bearer2add_list->list.array[i]->rlc_Config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ nr_rrc_data_req(
|
|||||||
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
|
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
|
||||||
ctxt_pP->instance,
|
ctxt_pP->instance,
|
||||||
message_p);
|
message_p);
|
||||||
LOG_I(NR_RRC,"sent RRC_DCCH_DATA_REQ to TASK_PDCP_ENB\n");
|
LOG_I(NR_RRC,"send RRC_DCCH_DATA_REQ to PDCP\n");
|
||||||
|
|
||||||
/* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads
|
/* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads
|
||||||
* Ideally, PDCP would not neet to be triggered like this but react to ITTI
|
* Ideally, PDCP would not neet to be triggered like this but react to ITTI
|
||||||
|
|||||||
@@ -1012,12 +1012,14 @@ rrc_gNB_process_RRCReconfigurationComplete(
|
|||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
/* Refresh SRBs/DRBs */
|
/* Refresh SRBs/DRBs */
|
||||||
nr_rrc_rlc_config_asn1_req(ctxt_pP,
|
if (!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
|
||||||
|
nr_rrc_rlc_config_asn1_req(ctxt_pP,
|
||||||
SRB_configList, // NULL,
|
SRB_configList, // NULL,
|
||||||
DRB_configList,
|
DRB_configList,
|
||||||
DRB_Release_configList2,
|
DRB_Release_configList2,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set the SRB active in UE context */
|
/* Set the SRB active in UE context */
|
||||||
|
|||||||
Reference in New Issue
Block a user