Merge branch 'ngap-wf-1120-srb' into develop_SA_rfsim_for_F1
Conflicts:
cmake_targets/CMakeLists.txt
openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR_UE/rrc_UE.c
openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
openair2/LAYER2/NR_MAC_gNB/main.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
openair2/LAYER2/nr_pdcp/nr_pdcp_entity_drb_am.c
This commit is contained in:
@@ -1969,6 +1969,7 @@ set(NR_PDCP_SRC
|
||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity.c
|
||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity_drb_am.c
|
||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity_srb.c
|
||||
)
|
||||
|
||||
set(L2_SRC
|
||||
|
||||
@@ -188,7 +188,21 @@ struct timespec clock_difftime(struct timespec start, struct timespec end) {
|
||||
void print_difftimes(void) {
|
||||
LOG_I(HW,"difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec);
|
||||
}
|
||||
int create_tasks_nrue(uint32_t ue_nb) {
|
||||
LOG_D(NR_RRC, "%s(ue_nb:%d)\n", __FUNCTION__, ue_nb);
|
||||
itti_wait_ready(1);
|
||||
|
||||
if (ue_nb > 0) {
|
||||
LOG_I(NR_RRC,"create TASK_RRC_NRUE \n");
|
||||
if (itti_create_task (TASK_RRC_NRUE, rrc_nrue_task, NULL) < 0) {
|
||||
LOG_E(NR_RRC, "Create task for RRC UE failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
itti_wait_ready(0);
|
||||
return 0;
|
||||
}
|
||||
void exit_function(const char *file, const char *function, const int line, const char *s) {
|
||||
int CC_id;
|
||||
|
||||
@@ -584,7 +598,14 @@ int main( int argc, char **argv ) {
|
||||
|
||||
// wait for end of program
|
||||
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
||||
|
||||
protocol_ctxt_t ctxt_pP = {0};
|
||||
ctxt_pP.enb_flag = ENB_FLAG_NO;
|
||||
ctxt_pP.rnti = 0x1234;
|
||||
rrc_ue_generate_RRCSetupRequest(&ctxt_pP, 0);
|
||||
if (create_tasks_nrue(1) < 0) {
|
||||
printf("cannot create ITTI tasks\n");
|
||||
exit(-1); // need a softer mode
|
||||
}
|
||||
while(true)
|
||||
sleep(3600);
|
||||
|
||||
|
||||
@@ -493,8 +493,8 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
|
||||
}
|
||||
|
||||
ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z;
|
||||
AssertFatal(Foffset <= E,"Foffset %d > E %d\n",Foffset,E);
|
||||
AssertFatal(Foffset <= Ncb,"Foffset %d > Ncb %d\n",Foffset,Ncb);
|
||||
// AssertFatal(Foffset <= E,"Foffset %d > E %d\n",Foffset,E);
|
||||
// AssertFatal(Foffset <= Ncb,"Foffset %d > Ncb %d\n",Foffset,Ncb);
|
||||
|
||||
#ifdef RM_DEBUG
|
||||
printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, k0 %d, Ncb %d, rvidx %d\n", clear, E, ind, Ncb, rvidx);
|
||||
|
||||
@@ -391,6 +391,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||
LOG_D(PHY,"%02x\n",a[i]);
|
||||
LOG_D(PHY,"\n");
|
||||
*/
|
||||
log_dump(PHY, a, 16, LOG_DUMP_CHAR,"gNB pdsch tx frame %d %d: ", frame, slot);
|
||||
|
||||
if (A > 3824) {
|
||||
// Add 24-bit crc (polynomial A) to payload
|
||||
|
||||
@@ -641,7 +641,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
|
||||
if (err_flag == 1) {
|
||||
//#if UE_DEBUG_TRACE
|
||||
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
||||
LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
||||
phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
|
||||
//#endif
|
||||
harq_process->harq_ack.ack = 0;
|
||||
@@ -665,7 +665,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
return((1 + dlsch->max_ldpc_iterations));
|
||||
} else {
|
||||
//#if UE_DEBUG_TRACE
|
||||
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
|
||||
LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
|
||||
phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
|
||||
//#endif
|
||||
|
||||
@@ -735,6 +735,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_OUT);
|
||||
|
||||
dlsch->last_iteration_cnt = ret;
|
||||
log_dump(PHY, harq_process->b, 16, LOG_DUMP_CHAR,"nrue pdsch rx frame %d %d: ", frame, nr_slot_rx );
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@@ -157,7 +157,8 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
||||
|
||||
///////////
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
log_dump(PHY, harq_process_ul_ue->a, 16, LOG_DUMP_CHAR,"nrue pusch tx frame %d %d: ", frame, slot);
|
||||
|
||||
/////////////////////////ULSCH scrambling/////////////////////////
|
||||
///////////
|
||||
|
||||
|
||||
@@ -257,7 +257,7 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
|
||||
// if all segments are done
|
||||
if (rdata->nbSegments == ulsch_harq->processedSegments) {
|
||||
if (decodeSuccess) {
|
||||
LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n",
|
||||
LOG_I(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n",
|
||||
gNB->Mod_id,ulsch_harq->slot,ulsch_harq->TBS);
|
||||
ulsch_harq->status = SCH_IDLE;
|
||||
ulsch_harq->round = 0;
|
||||
@@ -265,8 +265,9 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
|
||||
|
||||
LOG_D(PHY, "ULSCH received ok \n");
|
||||
nr_fill_indication(gNB,ulsch_harq->frame, ulsch_harq->slot, rdata->ulsch_id, rdata->harq_pid, 0);
|
||||
} else {
|
||||
LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n",
|
||||
log_dump(PHY, ulsch_harq->b, 16, LOG_DUMP_CHAR,"gnb pusch rx frame %d %d: ", ulsch_harq->frame, ulsch_harq->slot);
|
||||
} else {
|
||||
LOG_I(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n",
|
||||
gNB->Mod_id, ulsch_harq->frame, ulsch_harq->slot,
|
||||
rdata->harq_pid,ulsch_harq->status, ulsch_harq->round,ulsch_harq->TBS,r);
|
||||
if (ulsch_harq->round >= ulsch->Mlimit) {
|
||||
|
||||
@@ -53,7 +53,8 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst)
|
||||
if (rrc_inst) {
|
||||
nr_rrc_mac_config_req_ue(0,0,0,NULL,rrc_inst->cell_group_config);
|
||||
|
||||
if (IS_SOFTMODEM_NOS1){
|
||||
// if (IS_SOFTMODEM_NOS1){
|
||||
if (1) {
|
||||
AssertFatal(rlc_module_init(0) == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
|
||||
pdcp_layer_init();
|
||||
nr_DRB_preconfiguration(nr_ue_mac_inst->crnti);
|
||||
|
||||
@@ -415,6 +415,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||
//NR_FrequencyInfoDL_t *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL;
|
||||
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated = mac->rach_ConfigDedicated;
|
||||
|
||||
int prach_genarate = 0;
|
||||
// int32_t frame_diff = 0;
|
||||
|
||||
uint8_t sdu_lcids[NB_RB_MAX] = {0};
|
||||
@@ -509,8 +510,10 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||
|
||||
// Fill in preamble and PRACH resources
|
||||
if (mac->generate_nr_prach == 1)
|
||||
{
|
||||
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_slot_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
|
||||
|
||||
prach_genarate = 1;
|
||||
}
|
||||
offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus, // sdus buffer
|
||||
(uint8_t *) payload, // UL MAC pdu pointer
|
||||
num_sdus, // num sdus
|
||||
@@ -555,7 +558,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||
|
||||
// Reset RA_active flag: it disables Msg3 retransmission (8.3 of TS 38.213)
|
||||
// TbD Msg3 Retransmissions to be scheduled by DCI 0_0
|
||||
mac->RA_active = 0;
|
||||
//mac->RA_active = 0;
|
||||
mac->RA_window_cnt = -1;
|
||||
mac->ra_state = RA_SUCCEEDED;
|
||||
mac->generate_nr_prach = 2;
|
||||
@@ -636,8 +639,10 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||
|
||||
// Fill in preamble and PRACH resources
|
||||
if (mac->generate_nr_prach == 1)
|
||||
{
|
||||
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_slot_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
|
||||
|
||||
prach_genarate = 1;
|
||||
}
|
||||
} else {
|
||||
|
||||
mac->RA_window_cnt--;
|
||||
@@ -650,7 +655,10 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||
|
||||
// Fill in preamble and PRACH resources
|
||||
if (mac->generate_nr_prach == 1)
|
||||
{
|
||||
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_slot_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
|
||||
prach_genarate = 1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -658,7 +666,8 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||
LOG_D(MAC, "[UE %d] FATAL: Should not have checked for RACH in PUSCH yet ...", mod_id);
|
||||
AssertFatal(1 == 0, "");
|
||||
}
|
||||
return mac->generate_nr_prach;
|
||||
//return mac->generate_nr_prach;
|
||||
return prach_genarate;
|
||||
}
|
||||
|
||||
void nr_get_RA_window(NR_UE_MAC_INST_t *mac){
|
||||
|
||||
@@ -287,7 +287,8 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
||||
if (ss->searchSpaceType->choice.ue_Specific){
|
||||
if(ss->searchSpaceType->choice.ue_Specific->dci_Formats == NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1){
|
||||
// Monitors DCI 01 and 11 scrambled with C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
|
||||
if ((mac->ra_state == RA_SUCCEEDED || get_softmodem_params()->phy_test) && mac->crnti > 0) {
|
||||
//if (get_softmodem_params()->phy_test == 1 && mac->crnti > 0) {
|
||||
if (((mac->ra_state == RA_SUCCEEDED) || (get_softmodem_params()->phy_test == 1)) && mac->crnti > 0){
|
||||
LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in the user specific search space\n");
|
||||
rel15->num_dci_options = 2;
|
||||
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_1;
|
||||
|
||||
@@ -958,7 +958,7 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
|
||||
void *pduP,
|
||||
uint16_t cell_id)
|
||||
{
|
||||
LOG_I(MAC,"[L2][MAC] decode mib\n");
|
||||
LOG_D(MAC,"[L2][MAC] decode mib\n");
|
||||
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
||||
|
||||
@@ -1505,7 +1505,13 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
module_id_t mod_id = ul_info->module_id;
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||
|
||||
if (mac->ra_state == RA_SUCCEEDED || get_softmodem_params()->phy_test) {
|
||||
if (((get_softmodem_params()->phy_test) || ((mac->ra_state == RA_SUCCEEDED)) ) && ul_info->slot_tx == 8) { // ULSCH is handled only in phy-test mode (consistently with OAI gNB)
|
||||
static int skip_the_first = 0;
|
||||
if (skip_the_first == 0)
|
||||
{
|
||||
skip_the_first = 1;
|
||||
return UE_CONNECTION_OK;
|
||||
}
|
||||
|
||||
uint8_t nb_dmrs_re_per_rb;
|
||||
uint8_t ulsch_input_buffer[MAX_ULSCH_PAYLOAD_BYTES];
|
||||
@@ -1538,6 +1544,17 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
fapi_nr_ul_config_request_pdu_t *ulcfg_pdu = &ul_config_req->ul_config_list[j];
|
||||
|
||||
if (ulcfg_pdu->pdu_type == FAPI_NR_UL_CONFIG_TYPE_PUSCH) {
|
||||
uint32_t rb_size = ulcfg_pdu->pusch_config_pdu.rb_size;
|
||||
uint32_t rb_start = ulcfg_pdu->pusch_config_pdu.rb_start;
|
||||
uint8_t nr_of_symbols = ulcfg_pdu->pusch_config_pdu.nr_of_symbols;
|
||||
uint8_t start_symbol_index = ulcfg_pdu->pusch_config_pdu.start_symbol_index;
|
||||
uint8_t mcs_index = ulcfg_pdu->pusch_config_pdu.mcs_index;
|
||||
|
||||
rb_size = 106;
|
||||
rb_start = 0;
|
||||
nr_of_symbols = 11;
|
||||
start_symbol_index = 0;
|
||||
mcs_index = 9;
|
||||
|
||||
// These should come from RRC config!!!
|
||||
uint8_t ptrs_mcs1 = 2;
|
||||
@@ -1545,10 +1562,10 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
uint8_t ptrs_mcs3 = 10;
|
||||
uint16_t n_rb0 = 25;
|
||||
uint16_t n_rb1 = 75;
|
||||
uint8_t ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, ulcfg_pdu->pusch_config_pdu.mcs_index, ulcfg_pdu->pusch_config_pdu.mcs_table);
|
||||
uint8_t ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, ulcfg_pdu->pusch_config_pdu.rb_size);
|
||||
uint16_t l_prime_mask = get_l_prime(ulcfg_pdu->pusch_config_pdu.nr_of_symbols, typeB, pusch_dmrs_pos0, pusch_len1);
|
||||
uint16_t ul_dmrs_symb_pos = l_prime_mask << ulcfg_pdu->pusch_config_pdu.start_symbol_index;
|
||||
uint8_t ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, mcs_index, ulcfg_pdu->pusch_config_pdu.mcs_table);
|
||||
uint8_t ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, rb_size);
|
||||
uint16_t l_prime_mask = get_l_prime(nr_of_symbols, typeB, pusch_dmrs_pos0, pusch_len1);
|
||||
uint16_t ul_dmrs_symb_pos = l_prime_mask << start_symbol_index;
|
||||
|
||||
uint8_t dmrs_config_type = 0;
|
||||
uint16_t number_dmrs_symbols = 0;
|
||||
@@ -1575,7 +1592,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
//ulcfg_pdu->pusch_config_pdu.target_code_rate = nr_get_code_rate_ul(ulcfg_pdu->pusch_config_pdu.mcs_index, ulcfg_pdu->pusch_config_pdu.mcs_table);
|
||||
//ulcfg_pdu->pusch_config_pdu.qam_mod_order = nr_get_Qm_ul(ulcfg_pdu->pusch_config_pdu.mcs_index, ulcfg_pdu->pusch_config_pdu.mcs_table);
|
||||
|
||||
if (1 << ulcfg_pdu->pusch_config_pdu.pusch_ptrs.ptrs_time_density >= ulcfg_pdu->pusch_config_pdu.nr_of_symbols) {
|
||||
if (1 << ulcfg_pdu->pusch_config_pdu.pusch_ptrs.ptrs_time_density >= nr_of_symbols) {
|
||||
ulcfg_pdu->pusch_config_pdu.pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
|
||||
}
|
||||
|
||||
@@ -1585,8 +1602,8 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
|
||||
TBS = nr_compute_tbs(ulcfg_pdu->pusch_config_pdu.qam_mod_order,
|
||||
ulcfg_pdu->pusch_config_pdu.target_code_rate,
|
||||
ulcfg_pdu->pusch_config_pdu.rb_size,
|
||||
ulcfg_pdu->pusch_config_pdu.nr_of_symbols,
|
||||
rb_size,
|
||||
nr_of_symbols,
|
||||
nb_dmrs_re_per_rb*number_dmrs_symbols,
|
||||
N_PRB_oh,
|
||||
0,
|
||||
@@ -4932,8 +4949,8 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
||||
LOG_T(MAC, "\n");
|
||||
#endif
|
||||
|
||||
if (IS_SOFTMODEM_NOS1){
|
||||
if (rx_lcid < NB_RB_MAX && rx_lcid >= DL_SCH_LCID_DTCH) {
|
||||
// if (IS_SOFTMODEM_NOS1){
|
||||
if (rx_lcid < NB_RB_MAX && rx_lcid >= DL_SCH_LCID_DCCH) {
|
||||
|
||||
mac_rlc_data_ind(module_idP,
|
||||
mac->crnti,
|
||||
@@ -4949,7 +4966,7 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
||||
} else {
|
||||
LOG_E(MAC, "[UE %d] Frame %d : unknown LCID %d (gNB %d)\n", module_idP, frameP, rx_lcid, gNB_index);
|
||||
}
|
||||
}
|
||||
// }
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -5243,6 +5260,8 @@ nr_ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
|
||||
ulsch_buffer[j] = 0;
|
||||
}
|
||||
|
||||
// log_dump(MAC, ulsch_buffer, 16, LOG_DUMP_CHAR, "UE ULSCH payload : ");
|
||||
|
||||
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
||||
LOG_I(MAC, "Printing UL MAC payload UE side, payload_offset: %d \n", payload_offset);
|
||||
for (int i = 0; i < buflen ; i++) {
|
||||
|
||||
@@ -422,7 +422,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
||||
|
||||
// This schedules the DCI for Downlink and PDSCH
|
||||
if (is_xlsch_in_slot(dlsch_in_slot_bitmap, slot % num_slots_per_tdd)
|
||||
&& slot < 10) {
|
||||
&& slot < 10 && slot == 2) {
|
||||
nr_schedule_ue_spec(module_idP, frame, slot, num_slots_per_tdd);
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
#define HALFWORD 16
|
||||
#define WORD 32
|
||||
//#define SIZE_OF_POINTER sizeof (void *)
|
||||
|
||||
static boolean_t loop_dcch_dtch = TRUE;
|
||||
int nr_generate_dlsch_pdu(module_id_t module_idP,
|
||||
NR_UE_sched_ctrl_t *ue_sched_ctl,
|
||||
unsigned char *sdus_payload,
|
||||
@@ -392,8 +392,9 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
|
||||
|
||||
/* Retrieve amount of data to send for this UE */
|
||||
sched_ctrl->num_total_bytes = 0;
|
||||
const int lcid = DL_SCH_LCID_DTCH;
|
||||
const rnti_t rnti = UE_info->rnti[UE_id];
|
||||
loop_dcch_dtch = BOOL_NOT(loop_dcch_dtch);
|
||||
const int lcid = loop_dcch_dtch?DL_SCH_LCID_DTCH:DL_SCH_LCID_DCCH;
|
||||
const uint16_t rnti = UE_info->rnti[UE_id];
|
||||
sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id,
|
||||
rnti,
|
||||
module_id,
|
||||
@@ -405,6 +406,13 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
|
||||
0,
|
||||
0);
|
||||
sched_ctrl->num_total_bytes += sched_ctrl->rlc_status[lcid].bytes_in_buffer;
|
||||
LOG_I(MAC,
|
||||
"%d.%d, LCID%d:->DLSCH, RLC status %d bytes. \n",
|
||||
frame,
|
||||
slot,
|
||||
lcid,
|
||||
sched_ctrl->num_total_bytes);
|
||||
|
||||
if (sched_ctrl->num_total_bytes == 0
|
||||
&& !sched_ctrl->ta_apply) /* If TA should be applied, give at least one RB */
|
||||
return;
|
||||
@@ -671,13 +679,14 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
||||
uint16_t sdu_lengths[NB_RB_MAX] = {0};
|
||||
uint8_t mac_sdus[MAX_NR_DLSCH_PAYLOAD_BYTES];
|
||||
unsigned char sdu_lcids[NB_RB_MAX] = {0};
|
||||
const int lcid = DL_SCH_LCID_DTCH;
|
||||
const int lcid = loop_dcch_dtch?DL_SCH_LCID_DTCH:DL_SCH_LCID_DCCH;
|
||||
if (sched_ctrl->num_total_bytes > 0) {
|
||||
/* this is the data from the RLC we would like to request (e.g., only
|
||||
* some bytes for first LC and some more from a second one */
|
||||
const rlc_buffer_occupancy_t ndata = sched_ctrl->rlc_status[lcid].bytes_in_buffer;
|
||||
/* this is the maximum data we can transport based on TBS minus headers */
|
||||
const int mindata = min(ndata, TBS - ta_len - header_length_total - sdu_length_total - 2 - (ndata >= 256));
|
||||
#if 1
|
||||
LOG_D(MAC,
|
||||
"[gNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting "
|
||||
"%d bytes from RLC (lcid %d total hdr len %d), TBS: %d \n \n",
|
||||
@@ -689,7 +698,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
||||
TBS);
|
||||
|
||||
sdu_lengths[num_sdus] = mac_rlc_data_req(module_id,
|
||||
rnti,
|
||||
0x1234,
|
||||
module_id,
|
||||
frame,
|
||||
ENB_FLAG_YES,
|
||||
@@ -711,6 +720,17 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
||||
header_length_last = 1 + 1 + (sdu_lengths[num_sdus] >= 128);
|
||||
header_length_total += header_length_last;
|
||||
num_sdus++;
|
||||
#else
|
||||
LOG_D(MAC, "Configuring DL_TX in %d.%d: random data\n", frame, slot);
|
||||
for (int i = 0; i < TBS; i++)
|
||||
mac_sdus[i] = (unsigned char) (lrand48()&0xff);
|
||||
sdu_lcids[0] = 0x3f; // DRB
|
||||
sdu_lengths[0] = TBS - ta_len - 3;
|
||||
header_length_total += 2 + (sdu_lengths[0] >= 128);
|
||||
sdu_length_total += sdu_lengths[0];
|
||||
num_sdus +=1;
|
||||
|
||||
#endif
|
||||
}
|
||||
else if (get_softmodem_params()->phy_test || get_softmodem_params()->do_ra) {
|
||||
LOG_D(MAC, "Configuring DL_TX in %d.%d: random data\n", frame, slot);
|
||||
|
||||
@@ -50,7 +50,7 @@ void nr_process_mac_pdu(
|
||||
int pdu_len = mac_pdu_len;
|
||||
uint16_t mac_ce_len, mac_subheader_len, mac_sdu_len;
|
||||
|
||||
|
||||
// log_dump(MAC, pduP, 16, LOG_DUMP_CHAR, "gNB ULSCH payload: ");
|
||||
// For both DL/UL-SCH
|
||||
// Except:
|
||||
// - UL/DL-SCH: fixed-size MAC CE(known by LCID)
|
||||
@@ -179,11 +179,7 @@ void nr_process_mac_pdu(
|
||||
// end of MAC PDU, can ignore the rest.
|
||||
break;
|
||||
|
||||
// MAC SDUs
|
||||
case UL_SCH_LCID_SRB1:
|
||||
// todo
|
||||
break;
|
||||
case UL_SCH_LCID_SRB2:
|
||||
case UL_SCH_LCID_SRB2:
|
||||
// todo
|
||||
break;
|
||||
case UL_SCH_LCID_SRB3:
|
||||
@@ -197,6 +193,8 @@ void nr_process_mac_pdu(
|
||||
mac_subheader_len = 2;
|
||||
break;
|
||||
|
||||
// MAC SDUs
|
||||
case UL_SCH_LCID_SRB1:
|
||||
case UL_SCH_LCID_DTCH:
|
||||
// check if LCID is valid at current time.
|
||||
if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
|
||||
@@ -210,13 +208,39 @@ void nr_process_mac_pdu(
|
||||
mac_subheader_len = 2;
|
||||
}
|
||||
|
||||
LOG_D(MAC, "[UE %d] Frame %d : ULSCH -> UL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len);
|
||||
LOG_I(MAC, "[UE %d] Frame %d : ULSCH -> UL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len);
|
||||
int UE_id = find_nr_UE_id(module_idP, rnti);
|
||||
RC.nrmac[module_idP]->UE_info.mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_sdu_len;
|
||||
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
||||
log_dump(MAC, pdu_ptr + mac_subheader_len, 32, LOG_DUMP_CHAR, "\n");
|
||||
|
||||
#endif
|
||||
if(IS_SOFTMODEM_NOS1){
|
||||
mac_rlc_data_ind(module_idP,
|
||||
0x1234,
|
||||
module_idP,
|
||||
frameP,
|
||||
ENB_FLAG_YES,
|
||||
MBMS_FLAG_NO,
|
||||
rx_lcid,
|
||||
(char *) (pdu_ptr + mac_subheader_len),
|
||||
mac_sdu_len,
|
||||
1,
|
||||
NULL);
|
||||
}
|
||||
else{
|
||||
mac_rlc_data_ind(module_idP,
|
||||
0x1234,
|
||||
module_idP,
|
||||
frameP,
|
||||
ENB_FLAG_YES,
|
||||
MBMS_FLAG_NO,
|
||||
rx_lcid,
|
||||
(char *) (pdu_ptr + mac_subheader_len),
|
||||
mac_sdu_len,
|
||||
1,
|
||||
NULL);
|
||||
}
|
||||
|
||||
mac_rlc_data_ind(module_idP,
|
||||
rnti,
|
||||
|
||||
@@ -96,7 +96,7 @@ void mac_top_init_gNB(void)
|
||||
// These should be out of here later
|
||||
pdcp_layer_init();
|
||||
|
||||
if(IS_SOFTMODEM_NOS1 && !get_softmodem_params()->do_ra)
|
||||
// if(IS_SOFTMODEM_NOS1 && !get_softmodem_params()->do_ra)
|
||||
nr_DRB_preconfiguration(0x1234);
|
||||
|
||||
rrc_init_nr_global_param();
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "nr_pdcp_entity.h"
|
||||
|
||||
#include "nr_pdcp_entity_drb_am.h"
|
||||
#include "nr_pdcp_entity_srb.h"
|
||||
|
||||
#include "LOG/log.h"
|
||||
|
||||
@@ -34,7 +35,32 @@ nr_pdcp_entity_t *new_nr_pdcp_entity_srb(
|
||||
char *buf, int size, int sdu_id),
|
||||
void *deliver_pdu_data)
|
||||
{
|
||||
abort();
|
||||
|
||||
nr_pdcp_entity_srb_t *ret;
|
||||
|
||||
ret = calloc(1, sizeof(nr_pdcp_entity_srb_t));
|
||||
if (ret == NULL) {
|
||||
LOG_E(PDCP, "%s:%d:%s: out of memory\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ret->common.recv_pdu = nr_pdcp_entity_srb_recv_pdu;
|
||||
ret->common.recv_sdu = nr_pdcp_entity_srb_recv_sdu;
|
||||
ret->common.set_integrity_key = nr_pdcp_entity_srb_set_integrity_key;
|
||||
|
||||
ret->common.delete = nr_pdcp_entity_srb_delete;
|
||||
|
||||
ret->common.deliver_sdu = deliver_sdu;
|
||||
ret->common.deliver_sdu_data = deliver_sdu_data;
|
||||
|
||||
ret->common.deliver_pdu = deliver_pdu;
|
||||
ret->common.deliver_pdu_data = deliver_pdu_data;
|
||||
|
||||
ret->srb_id = rb_id;
|
||||
|
||||
ret->common.maximum_nr_pdcp_sn = 4095;
|
||||
|
||||
return (nr_pdcp_entity_t *)ret;
|
||||
}
|
||||
|
||||
nr_pdcp_entity_t *new_nr_pdcp_entity_drb_am(
|
||||
|
||||
@@ -23,17 +23,18 @@
|
||||
|
||||
#ifndef _NR_PDCP_ENTITY_H_
|
||||
#define _NR_PDCP_ENTITY_H_
|
||||
#include "platform_types.h"
|
||||
|
||||
typedef struct nr_pdcp_entity_t {
|
||||
/* functions provided by the PDCP module */
|
||||
void (*recv_pdu)(struct nr_pdcp_entity_t *entity, char *buffer, int size);
|
||||
void (*recv_pdu)(protocol_ctxt_t *ctxt_pP,struct nr_pdcp_entity_t *entity, char *buffer, int size);
|
||||
void (*recv_sdu)(struct nr_pdcp_entity_t *entity, char *buffer, int size,
|
||||
int sdu_id);
|
||||
void (*delete)(struct nr_pdcp_entity_t *entity);
|
||||
void (*set_integrity_key)(struct nr_pdcp_entity_t *entity, char *key);
|
||||
|
||||
/* callbacks provided to the PDCP module */
|
||||
void (*deliver_sdu)(void *deliver_sdu_data, struct nr_pdcp_entity_t *entity,
|
||||
void (*deliver_sdu)(protocol_ctxt_t *ctxt_pP,void *deliver_sdu_data, struct nr_pdcp_entity_t *entity,
|
||||
char *buf, int size);
|
||||
void *deliver_sdu_data;
|
||||
void (*deliver_pdu)(void *deliver_pdu_data, struct nr_pdcp_entity_t *entity,
|
||||
|
||||
@@ -26,16 +26,13 @@
|
||||
#include <string.h>
|
||||
#include "common/utils/LOG/log.h"
|
||||
|
||||
void nr_pdcp_entity_drb_am_recv_pdu(nr_pdcp_entity_t *_entity, char *buffer, int size)
|
||||
void nr_pdcp_entity_drb_am_recv_pdu( protocol_ctxt_t *ctxt_pP , nr_pdcp_entity_t *_entity, char *buffer, int size)
|
||||
{
|
||||
nr_pdcp_entity_drb_am_t *entity = (nr_pdcp_entity_drb_am_t *)_entity;
|
||||
|
||||
if (size < 3) abort();
|
||||
|
||||
if (!(buffer[0] & 0x80))
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
|
||||
entity->common.deliver_sdu(entity->common.deliver_sdu_data,
|
||||
if (!(buffer[0] & 0x80)) { printf("%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__); exit(1); }
|
||||
entity->common.deliver_sdu(ctxt_pP, entity->common.deliver_sdu_data,
|
||||
(nr_pdcp_entity_t *)entity, buffer+3, size-3);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#define _NR_PDCP_ENTITY_DRB_AM_H_
|
||||
|
||||
#include "nr_pdcp_entity.h"
|
||||
#include "platform_types.h"
|
||||
|
||||
typedef struct {
|
||||
nr_pdcp_entity_t common;
|
||||
@@ -32,7 +33,7 @@ typedef struct {
|
||||
int discard_timer; /* unit: ms, -1 means infinity */
|
||||
} nr_pdcp_entity_drb_am_t;
|
||||
|
||||
void nr_pdcp_entity_drb_am_recv_pdu(nr_pdcp_entity_t *entity, char *buffer, int size);
|
||||
void nr_pdcp_entity_drb_am_recv_pdu(protocol_ctxt_t *ctxt_pP,nr_pdcp_entity_t *entity, char *buffer, int size);
|
||||
void nr_pdcp_entity_drb_am_recv_sdu(nr_pdcp_entity_t *entity, char *buffer, int size,
|
||||
int sdu_id);
|
||||
void nr_pdcp_entity_drb_am_set_integrity_key(nr_pdcp_entity_t *entity, char *key);
|
||||
|
||||
@@ -95,6 +95,65 @@ extern rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * con
|
||||
const LTE_PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP,
|
||||
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
nr_rrc_data_ind(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
const rb_id_t Srb_id,
|
||||
const sdu_size_t sdu_sizeP,
|
||||
const uint8_t *const buffer_pP
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
rb_id_t DCCH_index = Srb_id;
|
||||
LOG_I(RRC, "[UE %x] Frame %d: received a DCCH %ld message on SRB %ld with Size %d from eNB %d\n",
|
||||
ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id,sdu_sizeP, ctxt_pP->eNB_index);
|
||||
{
|
||||
MessageDef *message_p;
|
||||
// Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_NRUE, ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_NRUE, sdu_sizeP);
|
||||
memcpy (message_buffer, buffer_pP, sdu_sizeP);
|
||||
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_NRUE, NR_RRC_DCCH_DATA_IND);
|
||||
NR_RRC_DCCH_DATA_IND (message_p).frame = ctxt_pP->frame;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).sdu_size = sdu_sizeP;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).sdu_p = message_buffer;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).module_id = ctxt_pP->module_id;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).gNB_index = ctxt_pP->eNB_index;
|
||||
itti_send_msg_to_task (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_NRUE, ctxt_pP->instance, message_p);
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
nr_rrc_data_ind_ccch(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
const rb_id_t Srb_id,
|
||||
const sdu_size_t sdu_sizeP,
|
||||
const uint8_t *const buffer_pP
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
rb_id_t DCCH_index = Srb_id;
|
||||
LOG_I(RRC, "[UE %x] Frame %d: received a CCCH %ld message on SRB %d with Size %d from gNB %d\n",
|
||||
ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id,sdu_sizeP, ctxt_pP->eNB_index);
|
||||
{
|
||||
MessageDef *message_p;
|
||||
// Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
|
||||
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_NRUE, NR_RRC_MAC_CCCH_DATA_IND);
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).frame = ctxt_pP->frame;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_sizeP;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).gnb_index = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).CC_id = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti;
|
||||
memcpy(NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu,buffer_pP,sdu_sizeP);
|
||||
itti_send_msg_to_task (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_NRUE, ctxt_pP->instance, message_p);
|
||||
}
|
||||
}
|
||||
|
||||
static void *rlc_data_req_thread(void *_)
|
||||
{
|
||||
int i;
|
||||
@@ -210,7 +269,7 @@ static void *enb_tun_read_thread(void *_)
|
||||
int rnti;
|
||||
protocol_ctxt_t ctxt;
|
||||
|
||||
int rb_id = 1;
|
||||
int lc_id = 4;
|
||||
pthread_setname_np( pthread_self(),"enb_tun_read");
|
||||
|
||||
while (1) {
|
||||
@@ -239,7 +298,7 @@ printf("\n\n\n########## nas_sock_fd read returns len %d\n", len);
|
||||
|
||||
ctxt.rnti = rnti;
|
||||
|
||||
pdcp_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED,
|
||||
pdcp_data_req(&ctxt, SRB_FLAG_NO, lc_id, RLC_MUI_UNDEFINED,
|
||||
RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf,
|
||||
PDCP_TRANSMISSION_MODE_DATA, NULL, NULL);
|
||||
}
|
||||
@@ -255,7 +314,7 @@ static void *ue_tun_read_thread(void *_)
|
||||
int rnti;
|
||||
protocol_ctxt_t ctxt;
|
||||
|
||||
int rb_id = 1;
|
||||
int lc_id = 4;
|
||||
pthread_setname_np( pthread_self(),"ue_tun_read");
|
||||
while (1) {
|
||||
len = read(nas_sock_fd[0], &rx_buf, NL_MAX_PAYLOAD);
|
||||
@@ -283,7 +342,7 @@ printf("\n\n\n########## nas_sock_fd read returns len %d\n", len);
|
||||
|
||||
ctxt.rnti = rnti;
|
||||
|
||||
pdcp_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED,
|
||||
pdcp_data_req(&ctxt, SRB_FLAG_NO, lc_id, RLC_MUI_UNDEFINED,
|
||||
RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf,
|
||||
PDCP_TRANSMISSION_MODE_DATA, NULL, NULL);
|
||||
}
|
||||
@@ -397,8 +456,8 @@ uint64_t pdcp_module_init(uint64_t _pdcp_optmask)
|
||||
}
|
||||
return pdcp_optmask ;
|
||||
}
|
||||
|
||||
static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
|
||||
static int liuyu=0;
|
||||
static void deliver_sdu_drb(protocol_ctxt_t *ctxt_pP,void *_ue, nr_pdcp_entity_t *entity,
|
||||
char *buf, int size)
|
||||
{
|
||||
extern int nas_sock_fd[];
|
||||
@@ -409,11 +468,33 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
|
||||
int rb_id;
|
||||
int i;
|
||||
|
||||
if(IS_SOFTMODEM_NOS1){
|
||||
if (1) { //(IS_SOFTMODEM_NOS1){
|
||||
#if 0
|
||||
log_dump(PDCP,buf,size,LOG_DUMP_CHAR," PDCP Received SDU:\n");
|
||||
if (size > 4700)
|
||||
{
|
||||
LOG_I(PDCP,"maybe ip data \n");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_I(PDCP,"send to gNB RRC \n");
|
||||
|
||||
if(liuyu==2)
|
||||
liuyu=1;
|
||||
if(liuyu==0)
|
||||
nr_rrc_data_ind_ccch( ctxt_pP, 1, size, buf);
|
||||
if(liuyu==1)
|
||||
nr_rrc_data_ind( ctxt_pP, 1, size, buf);
|
||||
|
||||
liuyu++;
|
||||
|
||||
}
|
||||
#else
|
||||
len = write(nas_sock_fd[0], buf, size);
|
||||
if (len != size) {
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else{
|
||||
for (i = 0; i < 5; i++) {
|
||||
@@ -488,6 +569,75 @@ rb_found:
|
||||
enqueue_rlc_data_req(&ctxt, 0, MBMS_FLAG_NO, rb_id, sdu_id, 0, size, memblock, NULL, NULL);
|
||||
}
|
||||
|
||||
static int ccch_or_dcch = 0;
|
||||
static void deliver_sdu_srb(protocol_ctxt_t *ctxt_pP, void *_ue, nr_pdcp_entity_t *entity,
|
||||
char *buf, int size)
|
||||
{
|
||||
/* Implementation to be added */
|
||||
|
||||
nr_pdcp_ue_t *ue = _ue;
|
||||
MessageDef *message_p;
|
||||
uint8_t *gtpu_buffer_p;
|
||||
int srb_id;
|
||||
int i;
|
||||
|
||||
if (ccch_or_dcch == 0)
|
||||
{
|
||||
nr_rrc_data_ind_ccch( ctxt_pP, 1, size, buf);
|
||||
ccch_or_dcch = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
nr_rrc_data_ind( ctxt_pP, 1, size, buf);
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void deliver_pdu_srb(void *_ue, nr_pdcp_entity_t *entity,
|
||||
char *buf, int size, int sdu_id)
|
||||
{
|
||||
nr_pdcp_ue_t *ue = _ue;
|
||||
int srb_id;
|
||||
protocol_ctxt_t ctxt;
|
||||
int i;
|
||||
mem_block_t *memblock;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (entity == ue->srb[i]) {
|
||||
srb_id = i+1;
|
||||
goto rb_found;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal, no RB found for ue %d\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, ue->rnti);
|
||||
exit(1);
|
||||
|
||||
rb_found:
|
||||
ctxt.module_id = 0;
|
||||
ctxt.enb_flag = 1;
|
||||
ctxt.instance = 0;
|
||||
ctxt.frame = 0;
|
||||
ctxt.subframe = 0;
|
||||
ctxt.eNB_index = 0;
|
||||
ctxt.configured = 1;
|
||||
ctxt.brOption = 0;
|
||||
|
||||
ctxt.rnti = ue->rnti;
|
||||
|
||||
memblock = get_free_mem_block(size, __FUNCTION__);
|
||||
memcpy(memblock->data, buf, size);
|
||||
|
||||
printf("!!!!!!! deliver_pdu_srb (srb %d) calling rlc_data_req size %d: ", srb_id, size);
|
||||
//for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)memblock->data[i]);
|
||||
printf("\n");
|
||||
enqueue_rlc_data_req(&ctxt, 1, MBMS_FLAG_NO, srb_id, sdu_id, 0, size, memblock, NULL, NULL);
|
||||
}
|
||||
|
||||
boolean_t pdcp_data_ind(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
const srb_flag_t srb_flagP,
|
||||
@@ -530,7 +680,7 @@ boolean_t pdcp_data_ind(
|
||||
}
|
||||
|
||||
if (rb != NULL) {
|
||||
rb->recv_pdu(rb, (char *)sdu_buffer->data, sdu_buffer_size);
|
||||
rb->recv_pdu(ctxt_pP,rb, (char *)sdu_buffer->data, sdu_buffer_size);
|
||||
} else {
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal: no RB found (rb_id %ld, srb_flag %d)\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, rb_id, srb_flagP);
|
||||
@@ -565,7 +715,7 @@ void pdcp_run(const protocol_ctxt_t *const ctxt_pP)
|
||||
0,
|
||||
RRC_DCCH_DATA_REQ(msg_p).eNB_index);
|
||||
result = pdcp_data_req(&ctxt,
|
||||
SRB_FLAG_YES,
|
||||
SRB_FLAG_YES,//not used, use lcid to check
|
||||
RRC_DCCH_DATA_REQ(msg_p).rb_id,
|
||||
RRC_DCCH_DATA_REQ(msg_p).muip,
|
||||
RRC_DCCH_DATA_REQ(msg_p).confirmp,
|
||||
@@ -588,7 +738,32 @@ void pdcp_run(const protocol_ctxt_t *const ctxt_pP)
|
||||
|
||||
static void add_srb(int rnti, struct NR_SRB_ToAddMod *s)
|
||||
{
|
||||
TODO;
|
||||
nr_pdcp_entity_t *pdcp_srb;
|
||||
nr_pdcp_ue_t *ue;
|
||||
|
||||
int srb_id = s->srb_Identity;
|
||||
|
||||
printf("\n\n################# rnti %d add srb %d\n\n\n", rnti, srb_id);
|
||||
|
||||
if (srb_id > 3) {
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal, bad drb id %d\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, srb_id);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rnti);
|
||||
if (ue->srb[srb_id-1] != NULL) {
|
||||
LOG_W(PDCP, "%s:%d:%s: warning DRB %d already exist for ue %d, do nothing\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, srb_id, rnti);
|
||||
} else {
|
||||
pdcp_srb = new_nr_pdcp_entity_srb(srb_id, deliver_sdu_srb, ue, deliver_pdu_srb, ue);
|
||||
nr_pdcp_ue_add_srb_pdcp_entity(ue, srb_id, pdcp_srb);
|
||||
|
||||
LOG_I(PDCP, "%s:%d:%s: added drb %d to ue %d\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, srb_id, rnti);
|
||||
}
|
||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||
}
|
||||
|
||||
static void add_drb_am(int rnti, struct NR_DRB_ToAddMod *s)
|
||||
@@ -736,7 +911,17 @@ void nr_DRB_preconfiguration(uint16_t crnti)
|
||||
//fill_default_rbconfig(rb_config, 5, 1);
|
||||
rbconfig = calloc(1, sizeof(*rbconfig));
|
||||
|
||||
rbconfig->srb_ToAddModList = NULL;
|
||||
rbconfig->srb_ToAddModList = calloc(1,sizeof(*rbconfig->srb_ToAddModList));
|
||||
NR_SRB_ToAddMod_t *srb_ToAddMod = calloc(1,sizeof(*srb_ToAddMod));
|
||||
srb_ToAddMod->srb_Identity = 1;
|
||||
srb_ToAddMod->reestablishPDCP = NULL;
|
||||
srb_ToAddMod->discardOnPDCP = NULL;
|
||||
srb_ToAddMod->pdcp_Config = NULL;
|
||||
ASN_SEQUENCE_ADD(&rbconfig->srb_ToAddModList->list,srb_ToAddMod);
|
||||
// srb_ToAddMod = calloc(1,sizeof(*srb_ToAddMod));
|
||||
// srb_ToAddMod->srb_Identity = 2;
|
||||
// ASN_SEQUENCE_ADD(&rbconfig->srb_ToAddModList->list,srb_ToAddMod);
|
||||
|
||||
rbconfig->srb3_ToRelease = NULL;
|
||||
rbconfig->drb_ToAddModList = calloc(1,sizeof(*rbconfig->drb_ToAddModList));
|
||||
NR_DRB_ToAddMod_t *drb_ToAddMod = calloc(1,sizeof(*drb_ToAddMod));
|
||||
@@ -781,7 +966,8 @@ void nr_DRB_preconfiguration(uint16_t crnti)
|
||||
|
||||
NR_RLC_BearerConfig_t *RLC_BearerConfig = calloc(1,sizeof(*RLC_BearerConfig));
|
||||
nr_rlc_bearer_init(RLC_BearerConfig);
|
||||
nr_drb_config(RLC_BearerConfig->rlc_Config, NR_RLC_Config_PR_um_Bi_Directional);
|
||||
// nr_drb_config(RLC_BearerConfig->rlc_Config, NR_RLC_Config_PR_um_Bi_Directional);
|
||||
nr_drb_config(RLC_BearerConfig->rlc_Config, NR_RLC_Config_PR_am);
|
||||
nr_rlc_bearer_init_ul_spec(RLC_BearerConfig->mac_LogicalChannelConfig);
|
||||
|
||||
Rlc_Bearer_ToAdd_list = calloc(1,sizeof(*Rlc_Bearer_ToAdd_list));
|
||||
@@ -796,7 +982,7 @@ void nr_DRB_preconfiguration(uint16_t crnti)
|
||||
|
||||
nr_rrc_pdcp_config_asn1_req(
|
||||
&ctxt,
|
||||
(NR_SRB_ToAddModList_t *) NULL,
|
||||
rbconfig->srb_ToAddModList,
|
||||
rbconfig->drb_ToAddModList ,
|
||||
rbconfig->drb_ToReleaseList,
|
||||
0xff,
|
||||
@@ -808,7 +994,7 @@ void nr_DRB_preconfiguration(uint16_t crnti)
|
||||
Rlc_Bearer_ToAdd_list);
|
||||
|
||||
nr_rrc_rlc_config_asn1_req (&ctxt,
|
||||
(NR_SRB_ToAddModList_t *) NULL,
|
||||
rbconfig->srb_ToAddModList,
|
||||
rbconfig->drb_ToAddModList,
|
||||
rbconfig->drb_ToReleaseList,
|
||||
(LTE_PMCH_InfoList_r9_t *) NULL,
|
||||
@@ -876,6 +1062,52 @@ void pdcp_config_set_security(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static boolean_t pdcp_data_req_srb(
|
||||
protocol_ctxt_t *ctxt_pP,
|
||||
const rb_id_t rb_id,
|
||||
const mui_t muiP,
|
||||
const confirm_t confirmP,
|
||||
const sdu_size_t sdu_buffer_size,
|
||||
unsigned char *const sdu_buffer)
|
||||
{
|
||||
LOG_D(PDCP, "%s() called, size %d\n", __func__, sdu_buffer_size);
|
||||
nr_pdcp_ue_t *ue;
|
||||
nr_pdcp_entity_t *rb;
|
||||
int rnti = ctxt_pP->rnti;
|
||||
|
||||
if (ctxt_pP->module_id != 0 ||
|
||||
//ctxt_pP->enb_flag != 1 ||
|
||||
ctxt_pP->instance != 0 ||
|
||||
ctxt_pP->eNB_index != 0 /*||
|
||||
ctxt_pP->configured != 1 ||
|
||||
ctxt_pP->brOption != 0*/) {
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
|
||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rnti);
|
||||
|
||||
if (rb_id < 1 || rb_id > 3)
|
||||
rb = NULL;
|
||||
else
|
||||
rb = ue->srb[rb_id - 1];
|
||||
|
||||
if (rb == NULL) {
|
||||
LOG_E(PDCP, "%s:%d:%s: no SRB found (rnti %d, rb_id %ld)\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, rnti, rb_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rb->recv_sdu(rb, (char *)sdu_buffer, sdu_buffer_size, muiP);
|
||||
|
||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static boolean_t pdcp_data_req_drb(
|
||||
protocol_ctxt_t *ctxt_pP,
|
||||
const rb_id_t rb_id,
|
||||
@@ -936,8 +1168,12 @@ boolean_t pdcp_data_req(
|
||||
#endif
|
||||
)
|
||||
{
|
||||
if (srb_flagP) { TODO; }
|
||||
return pdcp_data_req_drb(ctxt_pP, rb_id, muiP, confirmP, sdu_buffer_size,
|
||||
if (rb_id < 4) {
|
||||
return pdcp_data_req_srb(ctxt_pP, rb_id, muiP, confirmP, sdu_buffer_size,
|
||||
sdu_buffer);
|
||||
}
|
||||
// use rbid to check drb or srb.
|
||||
return pdcp_data_req_drb(ctxt_pP, rb_id - 3, muiP, confirmP, sdu_buffer_size,
|
||||
sdu_buffer);
|
||||
}
|
||||
|
||||
|
||||
@@ -766,6 +766,78 @@ static void add_drb_am(int rnti, struct NR_DRB_ToAddMod *s, NR_RLC_BearerConfig_
|
||||
}
|
||||
nr_rlc_manager_unlock(nr_rlc_ue_manager);
|
||||
}
|
||||
static void srb_add_drb_am(int rnti, struct NR_DRB_ToAddMod *s, NR_RLC_BearerConfig_t *rlc_BearerConfig)
|
||||
{
|
||||
nr_rlc_entity_t *nr_rlc_am;
|
||||
nr_rlc_ue_t *ue;
|
||||
|
||||
struct NR_RLC_Config *r = rlc_BearerConfig->rlc_Config;
|
||||
struct NR_LogicalChannelConfig *l = rlc_BearerConfig->mac_LogicalChannelConfig;
|
||||
int srb_id = 1;
|
||||
int channel_id = 1;//rlc_BearerConfig->logicalChannelIdentity;
|
||||
int logical_channel_group;
|
||||
|
||||
int t_status_prohibit;
|
||||
int t_poll_retransmit;
|
||||
int poll_pdu;
|
||||
int poll_byte;
|
||||
int max_retx_threshold;
|
||||
int t_reassembly;
|
||||
int sn_field_length;
|
||||
|
||||
|
||||
logical_channel_group = *l->ul_SpecificParameters->logicalChannelGroup;
|
||||
|
||||
/* TODO: accept other values? */
|
||||
if (logical_channel_group != 1) {
|
||||
LOG_E(RLC, "%s:%d:%s: fatal error\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
switch (r->present) {
|
||||
case NR_RLC_Config_PR_am: {
|
||||
struct NR_RLC_Config__am *am;
|
||||
am = r->choice.am;
|
||||
t_reassembly = decode_t_reassembly(am->dl_AM_RLC.t_Reassembly);
|
||||
t_status_prohibit = decode_t_status_prohibit(am->dl_AM_RLC.t_StatusProhibit);
|
||||
t_poll_retransmit = decode_t_poll_retransmit(am->ul_AM_RLC.t_PollRetransmit);
|
||||
poll_pdu = decode_poll_pdu(am->ul_AM_RLC.pollPDU);
|
||||
poll_byte = decode_poll_byte(am->ul_AM_RLC.pollByte);
|
||||
max_retx_threshold = decode_max_retx_threshold(am->ul_AM_RLC.maxRetxThreshold);
|
||||
if (*am->dl_AM_RLC.sn_FieldLength != *am->ul_AM_RLC.sn_FieldLength) {
|
||||
LOG_E(RLC, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
sn_field_length = decode_sn_field_length_am(*am->dl_AM_RLC.sn_FieldLength);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
LOG_E(RLC, "%s:%d:%s: fatal error\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
nr_rlc_manager_lock(nr_rlc_ue_manager);
|
||||
ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rnti);
|
||||
if (ue->srb[srb_id-1] != NULL) {
|
||||
LOG_W(RLC, "%s:%d:%s: warning DRB %d already exist for ue %d, do nothing\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, srb_id, rnti);
|
||||
} else {
|
||||
nr_rlc_am = new_nr_rlc_entity_am(100000,
|
||||
100000,
|
||||
deliver_sdu, ue,
|
||||
successful_delivery, ue,
|
||||
max_retx_reached, ue,
|
||||
t_poll_retransmit,
|
||||
t_reassembly, t_status_prohibit,
|
||||
poll_pdu, poll_byte, max_retx_threshold,
|
||||
sn_field_length);
|
||||
//nr_rlc_ue_add_drb_rlc_entity(ue, srb_id, nr_rlc_am);
|
||||
ue->srb[srb_id-1] = nr_rlc_am;
|
||||
LOG_I(RLC, "%s:%d:%s: added srb %d to ue %d\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, srb_id, rnti);
|
||||
}
|
||||
nr_rlc_manager_unlock(nr_rlc_ue_manager);
|
||||
}
|
||||
|
||||
static void add_drb_um(int rnti, struct NR_DRB_ToAddMod *s, NR_RLC_BearerConfig_t *rlc_BearerConfig)
|
||||
{
|
||||
@@ -834,6 +906,75 @@ static void add_drb_um(int rnti, struct NR_DRB_ToAddMod *s, NR_RLC_BearerConfig_
|
||||
}
|
||||
nr_rlc_manager_unlock(nr_rlc_ue_manager);
|
||||
}
|
||||
static void srb_add_drb_um(int rnti, struct NR_DRB_ToAddMod *s, NR_RLC_BearerConfig_t *rlc_BearerConfig)
|
||||
{
|
||||
nr_rlc_entity_t *nr_rlc_um;
|
||||
nr_rlc_ue_t *ue;
|
||||
|
||||
struct NR_RLC_Config *r = rlc_BearerConfig->rlc_Config;
|
||||
struct NR_LogicalChannelConfig *l = rlc_BearerConfig->mac_LogicalChannelConfig;
|
||||
int srb_id = 1;
|
||||
int channel_id = rlc_BearerConfig->logicalChannelIdentity;
|
||||
int logical_channel_group;
|
||||
|
||||
int sn_field_length;
|
||||
int t_reassembly;
|
||||
|
||||
// if (!(drb_id >= 1 && drb_id <= 5)) {
|
||||
// LOG_E(RLC, "%s:%d:%s: fatal, bad srb id %d\n",
|
||||
// __FILE__, __LINE__, __FUNCTION__, drb_id);
|
||||
// exit(1);
|
||||
// }
|
||||
|
||||
// if (channel_id != drb_id + 3) {
|
||||
// LOG_E(RLC, "%s:%d:%s: todo, remove this limitation\n",
|
||||
// __FILE__, __LINE__, __FUNCTION__);
|
||||
// exit(1);
|
||||
// }
|
||||
|
||||
logical_channel_group = *l->ul_SpecificParameters->logicalChannelGroup;
|
||||
|
||||
/* TODO: accept other values? */
|
||||
if (logical_channel_group != 1) {
|
||||
LOG_E(RLC, "%s:%d:%s: fatal error\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
switch (r->present) {
|
||||
case NR_RLC_Config_PR_um_Bi_Directional: {
|
||||
struct NR_RLC_Config__um_Bi_Directional *um;
|
||||
um = r->choice.um_Bi_Directional;
|
||||
t_reassembly = decode_t_reassembly(um->dl_UM_RLC.t_Reassembly);
|
||||
if (*um->dl_UM_RLC.sn_FieldLength != *um->ul_UM_RLC.sn_FieldLength) {
|
||||
LOG_E(RLC, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
sn_field_length = decode_sn_field_length_um(*um->dl_UM_RLC.sn_FieldLength);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
LOG_E(RLC, "%s:%d:%s: fatal error\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
nr_rlc_manager_lock(nr_rlc_ue_manager);
|
||||
ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rnti);
|
||||
if (ue->srb[srb_id-1] != NULL) {
|
||||
LOG_W(RLC, "%s:%d:%s: warning DRB %d already exist for ue %d, do nothing\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, srb_id, rnti);
|
||||
} else {
|
||||
nr_rlc_um = new_nr_rlc_entity_um(1000000,
|
||||
1000000,
|
||||
deliver_sdu, ue,
|
||||
t_reassembly,
|
||||
sn_field_length);
|
||||
// nr_rlc_ue_add_drb_rlc_entity(ue, srb_id, nr_rlc_um);
|
||||
ue->srb[srb_id-1] = nr_rlc_um;
|
||||
LOG_I(RLC, "%s:%d:%s: added srb %d to ue %d\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, srb_id, rnti);
|
||||
}
|
||||
nr_rlc_manager_unlock(nr_rlc_ue_manager);
|
||||
}
|
||||
|
||||
static void add_drb(int rnti, struct NR_DRB_ToAddMod *s, struct NR_RLC_BearerConfig *rlc_BearerConfig)
|
||||
{
|
||||
@@ -895,7 +1036,8 @@ rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt
|
||||
|
||||
if (srb2add_listP != NULL) {
|
||||
for (i = 0; i < srb2add_listP->list.count; i++) {
|
||||
add_srb(rnti, srb2add_listP->list.array[i]);
|
||||
// add_srb(rnti, srb2add_listP->list.array[i]);
|
||||
srb_add_drb_am(rnti, drb2add_listP->list.array[0], rlc_bearer2add_list->list.array[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -108,8 +108,8 @@ nr_rrc_data_req(
|
||||
/* 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
|
||||
* messages automatically */
|
||||
if (ctxt_pP->enb_flag && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type))
|
||||
pdcp_run(ctxt_pP);
|
||||
// if (ctxt_pP->enb_flag && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type))
|
||||
// pdcp_run(ctxt_pP);
|
||||
|
||||
return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
|
||||
}
|
||||
|
||||
@@ -826,9 +826,9 @@ uint8_t do_NR_SecurityModeCommand(
|
||||
dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm
|
||||
= integrityProtAlgorithm;
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
// if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
|
||||
}
|
||||
// }
|
||||
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
|
||||
NULL,
|
||||
|
||||
@@ -410,7 +410,12 @@ rrc_gNB_generate_RRCSetup(
|
||||
case ngran_gNB:
|
||||
{
|
||||
// rrc_mac_config_req_gNB
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
LOG_I(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCSetup (bytes %d)\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
ue_p->Srb0.Tx_buffer.payload_size);
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM,
|
||||
ue_p->Srb0.Tx_buffer.payload_size);
|
||||
@@ -419,7 +424,7 @@ rrc_gNB_generate_RRCSetup(
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).size = ue_p->Srb0.Tx_buffer.payload_size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#endif
|
||||
#else
|
||||
LOG_D(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" RRC_gNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_gNB\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
@@ -442,6 +447,15 @@ rrc_gNB_generate_RRCSetup(
|
||||
ue_context_pP->ue_context.ue_release_timer_thres = 1000;
|
||||
/* init timers */
|
||||
// ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0;
|
||||
|
||||
nr_rrc_data_req(ctxt_pP,
|
||||
DCCH,
|
||||
rrc_gNB_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
ue_p->Srb0.Tx_buffer.payload_size,
|
||||
ue_p->Srb0.Tx_buffer.Payload,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1890,7 +1904,7 @@ rrc_gNB_decode_dcch(
|
||||
sdu_sizeP,
|
||||
0,
|
||||
0);
|
||||
// xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
|
||||
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)ul_dcch_msg);
|
||||
|
||||
{
|
||||
for (i = 0; i < sdu_sizeP; i++) {
|
||||
@@ -2502,13 +2516,14 @@ void *rrc_gnb_task(void *args_p) {
|
||||
|
||||
/* Messages from MAC */
|
||||
case NR_RRC_MAC_CCCH_DATA_IND:
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).gnb_index,
|
||||
GNB_FLAG_YES,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).rnti,
|
||||
msg_p->ittiMsgHeader.lte_time.frame,
|
||||
msg_p->ittiMsgHeader.lte_time.slot);
|
||||
LOG_I(NR_RRC,"Decoding CCCH : inst %d, CC_id %d, ctxt %p, sib_info_p->Rx_buffer.payload_size %d\n",
|
||||
LOG_I(NR_RRC,"Decoding CCCH : ue %d, inst %d, CC_id %d, ctxt %p, sib_info_p->Rx_buffer.payload_size %d\n",
|
||||
ctxt.rnti,
|
||||
instance,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).CC_id,
|
||||
&ctxt,
|
||||
@@ -2534,6 +2549,11 @@ void *rrc_gnb_task(void *args_p) {
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).rnti,
|
||||
msg_p->ittiMsgHeader.lte_time.frame,
|
||||
msg_p->ittiMsgHeader.lte_time.slot);
|
||||
LOG_I(NR_RRC,"Decoding DCCH : ue %d, inst %d, ctxt %p, size %d\n",
|
||||
ctxt.rnti,
|
||||
instance,
|
||||
&ctxt,
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).sdu_size);
|
||||
LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Received on DCCH %d %s\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).dcch_index,
|
||||
|
||||
@@ -129,7 +129,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
||||
*secondaryCellGroup->spCellConfig->servCellIndex = servCellIndex;
|
||||
secondaryCellGroup->spCellConfig->reconfigurationWithSync=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->reconfigurationWithSync));
|
||||
secondaryCellGroup->spCellConfig->reconfigurationWithSync->spCellConfigCommon=servingcellconfigcommon;
|
||||
secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity=(get_softmodem_params()->phy_test==1) ? 0x1234 : (taus()&0xffff);
|
||||
secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity=0x1234;//(get_softmodem_params()->phy_test==1) ? 0x1234 : (taus()&0xffff);
|
||||
secondaryCellGroup->spCellConfig->reconfigurationWithSync->t304=NR_ReconfigurationWithSync__t304_ms2000;
|
||||
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = NULL;
|
||||
secondaryCellGroup->spCellConfig->reconfigurationWithSync->ext1 = NULL;
|
||||
|
||||
@@ -84,11 +84,11 @@ rrc_data_req_ue(
|
||||
// Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (
|
||||
ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE,
|
||||
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
|
||||
TASK_RRC_UE,
|
||||
TASK_PDCP_UE,
|
||||
sdu_sizeP);
|
||||
memcpy (message_buffer, buffer_pP, sdu_sizeP);
|
||||
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ);
|
||||
message_p = itti_alloc_new_message ( TASK_RRC_UE, RRC_DCCH_DATA_REQ);
|
||||
RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
|
||||
RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
|
||||
RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
|
||||
|
||||
+119
-103
@@ -1404,86 +1404,85 @@ static void rrc_ue_generate_RRCSetupComplete(
|
||||
}
|
||||
|
||||
int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_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;
|
||||
int rval=0;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_IN);
|
||||
// LOG_D(RRC,"[UE %d] Decoding DL-CCCH message (%d bytes), State %d\n",ue_mod_idP,Srb_info->Rx_buffer.payload_size,
|
||||
// NR_UE_rrc_inst[ue_mod_idP].Info[gNB_index].State);
|
||||
dec_rval = uper_decode(NULL,
|
||||
&asn_DEF_NR_DL_CCCH_Message,
|
||||
(void **)&dl_ccch_msg,
|
||||
(uint8_t *)Srb_info->Rx_buffer.Payload,
|
||||
100,0,0);
|
||||
|
||||
// if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout,&asn_DEF_NR_DL_CCCH_Message,(void *)dl_ccch_msg);
|
||||
// }
|
||||
|
||||
if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) {
|
||||
LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%zu bytes)\n",ctxt_pP->module_id,ctxt_pP->frame,dec_rval.consumed);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (dl_ccch_msg->message.present == NR_DL_CCCH_MessageType_PR_c1) {
|
||||
if (NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].State == NR_RRC_SI_RECEIVED) {
|
||||
switch (dl_ccch_msg->message.choice.c1->present) {
|
||||
case NR_DL_CCCH_MessageType__c1_PR_NOTHING:
|
||||
LOG_I(NR_RRC, "[UE%d] Frame %d : Received PR_NOTHING on DL-CCCH-Message\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame);
|
||||
rval = 0;
|
||||
break;
|
||||
|
||||
case NR_DL_CCCH_MessageType__c1_PR_rrcReject:
|
||||
LOG_I(NR_RRC,
|
||||
"[UE%d] Frame %d : Logical Channel DL-CCCH (SRB0), Received RRCConnectionReject \n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame);
|
||||
rval = 0;
|
||||
break;
|
||||
|
||||
case NR_DL_CCCH_MessageType__c1_PR_rrcSetup:
|
||||
LOG_I(NR_RRC,
|
||||
"[UE%d][RAPROC] Frame %d : Logical Channel DL-CCCH (SRB0), Received NR_RRCSetup RNTI %x\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame,
|
||||
ctxt_pP->rnti);
|
||||
|
||||
// Get configuration
|
||||
// Release T300 timer
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].T300_active = 0;
|
||||
|
||||
nr_rrc_ue_process_masterCellGroup(
|
||||
ctxt_pP,
|
||||
gNB_index,
|
||||
&dl_ccch_msg->message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup->masterCellGroup);
|
||||
nr_sa_rrc_ue_process_radioBearerConfig(
|
||||
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_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].rnti = ctxt_pP->rnti;
|
||||
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);
|
||||
rval = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(NR_RRC, "[UE%d] Frame %d : Unknown message\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame);
|
||||
rval = -1;
|
||||
break;
|
||||
}
|
||||
NR_DL_CCCH_Message_t *dl_ccch_msg=NULL;
|
||||
asn_dec_rval_t dec_rval;
|
||||
int rval=0;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_IN);
|
||||
// LOG_D(RRC,"[UE %d] Decoding DL-CCCH message (%d bytes), State %d\n",ue_mod_idP,Srb_info->Rx_buffer.payload_size,
|
||||
// NR_UE_rrc_inst[ue_mod_idP].Info[gNB_index].State);
|
||||
dec_rval = uper_decode(NULL,
|
||||
&asn_DEF_NR_DL_CCCH_Message,
|
||||
(void **)&dl_ccch_msg,
|
||||
(uint8_t *)Srb_info->Rx_buffer.Payload,
|
||||
100,0,0);
|
||||
|
||||
// if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout,&asn_DEF_NR_DL_CCCH_Message,(void *)dl_ccch_msg);
|
||||
// }
|
||||
|
||||
if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) {
|
||||
LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%zu bytes)\n",ctxt_pP->module_id,ctxt_pP->frame,dec_rval.consumed);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT);
|
||||
return -1;
|
||||
}
|
||||
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].State = NR_RRC_SI_RECEIVED;
|
||||
if (dl_ccch_msg->message.present == NR_DL_CCCH_MessageType_PR_c1) {
|
||||
if (NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].State == NR_RRC_SI_RECEIVED) {
|
||||
switch (dl_ccch_msg->message.choice.c1->present) {
|
||||
case NR_DL_CCCH_MessageType__c1_PR_NOTHING:
|
||||
LOG_I(NR_RRC, "[UE%d] Frame %d : Received PR_NOTHING on DL-CCCH-Message\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame);
|
||||
rval = 0;
|
||||
break;
|
||||
|
||||
case NR_DL_CCCH_MessageType__c1_PR_rrcReject:
|
||||
LOG_I(NR_RRC,
|
||||
"[UE%d] Frame %d : Logical Channel DL-CCCH (SRB0), Received RRCConnectionReject \n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame);
|
||||
rval = 0;
|
||||
break;
|
||||
|
||||
case NR_DL_CCCH_MessageType__c1_PR_rrcSetup:
|
||||
LOG_I(NR_RRC,
|
||||
"[UE%d][RAPROC] Frame %d : Logical Channel DL-CCCH (SRB0), Received NR_RRCSetup RNTI %x\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame,
|
||||
ctxt_pP->rnti);
|
||||
// Get configuration
|
||||
// Release T300 timer
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].T300_active = 0;
|
||||
|
||||
// nr_rrc_ue_process_masterCellGroup(
|
||||
// ctxt_pP,
|
||||
// gNB_index,
|
||||
// &dl_ccch_msg->message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup->masterCellGroup);
|
||||
// nr_sa_rrc_ue_process_radioBearerConfig(
|
||||
// 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_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].rnti = ctxt_pP->rnti;
|
||||
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);
|
||||
rval = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(NR_RRC, "[UE%d] Frame %d : Unknown message\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame);
|
||||
rval = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT);
|
||||
return rval;
|
||||
}
|
||||
@@ -1612,29 +1611,34 @@ nr_rrc_ue_process_securityModeCommand(
|
||||
securityMode = NR_CipheringAlgorithm_spare1;
|
||||
break;
|
||||
}
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm =
|
||||
securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm;
|
||||
|
||||
switch (*securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm) {
|
||||
case NR_IntegrityProtAlgorithm_nia1:
|
||||
LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to nia1\n",ctxt_pP->module_id);
|
||||
securityMode |= 1 << 5;
|
||||
break;
|
||||
if (securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm != NULL)
|
||||
{
|
||||
switch (*securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm) {
|
||||
case NR_IntegrityProtAlgorithm_nia1:
|
||||
LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to nia1\n",ctxt_pP->module_id);
|
||||
securityMode |= 1 << 5;
|
||||
break;
|
||||
|
||||
case NR_IntegrityProtAlgorithm_nia2:
|
||||
LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to nia2\n",ctxt_pP->module_id);
|
||||
securityMode |= 1 << 6;
|
||||
break;
|
||||
case NR_IntegrityProtAlgorithm_nia2:
|
||||
LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to nia2\n",ctxt_pP->module_id);
|
||||
securityMode |= 1 << 6;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to none\n",ctxt_pP->module_id);
|
||||
securityMode |= 0x70 ;
|
||||
break;
|
||||
}
|
||||
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm =
|
||||
*securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm;
|
||||
|
||||
default:
|
||||
LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to none\n",ctxt_pP->module_id);
|
||||
securityMode |= 0x70 ;
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_D(NR_RRC,"[UE %d] security mode is %x \n",ctxt_pP->module_id, securityMode);
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm =
|
||||
securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm;
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm =
|
||||
*securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm;
|
||||
memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
|
||||
//memset((void *)&SecurityModeCommand,0,sizeof(SecurityModeCommand_t));
|
||||
ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
|
||||
@@ -1646,6 +1650,7 @@ nr_rrc_ue_process_securityModeCommand(
|
||||
} else {
|
||||
LOG_I(NR_RRC, "rrc_ue_process_securityModeCommand, security mode failure case \n");
|
||||
ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_securityModeFailure;
|
||||
ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_securityModeComplete;
|
||||
}
|
||||
|
||||
uint8_t *kRRCenc = NULL;
|
||||
@@ -1710,10 +1715,10 @@ nr_rrc_ue_process_securityModeCommand(
|
||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
//if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
|
||||
}
|
||||
|
||||
// }
|
||||
log_dump(MAC, buffer, 16, LOG_DUMP_CHAR, "securityModeComplete payload: ");
|
||||
LOG_D(NR_RRC, "securityModeComplete Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8);
|
||||
|
||||
for (i = 0; i < (enc_rval.encoded + 7) / 8; i++) {
|
||||
@@ -1734,7 +1739,7 @@ nr_rrc_ue_process_securityModeCommand(
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = (enc_rval.encoded + 7) / 8;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
rrc_data_req (
|
||||
rrc_data_req_ue (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
nr_rrc_mui++,
|
||||
@@ -1782,6 +1787,17 @@ void rrc_ue_generate_RRCSetupRequest( const protocol_ctxt_t *const ctxt_pP, cons
|
||||
/*UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.Payload[i] = taus()&0xff;
|
||||
UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.payload_size =i; */
|
||||
|
||||
log_dump(RRC,NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.Payload,NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.payload_size,
|
||||
LOG_DUMP_CHAR,"RRCSetupRequest :\n");
|
||||
rrc_data_req_ue (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
nr_rrc_mui++,
|
||||
SDU_CONFIRM_NO,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.payload_size,
|
||||
(uint8_t *)NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.Payload,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
@@ -2184,12 +2200,12 @@ rrc_ue_process_rrcReconfiguration(
|
||||
ie = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration;
|
||||
if (ie->measConfig != NULL) {
|
||||
LOG_I(NR_RRC, "Measurement Configuration is present\n");
|
||||
nr_rrc_ue_process_measConfig(ctxt_pP, gNB_index, ie->measConfig);
|
||||
// nr_rrc_ue_process_measConfig(ctxt_pP, gNB_index, ie->measConfig);
|
||||
}
|
||||
|
||||
if (ie->radioBearerConfig != NULL) {
|
||||
LOG_I(NR_RRC, "radio Bearer Configuration is present\n");
|
||||
nr_sa_rrc_ue_process_radioBearerConfig(ctxt_pP, gNB_index, ie->radioBearerConfig);
|
||||
// nr_sa_rrc_ue_process_radioBearerConfig(ctxt_pP, gNB_index, ie->radioBearerConfig);
|
||||
}
|
||||
|
||||
/* Check if there is dedicated NAS information to forward to NAS */
|
||||
@@ -2531,7 +2547,7 @@ void *rrc_nrue_task( void *args_p ) {
|
||||
NR_RRC_MAC_BCCH_DATA_IND (msg_p).rsrp);
|
||||
|
||||
case NR_RRC_MAC_CCCH_DATA_IND:
|
||||
LOG_D(NR_RRC, "[UE %d] RNTI %x Received %s: frameP %d, gNB %d\n",
|
||||
LOG_I(NR_RRC, "[UE %d] RNTI %x Received %s: frameP %d, gNB %d\n",
|
||||
ue_mod_id,
|
||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti,
|
||||
ITTI_MSG_NAME (msg_p),
|
||||
@@ -2551,7 +2567,7 @@ void *rrc_nrue_task( void *args_p ) {
|
||||
/* PDCP messages */
|
||||
case NR_RRC_DCCH_DATA_IND:
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, NR_RRC_DCCH_DATA_IND (msg_p).module_id, GNB_FLAG_NO, NR_RRC_DCCH_DATA_IND (msg_p).rnti, NR_RRC_DCCH_DATA_IND (msg_p).frame, 0,NR_RRC_DCCH_DATA_IND (msg_p).gNB_index);
|
||||
LOG_D(NR_RRC, "[UE %d] Received %s: frameP %d, DCCH %d, gNB %d\n",
|
||||
LOG_I(NR_RRC, "[UE %d] Received %s: frameP %d, DCCH %d, gNB %d\n",
|
||||
NR_RRC_DCCH_DATA_IND (msg_p).module_id,
|
||||
ITTI_MSG_NAME (msg_p),
|
||||
NR_RRC_DCCH_DATA_IND (msg_p).frame,
|
||||
|
||||
Reference in New Issue
Block a user