[PATCH] Structure modifications for FANR feature

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.com
Thu Mar 10 04:57:11 UTC 2016


Adds 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





More information about the osmocom-net-gprs mailing list