Commit c6753606 authored by Florian Kaltenberger's avatar Florian Kaltenberger

Merge branch 'develop' of https://gitlab.eurecom.fr/oai/openairinterface5g into develop

parents 933dc966 03231dd1
...@@ -2016,11 +2016,11 @@ void prach_procedures(PHY_VARS_eNB *eNB) { ...@@ -2016,11 +2016,11 @@ void prach_procedures(PHY_VARS_eNB *eNB) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
} }
void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid) { void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid)
{
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0};
int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3; int16_t n1_pucch0 = -1, n1_pucch1 = -1, n1_pucch2 = -1, n1_pucch3 = -1;
uint8_t do_SR = 0; uint8_t do_SR = 0;
uint8_t pucch_sel = 0; uint8_t pucch_sel = 0;
int32_t metric0=0,metric1=0,metric0_SR=0; int32_t metric0=0,metric1=0,metric0_SR=0;
...@@ -2031,352 +2031,329 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq ...@@ -2031,352 +2031,329 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
if ((eNB->dlsch[UE_id][0]) && if ((eNB->dlsch[UE_id][0]) &&
(eNB->dlsch[UE_id][0]->rnti>0) && (eNB->dlsch[UE_id][0]->rnti>0) &&
(eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { (eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) {
// check SR availability // check SR availability
do_SR = is_SR_subframe(eNB,proc,UE_id); do_SR = is_SR_subframe(eNB,proc,UE_id);
// do_SR = 0; // do_SR = 0;
// Now ACK/NAK // Now ACK/NAK
// First check subframe_tx flag for earlier subframes // First check subframe_tx flag for earlier subframes
get_n1_pucch_eNB(eNB, get_n1_pucch_eNB(eNB,
proc, proc,
UE_id, UE_id,
&n1_pucch0, &n1_pucch0,
&n1_pucch1, &n1_pucch1,
&n1_pucch2, &n1_pucch2,
&n1_pucch3); &n1_pucch3);
LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n",
eNB->Mod_id,eNB->dlsch[UE_id][0]->rnti, eNB->Mod_id,eNB->dlsch[UE_id][0]->rnti,
frame,subframe, frame,subframe,
n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR);
if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id
} else { } else {
// otherwise we have some PUCCH detection to do // otherwise we have some PUCCH detection to do
// Null out PUCCH PRBs for noise measurement // Null out PUCCH PRBs for noise measurement
switch(fp->N_RB_UL) { switch(fp->N_RB_UL) {
case 6: case 6:
eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5
break; break;
case 15: case 15:
eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14
break; break;
case 25: case 25:
eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24
break; break;
case 50: case 50:
eNB->rb_mask_ul[0] |= 0x1; eNB->rb_mask_ul[0] |= 0x1;
eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32)
break; break;
case 75: case 75:
eNB->rb_mask_ul[0] |= 0x1; eNB->rb_mask_ul[0] |= 0x1;
eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64)
break; break;
case 100: case 100:
eNB->rb_mask_ul[0] |= 0x1; eNB->rb_mask_ul[0] |= 0x1;
eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96)
break; break;
default: default:
LOG_E(PHY,"Unknown number for N_RB_UL %d\n",fp->N_RB_UL); LOG_E(PHY,"Unknown number for N_RB_UL %d\n",fp->N_RB_UL);
break; break;
} }
if (do_SR == 1) { if (do_SR == 1) {
eNB->UE_stats[UE_id].sr_total++; eNB->UE_stats[UE_id].sr_total++;
if (eNB->abstraction_flag == 0) if (eNB->abstraction_flag == 0) {
metric0_SR = rx_pucch(eNB, metric0_SR = rx_pucch(eNB,
pucch_format1, pucch_format1,
UE_id, UE_id,
eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
0, // n2_pucch 0, // n2_pucch
0, // shortened format, should be use_srs flag, later 0, // shortened format, should be use_srs flag, later
&SR_payload, &SR_payload,
frame, frame,
subframe, subframe,
PUCCH1_THRES); PUCCH1_THRES);
LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR is %d (SR n1pucch is %d)\n",
eNB->Mod_id,
eNB->ulsch[UE_id]->rnti,
frame,
subframe,
SR_payload,
eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex);
}
#ifdef PHY_ABSTRACTION #ifdef PHY_ABSTRACTION
else { else {
metric0_SR = rx_pucch_emul(eNB, metric0_SR = rx_pucch_emul(eNB,
proc, proc,
UE_id, UE_id,
pucch_format1, pucch_format1,
0, 0,
&SR_payload); &SR_payload);
LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id, LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id,
eNB->ulsch[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); eNB->ulsch[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex);
} }
#endif #endif
if (SR_payload == 1) {
LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id,
eNB->ulsch[UE_id]->rnti,frame,subframe);
eNB->UE_stats[UE_id].sr_received++;
if (eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
eNB->first_sr[UE_id] = 0;
eNB->dlsch[UE_id][0]->harq_processes[0]->round=0;
eNB->dlsch[UE_id][0]->harq_processes[0]->status=SCH_IDLE;
LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n",
eNB->Mod_id,
eNB->ulsch[UE_id]->rnti,frame,subframe);
}
if (eNB->mac_enabled==1) {
mac_xface->SR_indication(eNB->Mod_id,
eNB->CC_id,
frame,
eNB->dlsch[UE_id][0]->rnti,subframe);
}
}
}// do_SR==1 }// do_SR==1
if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR
} else if (eNB->frame_parms.frame_type==FDD) { // FDD } else if (fp->frame_type==FDD) { // FDD
// if SR was detected, use the n1_pucch from SR, else use n1_pucch0 // if SR was detected, use the n1_pucch from SR, else use n1_pucch0
// n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; // n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0;
LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload);
if (eNB->abstraction_flag == 0) { if (eNB->abstraction_flag == 0) {
metric0 = rx_pucch(eNB,
pucch_format1a,
UE_id,
metric0 = rx_pucch(eNB, (uint16_t)n1_pucch0,
pucch_format1a, 0, //n2_pucch
UE_id, 0, // shortened format
(uint16_t)n1_pucch0, pucch_payload0,
0, //n2_pucch frame,
0, // shortened format subframe,
pucch_payload0, PUCCH1a_THRES);
frame, }
subframe,
PUCCH1a_THRES);
if (metric0 < metric0_SR)
metric0=rx_pucch(eNB,
pucch_format1a,
UE_id,
eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
0, //n2_pucch
0, // shortened format
pucch_payload0,
frame,
subframe,
PUCCH1a_THRES);
}
if (eNB->mac_enabled==1) {
mac_xface->SR_indication(eNB->Mod_id,
eNB->CC_id,
frame,
eNB->dlsch[UE_id][0]->rnti,subframe);
}
}
}// do_SR==1
if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR
} else if (fp->frame_type==FDD) { // FDD
// if SR was detected, use the n1_pucch from SR, else use n1_pucch0
// n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0;
LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload);
if (eNB->abstraction_flag == 0) {
metric0 = rx_pucch(eNB,
pucch_format1a,
UE_id,
(uint16_t)n1_pucch0,
0, //n2_pucch
0, // shortened format
pucch_payload0,
frame,
subframe,
PUCCH1a_THRES);
if (metric0 < metric0_SR)
metric0=rx_pucch(eNB,
pucch_format1a,
UE_id,
eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
0, //n2_pucch
0, // shortened format
pucch_payload0,
frame,
subframe,
PUCCH1a_THRES);
}
else {
#ifdef PHY_ABSTRACTION #ifdef PHY_ABSTRACTION
metric0 = rx_pucch_emul(eNB, else {
proc, metric0 = rx_pucch_emul(eNB,
UE_id, proc,
pucch_format1a, UE_id,
0, pucch_format1a,
pucch_payload0); 0,
pucch_payload0);
}
#endif #endif
}
/* cancel SR detection if reception on n1_pucch0 is better than on SR PUCCH resource index */
if (do_SR && metric0 > metric0_SR) SR_payload = 0;
if (do_SR && metric0 <= metric0_SR) {
/* when transmitting ACK/NACK on SR PUCCH resource index, SR payload is always 1 */
SR_payload = 1;
if (eNB->abstraction_flag == 0) {
metric0=rx_pucch(eNB,
pucch_format1a,
UE_id,
eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
0, //n2_pucch
0, // shortened format
pucch_payload0,
frame,
subframe,
PUCCH1a_THRES);
}
#ifdef PHY_ABSTRACTION
else {
metric0 = rx_pucch_emul(eNB,
proc,
UE_id,
pucch_format1a,
0,
pucch_payload0);
}
#endif
}
#ifdef DEBUG_PHY_PROC #ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n",
eNB->Mod_id, eNB->Mod_id,
eNB->dlsch[UE_id][0]->rnti, eNB->dlsch[UE_id][0]->rnti,
frame,subframe, frame,subframe,
pucch_payload0[0],metric0); pucch_payload0[0],metric0);
#endif #endif
process_HARQ_feedback(UE_id,eNB,proc,
0,// pusch_flag
pucch_payload0,
2,
SR_payload);
} // FDD process_HARQ_feedback(UE_id,eNB,proc,
else { //TDD 0,// pusch_flag
pucch_payload0,
2,
SR_payload);
} // FDD
else { //TDD
bundling_flag = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; bundling_flag = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
// fix later for 2 TB case and format1b // fix later for 2 TB case and format1b
if ((fp->frame_type==FDD) || if ((fp->frame_type==FDD) ||
(bundling_flag==bundling) || (bundling_flag==bundling) ||
((fp->frame_type==TDD)&&(fp->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) { ((fp->frame_type==TDD)&&(fp->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) {
format = pucch_format1a; format = pucch_format1a;
} else { } else {
format = pucch_format1b; format = pucch_format1b;
} }
// if SR was detected, use the n1_pucch from SR // if SR was detected, use the n1_pucch from SR
if (SR_payload==1) { if (SR_payload==1) {
#ifdef DEBUG_PHY_PROC #ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",eNB->Mod_id, LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",eNB->Mod_id,
eNB->dlsch[UE_id][0]->rnti, eNB->dlsch[UE_id][0]->rnti,
frame,subframe, frame,subframe,
n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
#endif #endif
if (eNB->abstraction_flag == 0) if (eNB->abstraction_flag == 0)
metric0_SR = rx_pucch(eNB, metric0 = rx_pucch(eNB,
format, format,
UE_id, UE_id,
eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
0, //n2_pucch 0, //n2_pucch
0, // shortened format 0, // shortened format
pucch_payload0, pucch_payload0,
frame, frame,
subframe, subframe,
PUCCH1a_THRES); PUCCH1a_THRES);
else { else {
#ifdef PHY_ABSTRACTION #ifdef PHY_ABSTRACTION
metric0 = rx_pucch_emul(eNB,proc, metric0 = rx_pucch_emul(eNB,proc,
UE_id, UE_id,
format, format,
0, 0,
pucch_payload0); pucch_payload0);
#endif #endif
} }
} else { //using n1_pucch0/n1_pucch1 resources } else { //using n1_pucch0/n1_pucch1 resources
#ifdef DEBUG_PHY_PROC #ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",eNB->Mod_id, LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",eNB->Mod_id,
eNB->dlsch[UE_id][0]->rnti, eNB->dlsch[UE_id][0]->rnti,
frame,subframe, frame,subframe,
n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
#endif #endif
metric0=0; metric0=0;
metric1=0; metric1=0;
// Check n1_pucch0 metric // Check n1_pucch0 metric
if (n1_pucch0 != -1) { if (n1_pucch0 != -1) {
if (eNB->abstraction_flag == 0) if (eNB->abstraction_flag == 0)
metric0 = rx_pucch(eNB, metric0 = rx_pucch(eNB,
format, format,
UE_id, UE_id,
(uint16_t)n1_pucch0, (uint16_t)n1_pucch0,
0, // n2_pucch 0, // n2_pucch
0, // shortened format 0, // shortened format
pucch_payload0, pucch_payload0,
frame, frame,
subframe, subframe,
PUCCH1a_THRES); PUCCH1a_THRES);
else { else {
#ifdef PHY_ABSTRACTION #ifdef PHY_ABSTRACTION
metric0 = rx_pucch_emul(eNB, metric0 = rx_pucch_emul(eNB,
proc, proc,
UE_id, UE_id,
format, format,
0, 0,
pucch_payload0); pucch_payload0);
#endif #endif
} }
} }
// Check n1_pucch1 metric // Check n1_pucch1 metric
if (n1_pucch1 != -1) { if (n1_pucch1 != -1) {
if (eNB->abstraction_flag == 0) if (eNB->abstraction_flag == 0)
metric1 = rx_pucch(eNB, metric1 = rx_pucch(eNB,
format, format,
UE_id, UE_id,
(uint16_t)n1_pucch1, (uint16_t)n1_pucch1,
0, //n2_pucch 0, //n2_pucch
0, // shortened format 0, // shortened format
pucch_payload1, pucch_payload1,
frame, frame,
subframe, subframe,
PUCCH1a_THRES); PUCCH1a_THRES);
else { else {
#ifdef PHY_ABSTRACTION #ifdef PHY_ABSTRACTION
metric1 = rx_pucch_emul(eNB, metric1 = rx_pucch_emul(eNB,
proc, proc,
UE_id, UE_id,
format, format,
1, 1,
pucch_payload1); pucch_payload1);
#endif #endif
} }
} }
} }
if (SR_payload == 1) { if (SR_payload == 1) {
pucch_payload = pucch_payload0; pucch_payload = pucch_payload0;
if (bundling_flag == bundling) if (bundling_flag == bundling)
pucch_sel = 2; pucch_sel = 2;
} else if (bundling_flag == multiplexing) { // multiplexing + no SR } else if (bundling_flag == multiplexing) { // multiplexing + no SR
pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0; pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0;
pucch_sel = (metric1>metric0) ? 1 : 0; pucch_sel = (metric1>metric0) ? 1 : 0;
} else { // bundling + no SR } else { // bundling + no SR
if (n1_pucch1 != -1) if (n1_pucch1 != -1)
pucch_payload = pucch_payload1; pucch_payload = pucch_payload1;
else if (n1_pucch0 != -1) else if (n1_pucch0 != -1)
pucch_payload = pucch_payload0; pucch_payload = pucch_payload0;
pucch_sel = 2; // indicate that this is a bundled ACK/NAK pucch_sel = 2; // indicate that this is a bundled ACK/NAK
} }
#ifdef DEBUG_PHY_PROC #ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",eNB->Mod_id, LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",eNB->Mod_id,
eNB->dlsch[UE_id][0]->rnti, eNB->dlsch[UE_id][0]->rnti,
frame,subframe, frame,subframe,
metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
#endif #endif
process_HARQ_feedback(UE_id,eNB,proc, process_HARQ_feedback(UE_id,eNB,proc,
0,// pusch_flag 0,// pusch_flag
pucch_payload, pucch_payload,
pucch_sel, pucch_sel,
SR_payload); SR_payload);
} // TDD
} }
}
if (SR_payload == 1) {
LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id,
eNB->ulsch[UE_id]->rnti,frame,subframe);
eNB->UE_stats[UE_id].sr_received++;
if (eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
eNB->first_sr[UE_id] = 0;
eNB->dlsch[UE_id][0]->harq_processes[0]->round=0;
eNB->dlsch[UE_id][0]->harq_processes[0]->status=SCH_IDLE;
LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n",
eNB->Mod_id,
eNB->ulsch[UE_id]->rnti,frame,subframe);
}
if (eNB->mac_enabled==1) {
mac_xface->SR_indication(eNB->Mod_id,
eNB->CC_id,
frame,
eNB->dlsch[UE_id][0]->rnti,subframe);
}
}
}
} }
......
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