aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2016-01-22 17:06:14 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-02 17:06:39 +0100
commite87b3e4cf1cc2f5a29976a1c38c7d26a1d64babd (patch)
tree402e8e68d170722ee1cce95240f2afbcc6749608
parent2d62a4e8442b4e71f3c07b1188a4fa18b82e79e8 (diff)
ms: Add current_pacch_slots method
The PACCH is specific to an MS and may change when a TBF is established or removed (see TS 44.060, 8.1.1.2.2). For multislot class type 2 phones, more than one timeslot may be used to transmit RLC/MAC control messages. Add a method that returns a set of TS which can be used for the PACCH. Sponsored-by: On-Waves ehf
-rw-r--r--src/gprs_ms.cpp23
-rw-r--r--src/gprs_ms.h1
-rw-r--r--src/pcu_vty_functions.cpp7
3 files changed, 31 insertions, 0 deletions
diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp
index 9126543..9c8b62a 100644
--- a/src/gprs_ms.cpp
+++ b/src/gprs_ms.cpp
@@ -25,6 +25,7 @@
#include "tbf.h"
#include "gprs_debug.h"
#include "gprs_codel.h"
+#include "pcu_utils.h"
#include <time.h>
@@ -762,6 +763,28 @@ uint8_t GprsMs::ul_slots() const
return slots;
}
+uint8_t GprsMs::current_pacch_slots() const
+{
+ uint8_t slots = 0;
+
+ if (!m_dl_tbf && !m_ul_tbf)
+ return 0;
+
+ /* see TS 44.060, 8.1.1.2.2 */
+ if (m_dl_tbf && !m_ul_tbf)
+ slots = m_dl_tbf->dl_slots();
+ else if (!m_dl_tbf && m_ul_tbf)
+ slots = m_ul_tbf->ul_slots();
+ else
+ slots = m_ul_tbf->ul_slots() & m_dl_tbf->dl_slots();
+
+ /* Assume a multislot class 1 device */
+ /* TODO: For class 2 devices, this could be removed */
+ slots = pcu_lsb(slots);
+
+ return slots;
+}
+
void GprsMs::set_reserved_slots(gprs_rlcmac_trx *trx,
uint8_t ul_slots, uint8_t dl_slots)
{
diff --git a/src/gprs_ms.h b/src/gprs_ms.h
index 246f71e..b07f175 100644
--- a/src/gprs_ms.h
+++ b/src/gprs_ms.h
@@ -97,6 +97,7 @@ public:
uint8_t ul_slots() const;
uint8_t reserved_dl_slots() const;
uint8_t reserved_ul_slots() const;
+ uint8_t current_pacch_slots() const;
gprs_rlcmac_trx *current_trx() const;
void set_reserved_slots(gprs_rlcmac_trx *trx,
uint8_t ul_slots, uint8_t dl_slots);
diff --git a/src/pcu_vty_functions.cpp b/src/pcu_vty_functions.cpp
index 4168f69..9ce7880 100644
--- a/src/pcu_vty_functions.cpp
+++ b/src/pcu_vty_functions.cpp
@@ -118,6 +118,7 @@ static int show_ms(struct vty *vty, GprsMs *ms)
{
unsigned i;
LListHead<gprs_rlcmac_tbf> *i_tbf;
+ uint8_t slots;
vty_out(vty, "MS TLLI=%08x, IMSI=%s%s", ms->tlli(), ms->imsi(), VTY_NEWLINE);
vty_out(vty, " Timing advance (TA): %d%s", ms->ta(), VTY_NEWLINE);
@@ -129,6 +130,12 @@ static int show_ms(struct vty *vty, GprsMs *ms)
GprsCodingScheme::modeName(ms->mode()), VTY_NEWLINE);
vty_out(vty, " MS class: %d%s", ms->ms_class(), VTY_NEWLINE);
vty_out(vty, " EGPRS MS class: %d%s", ms->egprs_ms_class(), VTY_NEWLINE);
+ vty_out(vty, " PACCH: ");
+ slots = ms->current_pacch_slots();
+ for (int i = 0; i < 8; i++)
+ if (slots && (1 << i))
+ vty_out(vty, "%d ", i);
+ vty_out(vty, "%s", VTY_NEWLINE);
vty_out(vty, " LLC queue length: %d%s", ms->llc_queue()->size(),
VTY_NEWLINE);
vty_out(vty, " LLC queue octets: %d%s", ms->llc_queue()->octets(),