Merge branch 'next_with_variable_harq' into next_novolk

master
Ismael Gomez 7 years ago
commit c8dc3d1ad7

@ -44,6 +44,14 @@
#define SRSLTE_N_DRB 8 #define SRSLTE_N_DRB 8
#define SRSLTE_N_RADIO_BEARERS 11 #define SRSLTE_N_RADIO_BEARERS 11
#define HARQ_DELAY_MS 4
#define MSG3_DELAY_MS 6
#define HARQ_TX(tti) ((tti+HARQ_DELAY_MS)%10240)
#define HARQ_RX(tti) ((tti+(2*HARQ_DELAY_MS))%10240)
#define TTIMOD_SZ 10
#define TTIMOD(tti) (tti%TTIMOD_SZ)
// Cat 3 UE - Max number of DL-SCH transport block bits received within a TTI // Cat 3 UE - Max number of DL-SCH transport block bits received within a TTI
// 3GPP 36.306 Table 4.1.1 // 3GPP 36.306 Table 4.1.1
#define SRSLTE_MAX_BUFFER_SIZE_BITS 102048 #define SRSLTE_MAX_BUFFER_SIZE_BITS 102048

@ -172,7 +172,7 @@ private:
// Allowed DCI locations per CFI and per subframe // Allowed DCI locations per CFI and per subframe
sched_dci_cce_t dci_locations[3][10]; sched_dci_cce_t dci_locations[3][10];
const static int SCHED_MAX_HARQ_PROC = 8; const static int SCHED_MAX_HARQ_PROC = 2*HARQ_DELAY_MS;
dl_harq_proc dl_harq[SCHED_MAX_HARQ_PROC]; dl_harq_proc dl_harq[SCHED_MAX_HARQ_PROC];
ul_harq_proc ul_harq[SCHED_MAX_HARQ_PROC]; ul_harq_proc ul_harq[SCHED_MAX_HARQ_PROC];

@ -120,7 +120,7 @@ private:
uint32_t nof_failures; uint32_t nof_failures;
const static int NOF_HARQ_PROCESSES = 8; const static int NOF_HARQ_PROCESSES = 2*HARQ_DELAY_MS;
srslte_softbuffer_tx_t softbuffer_tx[NOF_HARQ_PROCESSES]; srslte_softbuffer_tx_t softbuffer_tx[NOF_HARQ_PROCESSES];
srslte_softbuffer_rx_t softbuffer_rx[NOF_HARQ_PROCESSES]; srslte_softbuffer_rx_t softbuffer_rx[NOF_HARQ_PROCESSES];

@ -78,13 +78,13 @@ public:
mac_interface_phy *mac; mac_interface_phy *mac;
// Common objects for schedulign grants // Common objects for schedulign grants
mac_interface_phy::ul_sched_t ul_grants[10]; mac_interface_phy::ul_sched_t ul_grants[TTIMOD_SZ];
mac_interface_phy::dl_sched_t dl_grants[10]; mac_interface_phy::dl_sched_t dl_grants[TTIMOD_SZ];
// Map of pending ACKs for each user // Map of pending ACKs for each user
typedef struct { typedef struct {
bool is_pending[10]; bool is_pending[TTIMOD_SZ];
uint16_t n_pdcch[10]; uint16_t n_pdcch[TTIMOD_SZ];
} pending_ack_t; } pending_ack_t;
std::map<uint16_t,pending_ack_t> pending_ack; std::map<uint16_t,pending_ack_t> pending_ack;

@ -73,12 +73,12 @@ private:
void work_imp(); void work_imp();
int encode_pdsch(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants, uint32_t sf_idx); int encode_pdsch(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants);
int decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch, uint32_t tti_rx); int decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch);
int encode_phich(srslte_enb_dl_phich_t *acks, uint32_t nof_acks, uint32_t sf_idx); int encode_phich(srslte_enb_dl_phich_t *acks, uint32_t nof_acks);
int encode_pdcch_dl(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants, uint32_t sf_idx); int encode_pdcch_dl(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants);
int encode_pdcch_ul(srslte_enb_ul_pusch_t *grants, uint32_t nof_grants, uint32_t sf_idx); int encode_pdcch_ul(srslte_enb_ul_pusch_t *grants, uint32_t nof_grants);
int decode_pucch(uint32_t tti_rx); int decode_pucch();
/* Common objects */ /* Common objects */
@ -89,8 +89,9 @@ private:
cf_t *signal_buffer_rx; cf_t *signal_buffer_rx;
cf_t *signal_buffer_tx; cf_t *signal_buffer_tx;
uint32_t tti_rx, tti_tx, tti_sched_ul, sf_rx, sf_tx, sf_sched_ul, tx_mutex_cnt; uint32_t tti_rx, tti_tx, tti_sched_ul;
uint32_t sf_rx, sf_tx, tx_mutex_cnt;
uint32_t t_rx, t_tx, t_sched_ul;
srslte_enb_dl_t enb_dl; srslte_enb_dl_t enb_dl;
srslte_enb_ul_t enb_ul; srslte_enb_ul_t enb_ul;

