Commit 143aaaa1 authored by Nick Ho's avatar Nick Ho

7 byte msg4 can be recieved by UE now

parent 2a9f54a5
...@@ -414,8 +414,8 @@ int generate_eNB_dlsch_params_from_dci_NB_IoT(PHY_VARS_eNB *eNB, ...@@ -414,8 +414,8 @@ int generate_eNB_dlsch_params_from_dci_NB_IoT(PHY_VARS_eNB *eNB,
DCI_flip[0] = DCI_tmp[2]*2; DCI_flip[0] = DCI_tmp[2]*2;
DCI_flip[1] = DCI_tmp[1]*2; DCI_flip[1] = DCI_tmp[1]*2;
DCI_flip[2] = DCI_tmp[0]*2; //DCI_flip[2] = DCI_tmp[0]*2;
DCI_flip[2] = 4;
ndlcch->pdu[ncce_index] = DCI_flip; ndlcch->pdu[ncce_index] = DCI_flip;
printf("DCI N1 PDU content:"); printf("DCI N1 PDU content:");
......
...@@ -857,19 +857,20 @@ void generate_eNB_dlsch_params_NB_IoT(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t * proc,n ...@@ -857,19 +857,20 @@ void generate_eNB_dlsch_params_NB_IoT(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t * proc,n
DCI_Content->DCIN1.ndi = dl_config_pdu->npdcch_pdu.npdcch_pdu_rel13.new_data_indicator; DCI_Content->DCIN1.ndi = dl_config_pdu->npdcch_pdu.npdcch_pdu_rel13.new_data_indicator;
DCI_Content->DCIN1.HARQackRes = dl_config_pdu->npdcch_pdu.npdcch_pdu_rel13.harq_ack_resource; DCI_Content->DCIN1.HARQackRes = dl_config_pdu->npdcch_pdu.npdcch_pdu_rel13.harq_ack_resource;
DCI_Content->DCIN1.DCIRep = dl_config_pdu->npdcch_pdu.npdcch_pdu_rel13.dci_subframe_repetition_number; DCI_Content->DCIN1.DCIRep = dl_config_pdu->npdcch_pdu.npdcch_pdu_rel13.dci_subframe_repetition_number;
npdcch = eNB->npdcch_DCI;
eNB->npdcch[(uint8_t)UE_id] = (NB_IoT_eNB_NPDCCH_t *) malloc(sizeof(NB_IoT_eNB_NPDCCH_t)); //eNB->npdcch[(uint8_t)UE_id] = (NB_IoT_eNB_NPDCCH_t *) malloc(sizeof(NB_IoT_eNB_NPDCCH_t));
//set the NPDCCH UE-specific structure (calculate R) //set the NPDCCH UE-specific structure (calculate R)
npdcch=eNB->npdcch[(uint8_t)UE_id]; //npdcch=eNB->npdcch[(uint8_t)UE_id];
AssertFatal(npdcch != NULL, "NPDCCH structure for UE specific is not exist\n"); //AssertFatal(npdcch != NULL, "NPDCCH structure for UE specific is not exist\n");
npdcch->repetition_idx[(uint8_t)UE_id] = 0; //this is used for the encoding mechanism to understand that is the first transmission //npdcch->repetition_idx[(uint8_t)UE_id] = 0; //this is used for the encoding mechanism to understand that is the first transmission
if(dl_config_pdu->npdcch_pdu.npdcch_pdu_rel13.aggregation_level) //whenever aggregation level is =1 we have only 1 repetition for USS //if(dl_config_pdu->npdcch_pdu.npdcch_pdu_rel13.aggregation_level) //whenever aggregation level is =1 we have only 1 repetition for USS
npdcch->repetition_number[(uint8_t)UE_id] = 1; // npdcch->repetition_number[(uint8_t)UE_id] = 1;
else //else
{ //{
//see TS 36.213 Table 16.1-1 //see TS 36.213 Table 16.1-1
} //}
//fill the ndlsch structure for UE and packed the DCI PD //fill the ndlsch structure for UE and packed the DCI PD
......
...@@ -766,7 +766,7 @@ void schedule_msg4_NB_IoT(eNB_MAC_INST_NB_IoT *mac_inst, int abs_subframe){ ...@@ -766,7 +766,7 @@ void schedule_msg4_NB_IoT(eNB_MAC_INST_NB_IoT *mac_inst, int abs_subframe){
} }
// check msg4 resource // check msg4 resource
rep = dl_rep[msg4_nodes->ce_level]; rep = dl_rep[msg4_nodes->ce_level];
msg4_length = fill_msg4_NB_IoT(mac_inst,msg4_nodes); msg4_length = fill_msg4_NB_IoT_fixed(mac_inst,msg4_nodes);
I_mcs = get_I_mcs(msg4_nodes->ce_level); I_mcs = get_I_mcs(msg4_nodes->ce_level);
I_tbs = I_mcs; I_tbs = I_mcs;
TBS = get_max_tbs(I_tbs); TBS = get_max_tbs(I_tbs);
...@@ -865,8 +865,8 @@ void schedule_msg4_NB_IoT(eNB_MAC_INST_NB_IoT *mac_inst, int abs_subframe){ ...@@ -865,8 +865,8 @@ void schedule_msg4_NB_IoT(eNB_MAC_INST_NB_IoT *mac_inst, int abs_subframe){
harq_result = (schedule_result_t *)malloc(sizeof(schedule_result_t)); harq_result = (schedule_result_t *)malloc(sizeof(schedule_result_t));
harq_result->rnti = msg4_nodes->ue_rnti; harq_result->rnti = msg4_nodes->ue_rnti;
harq_result->output_subframe = harq_subframe; harq_result->output_subframe = harq_subframe+3;
harq_result->end_subframe = harq_end_subframe; harq_result->end_subframe = harq_end_subframe+3;
harq_result->sdu_length = 0; harq_result->sdu_length = 0;
harq_result->direction = UL; harq_result->direction = UL;
harq_result->rnti_type = 3; harq_result->rnti_type = 3;
...@@ -1024,3 +1024,36 @@ int fill_msg4_NB_IoT( ...@@ -1024,3 +1024,36 @@ int fill_msg4_NB_IoT(
*/ */
return length; return length;
} }
// Generate MSG4 MAC PDU
int fill_msg4_NB_IoT_fixed(
eNB_MAC_INST_NB_IoT *inst,
RA_TEMPLATE_NB_IoT *ra_template
)
{
int length = 0;
uint8_t *dlsch_buffer = &ra_template->msg4_buffer[0];
// we have three subheader here: 1 for Control element of Contention resolution, 2 for CCCH
SCH_SUBHEADER_FIXED_NB_IoT *msg4_sub_1 = (SCH_SUBHEADER_FIXED_NB_IoT*)dlsch_buffer;
msg4_sub_1->R = 0;
msg4_sub_1->E = 1;
msg4_sub_1->LCID = UE_CONTENTION_RESOLUTION;
length+=1;
uint8_t *con_res = (uint8_t *)(dlsch_buffer+1);
con_res[0] = ra_template->ccch_buffer[0];
con_res[1] = ra_template->ccch_buffer[1];
con_res[2] = ra_template->ccch_buffer[2];
con_res[3] = ra_template->ccch_buffer[3];
con_res[4] = ra_template->ccch_buffer[4];
con_res[5] = ra_template->ccch_buffer[5];
length+=6;
/*
printf("MSG4 PDU = ");
for(int i=0; i<length;i++)
printf("%02x ",dlsch_buffer[i]);
printf("\n");
*/
return length;
}
...@@ -221,8 +221,12 @@ void rx_sdu_NB_IoT(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t ...@@ -221,8 +221,12 @@ void rx_sdu_NB_IoT(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t
//mac_NB_IoT_t *mac_inst; //mac_NB_IoT_t *mac_inst;
UE_TEMPLATE_NB_IoT *UE_info; UE_TEMPLATE_NB_IoT *UE_info;
uint8_t* msg4_rrc_pdu = NULL; uint8_t* msg4_rrc_pdu = NULL;
LOG_D(MAC,"RX_SDU_IN\n"); LOG_D(MAC,"RX_SDU_IN\n");
uint8_t* first_6 = (uint8_t*) malloc(6*sizeof(uint8_t));
for(int a = 0; a<6;a++)
first_6[a]=sdu[a];
//mac_inst = get_mac_inst(module_id); //mac_inst = get_mac_inst(module_id);
// note: if lcid < 25 this is sdu, otherwise this is CE // note: if lcid < 25 this is sdu, otherwise this is CE
...@@ -271,8 +275,8 @@ void rx_sdu_NB_IoT(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t ...@@ -271,8 +275,8 @@ void rx_sdu_NB_IoT(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t
rx_lengths[i]-=1; rx_lengths[i]-=1;
LOG_D(MAC,"rx_lengths : %d\n", rx_lengths[i]); LOG_D(MAC,"rx_lengths : %d\n", rx_lengths[i]);
msg4_rrc_pdu = mac_rrc_msg3_ind_NB_IoT(payload_ptr,rnti,rx_lengths[i]); msg4_rrc_pdu = mac_rrc_msg3_ind_NB_IoT(payload_ptr,rnti,rx_lengths[i]);
receive_msg3_NB_IoT(mac_inst,rnti,PHR,DVI_index,payload_ptr,msg4_rrc_pdu); receive_msg3_NB_IoT(mac_inst,rnti,PHR,DVI_index,first_6,msg4_rrc_pdu);
LOG_D(MAC,"recieve msg3 Successfully at MAC!\n"); LOG_I(MAC,"recieve msg3 Successfully at MAC!\n");
//NB_IoT_mac_rrc_data_ind(payload_ptr,mac_inst,rnti); //NB_IoT_mac_rrc_data_ind(payload_ptr,mac_inst,rnti);
//NB_IoT_receive_msg3(mac_inst,rnti,PHR,ul_total_buffer); //NB_IoT_receive_msg3(mac_inst,rnti,PHR,ul_total_buffer);
break; break;
......
...@@ -127,6 +127,7 @@ void schedule_msg4_NB_IoT(eNB_MAC_INST_NB_IoT *mac_inst, int abs_subframe); ...@@ -127,6 +127,7 @@ void schedule_msg4_NB_IoT(eNB_MAC_INST_NB_IoT *mac_inst, int abs_subframe);
void fill_rar_NB_IoT(eNB_MAC_INST_NB_IoT *inst, RA_TEMPLATE_NB_IoT *ra_template, uint8_t msg3_schedule_delay, uint8_t msg3_rep, sched_temp_UL_NB_IoT_t *schedule_template); void fill_rar_NB_IoT(eNB_MAC_INST_NB_IoT *inst, RA_TEMPLATE_NB_IoT *ra_template, uint8_t msg3_schedule_delay, uint8_t msg3_rep, sched_temp_UL_NB_IoT_t *schedule_template);
void receive_msg4_ack_NB_IoT(eNB_MAC_INST_NB_IoT *mac_inst, rnti_t rnti); void receive_msg4_ack_NB_IoT(eNB_MAC_INST_NB_IoT *mac_inst, rnti_t rnti);
int fill_msg4_NB_IoT(eNB_MAC_INST_NB_IoT *inst, RA_TEMPLATE_NB_IoT *ra_template); int fill_msg4_NB_IoT(eNB_MAC_INST_NB_IoT *inst, RA_TEMPLATE_NB_IoT *ra_template);
int fill_msg4_NB_IoT_fixed(eNB_MAC_INST_NB_IoT *inst, RA_TEMPLATE_NB_IoT *ra_template);
//USS //USS
void schedule_uss_NB_IoT(module_id_t module_id, eNB_MAC_INST_NB_IoT *mac_inst, uint32_t subframe, uint32_t frame, uint32_t hypersfn, int index_ss); void schedule_uss_NB_IoT(module_id_t module_id, eNB_MAC_INST_NB_IoT *mac_inst, uint32_t subframe, uint32_t frame, uint32_t hypersfn, int index_ss);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment