This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/osmocom-net-gprs@lists.osmocom.org/.
Aravind Sirsikar arvind.sirsikar at radisys.comAdds new variable m_fanr_enabled in the gprs_rlcmac_tbf structure Adds new variable m_is_fanr_capable in GprsMs class Adds new variable pan_allowed in mcs_info structure variable This is the fourth patch among series of patches for FANR feature --- src/gprs_coding_scheme.cpp | 60 ++++++++++++++++++++++++++------------------ src/gprs_ms.cpp | 1 + src/gprs_ms.h | 17 +++++++++++++ src/tbf.cpp | 3 ++- src/tbf.h | 14 +++++++++++ 5 files changed, 69 insertions(+), 26 deletions(-) diff --git a/src/gprs_coding_scheme.cpp b/src/gprs_coding_scheme.cpp index 232cee3..53ce868 100644 --- a/src/gprs_coding_scheme.cpp +++ b/src/gprs_coding_scheme.cpp @@ -30,23 +30,24 @@ static struct { unsigned int num_blocks; const char *name; GprsCodingScheme::HeaderType data_hdr; + bool pan_allowed; } mcs_info[GprsCodingScheme::NUM_SCHEMES] = { - {{0, 0}, {0, 0}, 0, 0, "UNKNOWN", GprsCodingScheme::HEADER_INVALID}, - {{23, 0}, {23, 0}, 20, 1, "CS-1", GprsCodingScheme::HEADER_GPRS_DATA}, - {{33, 7}, {33, 7}, 30, 1, "CS-2", GprsCodingScheme::HEADER_GPRS_DATA}, - {{39, 3}, {39, 3}, 36, 1, "CS-3", GprsCodingScheme::HEADER_GPRS_DATA}, - {{53, 7}, {53, 7}, 50, 1, "CS-4", GprsCodingScheme::HEADER_GPRS_DATA}, - - {{26, 1}, {26, 1}, 22, 1, "MCS-1", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3}, - {{32, 1}, {32, 1}, 28, 1, "MCS-2", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3}, - {{41, 1}, {41, 1}, 37, 1, "MCS-3", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3}, - {{48, 1}, {48, 1}, 44, 1, "MCS-4", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3}, - - {{60, 7}, {59, 6}, 56, 1, "MCS-5", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2}, - {{78, 7}, {77, 6}, 74, 1, "MCS-6", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2}, - {{118, 2}, {117, 4}, 56, 2, "MCS-7", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1}, - {{142, 2}, {141, 4}, 68, 2, "MCS-8", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1}, - {{154, 2}, {153, 4}, 74, 2, "MCS-9", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1}, + {{0, 0}, {0, 0}, 0, 0, "UNKNOWN", GprsCodingScheme::HEADER_INVALID,false}, + {{23, 0}, {23, 0}, 20, 1, "CS-1", GprsCodingScheme::HEADER_GPRS_DATA, false}, + {{33, 7}, {33, 7}, 30, 1, "CS-2", GprsCodingScheme::HEADER_GPRS_DATA, false}, + {{39, 3}, {39, 3}, 36, 1, "CS-3", GprsCodingScheme::HEADER_GPRS_DATA, false}, + {{53, 7}, {53, 7}, 50, 1, "CS-4", GprsCodingScheme::HEADER_GPRS_DATA, false}, + + {{26, 1}, {26, 1}, 22, 1, "MCS-1", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3, true}, + {{32, 1}, {32, 1}, 28, 1, "MCS-2", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3, true}, + {{41, 1}, {41, 1}, 37, 1, "MCS-3", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3, true}, + {{48, 1}, {48, 1}, 44, 1, "MCS-4", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3, false}, + + {{60, 7}, {59, 6}, 56, 1, "MCS-5", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2, true}, + {{78, 7}, {77, 6}, 74, 1, "MCS-6", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2, true}, + {{118, 2}, {117, 4}, 56, 2, "MCS-7", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1, true}, + {{142, 2}, {141, 4}, 68, 2, "MCS-8", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1, true}, + {{154, 2}, {153, 4}, 74, 2, "MCS-9", GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1, false}, }; /* CPS table for Header Type 3 */ @@ -132,20 +133,29 @@ uint8_t GprsCodingScheme::get_cps(uint8_t ps, bool is_padding) GprsCodingScheme GprsCodingScheme::getBySizeUL(unsigned size) { + /* The size 31, 37, 46, 66, 84, 124, 148 corresponds to PAN field + * inclusion in egprs UL frame. i.e 4 bytes extra. */ switch (size) { case 23: return GprsCodingScheme(CS1); - case 27: return GprsCodingScheme(MCS1); - case 33: return GprsCodingScheme(MCS2); + case 27: return GprsCodingScheme(MCS1, EGPRS); + case 31: return GprsCodingScheme(MCS1,EGPRS); + case 33:return GprsCodingScheme(MCS2); + case 37: return GprsCodingScheme(MCS2,EGPRS); case 34: return GprsCodingScheme(CS2); case 40: return GprsCodingScheme(CS3); - case 42: return GprsCodingScheme(MCS3); - case 49: return GprsCodingScheme(MCS4); + case 42: return GprsCodingScheme(MCS3,EGPRS); + case 46: return GprsCodingScheme(MCS3,EGPRS); + case 49: return GprsCodingScheme(MCS4,EGPRS); case 54: return GprsCodingScheme(CS4); - case 62: return GprsCodingScheme(MCS5); - case 80: return GprsCodingScheme(MCS6); - case 120: return GprsCodingScheme(MCS7); - case 144: return GprsCodingScheme(MCS8); - case 156: return GprsCodingScheme(MCS9); + case 62: return GprsCodingScheme(MCS5,EGPRS); + case 66: return GprsCodingScheme(MCS5,EGPRS); + case 80: return GprsCodingScheme(MCS6, EGPRS); + case 84: return GprsCodingScheme(MCS6,EGPRS); + case 120: return GprsCodingScheme(MCS7, EGPRS); + case 124: return GprsCodingScheme(MCS7,EGPRS); + case 144: return GprsCodingScheme(MCS8, EGPRS); + case 148: return GprsCodingScheme(MCS8,EGPRS); + case 156: return GprsCodingScheme(MCS9, EGPRS); } return GprsCodingScheme(UNKNOWN); diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp index cd4582f..67c3e95 100644 --- a/src/gprs_ms.cpp +++ b/src/gprs_ms.cpp @@ -137,6 +137,7 @@ GprsMs::GprsMs(BTS *bts, uint32_t tlli) : gprs_codel_set_interval(m_codel_state, codel_interval); } m_last_cs_not_low = now_msec(); + m_is_fanr_capable = false; } GprsMs::~GprsMs() diff --git a/src/gprs_ms.h b/src/gprs_ms.h index 3c91e3c..3cd94bd 100644 --- a/src/gprs_ms.h +++ b/src/gprs_ms.h @@ -130,6 +130,8 @@ public: /* internal use */ static void timeout(void *priv_); + bool is_fanr_capable() const; + void set_fanr_capable(bool); protected: void update_status(); GprsMs *ref(); @@ -161,6 +163,11 @@ private: gprs_llc_queue m_llc_queue; bool m_is_idle; + /* member to validate fanr support. will be set after + * after decoding RA capability of the MS + */ + bool m_is_fanr_capable; + int m_ref; LListHead<GprsMs> m_list; struct osmo_timer_list m_timer; @@ -182,6 +189,16 @@ inline bool GprsMs::is_idle() const return !m_ul_tbf && !m_dl_tbf && !m_ref && llist_empty(&m_old_tbfs); } +inline bool GprsMs::is_fanr_capable() const +{ + return this->m_is_fanr_capable; +} + +inline void GprsMs::set_fanr_capable(bool is_fanr_capable) +{ + this->m_is_fanr_capable = is_fanr_capable; +} + inline bool GprsMs::need_dl_tbf() const { if (dl_tbf() != NULL && dl_tbf()->state_is_not(GPRS_RLCMAC_WAIT_RELEASE)) diff --git a/src/tbf.cpp b/src/tbf.cpp index aedb9ae..93dd8c2 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -87,7 +87,8 @@ gprs_rlcmac_tbf::gprs_rlcmac_tbf(BTS *bts_, gprs_rlcmac_tbf_direction dir) : m_ta(0), m_ms_class(0), m_ms_list(this), - m_egprs_enabled(false) + m_egprs_enabled(false), + m_fanr_enabled(false) { /* The classes of these members do not have proper constructors yet. * Just set them to 0 like talloc_zero did */ diff --git a/src/tbf.h b/src/tbf.h index 1f5d928..6e482c7 100644 --- a/src/tbf.h +++ b/src/tbf.h @@ -177,6 +177,9 @@ struct gprs_rlcmac_tbf { void enable_egprs(); void disable_egprs(); + bool is_fanr_enabled() const; + void enable_fanr(); + /* attempt to make things a bit more fair */ void rotate_in_list(); @@ -261,6 +264,7 @@ protected: private: LListHead<gprs_rlcmac_tbf> m_ms_list; bool m_egprs_enabled; + bool m_fanr_enabled; mutable char m_name_buf[60]; }; @@ -343,6 +347,16 @@ inline void gprs_rlcmac_tbf::disable_egprs() m_egprs_enabled = false; } +inline bool gprs_rlcmac_tbf::is_fanr_enabled() const +{ + return m_fanr_enabled; +} + +inline void gprs_rlcmac_tbf::enable_fanr() +{ + m_fanr_enabled = true; +} + struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf { gprs_rlcmac_dl_tbf(BTS *bts); -- 1.7.9.5