diff --git a/lib/include/srslte/interfaces/ue_interfaces.h b/lib/include/srslte/interfaces/ue_interfaces.h index 41b90bf9f..3cffaae1e 100644 --- a/lib/include/srslte/interfaces/ue_interfaces.h +++ b/lib/include/srslte/interfaces/ue_interfaces.h @@ -300,6 +300,7 @@ public: uint32_t rv; uint16_t rnti; uint32_t current_tx_nb; + int32_t tti_offset; // relative offset between grant and UL tx/HARQ rx srslte_softbuffer_tx_t *softbuffer; srslte_phy_grant_t phy_grant; uint8_t *payload_ptr; diff --git a/srsue/hdr/mac/ul_harq.h b/srsue/hdr/mac/ul_harq.h index 107683ebb..2ef1ed2b6 100644 --- a/srsue/hdr/mac/ul_harq.h +++ b/srsue/hdr/mac/ul_harq.h @@ -128,13 +128,13 @@ public: void new_grant_ul_ack(Tgrant grant, bool ack, Taction *action) { - set_ack(grant.tti, ack); + set_ack(grant.tti, ack, action); new_grant_ul(grant, action); } void harq_recv(uint32_t tti, bool ack, Taction *action) { - set_ack(tti, ack); + set_ack(tti, ack, action); run_tti(tti, NULL, action); } @@ -385,13 +385,13 @@ private: // Called with UL grant void run_tti(uint32_t tti, Tgrant *grant, Taction* action) { - uint32_t tti_tx = (tti+4)%10240; + uint32_t tti_tx = (tti+action->tti_offset)%10240; proc[pidof(tti_tx)].run_tti(tti_tx, grant, action); } - void set_ack(uint32_t tti, bool ack) + void set_ack(uint32_t tti, bool ack, Taction *action) { - int tti_harq = (int) tti - 4; + int tti_harq = (int) tti - action->tti_offset; if (tti_harq < 0) { tti_harq += 10240; } diff --git a/srsue/src/phy/phch_worker.cc b/srsue/src/phy/phch_worker.cc index 14de9b51a..c2796e2ad 100644 --- a/srsue/src/phy/phch_worker.cc +++ b/srsue/src/phy/phch_worker.cc @@ -240,6 +240,9 @@ void phch_worker::work_imp() set_uci_periodic_cqi(); } + /* TTI offset for UL is always 4 for LTE */ + ul_action.tti_offset = 4; + /* Send UL grant or HARQ information (from PHICH) to MAC */ if (ul_grant_available && ul_ack_available) { phy->mac->new_grant_ul_ack(ul_mac_grant, ul_ack, &ul_action);