rlc: Move the rlc headers into a separate header file
diff --git a/src/rlc.h b/src/rlc.h
index df10ec3..5d0cd22 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 @@
 		 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');
+}