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