diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bts.cpp | 6 | ||||
-rw-r--r-- | src/gprs_ms.h | 9 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 65289158..39737f4e 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -834,6 +834,12 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet, "assignment for UL %s\n", tbf_name(new_tbf)); } tbf_assign_control_ts(new_tbf); + /* there might be LLC packets waiting in the queue, but the DL + * TBF might have been released while the UL TBF has been + * established */ + if (new_tbf->ms()->need_dl_tbf()) + new_tbf->establish_dl_tbf_on_pacch(); + return; } LOGP(DRLCMAC, LOGL_ERROR, "Error: received PACET CONTROL ACK " diff --git a/src/gprs_ms.h b/src/gprs_ms.h index 1f080ff2..e820e196 100644 --- a/src/gprs_ms.h +++ b/src/gprs_ms.h @@ -110,6 +110,7 @@ public: void update_error_rate(gprs_rlcmac_tbf *tbf, int percent); bool is_idle() const; + bool need_dl_tbf() const; void* operator new(size_t num); void operator delete(void* p); @@ -175,6 +176,14 @@ inline bool GprsMs::is_idle() const return !m_ul_tbf && !m_dl_tbf && !m_ref && llist_empty(&m_old_tbfs); } +inline bool GprsMs::need_dl_tbf() const +{ + if (dl_tbf() != NULL && dl_tbf()->state_is_not(GPRS_RLCMAC_WAIT_RELEASE)) + return false; + + return llc_queue()->size() > 0; +} + inline uint32_t GprsMs::tlli() const { return m_new_ul_tlli ? m_new_ul_tlli : |