diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-06-02 16:00:41 +0200 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-06-08 09:39:25 +0200 |
commit | a700dd9e11d31805cfe8dd07fc27ac96425cbf0c (patch) | |
tree | 7a7d6922c8cb5f1dbd3bfe95dcdb72e766bacddf /src | |
parent | 17214bb06de4a1d8b626dab0f695017b0c74b358 (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.cpp | 4 | ||||
-rw-r--r-- | src/gprs_ms.cpp | 12 | ||||
-rw-r--r-- | src/gprs_ms.h | 17 | ||||
-rw-r--r-- | src/tbf.cpp | 14 | ||||
-rw-r--r-- | src/tbf.h | 3 | ||||
-rw-r--r-- | src/tbf_dl.cpp | 12 |
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); } @@ -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 */ |