@ -541,7 +541,7 @@ int sched::dl_sched_rar(dl_sched_rar_t rar[MAX_RAR_LIST])
pending_rar[j].rar_tti = 0; pending_rar[j].rar_tti = 0;
// Save UL resources // Save UL resources
uint32_t pending_tti=(current_tti+6)%10; uint32_t pending_tti=(current_tti+MSG3_DELAY_MS)%10;
pending_msg3[pending_tti].enabled = true; pending_msg3[pending_tti].enabled = true;
pending_msg3[pending_tti].rnti = pending_rar[j].rnti; pending_msg3[pending_tti].rnti = pending_rar[j].rnti;
pending_msg3[pending_tti].L = L_prb; pending_msg3[pending_tti].L = L_prb;
@ -677,7 +677,7 @@ int sched::ul_sched(uint32_t tti, srsenb::sched_interface::ul_sched_res_t* sched
pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex);
/* If dl_sched() not yet called this tti (this tti is +4ms advanced), reset CCE state */ /* If dl_sched() not yet called this tti (this tti is +4ms advanced), reset CCE state */
if ((current_tti+4)%10240 != tti) { if (HARQ_TX(current_tti) != tti) {
bzero(used_cce, MAX_CCE*sizeof(bool)); bzero(used_cce, MAX_CCE*sizeof(bool));
} }
@ -685,9 +685,9 @@ int sched::ul_sched(uint32_t tti, srsenb::sched_interface::ul_sched_res_t* sched
current_tti = tti; current_tti = tti;
sfn = tti/10; sfn = tti/10;
if (tti > 4) { if (tti > 4) {
sf_idx = (tti-4)%10; sf_idx = (tti-HARQ_DELAY_MS)%10;
} else { } else {
sf_idx = (tti+10240-4)%10; sf_idx = (tti+10240-HARQ_DELAY_MS)%10;
} }
int nof_dci_elems = 0; int nof_dci_elems = 0;
int nof_phich_elems = 0; int nof_phich_elems = 0;

@ -177,7 +177,7 @@ void dl_harq_proc::set_rbgmask(uint32_t new_mask)
bool dl_harq_proc::has_pending_retx(uint32_t current_tti) bool dl_harq_proc::has_pending_retx(uint32_t current_tti)
{ {
return srslte_tti_interval(current_tti, tti) >= 8 && has_pending_retx_common(); return srslte_tti_interval(current_tti, tti) >= (2*HARQ_DELAY_MS) && has_pending_retx_common();
} }
int dl_harq_proc::get_tbs() int dl_harq_proc::get_tbs()

@ -248,7 +248,7 @@ bool sched_ue::get_pucch_sched(uint32_t current_tti, uint32_t prb_idx[2])
// First check if it has pending ACKs // First check if it has pending ACKs
for (int i=0;i<SCHED_MAX_HARQ_PROC;i++) { for (int i=0;i<SCHED_MAX_HARQ_PROC;i++) {
if (((dl_harq[i].get_tti()+4)%10240) == current_tti) { if (HARQ_TX(dl_harq[i].get_tti()) == current_tti) {
uint32_t n_pucch = srslte_pucch_get_npucch(dl_harq[i].get_n_cce(), SRSLTE_PUCCH_FORMAT_1A, has_sr, &pucch_sched); uint32_t n_pucch = srslte_pucch_get_npucch(dl_harq[i].get_n_cce(), SRSLTE_PUCCH_FORMAT_1A, has_sr, &pucch_sched);
if (prb_idx) { if (prb_idx) {
for (int i=0;i<2;i++) { for (int i=0;i<2;i++) {
@ -288,7 +288,7 @@ bool sched_ue::get_pucch_sched(uint32_t current_tti, uint32_t prb_idx[2])
int sched_ue::set_ack_info(uint32_t tti, bool ack) int sched_ue::set_ack_info(uint32_t tti, bool ack)
{ {
for (int i=0;i<SCHED_MAX_HARQ_PROC;i++) { for (int i=0;i<SCHED_MAX_HARQ_PROC;i++) {
if (((dl_harq[i].get_tti()+4)%10240) == tti) { if (HARQ_TX(dl_harq[i].get_tti()) == tti) {
Debug("SCHED: Set ACK=%d for rnti=0x%x, pid=%d, tti=%d\n", ack, rnti, i, tti); Debug("SCHED: Set ACK=%d for rnti=0x%x, pid=%d, tti=%d\n", ack, rnti, i, tti);
dl_harq[i].set_ack(ack); dl_harq[i].set_ack(ack);
return dl_harq[i].get_tbs(); return dl_harq[i].get_tbs();

@ -48,8 +48,8 @@ void phch_common::set_nof_mutex(uint32_t nof_mutex_) {
} }
void phch_common::reset() { void phch_common::reset() {
bzero(ul_grants, sizeof(mac_interface_phy::ul_sched_t)*10); bzero(ul_grants, sizeof(mac_interface_phy::ul_sched_t)*TTIMOD_SZ);
bzero(dl_grants, sizeof(mac_interface_phy::dl_sched_t)*10); bzero(dl_grants, sizeof(mac_interface_phy::dl_sched_t)*TTIMOD_SZ);
} }
bool phch_common::init(srslte_cell_t *cell_, srslte::radio* radio_h_, mac_interface_phy *mac_) bool phch_common::init(srslte_cell_t *cell_, srslte::radio* radio_h_, mac_interface_phy *mac_)

@ -176,11 +176,16 @@ cf_t* phch_worker::get_buffer_rx()
void phch_worker::set_time(uint32_t tti_, uint32_t tx_mutex_cnt_, srslte_timestamp_t tx_time_) void phch_worker::set_time(uint32_t tti_, uint32_t tx_mutex_cnt_, srslte_timestamp_t tx_time_)
{ {
tti_rx = tti_; tti_rx = tti_;
tti_tx = (tti_ + 4)%10240; tti_tx = HARQ_TX(tti_rx);
tti_sched_ul = (tti_ + 8)%10240; tti_sched_ul = HARQ_RX(tti_rx);
sf_rx = tti_rx%10; sf_rx = tti_rx%10;
sf_tx = tti_tx%10; sf_tx = tti_tx%10;
sf_sched_ul = tti_sched_ul%10;
t_tx = TTIMOD(tti_tx);
t_rx = TTIMOD(tti_rx);
t_sched_ul = TTIMOD(tti_sched_ul);
tx_mutex_cnt = tx_mutex_cnt_; tx_mutex_cnt = tx_mutex_cnt_;
memcpy(&tx_time, &tx_time_, sizeof(srslte_timestamp_t)); memcpy(&tx_time, &tx_time_, sizeof(srslte_timestamp_t));
} }
@ -245,7 +250,7 @@ void phch_worker::rem_rnti(uint16_t rnti)
srslte_enb_ul_rem_rnti(&enb_ul, rnti); srslte_enb_ul_rem_rnti(&enb_ul, rnti);
// remove any pending grant for each subframe // remove any pending grant for each subframe
for (uint32_t i=0;i<10;i++) { for (uint32_t i=0;i<TTIMOD_SZ;i++) {
for (uint32_t j=0;j<phy->ul_grants[i].nof_grants;j++) { for (uint32_t j=0;j<phy->ul_grants[i].nof_grants;j++) {
if (phy->ul_grants[i].sched_grants[j].rnti == rnti) { if (phy->ul_grants[i].sched_grants[j].rnti == rnti) {
phy->ul_grants[i].sched_grants[j].rnti = 0; phy->ul_grants[i].sched_grants[j].rnti = 0;
@ -265,8 +270,6 @@ void phch_worker::rem_rnti(uint16_t rnti)
void phch_worker::work_imp() void phch_worker::work_imp()
{ {
uint32_t sf_ack;
if (!running) { if (!running) {
return; return;
} }
@ -290,48 +293,47 @@ void phch_worker::work_imp()
srslte_enb_ul_fft(&enb_ul, signal_buffer_rx); srslte_enb_ul_fft(&enb_ul, signal_buffer_rx);
// Decode pending UL grants for the tti they were scheduled // Decode pending UL grants for the tti they were scheduled
decode_pusch(ul_grants[sf_rx].sched_grants, ul_grants[sf_rx].nof_grants, sf_rx); decode_pusch(ul_grants[t_rx].sched_grants, ul_grants[t_rx].nof_grants);
// Decode remaining PUCCH ACKs not associated with PUSCH transmission and SR signals // Decode remaining PUCCH ACKs not associated with PUSCH transmission and SR signals
decode_pucch(tti_rx); decode_pucch();
// Get DL scheduling for the TX TTI from MAC // Get DL scheduling for the TX TTI from MAC
if (mac->get_dl_sched(tti_tx, &dl_grants[sf_tx]) < 0) { if (mac->get_dl_sched(tti_tx, &dl_grants[t_tx]) < 0) {
Error("Getting DL scheduling from MAC\n"); Error("Getting DL scheduling from MAC\n");
goto unlock; goto unlock;
} }
if (dl_grants[sf_tx].cfi < 1 || dl_grants[sf_tx].cfi > 3) { if (dl_grants[t_tx].cfi < 1 || dl_grants[t_tx].cfi > 3) {
Error("Invalid CFI=%d\n", dl_grants[sf_tx].cfi); Error("Invalid CFI=%d\n", dl_grants[t_tx].cfi);
goto unlock; goto unlock;
} }
// Get UL scheduling for the TX TTI from MAC // Get UL scheduling for the TX TTI from MAC
if (mac->get_ul_sched(tti_sched_ul, &ul_grants[sf_sched_ul]) < 0) { if (mac->get_ul_sched(tti_sched_ul, &ul_grants[t_sched_ul]) < 0) {
Error("Getting UL scheduling from MAC\n"); Error("Getting UL scheduling from MAC\n");
goto unlock; goto unlock;
} }
// Put base signals (references, PBCH, PCFICH and PSS/SSS) into the resource grid // Put base signals (references, PBCH, PCFICH and PSS/SSS) into the resource grid
srslte_enb_dl_clear_sf(&enb_dl); srslte_enb_dl_clear_sf(&enb_dl);
srslte_enb_dl_set_cfi(&enb_dl, dl_grants[sf_tx].cfi); srslte_enb_dl_set_cfi(&enb_dl, dl_grants[t_tx].cfi);
srslte_enb_dl_put_base(&enb_dl, tti_tx); srslte_enb_dl_put_base(&enb_dl, tti_tx);
// Put UL/DL grants to resource grid. PDSCH data will be encoded as well. // Put UL/DL grants to resource grid. PDSCH data will be encoded as well.
encode_pdcch_dl(dl_grants[sf_tx].sched_grants, dl_grants[sf_tx].nof_grants, sf_tx); encode_pdcch_dl(dl_grants[t_tx].sched_grants, dl_grants[t_tx].nof_grants);
encode_pdcch_ul(ul_grants[sf_sched_ul].sched_grants, ul_grants[sf_sched_ul].nof_grants, sf_tx); encode_pdcch_ul(ul_grants[t_sched_ul].sched_grants, ul_grants[t_sched_ul].nof_grants);
encode_pdsch(dl_grants[sf_tx].sched_grants, dl_grants[sf_tx].nof_grants, sf_tx); encode_pdsch(dl_grants[t_tx].sched_grants, dl_grants[t_tx].nof_grants);
// Put pending PHICH HARQ ACK/NACK indications into subframe // Put pending PHICH HARQ ACK/NACK indications into subframe
encode_phich(ul_grants[sf_sched_ul].phich, ul_grants[sf_sched_ul].nof_phich, sf_tx); encode_phich(ul_grants[t_sched_ul].phich, ul_grants[t_sched_ul].nof_phich);
// Prepare for receive ACK for DL grants in sf_tx+4 // Prepare for receive ACK for DL grants in t_tx+4
sf_ack = (sf_tx+4)%10; phy->ack_clear(TTIMOD(HARQ_TX(sf_tx)));
phy->ack_clear(sf_ack); for (uint32_t i=0;i<dl_grants[t_tx].nof_grants;i++) {
for (uint32_t i=0;i<dl_grants[sf_tx].nof_grants;i++) {
// SI-RNTI and RAR-RNTI do not have ACK // SI-RNTI and RAR-RNTI do not have ACK
if (dl_grants[sf_tx].sched_grants[i].rnti >= SRSLTE_CRNTI_START && dl_grants[sf_tx].sched_grants[i].rnti <= SRSLTE_CRNTI_END) { if (dl_grants[t_tx].sched_grants[i].rnti >= SRSLTE_CRNTI_START && dl_grants[t_tx].sched_grants[i].rnti <= SRSLTE_CRNTI_END) {
phy->ack_set_pending(sf_ack, dl_grants[sf_tx].sched_grants[i].rnti, dl_grants[sf_tx].sched_grants[i].location.ncce); phy->ack_set_pending(TTIMOD(HARQ_TX(sf_tx)), dl_grants[t_tx].sched_grants[i].rnti, dl_grants[t_tx].sched_grants[i].location.ncce);
} }
} }
@ -364,7 +366,7 @@ unlock:
} }
int phch_worker::decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch, uint32_t tti) int phch_worker::decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch)
{ {
srslte_uci_data_t uci_data; srslte_uci_data_t uci_data;
bzero(&uci_data, sizeof(srslte_uci_data_t)); bzero(&uci_data, sizeof(srslte_uci_data_t));
@ -383,7 +385,7 @@ int phch_worker::decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch,
#endif #endif
// Get pending ACKs with an associated PUSCH transmission // Get pending ACKs with an associated PUSCH transmission
if (phy->ack_is_pending(sf_rx, rnti)) { if (phy->ack_is_pending(t_rx, rnti)) {
uci_data.uci_ack_len = 1; uci_data.uci_ack_len = 1;
} }
// Configure PUSCH CQI channel // Configure PUSCH CQI channel
@ -406,7 +408,7 @@ int phch_worker::decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch,
srslte_ra_ul_grant_t phy_grant; srslte_ra_ul_grant_t phy_grant;
int res = -1; int res = -1;
if (!srslte_ra_ul_dci_to_grant(&grants[i].grant, enb_ul.cell.nof_prb, n_rb_ho, &phy_grant, tti%8)) { if (!srslte_ra_ul_dci_to_grant(&grants[i].grant, enb_ul.cell.nof_prb, n_rb_ho, &phy_grant, tti_rx%8)) {
if (phy_grant.mcs.mod == SRSLTE_MOD_64QAM) { if (phy_grant.mcs.mod == SRSLTE_MOD_64QAM) {
phy_grant.mcs.mod = SRSLTE_MOD_16QAM; phy_grant.mcs.mod = SRSLTE_MOD_16QAM;
} }
@ -416,7 +418,7 @@ int phch_worker::decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch,
grants[i].current_tx_nb, grants[i].current_tx_nb,
grants[i].data, grants[i].data,
&uci_data, &uci_data,
tti); sf_rx);
} else { } else {
Error("Computing PUSCH grant\n"); Error("Computing PUSCH grant\n");
return SRSLTE_ERROR; return SRSLTE_ERROR;
@ -502,9 +504,8 @@ int phch_worker::decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch,
} }
int phch_worker::decode_pucch(uint32_t tti_rx) int phch_worker::decode_pucch()
{ {
uint32_t sf_rx = tti_rx%10;
srslte_uci_data_t uci_data; srslte_uci_data_t uci_data;
for(std::map<uint16_t, ue>::iterator iter=ue_db.begin(); iter!=ue_db.end(); ++iter) { for(std::map<uint16_t, ue>::iterator iter=ue_db.begin(); iter!=ue_db.end(); ++iter) {
@ -523,7 +524,7 @@ int phch_worker::decode_pucch(uint32_t tti_rx)
uci_data.scheduling_request = true; uci_data.scheduling_request = true;
} }
} }
if (phy->ack_is_pending(sf_rx, rnti, &last_n_pdcch)) { if (phy->ack_is_pending(t_rx, rnti, &last_n_pdcch)) {
needs_pucch = true; needs_pucch = true;
needs_ack = true; needs_ack = true;
uci_data.uci_ack_len = 1; uci_data.uci_ack_len = 1;
@ -539,7 +540,7 @@ int phch_worker::decode_pucch(uint32_t tti_rx)
} }
if (needs_pucch) { if (needs_pucch) {
if (srslte_enb_ul_get_pucch(&enb_ul, rnti, last_n_pdcch, sf_rx, &uci_data)) { if (srslte_enb_ul_get_pucch(&enb_ul, rnti, last_n_pdcch, t_rx, &uci_data)) {
fprintf(stderr, "Error getting PUCCH\n"); fprintf(stderr, "Error getting PUCCH\n");
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
@ -581,7 +582,7 @@ int phch_worker::decode_pucch(uint32_t tti_rx)
} }
int phch_worker::encode_phich(srslte_enb_dl_phich_t *acks, uint32_t nof_acks, uint32_t sf_idx) int phch_worker::encode_phich(srslte_enb_dl_phich_t *acks, uint32_t nof_acks)
{ {
for (uint32_t i=0;i<nof_acks;i++) { for (uint32_t i=0;i<nof_acks;i++) {
uint16_t rnti = acks[i].rnti; uint16_t rnti = acks[i].rnti;
@ -589,7 +590,7 @@ int phch_worker::encode_phich(srslte_enb_dl_phich_t *acks, uint32_t nof_acks, ui
srslte_enb_dl_put_phich(&enb_dl, acks[i].ack, srslte_enb_dl_put_phich(&enb_dl, acks[i].ack,
ue_db[rnti].phich_info.n_prb_lowest, ue_db[rnti].phich_info.n_prb_lowest,
ue_db[rnti].phich_info.n_dmrs, ue_db[rnti].phich_info.n_dmrs,
sf_idx); sf_tx);
Info("PHICH: rnti=0x%x, hi=%d, I_lowest=%d, n_dmrs=%d, tti_tx=%d\n", Info("PHICH: rnti=0x%x, hi=%d, I_lowest=%d, n_dmrs=%d, tti_tx=%d\n",
rnti, acks[i].ack, rnti, acks[i].ack,
@ -601,24 +602,24 @@ int phch_worker::encode_phich(srslte_enb_dl_phich_t *acks, uint32_t nof_acks, ui
} }
int phch_worker::encode_pdcch_ul(srslte_enb_ul_pusch_t *grants, uint32_t nof_grants, uint32_t sf_idx) int phch_worker::encode_pdcch_ul(srslte_enb_ul_pusch_t *grants, uint32_t nof_grants)
{ {
for (uint32_t i=0;i<nof_grants;i++) { for (uint32_t i=0;i<nof_grants;i++) {
uint16_t rnti = grants[i].rnti; uint16_t rnti = grants[i].rnti;
if (grants[i].needs_pdcch && rnti) { if (grants[i].needs_pdcch && rnti) {
if (srslte_enb_dl_put_pdcch_ul(&enb_dl, &grants[i].grant, grants[i].location, rnti, sf_idx)) { if (srslte_enb_dl_put_pdcch_ul(&enb_dl, &grants[i].grant, grants[i].location, rnti, sf_tx)) {
fprintf(stderr, "Error putting PUSCH %d\n",i); fprintf(stderr, "Error putting PUSCH %d\n",i);
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
Info("PDCCH: UL DCI Format0 rnti=0x%x, cce_index=%d, L=%d, tti_tx=%d\n", Info("PDCCH: UL DCI Format0 rnti=0x%x, cce_index=%d, L=%d, tpc=%d, tti_tx=%d\n",
rnti, grants[i].location.ncce, (1<<grants[i].location.L), tti_tx); rnti, grants[i].location.ncce, (1<<grants[i].location.L), grants[i].grant.tpc_pusch, tti_tx);
} }
} }
return SRSLTE_SUCCESS; return SRSLTE_SUCCESS;
} }
int phch_worker::encode_pdcch_dl(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants, uint32_t sf_idx) int phch_worker::encode_pdcch_dl(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants)
{ {
for (uint32_t i=0;i<nof_grants;i++) { for (uint32_t i=0;i<nof_grants;i++) {
uint16_t rnti = grants[i].rnti; uint16_t rnti = grants[i].rnti;
@ -633,7 +634,7 @@ int phch_worker::encode_pdcch_dl(srslte_enb_dl_pdsch_t *grants, uint32_t nof_gra
format = SRSLTE_DCI_FORMAT1A; format = SRSLTE_DCI_FORMAT1A;
break; break;
} }
if (srslte_enb_dl_put_pdcch_dl(&enb_dl, &grants[i].grant, format, grants[i].location, rnti, sf_idx)) { if (srslte_enb_dl_put_pdcch_dl(&enb_dl, &grants[i].grant, format, grants[i].location, rnti, sf_tx)) {
fprintf(stderr, "Error putting PDCCH %d\n",i); fprintf(stderr, "Error putting PDCCH %d\n",i);
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
@ -647,7 +648,7 @@ int phch_worker::encode_pdcch_dl(srslte_enb_dl_pdsch_t *grants, uint32_t nof_gra
return 0; return 0;
} }
int phch_worker::encode_pdsch(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants, uint32_t sf_idx) int phch_worker::encode_pdsch(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants)
{ {
for (uint32_t i=0;i<nof_grants;i++) { for (uint32_t i=0;i<nof_grants;i++) {
uint16_t rnti = grants[i].rnti; uint16_t rnti = grants[i].rnti;
@ -693,7 +694,7 @@ int phch_worker::encode_pdsch(srslte_enb_dl_pdsch_t *grants, uint32_t nof_grants
int rv[SRSLTE_MAX_CODEWORDS] = {grants[i].grant.rv_idx, 0}; int rv[SRSLTE_MAX_CODEWORDS] = {grants[i].grant.rv_idx, 0};
if (srslte_enb_dl_put_pdsch(&enb_dl, &phy_grant, sb, rnti, rv, sf_idx, d, SRSLTE_MIMO_TYPE_SINGLE_ANTENNA, 0)) if (srslte_enb_dl_put_pdsch(&enb_dl, &phy_grant, sb, rnti, rv, sf_tx, d, SRSLTE_MIMO_TYPE_SINGLE_ANTENNA, 0))
{ {
fprintf(stderr, "Error putting PDSCH %d\n",i); fprintf(stderr, "Error putting PDSCH %d\n",i);
return SRSLTE_ERROR; return SRSLTE_ERROR;

@ -109,7 +109,7 @@ private:
static const int MAC_MAIN_THREAD_PRIO = 5; static const int MAC_MAIN_THREAD_PRIO = 5;
static const int MAC_PDU_THREAD_PRIO = 6; static const int MAC_PDU_THREAD_PRIO = 6;
static const int MAC_NOF_HARQ_PROC = 8; static const int MAC_NOF_HARQ_PROC = 2*HARQ_DELAY_MS;
// Interaction with PHY // Interaction with PHY
srslte::tti_sync_cv ttisync; srslte::tti_sync_cv ttisync;

@ -138,7 +138,7 @@ namespace srsue {
uint32_t I_lowest; uint32_t I_lowest;
uint32_t n_dmrs; uint32_t n_dmrs;
} pending_ack_t; } pending_ack_t;
pending_ack_t pending_ack[10]; pending_ack_t pending_ack[TTIMOD_SZ];
bool is_first_tx; bool is_first_tx;

@ -368,7 +368,7 @@ bool bsr_proc::need_to_reset_sr() {
bool bsr_proc::need_to_send_sr(uint32_t tti) { bool bsr_proc::need_to_send_sr(uint32_t tti) {
if (!sr_is_sent && triggered_bsr_type == REGULAR) { if (!sr_is_sent && triggered_bsr_type == REGULAR) {
if (srslte_tti_interval(tti,next_tx_tti)>0 && srslte_tti_interval(tti,next_tx_tti) < 10240-4) { if (srslte_tti_interval(tti,next_tx_tti)>0 && srslte_tti_interval(tti,next_tx_tti) < 10240-HARQ_DELAY_MS) {
reset_sr = false; reset_sr = false;
sr_is_sent = true; sr_is_sent = true;
Debug("BSR: Need to send sr: sr_is_sent=true, reset_sr=false, tti=%d, next_tx_tti=%d\n", tti, next_tx_tti); Debug("BSR: Need to send sr: sr_is_sent=true, reset_sr=false, tti=%d, next_tx_tti=%d\n", tti, next_tx_tti);

@ -195,13 +195,13 @@ void phch_common::set_dl_rnti(srslte_rnti_type_t type, uint16_t rnti_value, int
} }
void phch_common::reset_pending_ack(uint32_t tti) { void phch_common::reset_pending_ack(uint32_t tti) {
pending_ack[tti%10].enabled = false; pending_ack[TTIMOD(tti)].enabled = false;
} }
void phch_common::set_pending_ack(uint32_t tti, uint32_t I_lowest, uint32_t n_dmrs) { void phch_common::set_pending_ack(uint32_t tti, uint32_t I_lowest, uint32_t n_dmrs) {
pending_ack[tti%10].enabled = true; pending_ack[TTIMOD(tti)].enabled = true;
pending_ack[tti%10].I_lowest = I_lowest; pending_ack[TTIMOD(tti)].I_lowest = I_lowest;
pending_ack[tti%10].n_dmrs = n_dmrs; pending_ack[TTIMOD(tti)].n_dmrs = n_dmrs;
Debug("Set pending ACK for tti=%d I_lowest=%d, n_dmrs=%d\n", tti, I_lowest, n_dmrs); Debug("Set pending ACK for tti=%d I_lowest=%d, n_dmrs=%d\n", tti, I_lowest, n_dmrs);
} }
@ -211,12 +211,12 @@ bool phch_common::get_pending_ack(uint32_t tti) {
bool phch_common::get_pending_ack(uint32_t tti, uint32_t *I_lowest, uint32_t *n_dmrs) { bool phch_common::get_pending_ack(uint32_t tti, uint32_t *I_lowest, uint32_t *n_dmrs) {
if (I_lowest) { if (I_lowest) {
*I_lowest = pending_ack[tti%10].I_lowest; *I_lowest = pending_ack[TTIMOD(tti)].I_lowest;
} }
if (n_dmrs) { if (n_dmrs) {
*n_dmrs = pending_ack[tti%10].n_dmrs; *n_dmrs = pending_ack[TTIMOD(tti)].n_dmrs;
} }
return pending_ack[tti%10].enabled; return pending_ack[TTIMOD(tti)].enabled;
} }
/* The transmisison of UL subframes must be in sequence. Each worker uses this function to indicate /* The transmisison of UL subframes must be in sequence. Each worker uses this function to indicate

@ -715,11 +715,11 @@ void phch_recv::run_thread() {
worker->set_sample_offset(srslte_ue_sync_get_sfo(&ue_sync)/1000); worker->set_sample_offset(srslte_ue_sync_get_sfo(&ue_sync)/1000);
/* Compute TX time: Any transmission happens in TTI4 thus advance 4 ms the reception time */ /* Compute TX time: Any transmission happens in TTI+4 thus advance 4 ms the reception time */
srslte_timestamp_t rx_time, tx_time, tx_time_prach; srslte_timestamp_t rx_time, tx_time, tx_time_prach;
srslte_ue_sync_get_last_timestamp(&ue_sync, &rx_time); srslte_ue_sync_get_last_timestamp(&ue_sync, &rx_time);
srslte_timestamp_copy(&tx_time, &rx_time); srslte_timestamp_copy(&tx_time, &rx_time);
srslte_timestamp_add(&tx_time, 0, 4e-3 - time_adv_sec); srslte_timestamp_add(&tx_time, 0, HARQ_DELAY_MS*1e-3 - time_adv_sec);
worker->set_tx_time(tx_time, next_offset); worker->set_tx_time(tx_time, next_offset);
next_offset = 0; next_offset = 0;

@ -335,7 +335,7 @@ void phch_worker::work_imp()
&ul_action.softbuffers[0], ul_action.rv[0], ul_action.rnti, ul_mac_grant.is_from_rar); &ul_action.softbuffers[0], ul_action.rv[0], ul_action.rnti, ul_mac_grant.is_from_rar);
signal_ready = true; signal_ready = true;
if (ul_action.expect_ack) { if (ul_action.expect_ack) {
phy->set_pending_ack(tti + 8, ue_ul.pusch_cfg.grant.n_prb_tilde[0], ul_action.phy_grant.ul.ncs_dmrs); phy->set_pending_ack(HARQ_RX(tti), ue_ul.pusch_cfg.grant.n_prb_tilde[0], ul_action.phy_grant.ul.ncs_dmrs);
} }
} else if (dl_action.generate_ack || uci_data.scheduling_request || uci_data.uci_cqi_len > 0) { } else if (dl_action.generate_ack || uci_data.scheduling_request || uci_data.uci_cqi_len > 0) {
@ -663,7 +663,7 @@ bool phch_worker::decode_pdcch_ul(mac_interface_phy::mac_grant_t* grant)
char timestr[64]; char timestr[64];
timestr[0]='\0'; timestr[0]='\0';
phy->reset_pending_ack(tti + 8); phy->reset_pending_ack(HARQ_RX(tti));
srslte_dci_msg_t dci_msg; srslte_dci_msg_t dci_msg;
srslte_ra_ul_dci_t dci_unpacked; srslte_ra_ul_dci_t dci_unpacked;
@ -776,7 +776,7 @@ void phch_worker::set_uci_sr()
{ {
uci_data.scheduling_request = false; uci_data.scheduling_request = false;
if (phy->sr_enabled) { if (phy->sr_enabled) {
uint32_t sr_tx_tti = (tti+4)%10240; uint32_t sr_tx_tti = HARQ_TX(tti);
// Get I_sr parameter // Get I_sr parameter
if (srslte_ue_ul_sr_send_tti(I_sr, sr_tx_tti)) { if (srslte_ue_ul_sr_send_tti(I_sr, sr_tx_tti)) {
Info("PUCCH: SR transmission at TTI=%d, I_sr=%d\n", sr_tx_tti, I_sr); Info("PUCCH: SR transmission at TTI=%d, I_sr=%d\n", sr_tx_tti, I_sr);
@ -793,7 +793,7 @@ void phch_worker::set_uci_periodic_cqi()
int cqi_max = phy->args->cqi_max; int cqi_max = phy->args->cqi_max;
if (period_cqi.configured && rnti_is_set) { if (period_cqi.configured && rnti_is_set) {
if (period_cqi.ri_idx_present && srslte_ri_send(period_cqi.pmi_idx, period_cqi.ri_idx, (tti+4)%10240)) { if (period_cqi.ri_idx_present && srslte_ri_send(period_cqi.pmi_idx, period_cqi.ri_idx, HARQ_TX(tti))) {
if (uci_data.uci_ri_len) { if (uci_data.uci_ri_len) {
uci_data.uci_cqi[0] = uci_data.uci_ri; uci_data.uci_cqi[0] = uci_data.uci_ri;
uci_data.uci_cqi_len = uci_data.uci_ri_len; uci_data.uci_cqi_len = uci_data.uci_ri_len;
@ -802,7 +802,7 @@ void phch_worker::set_uci_periodic_cqi()
uci_data.uci_pmi_len = 0; uci_data.uci_pmi_len = 0;
Info("PUCCH: Periodic RI=%d\n", uci_data.uci_cqi[0]); Info("PUCCH: Periodic RI=%d\n", uci_data.uci_cqi[0]);
} }
} else if (srslte_cqi_send(period_cqi.pmi_idx, (tti+4)%10240)) { } else if (srslte_cqi_send(period_cqi.pmi_idx, HARQ_TX(tti))) {
srslte_cqi_value_t cqi_report; srslte_cqi_value_t cqi_report;
if (period_cqi.format_is_subband) { if (period_cqi.format_is_subband) {
// TODO: Implement subband periodic reports // TODO: Implement subband periodic reports
@ -868,8 +868,8 @@ void phch_worker::set_uci_aperiodic_cqi()
bool phch_worker::srs_is_ready_to_send() { bool phch_worker::srs_is_ready_to_send() {
if (srs_cfg.configured) { if (srs_cfg.configured) {
if (srslte_refsignal_srs_send_cs(srs_cfg.subframe_config, (tti+4)%10) == 1 && if (srslte_refsignal_srs_send_cs(srs_cfg.subframe_config, HARQ_RX(tti)%10) == 1 &&
srslte_refsignal_srs_send_ue(srs_cfg.I_srs, (tti+4)%10240) == 1) srslte_refsignal_srs_send_ue(srs_cfg.I_srs, HARQ_TX(tti)) == 1)
{ {
return true; return true;
} }
@ -889,7 +889,7 @@ void phch_worker::encode_pusch(srslte_ra_ul_grant_t *grant, uint8_t *payload, ui
char timestr[64]; char timestr[64];
timestr[0]='\0'; timestr[0]='\0';
if (srslte_ue_ul_cfg_grant(&ue_ul, grant, (tti+4)%10240, rv, current_tx_nb)) { if (srslte_ue_ul_cfg_grant(&ue_ul, grant, HARQ_TX(tti), rv, current_tx_nb)) {
Error("Configuring UL grant\n"); Error("Configuring UL grant\n");
} }
@ -919,7 +919,7 @@ void phch_worker::encode_pusch(srslte_ra_ul_grant_t *grant, uint8_t *payload, ui
#endif #endif
Info("PUSCH: tti_tx=%d, n_prb=%d, rb_start=%d, tbs=%d, mod=%d, mcs=%d, rv_idx=%d, ack=%s, ri=%s, cfo=%.1f Hz%s\n", Info("PUSCH: tti_tx=%d, n_prb=%d, rb_start=%d, tbs=%d, mod=%d, mcs=%d, rv_idx=%d, ack=%s, ri=%s, cfo=%.1f Hz%s\n",
(tti+4)%10240, HARQ_TX(tti),
grant->L_prb, grant->n_prb[0], grant->L_prb, grant->n_prb[0],
grant->mcs.tbs/8, grant->mcs.mod, grant->mcs.idx, rv, grant->mcs.tbs/8, grant->mcs.mod, grant->mcs.idx, rv,
uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no", uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no",
@ -950,7 +950,7 @@ void phch_worker::encode_pucch()
gettimeofday(&t[1], NULL); gettimeofday(&t[1], NULL);
#endif #endif
if (srslte_ue_ul_pucch_encode(&ue_ul, uci_data, last_dl_pdcch_ncce, (tti+4)%10240, signal_buffer[0])) { if (srslte_ue_ul_pucch_encode(&ue_ul, uci_data, last_dl_pdcch_ncce, HARQ_TX(tti), signal_buffer[0])) {
Error("Encoding PUCCH\n"); Error("Encoding PUCCH\n");
} }
@ -966,7 +966,7 @@ void phch_worker::encode_pucch()
float gain = set_power(tx_power); float gain = set_power(tx_power);
Info("PUCCH: tti_tx=%d, n_cce=%3d, n_pucch=%d, n_prb=%d, ack=%s%s, ri=%s, pmi=%s%s, sr=%s, cfo=%.1f Hz%s\n", Info("PUCCH: tti_tx=%d, n_cce=%3d, n_pucch=%d, n_prb=%d, ack=%s%s, ri=%s, pmi=%s%s, sr=%s, cfo=%.1f Hz%s\n",
(tti+4)%10240, HARQ_TX(tti),
last_dl_pdcch_ncce, ue_ul.pucch.last_n_pucch, ue_ul.pucch.last_n_prb, last_dl_pdcch_ncce, ue_ul.pucch.last_n_pucch, ue_ul.pucch.last_n_prb,
uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no", uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no",
uci_data.uci_ack_len>1?(uci_data.uci_ack_2?"1":"0"):"", uci_data.uci_ack_len>1?(uci_data.uci_ack_2?"1":"0"):"",
@ -987,7 +987,7 @@ void phch_worker::encode_srs()
char timestr[64]; char timestr[64];
timestr[0]='\0'; timestr[0]='\0';
if (srslte_ue_ul_srs_encode(&ue_ul, (tti+4)%10240, signal_buffer[0])) if (srslte_ue_ul_srs_encode(&ue_ul, HARQ_TX(tti), signal_buffer[0]))
{ {
Error("Encoding SRS\n"); Error("Encoding SRS\n");
} }
@ -1002,7 +1002,7 @@ void phch_worker::encode_srs()
float gain = set_power(tx_power); float gain = set_power(tx_power);
uint32_t fi = srslte_vec_max_fi((float*) signal_buffer, SRSLTE_SF_LEN_PRB(cell.nof_prb)); uint32_t fi = srslte_vec_max_fi((float*) signal_buffer, SRSLTE_SF_LEN_PRB(cell.nof_prb));
float *f = (float*) signal_buffer; float *f = (float*) signal_buffer;
Info("SRS: power=%.2f dBm, tti_tx=%d%s\n", tx_power, (tti+4)%10240, timestr); Info("SRS: power=%.2f dBm, tti_tx=%d%s\n", tx_power, HARQ_TX(tti), timestr);
} }

Loading…
Cancel
Save