aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-06-02 16:00:41 +0200
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-06-08 09:39:25 +0200
commita700dd9e11d31805cfe8dd07fc27ac96425cbf0c (patch)
tree7a7d6922c8cb5f1dbd3bfe95dcdb72e766bacddf /src
parent17214bb06de4a1d8b626dab0f695017b0c74b358 (diff)
tbf: Move the current CS field to GprsMs
Currently the current CS value is stored in the cs field of gprs_rlcmac_tbf and initialised when it is used the first time. This commit adds separate fields for UL and DL CS values to the GprsMs class and provides corresponding getter methods for GprsMs and gprs_rlcmac_tbf. Ticket: #1739 Sponsored-by: On-Waves ehf
Diffstat (limited to 'src')
-rw-r--r--src/encoding.cpp4
-rw-r--r--src/gprs_ms.cpp12
-rw-r--r--src/gprs_ms.h17
-rw-r--r--src/tbf.cpp14
-rw-r--r--src/tbf.h3
-rw-r--r--src/tbf_dl.cpp12
6 files changed, 51 insertions, 11 deletions
diff --git a/src/encoding.cpp b/src/encoding.cpp
index 167bfd4c..d0dc35c9 100644
--- a/src/encoding.cpp
+++ b/src/encoding.cpp
@@ -192,7 +192,7 @@ void Encoding::write_packet_uplink_assignment(
}
bitvec_write_field(dest, wp,0x0,1); // Message escape
- bitvec_write_field(dest, wp,bts->initial_cs_ul-1, 2); // CHANNEL_CODING_COMMAND
+ bitvec_write_field(dest, wp,tbf->current_cs()-1, 2); // CHANNEL_CODING_COMMAND
bitvec_write_field(dest, wp,0x1,1); // TLLI_BLOCK_CHANNEL_CODING
bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_VALUE = on
bitvec_write_field(dest, wp,tbf->ta(),6); // TIMING_ADVANCE_VALUE
@@ -397,7 +397,7 @@ void Encoding::write_packet_uplink_ack(struct gprs_rlcmac_bts *bts,
block->u.Packet_Uplink_Ack_Nack.UPLINK_TFI = tbf->tfi(); // Uplink TFI
block->u.Packet_Uplink_Ack_Nack.UnionType = 0x0; // PU_AckNack_GPRS = on
- block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.CHANNEL_CODING_COMMAND = bts->initial_cs_ul - 1; // CS1
+ block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.CHANNEL_CODING_COMMAND = tbf->current_cs() - 1; // CS1
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Ack_Nack_Description.FINAL_ACK_INDICATION = final; // FINAL ACK INDICATION
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Ack_Nack_Description.STARTING_SEQUENCE_NUMBER = tbf->m_window.ssn(); // STARTING_SEQUENCE_NUMBER
diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp
index c2e83721..dc8783c4 100644
--- a/src/gprs_ms.cpp
+++ b/src/gprs_ms.cpp
@@ -21,6 +21,7 @@
#include "gprs_ms.h"
+#include "bts.h"
#include "tbf.h"
#include "gprs_debug.h"
@@ -74,6 +75,8 @@ GprsMs::GprsMs(BTS *bts, uint32_t tlli) :
m_new_dl_tlli(0),
m_ta(0),
m_ms_class(0),
+ m_current_cs_ul(1),
+ m_current_cs_dl(1),
m_is_idle(true),
m_ref(0),
m_list(this)
@@ -84,6 +87,15 @@ GprsMs::GprsMs(BTS *bts, uint32_t tlli) :
memset(&m_timer, 0, sizeof(m_timer));
m_timer.cb = GprsMs::timeout;
m_llc_queue.init();
+ if (m_bts) {
+ m_current_cs_ul = m_bts->bts_data()->initial_cs_ul;
+ if (m_current_cs_ul < 1)
+ m_current_cs_ul = 1;
+
+ m_current_cs_dl = m_bts->bts_data()->initial_cs_dl;
+ if (m_current_cs_dl < 1)
+ m_current_cs_dl = 1;
+ }
}
GprsMs::~GprsMs()
diff --git a/src/gprs_ms.h b/src/gprs_ms.h
index 7c71bd14..01858366 100644
--- a/src/gprs_ms.h
+++ b/src/gprs_ms.h
@@ -72,6 +72,9 @@ public:
uint8_t ms_class() const;
void set_ms_class(uint8_t ms_class);
+ uint8_t current_cs_ul() const;
+ uint8_t current_cs_dl() const;
+
gprs_llc_queue *llc_queue();
const gprs_llc_queue *llc_queue() const;
@@ -114,6 +117,10 @@ private:
char m_imsi[16];
uint8_t m_ta;
uint8_t m_ms_class;
+ /* current coding scheme */
+ uint8_t m_current_cs_ul;
+ uint8_t m_current_cs_dl;
+
gprs_llc_queue m_llc_queue;
bool m_is_idle;
@@ -151,6 +158,16 @@ inline uint8_t GprsMs::ms_class() const
return m_ms_class;
}
+inline uint8_t GprsMs::current_cs_dl() const
+{
+ return m_current_cs_dl;
+}
+
+inline uint8_t GprsMs::current_cs_ul() const
+{
+ return m_current_cs_ul;
+}
+
inline void GprsMs::set_timeout(unsigned secs)
{
m_delay = secs;
diff --git a/src/tbf.cpp b/src/tbf.cpp
index e058348f..f3c5e69e 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -115,6 +115,17 @@ void gprs_rlcmac_tbf::set_ms_class(uint8_t ms_class_)
m_ms_class = ms_class_;
}
+uint8_t gprs_rlcmac_tbf::current_cs() const
+{
+ uint8_t cs;
+ if (direction == GPRS_RLCMAC_UL_TBF)
+ cs = m_ms ? m_ms->current_cs_ul() : bts->bts_data()->initial_cs_ul;
+ else
+ cs = m_ms ? m_ms->current_cs_dl() : bts->bts_data()->initial_cs_dl;
+
+ return cs < 1 ? 1 : cs;
+}
+
gprs_llc_queue *gprs_rlcmac_tbf::llc_queue()
{
return m_ms ? m_ms->llc_queue() : NULL;
@@ -945,5 +956,6 @@ void tbf_print_vty_info(struct vty *vty, struct llist_head *ltbf)
if (tbf->pdch[i])
vty_out(vty, "%d ", i);
}
- vty_out(vty, " CS=%d%s%s", tbf->cs, VTY_NEWLINE, VTY_NEWLINE);
+ vty_out(vty, " CS=%d%s%s", tbf->ms() ? tbf->ms()->current_cs_dl() : 1,
+ VTY_NEWLINE, VTY_NEWLINE);
}
diff --git a/src/tbf.h b/src/tbf.h
index c5bb9009..f50c489a 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -153,6 +153,7 @@ struct gprs_rlcmac_tbf {
void set_ta(uint8_t);
uint8_t ms_class() const;
void set_ms_class(uint8_t);
+ uint8_t current_cs() const;
gprs_llc_queue *llc_queue();
const gprs_llc_queue *llc_queue() const;
@@ -198,8 +199,6 @@ struct gprs_rlcmac_tbf {
int rssi_num; /* number of rssi values added since rssi_tv */
} meas;
- uint8_t cs; /* current coding scheme */
-
/* these should become protected but only after gprs_rlcmac_data.c
* stops to iterate over all tbf in its current form */
enum gprs_rlcmac_tbf_state state;
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index d1ed1cd9..0aa41a26 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -394,16 +394,16 @@ struct msgb *gprs_rlcmac_dl_tbf::create_new_bsn(const uint32_t fn, const uint8_t
uint16_t space, chunk;
gprs_rlc_data *rlc_data;
const uint16_t bsn = m_window.v_s();
+ uint8_t cs = 1;
LOGP(DRLCMACDL, LOGL_DEBUG, "- Sending new block at BSN %d\n",
m_window.v_s());
-#warning "Selection of the CS doesn't belong here"
- if (cs == 0) {
- cs = bts_data()->initial_cs_dl;
- if (cs < 1 || cs > 4)
- cs = 1;
- }
+ cs = current_cs();
+
+ OSMO_ASSERT(cs >= 1);
+ OSMO_ASSERT(cs <= 4);
+
/* total length of block, including spare bits */
const uint8_t block_length = gprs_rlcmac_cs[cs].block_length;
/* length of usable data of block, w/o spare bits, inc. MAC */