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/.
sangamesh sajjan sangamesh.sajjan at radisys.comThis patch includes the changes to build the tree of code words to save run length during BTS initialization --- src/egprs_rlc_compression.cpp | 51 +++++++++++++++++++++++++++++++++++++++++ src/egprs_rlc_compression.h | 37 +++++++++++++++++++++++++++++- src/pcu_main.cpp | 3 +++ 3 files changed, 90 insertions(+), 1 deletion(-) diff --git a/src/egprs_rlc_compression.cpp b/src/egprs_rlc_compression.cpp index 55ff595..4c17a17 100644 --- a/src/egprs_rlc_compression.cpp +++ b/src/egprs_rlc_compression.cpp @@ -3,6 +3,57 @@ */ #include <egprs_rlc_compression.h> #include <errno.h> +#include <decoding.h> + +egprs_compress *egprs_compress::s_instance = 0; +Node *egprs_compress::ones_list = NULL; +Node *egprs_compress::zeros_list = NULL; + +void egprs_compress::build_codeword(Node *root, const char *cdwd[]) +{ + Node *iter; /* iterate the node on the tree */ + int len; /* length of the code word */ + int i; /* iterater */ + uint16_t idx; /* interate index of the code word table */ + + root->left = NULL; + root->right = NULL; + root->run_length = NULL; + + for (idx = 0; idx < MAX_CDWDTBL_LEN; idx++) { + len = strlen((const char *)cdwd[idx]); + iter = root; + for (i = 0; i < len; i++) { + if (cdwd[idx][i] == '0') { + if (iter->left == NULL) { + iter->left = (Node *)malloc(sizeof(Node)); + /* create a clean node */ + iter->left->left = NULL; + iter->left->right = NULL; + iter->left->run_length = NULL; + } + iter = iter->left; + } else if (cdwd[idx][i] == '1') { + if (iter->right == NULL) { + iter->right = (Node *)malloc(sizeof(Node)); + /* create a clean node */ + iter->right->left = NULL; + iter->right->right = NULL; + iter->right->run_length = NULL; + } + iter = iter->right; + } + } + if (iter != NULL) { + iter->run_length = (uint16_t *)malloc(sizeof(uint16_t)); + *(iter->run_length) = (uint16_t)NULL; + if (idx < 64) + *(iter->run_length) = idx; + else + *(iter->run_length) = (idx - 63) * 64; + } + } +} const char *one_run_len_code_list[MAX_CDWDTBL_LEN] = { "00110101", diff --git a/src/egprs_rlc_compression.h b/src/egprs_rlc_compression.h index 00d850e..db1f880 100644 --- a/src/egprs_rlc_compression.h +++ b/src/egprs_rlc_compression.h @@ -15,7 +15,7 @@ extern "C" { #include <string.h> #define MAX_CDWDTBL_LEN 79 /* total number of codewords */ -#define BITS_TO_BYTES(X) (X ? (X/8):0)+1 +#define BITS_TO_BYTES(X) ((X ? (X/8):0)+1) #define MOD8(X) (((X)+8) & (0x07)) typedef struct node { @@ -23,3 +23,38 @@ typedef struct node { struct node *right; uint16_t *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]; + +/* Creating singleton class + */ +class egprs_compress +{ + static egprs_compress *s_instance; + + egprs_compress() + { + egprs_compress::ones_list = (Node *)malloc(sizeof(Node)); + egprs_compress::zeros_list = (Node *)malloc(sizeof(Node)); + } + void build_codeword(Node *root, const char *cdwd[]); +public: + static Node *ones_list; + static Node *zeros_list; + + void decode_tree_init(void) + { + egprs_compress::instance()->build_codeword( + egprs_compress::ones_list, one_run_len_code_list); + egprs_compress::instance()->build_codeword( + egprs_compress::zeros_list, zero_run_len_code_list); + } + static egprs_compress *instance() + { + if (!s_instance) + s_instance = new egprs_compress; + + return s_instance; + } +}; diff --git a/src/pcu_main.cpp b/src/pcu_main.cpp index f66c631..642ab33 100644 --- a/src/pcu_main.cpp +++ b/src/pcu_main.cpp @@ -28,6 +28,7 @@ #include <signal.h> #include <sched.h> #include <bts.h> +#include <egprs_rlc_compression.h> extern "C" { #include "pcu_vty.h" #include <osmocom/vty/telnet_interface.h> @@ -253,6 +254,8 @@ int main(int argc, char *argv[]) if (!bts->alloc_algorithm) bts->alloc_algorithm = alloc_algorithm_dynamic; + egprs_compress::instance()->decode_tree_init(); + rc = pcu_l1if_open(); if (rc < 0) -- 1.7.9.5