aboutsummaryrefslogtreecommitdiffstats
path: root/src/egprs_rlc_compression.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/egprs_rlc_compression.h')
-rw-r--r--src/egprs_rlc_compression.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/egprs_rlc_compression.h b/src/egprs_rlc_compression.h
new file mode 100644
index 00000000..cf563503
--- /dev/null
+++ b/src/egprs_rlc_compression.h
@@ -0,0 +1,64 @@
+/* egprs_rlc_compression.h
+ * Routines for EGPRS RLC bitmap compression handling
+ */
+
+#pragma once
+
+#include <gprs_rlcmac.h>
+#include <gprs_debug.h>
+
+extern "C" {
+#include <osmocom/core/talloc.h>
+}
+
+#include <arpa/inet.h>
+#include <errno.h>
+#include <string.h>
+
+#define MAX_CDWDTBL_LEN 79 /* total number of codewords */
+#define BITS_TO_BYTES(X) ((X ? (X/8):0)+1)
+#define MOD8(X) (((X)+8) & (0x07))
+
+typedef struct node {
+ struct node *left;
+ struct node *right;
+ int run_length;
+} Node;
+
+extern const char *one_run_len_code_list[MAX_CDWDTBL_LEN];
+extern const char *zero_run_len_code_list[MAX_CDWDTBL_LEN];
+extern void *tall_pcu_ctx;
+
+int decompress_crbb(int8_t compress_bmap_len, uint8_t clr_code_bit,
+ const uint8_t *orig_buf, bitvec *dest);
+
+/* Creating singleton class
+ */
+class egprs_compress
+{
+ static egprs_compress *s_instance;
+
+ egprs_compress()
+ {
+ if (decode_tree_init() < 0) {
+ fprintf(stderr, "Error initializing tree\n");
+ exit(1);
+ }
+ }
+ Node *create_tree_node(void *);
+ void build_codeword(Node *root, const char *cdwd[]);
+ ~egprs_compress();
+public:
+ Node *ones_list;
+ Node *zeros_list;
+
+ int decode_tree_init(void);
+
+ static egprs_compress *instance()
+ {
+ if (!s_instance)
+ s_instance = new egprs_compress;
+
+ return s_instance;
+ }
+};