|
|
|
@@ -33,11 +33,12 @@
|
|
|
|
|
#define RRC_UE
|
|
|
|
|
#define RRC_UE_C
|
|
|
|
|
|
|
|
|
|
#include "NR_DL-DCCH-Message.h" //asn_DEF_NR_DL_DCCH_Message
|
|
|
|
|
#include "NR_DL-CCCH-Message.h" //asn_DEF_NR_DL_CCCH_Message
|
|
|
|
|
#include "NR_BCCH-BCH-Message.h" //asn_DEF_NR_BCCH_BCH_Message
|
|
|
|
|
#include "NR_CellGroupConfig.h" //asn_DEF_NR_CellGroupConfig
|
|
|
|
|
#include "NR_BWP-Downlink.h" //asn_DEF_NR_BWP_Downlink
|
|
|
|
|
#include "NR_DL-DCCH-Message.h" //asn_DEF_NR_DL_DCCH_Message
|
|
|
|
|
#include "NR_DL-CCCH-Message.h" //asn_DEF_NR_DL_CCCH_Message
|
|
|
|
|
#include "NR_BCCH-BCH-Message.h" //asn_DEF_NR_BCCH_BCH_Message
|
|
|
|
|
#include "NR_BCCH-DL-SCH-Message.h" //asn_DEF_NR_BCCH_DL_SCH_Message
|
|
|
|
|
#include "NR_CellGroupConfig.h" //asn_DEF_NR_CellGroupConfig
|
|
|
|
|
#include "NR_BWP-Downlink.h" //asn_DEF_NR_BWP_Downlink
|
|
|
|
|
#include "NR_RRCReconfiguration.h"
|
|
|
|
|
#include "NR_MeasConfig.h"
|
|
|
|
|
#include "NR_UL-DCCH-Message.h"
|
|
|
|
@@ -48,6 +49,8 @@
|
|
|
|
|
#include "rrc_vars.h"
|
|
|
|
|
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
|
|
|
|
|
|
|
|
|
#include "intertask_interface.h"
|
|
|
|
|
|
|
|
|
|
#include "executables/softmodem-common.h"
|
|
|
|
|
#include "pdcp.h"
|
|
|
|
|
#include "UTIL/OSA/osa_defs.h"
|
|
|
|
@@ -56,6 +59,55 @@
|
|
|
|
|
|
|
|
|
|
mui_t nr_rrc_mui=0;
|
|
|
|
|
|
|
|
|
|
static Rrc_State_t nr_rrc_get_state (module_id_t ue_mod_idP) {
|
|
|
|
|
return NR_UE_rrc_inst[ue_mod_idP].nrRrcState;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static Rrc_Sub_State_t nr_rrc_get_sub_state (module_id_t ue_mod_idP) {
|
|
|
|
|
return NR_UE_rrc_inst[ue_mod_idP].nrRrcSubState;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nr_rrc_set_state (module_id_t ue_mod_idP, Rrc_State_t state) {
|
|
|
|
|
AssertFatal ((RRC_STATE_FIRST <= state) && (state <= RRC_STATE_LAST),
|
|
|
|
|
"Invalid state %d!\n", state);
|
|
|
|
|
|
|
|
|
|
if (NR_UE_rrc_inst[ue_mod_idP].nrRrcState != state) {
|
|
|
|
|
NR_UE_rrc_inst[ue_mod_idP].nrRrcState = state;
|
|
|
|
|
return (1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nr_rrc_set_sub_state( module_id_t ue_mod_idP, Rrc_Sub_State_NR_t subState ) {
|
|
|
|
|
if (AMF_MODE_ENABLED) {
|
|
|
|
|
switch (NR_UE_rrc_inst[ue_mod_idP].nrRrcState) {
|
|
|
|
|
case RRC_STATE_INACTIVE_NR:
|
|
|
|
|
AssertFatal ((RRC_SUB_STATE_INACTIVE_FIRST_NR <= subState) && (subState <= RRC_SUB_STATE_INACTIVE_LAST_NR),
|
|
|
|
|
"Invalid nr sub state %d for state %d!\n", subState, NR_UE_rrc_inst[ue_mod_idP].nrRrcState);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case RRC_STATE_IDLE_NR:
|
|
|
|
|
AssertFatal ((RRC_SUB_STATE_IDLE_FIRST_NR <= subState) && (subState <= RRC_SUB_STATE_IDLE_LAST_NR),
|
|
|
|
|
"Invalid nr sub state %d for state %d!\n", subState, NR_UE_rrc_inst[ue_mod_idP].nrRrcState);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case RRC_STATE_CONNECTED_NR:
|
|
|
|
|
AssertFatal ((RRC_SUB_STATE_CONNECTED_FIRST_NR <= subState) && (subState <= RRC_SUB_STATE_CONNECTED_LAST_NR),
|
|
|
|
|
"Invalid nr sub state %d for state %d!\n", subState, NR_UE_rrc_inst[ue_mod_idP].nrRrcState);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (NR_UE_rrc_inst[ue_mod_idP].nrRrcSubState != subState) {
|
|
|
|
|
NR_UE_rrc_inst[ue_mod_idP].nrRrcSubState = subState;
|
|
|
|
|
return (1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern boolean_t nr_rrc_pdcp_config_asn1_req(
|
|
|
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
|
|
|
NR_SRB_ToAddModList_t *const srb2add_list,
|
|
|
|
@@ -462,6 +514,104 @@ int8_t nr_rrc_ue_decode_NR_BCCH_BCH_Message(
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
int nr_decode_SI( const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index ) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int nr_decode_SIB1( const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index, const uint8_t rsrq, const uint8_t rsrp ) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
int nr_decode_BCCH_DLSCH_Message(
|
|
|
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
|
|
|
const uint8_t gNB_index,
|
|
|
|
|
uint8_t *const Sdu,
|
|
|
|
|
const uint8_t Sdu_len,
|
|
|
|
|
const uint8_t rsrq,
|
|
|
|
|
const uint8_t rsrp ) {
|
|
|
|
|
NR_BCCH_DL_SCH_Message_t *bcch_message = NULL;
|
|
|
|
|
NR_SIB1_t *sib1 = NR_UE_rrc_inst[ctxt_pP->module_id].sib1[gNB_index];
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_IN );
|
|
|
|
|
|
|
|
|
|
if (((NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIStatus&1) == 1) && // SIB1 received
|
|
|
|
|
(NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIcnt == sib1->si_SchedulingInfo->schedulingInfoList.list.count)) {
|
|
|
|
|
// to prevent memory bloating
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT );
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nr_rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_RECEIVING_SIB_NR );
|
|
|
|
|
|
|
|
|
|
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
|
|
|
|
xer_fprint(stdout, &asn_DEF_NR_BCCH_DL_SCH_Message,(void *)bcch_message );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
|
|
|
|
|
&asn_DEF_NR_BCCH_DL_SCH_Message,
|
|
|
|
|
(void **)&bcch_message,
|
|
|
|
|
(const void *)Sdu,
|
|
|
|
|
Sdu_len );
|
|
|
|
|
|
|
|
|
|
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
|
|
|
|
LOG_E( RRC, "[UE %"PRIu8"] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)\n",
|
|
|
|
|
ctxt_pP->module_id,
|
|
|
|
|
dec_rval.consumed );
|
|
|
|
|
log_dump(RRC, Sdu, Sdu_len, LOG_DUMP_CHAR," Received bytes:\n" );
|
|
|
|
|
// free the memory
|
|
|
|
|
SEQUENCE_free( &asn_DEF_LTE_BCCH_DL_SCH_Message, (void *)bcch_message, 1 );
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT );
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bcch_message->message.present == NR_BCCH_DL_SCH_MessageType_PR_c1) {
|
|
|
|
|
switch (bcch_message->message.choice.c1->present) {
|
|
|
|
|
case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1:
|
|
|
|
|
if ((ctxt_pP->frame % 2) == 0) {
|
|
|
|
|
// even frame
|
|
|
|
|
if ((NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIStatus&1) == 0) {
|
|
|
|
|
NR_SIB1_t *sib1 = NR_UE_rrc_inst[ctxt_pP->module_id].sib1[gNB_index];
|
|
|
|
|
memcpy( (void *)sib1,
|
|
|
|
|
(void *)bcch_message->message.choice.c1->choice.systemInformationBlockType1,
|
|
|
|
|
sizeof(NR_SIB1_t) );
|
|
|
|
|
LOG_D( RRC, "[UE %"PRIu8"] Decoding First SIB1\n", ctxt_pP->module_id );
|
|
|
|
|
nr_decode_SIB1( ctxt_pP, gNB_index, rsrq, rsrp );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
|
|
|
|
|
if ((NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIStatus&1) == 1) {
|
|
|
|
|
// SIB1 with schedulingInfoList is available
|
|
|
|
|
NR_SystemInformation_t *si = NR_UE_rrc_inst[ctxt_pP->module_id].si[gNB_index];
|
|
|
|
|
memcpy( si,
|
|
|
|
|
bcch_message->message.choice.c1->choice.systemInformation,
|
|
|
|
|
sizeof(NR_SystemInformation_t) );
|
|
|
|
|
LOG_I( RRC, "[UE %"PRIu8"] Decoding SI for frameP %"PRIu32"\n",
|
|
|
|
|
ctxt_pP->module_id,
|
|
|
|
|
ctxt_pP->frame );
|
|
|
|
|
nr_decode_SI( ctxt_pP, gNB_index );
|
|
|
|
|
//if (nfapi_mode == 3)
|
|
|
|
|
//UE_mac_inst[ctxt_pP->module_id].SI_Decoded = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case NR_BCCH_DL_SCH_MessageType__c1_PR_NOTHING:
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (nr_rrc_get_sub_state(ctxt_pP->module_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE_NR) {
|
|
|
|
|
//if ( (NR_UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL) || (!AMF_MODE_ENABLED)) {
|
|
|
|
|
rrc_ue_generate_RRCSetupRequest(ctxt_pP, 0);
|
|
|
|
|
nr_rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_CONNECTING );
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT );
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void
|
|
|
|
@@ -495,6 +645,12 @@ nr_rrc_ue_process_masterCellGroup(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( cellGroupConfig->spCellConfig != NULL){
|
|
|
|
|
if (NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->spCellConfig) {
|
|
|
|
|
memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->spCellConfig,cellGroupConfig->spCellConfig,
|
|
|
|
|
sizeof(struct NR_SpCellConfig));
|
|
|
|
|
} else {
|
|
|
|
|
NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->spCellConfig = cellGroupConfig->spCellConfig;
|
|
|
|
|
}
|
|
|
|
|
//TODO (configure the SpCell as specified in 5.3.5.5.7)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -512,6 +668,42 @@ nr_rrc_ue_process_masterCellGroup(
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------*/
|
|
|
|
|
static void rrc_ue_generate_RRCSetupComplete(
|
|
|
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
|
|
|
const uint8_t gNB_index,
|
|
|
|
|
const uint8_t Transaction_id,
|
|
|
|
|
uint8_t sel_plmn_id){
|
|
|
|
|
uint8_t buffer[100];
|
|
|
|
|
uint8_t size;
|
|
|
|
|
const char *nas_msg;
|
|
|
|
|
int nas_msg_length;
|
|
|
|
|
/*
|
|
|
|
|
if (EPC_MODE_ENABLED) {
|
|
|
|
|
nas_msg = (char *) UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data;
|
|
|
|
|
nas_msg_length = UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.length;
|
|
|
|
|
} else {
|
|
|
|
|
nas_msg = nas_attach_req_imsi;
|
|
|
|
|
nas_msg_length = sizeof(nas_attach_req_imsi);
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
size = do_RRCSetupComplete(ctxt_pP->module_id,buffer,Transaction_id,sel_plmn_id,nas_msg_length,nas_msg);
|
|
|
|
|
LOG_I(RRC,"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCConnectionSetupComplete (bytes%d, gNB %d)\n",
|
|
|
|
|
ctxt_pP->module_id,ctxt_pP->frame, size, gNB_index);
|
|
|
|
|
LOG_D(RLC,
|
|
|
|
|
"[FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to gNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n",
|
|
|
|
|
ctxt_pP->frame, ctxt_pP->module_id+NB_RN_INST, size, gNB_index, nr_rrc_mui, ctxt_pP->module_id+NB_eNB_INST, DCCH);
|
|
|
|
|
// ctxt_pP_local.rnti = ctxt_pP->rnti;
|
|
|
|
|
rrc_data_req_ue(
|
|
|
|
|
ctxt_pP,
|
|
|
|
|
DCCH,
|
|
|
|
|
nr_rrc_mui++,
|
|
|
|
|
SDU_CONFIRM_NO,
|
|
|
|
|
size,
|
|
|
|
|
buffer,
|
|
|
|
|
PDCP_TRANSMISSION_MODE_CONTROL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const SRB_INFO *const Srb_info, const uint8_t gNB_index ){
|
|
|
|
|
NR_DL_CCCH_Message_t *dl_ccch_msg=NULL;
|
|
|
|
|
asn_dec_rval_t dec_rval;
|
|
|
|
@@ -571,14 +763,14 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const SRB_IN
|
|
|
|
|
ctxt_pP,
|
|
|
|
|
gNB_index,
|
|
|
|
|
&dl_ccch_msg->message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup->radioBearerConfig);
|
|
|
|
|
//nr_rrc_set_state (ctxt_pP->module_id, RRC_STATE_CONNECTED);
|
|
|
|
|
//nr_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED);
|
|
|
|
|
nr_rrc_set_state (ctxt_pP->module_id, RRC_STATE_CONNECTED);
|
|
|
|
|
nr_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED);
|
|
|
|
|
NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].rnti = ctxt_pP->rnti;
|
|
|
|
|
/*rrc_ue_generate_RRCSetupComplete(
|
|
|
|
|
rrc_ue_generate_RRCSetupComplete(
|
|
|
|
|
ctxt_pP,
|
|
|
|
|
gNB_index,
|
|
|
|
|
dl_ccch_msg->message.choice.c1.choice.rrcSetup.rrc_TransactionIdentifier,
|
|
|
|
|
NR_UE_rrc_inst[ctxt_pP->module_id].selected_plmn_identity);*/
|
|
|
|
|
dl_ccch_msg->message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier,
|
|
|
|
|
NR_UE_rrc_inst[ctxt_pP->module_id].selected_plmn_identity);
|
|
|
|
|
rval = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
@@ -936,7 +1128,7 @@ nr_rrc_ue_establish_drb(
|
|
|
|
|
LOG_I(NR_RRC,"[UE %d] Frame %d: processing RRCReconfiguration: reconfiguring DRB %ld\n",
|
|
|
|
|
ue_mod_idP, frameP, DRB_config->drb_Identity);
|
|
|
|
|
|
|
|
|
|
// if(!AMF_MODE_ENABLED) {
|
|
|
|
|
if(!AMF_MODE_ENABLED) {
|
|
|
|
|
ip_addr_offset3 = 0;
|
|
|
|
|
ip_addr_offset4 = 1;
|
|
|
|
|
LOG_I(OIP, "[UE %d] trying to bring up the OAI interface %d, IP X.Y.%d.%d\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP,
|
|
|
|
@@ -960,7 +1152,7 @@ nr_rrc_ue_establish_drb(
|
|
|
|
|
ipv4_address(ip_addr_offset3+ue_mod_idP+1, gNB_index+1));//daddr
|
|
|
|
|
LOG_D(NR_RRC,"[UE %d] State = Attached (gNB %d)\n",ue_mod_idP,gNB_index);
|
|
|
|
|
}
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
@@ -1400,42 +1592,6 @@ nr_rrc_ue_decode_dcch(
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------*/
|
|
|
|
|
static void rrc_ue_generate_RRCSetupComplete(
|
|
|
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
|
|
|
const uint8_t gNB_index,
|
|
|
|
|
const uint8_t Transaction_id,
|
|
|
|
|
uint8_t sel_plmn_id){
|
|
|
|
|
uint8_t buffer[100];
|
|
|
|
|
uint8_t size;
|
|
|
|
|
const char *nas_msg;
|
|
|
|
|
int nas_msg_length;
|
|
|
|
|
/*
|
|
|
|
|
if (EPC_MODE_ENABLED) {
|
|
|
|
|
nas_msg = (char *) UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data;
|
|
|
|
|
nas_msg_length = UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.length;
|
|
|
|
|
} else {
|
|
|
|
|
nas_msg = nas_attach_req_imsi;
|
|
|
|
|
nas_msg_length = sizeof(nas_attach_req_imsi);
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
size = do_RRCSetupComplete(ctxt_pP->module_id,buffer,Transaction_id,sel_plmn_id,nas_msg_length,nas_msg);
|
|
|
|
|
LOG_I(RRC,"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCConnectionSetupComplete (bytes%d, gNB %d)\n",
|
|
|
|
|
ctxt_pP->module_id,ctxt_pP->frame, size, gNB_index);
|
|
|
|
|
LOG_D(RLC,
|
|
|
|
|
"[FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to gNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n",
|
|
|
|
|
ctxt_pP->frame, ctxt_pP->module_id+NB_RN_INST, size, gNB_index, nr_rrc_mui, ctxt_pP->module_id+NB_eNB_INST, DCCH);
|
|
|
|
|
// ctxt_pP_local.rnti = ctxt_pP->rnti;
|
|
|
|
|
rrc_data_req_ue(
|
|
|
|
|
ctxt_pP,
|
|
|
|
|
DCCH,
|
|
|
|
|
nr_rrc_mui++,
|
|
|
|
|
SDU_CONFIRM_NO,
|
|
|
|
|
size,
|
|
|
|
|
buffer,
|
|
|
|
|
PDCP_TRANSMISSION_MODE_CONTROL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void *rrc_nrue_task( void *args_p ) {
|
|
|
|
|
MessageDef *msg_p;
|
|
|
|
@@ -1462,22 +1618,34 @@ void *rrc_nrue_task( void *args_p ) {
|
|
|
|
|
LOG_D(RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case RRC_MAC_CCCH_DATA_IND:
|
|
|
|
|
case NR_RRC_MAC_BCCH_DATA_IND:
|
|
|
|
|
LOG_D(RRC, "[UE %d] Received %s: frameP %d, gNB %d\n", ue_mod_id, ITTI_MSG_NAME (msg_p),
|
|
|
|
|
NR_RRC_MAC_BCCH_DATA_IND (msg_p).frame, NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index);
|
|
|
|
|
// PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, NOT_A_RNTI, RRC_MAC_BCCH_DATA_IND (msg_p).frame, 0);
|
|
|
|
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NOT_A_RNTI, NR_RRC_MAC_BCCH_DATA_IND (msg_p).frame, 0,NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index);
|
|
|
|
|
nr_decode_BCCH_DLSCH_Message (&ctxt,
|
|
|
|
|
NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index,
|
|
|
|
|
NR_RRC_MAC_BCCH_DATA_IND (msg_p).sdu,
|
|
|
|
|
NR_RRC_MAC_BCCH_DATA_IND (msg_p).sdu_size,
|
|
|
|
|
NR_RRC_MAC_BCCH_DATA_IND (msg_p).rsrq,
|
|
|
|
|
NR_RRC_MAC_BCCH_DATA_IND (msg_p).rsrp);
|
|
|
|
|
|
|
|
|
|
case NR_RRC_MAC_CCCH_DATA_IND:
|
|
|
|
|
LOG_D(RRC, "[UE %d] RNTI %x Received %s: frameP %d, gNB %d\n",
|
|
|
|
|
ue_mod_id,
|
|
|
|
|
RRC_MAC_CCCH_DATA_IND (msg_p).rnti,
|
|
|
|
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti,
|
|
|
|
|
ITTI_MSG_NAME (msg_p),
|
|
|
|
|
RRC_MAC_CCCH_DATA_IND (msg_p).frame,
|
|
|
|
|
RRC_MAC_CCCH_DATA_IND (msg_p).enb_index);
|
|
|
|
|
srb_info_p = &NR_UE_rrc_inst[ue_mod_id].Srb0[RRC_MAC_CCCH_DATA_IND (msg_p).enb_index];
|
|
|
|
|
memcpy (srb_info_p->Rx_buffer.Payload, RRC_MAC_CCCH_DATA_IND (msg_p).sdu,
|
|
|
|
|
RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size);
|
|
|
|
|
srb_info_p->Rx_buffer.payload_size = RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size;
|
|
|
|
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame,
|
|
|
|
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
|
|
|
|
srb_info_p = &NR_UE_rrc_inst[ue_mod_id].Srb0[NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index];
|
|
|
|
|
memcpy (srb_info_p->Rx_buffer.Payload, NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu,
|
|
|
|
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size);
|
|
|
|
|
srb_info_p->Rx_buffer.payload_size = NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size;
|
|
|
|
|
// PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, RRC_MAC_CCCH_DATA_IND (msg_p).rnti, RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0);
|
|
|
|
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, ENB_FLAG_NO, RRC_MAC_CCCH_DATA_IND (msg_p).rnti, RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0, RRC_MAC_CCCH_DATA_IND (msg_p).enb_index);
|
|
|
|
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0, NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
|
|
|
|
nr_rrc_ue_decode_ccch (&ctxt,
|
|
|
|
|
srb_info_p,
|
|
|
|
|
RRC_MAC_CCCH_DATA_IND (msg_p).enb_index);
|
|
|
|
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* PDCP messages */
|
|
|
|
|