complete programming of Msg2/Msg4 procedures for eMTC. Addition of skeleton for PUCCH UCI (NFAPI) in L1. Some cleanup of eNB_scheduler.c
This commit is contained in:
@@ -827,15 +827,15 @@ typedef struct {
|
||||
/// Subframe where Msg2 is to be sent
|
||||
uint8_t Msg2_subframe;
|
||||
/// Frame where Msg2 is to be sent
|
||||
uint8_t Msg2_frame;
|
||||
frame_t Msg2_frame;
|
||||
/// Subframe where Msg3 is to be sent
|
||||
uint8_t Msg3_subframe;
|
||||
sub_frame_t Msg3_subframe;
|
||||
/// Frame where Msg3 is to be sent
|
||||
uint8_t Msg3_frame;
|
||||
frame_t Msg3_frame;
|
||||
/// Subframe where Msg4 is to be sent
|
||||
uint8_t Msg4_subframe;
|
||||
sub_frame_t Msg4_subframe;
|
||||
/// Frame where Msg4 is to be sent
|
||||
uint8_t Msg4_frame;
|
||||
frame_t Msg4_frame;
|
||||
/// Flag to indicate the eNB should generate Msg4 upon reception of SDU from RRC. This is triggered by first ULSCH reception at eNB for new user.
|
||||
uint8_t generate_Msg4;
|
||||
/// Flag to indicate that eNB is waiting for ACK that UE has received Msg3.
|
||||
@@ -854,6 +854,10 @@ typedef struct {
|
||||
int16_t RRC_timer;
|
||||
/// Round of Msg3 HARQ
|
||||
uint8_t msg3_round;
|
||||
/// TBS used for Msg4
|
||||
int Msg4_TBsize;
|
||||
/// MCS used for Msg4
|
||||
int Msg4_mcs;
|
||||
#ifdef Rel14
|
||||
uint8_t rach_resource_type;
|
||||
uint8_t msg2_mpdcch_repetition_cnt;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -143,7 +143,10 @@ schedule_SIB1_BR(
|
||||
switch (N_RB_DL) {
|
||||
case 6:
|
||||
case 15:
|
||||
m=1;
|
||||
n_NB=0;
|
||||
N_S_NB=0;
|
||||
Sj=NULL;
|
||||
break;
|
||||
case 25:
|
||||
m=2;
|
||||
@@ -305,11 +308,8 @@ schedule_SI_BR(
|
||||
nfapi_dl_config_request_pdu_t *dl_config_pdu;
|
||||
nfapi_tx_request_pdu_t *TX_req;
|
||||
nfapi_dl_config_request_body_t *dl_req;
|
||||
int m,i,N_S_NB;
|
||||
int *Sj;
|
||||
int n_NB = 0;
|
||||
int TBS;
|
||||
int k,rvidx;
|
||||
int i;
|
||||
int rvidx;
|
||||
|
||||
|
||||
|
||||
@@ -378,7 +378,7 @@ schedule_SI_BR(
|
||||
if (bcch_sdu_length > 0) {
|
||||
AssertFatal(bcch_sdu_length <= (si_TBS_r13>>3),
|
||||
"RRC provided bcch with length %d > %d\n",
|
||||
bcch_sdu_length,(si_TBS_r13>>3));
|
||||
bcch_sdu_length,(int)(si_TBS_r13>>3));
|
||||
LOG_D(MAC,"[eNB %d] Frame %d : BCCH_BR %d->DLSCH CC_id %d, Received %d bytes \n",module_idP,frameP,i,CC_id,bcch_sdu_length);
|
||||
|
||||
// allocate all 6 PRBs in narrowband for SIB1_BR
|
||||
|
||||
@@ -98,10 +98,10 @@ uint16_t mac_computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs) {
|
||||
}
|
||||
|
||||
void get_Msg3alloc(COMMON_channels_t *cc,
|
||||
unsigned char current_subframe,
|
||||
unsigned int current_frame,
|
||||
unsigned int *frame,
|
||||
unsigned char *subframe)
|
||||
sub_frame_t current_subframe,
|
||||
frame_t current_frame,
|
||||
frame_t *frame,
|
||||
sub_frame_t *subframe)
|
||||
{
|
||||
|
||||
// Fill in other TDD Configuration!!!!
|
||||
@@ -211,10 +211,10 @@ void get_Msg3alloc(COMMON_channels_t *cc,
|
||||
|
||||
|
||||
void get_Msg3allocret(COMMON_channels_t *cc,
|
||||
unsigned char current_subframe,
|
||||
unsigned int current_frame,
|
||||
unsigned int *frame,
|
||||
unsigned char *subframe)
|
||||
sub_frame_t current_subframe,
|
||||
frame_t current_frame,
|
||||
frame_t *frame,
|
||||
sub_frame_t *subframe)
|
||||
{
|
||||
if (cc->tdd_Config == NULL) { //FDD
|
||||
/* always retransmit in n+8 */
|
||||
@@ -249,7 +249,7 @@ void get_Msg3allocret(COMMON_channels_t *cc,
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t subframe2harqpid(COMMON_channels_t *cc,uint32_t frame,uint8_t subframe)
|
||||
uint8_t subframe2harqpid(COMMON_channels_t *cc,frame_t frame,sub_frame_t subframe)
|
||||
{
|
||||
uint8_t ret = 255;
|
||||
|
||||
@@ -317,8 +317,8 @@ uint8_t subframe2harqpid(COMMON_channels_t *cc,uint32_t frame,uint8_t subframe)
|
||||
}
|
||||
|
||||
uint8_t get_Msg3harqpid(COMMON_channels_t *cc,
|
||||
uint32_t frame,
|
||||
unsigned char current_subframe)
|
||||
frame_t frame,
|
||||
sub_frame_t current_subframe)
|
||||
{
|
||||
|
||||
uint8_t ul_subframe=0;
|
||||
@@ -403,7 +403,7 @@ uint8_t get_Msg3harqpid(COMMON_channels_t *cc,
|
||||
|
||||
}
|
||||
|
||||
int is_UL_sf(COMMON_channels_t *ccP,uint8_t subframeP)
|
||||
int is_UL_sf(COMMON_channels_t *ccP,sub_frame_t subframeP)
|
||||
{
|
||||
|
||||
// if FDD return dummy value
|
||||
|
||||
@@ -403,7 +403,7 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
RA_template->generate_Msg4 = 1;
|
||||
RA_template->wait_ack_Msg4 = 0;
|
||||
|
||||
// Program Msg4 PDCCH+DLSCH/MPDCCH transmission 4 subframes from now
|
||||
// Program Msg4 PDCCH+DLSCH/MPDCCH transmission 4 subframes from now, // Check if this is ok for BL/CE, or if the rule is different
|
||||
RA_template->Msg4_frame = frameP + ((subframeP>5) ? 1 : 0);
|
||||
RA_template->Msg4_subframe = (subframeP+4)%10;
|
||||
|
||||
|
||||
+36
-11
@@ -230,6 +230,17 @@ unsigned short fill_rar(
|
||||
const uint8_t input_buffer_length
|
||||
);
|
||||
|
||||
#ifdef Rel14
|
||||
unsigned short fill_rar_br(eNB_MAC_INST *eNB,
|
||||
int CC_id,
|
||||
RA_TEMPLATE *RA_template,
|
||||
const frame_t frameP,
|
||||
const sub_frame_t subframeP,
|
||||
uint8_t* const dlsch_buffer,
|
||||
const uint8_t ce_level
|
||||
);
|
||||
#endif
|
||||
|
||||
/* \brief Function to indicate a failed RA response. It removes all temporary variables related to the initial connection of a UE
|
||||
@param Mod_id Instance ID of eNB
|
||||
@param preamble_index index of the received RA request.
|
||||
@@ -857,19 +868,18 @@ uint16_t getRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs);
|
||||
|
||||
int get_subbandsize(uint8_t dl_bandwidth);
|
||||
|
||||
uint8_t subframe2harqpid(COMMON_channels_t *cc,uint32_t frame,uint8_t subframe);
|
||||
|
||||
void get_Msg3allocret(COMMON_channels_t *cc,
|
||||
unsigned char current_subframe,
|
||||
unsigned int current_frame,
|
||||
unsigned int *frame,
|
||||
unsigned char *subframe);
|
||||
sub_frame_t current_subframe,
|
||||
frame_t current_frame,
|
||||
frame_t *frame,
|
||||
sub_frame_t *subframe);
|
||||
|
||||
void get_Msg3alloc(COMMON_channels_t *cc,
|
||||
unsigned char current_subframe,
|
||||
unsigned int current_frame,
|
||||
unsigned int *frame,
|
||||
unsigned char *subframe);
|
||||
sub_frame_t current_subframe,
|
||||
frame_t current_frame,
|
||||
frame_t *frame,
|
||||
sub_frame_t *subframe);
|
||||
|
||||
uint16_t mac_computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs);
|
||||
|
||||
@@ -880,8 +890,23 @@ int to_rbg(int dl_Bandwidth);
|
||||
int to_prb(int dl_Bandwidth);
|
||||
|
||||
uint8_t get_Msg3harqpid(COMMON_channels_t *cc,
|
||||
uint32_t frame,
|
||||
unsigned char current_subframe);
|
||||
frame_t frame,
|
||||
sub_frame_t current_subframe);
|
||||
int is_UL_sf(COMMON_channels_t *ccP,sub_frame_t subframeP);
|
||||
|
||||
uint8_t subframe2harqpid(COMMON_channels_t *cc,frame_t frame,sub_frame_t subframe);
|
||||
|
||||
|
||||
|
||||
#ifdef Rel14
|
||||
int get_numnarrowbandbits(long dl_Bandwidth);
|
||||
|
||||
int mpdcch_sf_condition(eNB_MAC_INST *eNB,int CC_id, frame_t frameP,sub_frame_t subframeP,int rmax,MPDCCH_TYPES_t mpdcch_type);
|
||||
|
||||
int get_numnarrowbands(long dl_Bandwidth);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
/** @}*/
|
||||
|
||||
@@ -132,8 +132,8 @@ unsigned short fill_rar(
|
||||
#ifdef Rel14
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned short fill_rar_br(eNB_MAC_INST *eNB,
|
||||
const int CC_id,
|
||||
const int ra_idx,
|
||||
int CC_id,
|
||||
RA_TEMPLATE *RA_template,
|
||||
const frame_t frameP,
|
||||
const sub_frame_t subframeP,
|
||||
uint8_t* const dlsch_buffer,
|
||||
@@ -143,44 +143,41 @@ unsigned short fill_rar_br(eNB_MAC_INST *eNB,
|
||||
{
|
||||
|
||||
RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)dlsch_buffer;
|
||||
|
||||
COMMON_channels_t *cc = &eNB->common_channels[CC_id];
|
||||
uint8_t *rar = (uint8_t *)(dlsch_buffer+1);
|
||||
int i;
|
||||
uint8_t nb,rballoc,reps;
|
||||
uint8_t mcs,TPC,ULdelay,cqireq;
|
||||
COMMON_channels_t *cc = &eNB->common_channels[CC_id];
|
||||
int input_buffer_length;
|
||||
|
||||
|
||||
AssertFatal(CC_id < MAX_NUM_CCs, "CC_id %u < MAX_NUM_CCs %u", CC_id, MAX_NUM_CCs);
|
||||
|
||||
AssertFatal(ra_idx >= 0 && ra_idx < 4, "RA index not in [0..3]\n");
|
||||
AssertFatal(RA_template != NULL, "RA is null \n");
|
||||
|
||||
// subheader fixed
|
||||
rarh->E = 0; // First and last RAR
|
||||
rarh->T = 1; // 0 for E/T/R/R/BI subheader, 1 for E/T/RAPID subheader
|
||||
rarh->RAPID = cc->RA_template[ra_idx].preamble_index; // Respond to Preamble 0 only for the moment
|
||||
cc->RA_template[ra_idx].timing_offset /= 16; //T_A = N_TA/16, where N_TA should be on a 30.72Msps
|
||||
rar[0] = (uint8_t)(cc->RA_template[ra_idx].timing_offset>>(2+4)); // 7 MSBs of timing advance + divide by 4
|
||||
rar[1] = (uint8_t)(cc->RA_template[ra_idx].timing_offset<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4
|
||||
rarh->RAPID = RA_template->preamble_index; // Respond to Preamble 0 only for the moment
|
||||
RA_template->timing_offset /= 16; //T_A = N_TA/16, where N_TA should be on a 30.72Msps
|
||||
rar[0] = (uint8_t)(RA_template->timing_offset>>(2+4)); // 7 MSBs of timing advance + divide by 4
|
||||
rar[1] = (uint8_t)(RA_template->timing_offset<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4
|
||||
|
||||
int N_NB_index;
|
||||
|
||||
AssertFatal(1==0,"RAR for BL/CE Still to be finished ...\n");
|
||||
|
||||
// Copy the Msg2 narrowband
|
||||
cc->RA_template[ra_idx].msg34_narrowband = cc->RA_template[ra_idx].msg2_narrowband;
|
||||
RA_template->msg34_narrowband = RA_template->msg2_narrowband;
|
||||
|
||||
if (ce_level<2) { //CE Level 0,1, CEmodeA
|
||||
input_buffer_length =6;
|
||||
|
||||
N_NB_index = get_numnarrowbandbits(cc->mib->message.dl_Bandwidth);
|
||||
|
||||
rar[4] = (uint8_t)(cc->RA_template[ra_idx].rnti>>8);
|
||||
rar[5] = (uint8_t)(cc->RA_template[ra_idx].rnti&0xff);
|
||||
rar[4] = (uint8_t)(RA_template->rnti>>8);
|
||||
rar[5] = (uint8_t)(RA_template->rnti&0xff);
|
||||
//cc->RA_template[ra_idx].timing_offset = 0;
|
||||
nb = 0;
|
||||
rballoc = mac_computeRIV(6,1+ra_idx,1); // one PRB only for UL Grant in position 1+ra_idx within Narrowband
|
||||
rballoc = mac_computeRIV(6,1+ce_level,1); // one PRB only for UL Grant in position 1+ce_level within Narrowband
|
||||
rar[1] |= (rballoc&15)<<(4-N_NB_index); // Hopping = 0 (bit 3), 3 MSBs of rballoc
|
||||
|
||||
reps = 4;
|
||||
@@ -195,27 +192,26 @@ unsigned short fill_rar_br(eNB_MAC_INST *eNB,
|
||||
|
||||
input_buffer_length =5;
|
||||
|
||||
rar[3] = (uint8_t)(cc->RA_template[ra_idx].rnti>>8);
|
||||
rar[4] = (uint8_t)(cc->RA_template[ra_idx].rnti&0xff);
|
||||
rar[3] = (uint8_t)(RA_template->rnti>>8);
|
||||
rar[4] = (uint8_t)(RA_template->rnti&0xff);
|
||||
}
|
||||
LOG_D(MAC,"[RAPROC] CC_id %d Frame %d Generating RAR BR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",
|
||||
CC_id,
|
||||
LOG_D(MAC,"[RAPROC] Frame %d Generating RAR BR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ce_level %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",
|
||||
frameP,
|
||||
*(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5],
|
||||
ra_idx,
|
||||
cc->RA_template[ra_idx].rnti,
|
||||
rarh->RAPID,cc->RA_template[0].preamble_index,
|
||||
cc->RA_template[ra_idx].timing_offset);
|
||||
ce_level,
|
||||
RA_template->rnti,
|
||||
rarh->RAPID,RA_template->preamble_index,
|
||||
RA_template->timing_offset);
|
||||
|
||||
if (opt_enabled) {
|
||||
trace_pdu(1, dlsch_buffer, input_buffer_length, eNB->Mod_id, 2, 1,
|
||||
eNB->frame, eNB->subframe, 0, 0);
|
||||
LOG_D(OPT,"[eNB %d][RAPROC] CC_id %d RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n",
|
||||
eNB->Mod_id, CC_id, frameP, cc->RA_template[ra_idx].rnti,
|
||||
LOG_D(OPT,"[RAPROC] RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n",
|
||||
frameP, RA_template->rnti,
|
||||
rarh->RAPID, input_buffer_length);
|
||||
}
|
||||
|
||||
return(cc->RA_template[ra_idx].rnti);
|
||||
return(RA_template->rnti);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user