aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bts.cpp6
-rw-r--r--src/gprs_ms.h9
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 :