aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bts.cpp6
-rw-r--r--src/gprs_ms.h9
-rw-r--r--tests/tbf/TbfTest.cpp5
-rw-r--r--tests/tbf/TbfTest.err19
4 files changed, 36 insertions, 3 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 :
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index 2af7e3a9..92679bcf 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -895,9 +895,8 @@ static void test_tbf_dl_flow_and_rach_two_phase()
ms = the_bts.ms_by_tlli(tlli1);
OSMO_ASSERT(ms2 == ms);
- /* DL TBF should be the same */
- /* OSMO_ASSERT(ms->dl_tbf()); */
- /* OSMO_ASSERT(ms->dl_tbf() == dl_tbf); */
+ /* A DL TBF should still exist */
+ OSMO_ASSERT(ms->dl_tbf());
/* No queued packets should be lost */
OSMO_ASSERT(ms->llc_queue()->size() == 2);
diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err
index 8401e083..70b5c570 100644
--- a/tests/tbf/TbfTest.err
+++ b/tests/tbf/TbfTest.err
@@ -1825,6 +1825,25 @@ Sending data request: trx=0 ts=7 sapi=5 arfcn=0 fn=2654327 block=9 data=4f 28 5e
RX: [PCU <- BTS] TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) Packet Control Ack
TBF: [DOWNLINK] UPLINK ASSIGNED TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN)
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) changes state from ASSIGN to FLOW
+********** TBF starts here **********
+Allocating DL TBF: MS_CLASS=1
+Slot Allocation (Algorithm A) for class 1
+- Skipping TS 0, because not enabled
+- Skipping TS 1, because not enabled
+- Skipping TS 2, because not enabled
+- Skipping TS 3, because not enabled
+- Skipping TS 4, because not enabled
+- Skipping TS 5, because not enabled
+- Skipping TS 6, because not enabled
+- Assign downlink TS=7 TFI=1
+PDCH(TS 7, TRX 0): Attaching TBF(TFI=1 TLLI=0x00000000 DIR=DL STATE=NULL), 2 TBFs, USFs = 01, TFIs = 00000003.
+- Setting Control TS 7
+Attaching TBF to MS object, TLLI = 0xf1223344, TBF = TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=NULL)
+Allocated TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 80
+TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) Trigger downlink assignment on PACCH
+Send dowlink assignment on PACCH, because TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) exists
+TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=NULL) changes state from NULL to ASSIGN
+TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=ASSIGN) starting timer 0.
UL DATA TFI=0 received (V(Q)=0 .. V(R)=0)
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) restarting timer 3169 while old timer 3169 pending
- BSN 0 storing in window (0..63)