aboutsummaryrefslogtreecommitdiffstats
path: root/src/rlc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/rlc.h')
-rw-r--r--src/rlc.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/rlc.h b/src/rlc.h
index df10ec37..5d0cd22e 100644
--- a/src/rlc.h
+++ b/src/rlc.h
@@ -21,6 +21,52 @@
#include <stdint.h>
+#define RLC_MAX_SNS 128 /* GPRS, must be power of 2 */
+#define RLC_MAX_WS 64 /* max window size */
+#define RLC_MAX_LEN 54 /* CS-4 including spare bits */
+
+
+struct gprs_rlc_data {
+ uint8_t *prepare(size_t block_data_length);
+
+ /* block history */
+ uint8_t block[RLC_MAX_LEN];
+ /* block len of history */
+ uint8_t len;
+};
+
+/*
+ * I hold the currently transferred blocks and will provide
+ * the routines to manipulate these arrays.
+ */
+struct gprs_rlc {
+ gprs_rlc_data blocks[RLC_MAX_SNS/2];
+};
+
+struct gprs_rlc_v_b {
+ bool is_nacked(int index) const;
+ bool is_acked(int index) const;
+ bool is_unacked(int index) const;
+ bool is_resend(int index) const;
+
+ char state(int index) const;
+
+ void mark_unacked(int index);
+ void mark_nacked(int index);
+ void mark_acked(int index);
+ void mark_resend(int index);
+ void mark_invalid(int index);
+
+ void reset();
+
+private:
+ bool is_state(int index, const char state) const;
+ void mark(int index, const char state);
+
+ char m_v_b[RLC_MAX_SNS/2]; /* acknowledge state array */
+};
+
+
extern "C" {
/* TS 04.60 10.2.2 */
struct rlc_ul_header {
@@ -54,3 +100,63 @@ struct rlc_li_field {
li:6;
} __attribute__ ((packed));
}
+
+inline bool gprs_rlc_v_b::is_state(int index, const char type) const
+{
+ return m_v_b[index] == type;
+}
+
+inline void gprs_rlc_v_b::mark(int index, const char type)
+{
+ m_v_b[index] = type;
+}
+
+inline char gprs_rlc_v_b::state(int index) const
+{
+ return m_v_b[index];
+}
+
+inline bool gprs_rlc_v_b::is_nacked(int index) const
+{
+ return is_state(index, 'N');
+}
+
+inline bool gprs_rlc_v_b::is_acked(int index) const
+{
+ return is_state(index, 'A');
+}
+
+inline bool gprs_rlc_v_b::is_unacked(int index) const
+{
+ return is_state(index, 'U');
+}
+
+inline bool gprs_rlc_v_b::is_resend(int index) const
+{
+ return is_state(index, 'X');
+}
+
+inline void gprs_rlc_v_b::mark_resend(int index)
+{
+ return mark(index, 'X');
+}
+
+inline void gprs_rlc_v_b::mark_unacked(int index)
+{
+ return mark(index, 'U');
+}
+
+inline void gprs_rlc_v_b::mark_acked(int index)
+{
+ return mark(index, 'A');
+}
+
+inline void gprs_rlc_v_b::mark_nacked(int index)
+{
+ return mark(index, 'N');
+}
+
+inline void gprs_rlc_v_b::mark_invalid(int index)
+{
+ return mark(index, 'I');
+}