blob: 69ef5111c3ff376e3aa25238a1ae5e2179ceeca2 [file] [log] [blame]
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +05301#include <stdint.h>
2#include <string.h>
3
4#include "rlc.h"
5#include "gprs_debug.h"
6#include <gprs_rlcmac.h>
7#include "egprs_rlc_compression.h"
8
9extern "C" {
10#include <osmocom/core/logging.h>
11#include <osmocom/core/bitvec.h>
12#include <osmocom/core/utils.h>
13#include <osmocom/core/application.h>
14}
15
16#define NEW 1
17#define MASK(n) (0xFF << (8-n))
18#define MAX_CRBB_LEN 23
19#define MAX_URBB_LEN 40
Neels Hofmeyr77839642017-03-26 23:12:26 +020020#define CEIL_DIV_8(x) (((x) + 7)/8)
Neels Hofmeyrdd1700a2017-03-26 23:21:16 +020021#define _LOG(fmt, args...) \
22 fprintf(stderr, fmt, ## args)
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053023
24void *tall_pcu_ctx;
25
26struct test_data {
27 int8_t crbb_len;
28 uint8_t cc;
29 uint8_t crbb_data[MAX_CRBB_LEN]; /* compressed data */
30 uint8_t ucmp_data[MAX_URBB_LEN]; /* uncompressed data */
31 int ucmp_len;
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +020032 int expect_rc;
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053033} test[] = {
34 { .crbb_len = 67, .cc = 1,
35 .crbb_data = {
36 0x02, 0x0c, 0xa0, 0x30, 0xcb, 0x1a, 0x0c, 0xe3, 0x6c
37 },
38 .ucmp_data = {
39 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff,
40 0xff, 0xf8, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe,
Neels Hofmeyr5382e0f2017-03-26 23:39:44 +020041 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053042 },
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +020043 .ucmp_len = 194,
44 .expect_rc = 0,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053045 },
46 { .crbb_len = 40, .cc = 1,
47 .crbb_data = {
48 0x53, 0x06, 0xc5, 0x40, 0x6d
49 },
50 .ucmp_data = {
51 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00,
52 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
Neels Hofmeyr5382e0f2017-03-26 23:39:44 +020053 0x00, 0x00, 0x00, 0x00, 0x00
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053054 },
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +020055 .ucmp_len = 182,
56 .expect_rc = 0,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053057 },
58 { .crbb_len = 8, .cc = 1,
59 .crbb_data = {0x02},
60 .ucmp_data = {0xff, 0xff, 0xff, 0xf8},
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +020061 .ucmp_len = 29,
62 .expect_rc = 0,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053063 },
64 { .crbb_len = 103, .cc = 1,
65 .crbb_data = {
66 0x02, 0x0c, 0xe0, 0x41, 0xa0, 0x0c, 0x36, 0x0d, 0x03,
67 0x71, 0xb0, 0x6e, 0x24
68 },
69 .ucmp_data = {
70 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff,
71 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00,
72 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff,
73 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff
74 },
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +020075 .ucmp_len = 288,
76 .expect_rc = 0,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053077 },
78 /* Test vector from libosmocore test */
79 { .crbb_len = 35, .cc = 0,
80 .crbb_data = {0xde, 0x88, 0x75, 0x65, 0x80},
81 .ucmp_data = {0x37, 0x47, 0x81, 0xf0},
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +020082 .ucmp_len = 28,
83 .expect_rc = 0,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053084 },
85 { .crbb_len = 18, .cc = 1,
86 .crbb_data = {0xdd, 0x41, 0x00},
87 .ucmp_data = {
88 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
89 0xff, 0x00, 0x00
90 },
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +020091 .ucmp_len = 90,
92 .expect_rc = 0,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053093 },
Alexander Couzens2d24eba2019-06-17 01:41:29 +020094 /* Invalid inputs */
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +053095 { .crbb_len = 18, .cc = 1,
96 .crbb_data = {0x1E, 0x70, 0xc0},
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +020097 .ucmp_data = {0xb0, 0x00, 0x00},
98 .ucmp_len = 19,
Alexander Couzens2d24eba2019-06-17 01:41:29 +020099 .expect_rc = -1,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530100 },
101 { .crbb_len = 14, .cc = 1,
102 .crbb_data = {0x00, 0x1E, 0x7c},
103 .ucmp_data = {0x0},
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +0200104 .ucmp_len = 0,
105 .expect_rc = -1,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530106 },
107 { .crbb_len = 24, .cc = 0,
108 .crbb_data = {0x00, 0x00, 0x00},
109 .ucmp_data = {0x0},
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +0200110 .ucmp_len = 0,
111 .expect_rc = -1,
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530112 }
113 };
114
Neels Hofmeyr77839642017-03-26 23:12:26 +0200115bool result_matches(const bitvec &bits, const uint8_t *exp_data, unsigned int exp_len)
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530116{
117 if (bits.cur_bit != exp_len)
Neels Hofmeyr77839642017-03-26 23:12:26 +0200118 return false;
Neels Hofmeyr5382e0f2017-03-26 23:39:44 +0200119 return (memcmp(exp_data, bits.data, CEIL_DIV_8(exp_len)) == 0);
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530120}
121
122/* To test decoding of compressed bitmap by Tree based method
123 * and to verify the result with expected result
124 * for invalid input verfication is suppressed
125 */
126static void test_EPDAN_decode_tree(void)
127{
128 bitvec dest;
Neels Hofmeyrd34646a2017-02-08 17:07:40 +0100129 unsigned int itr;
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530130 int rc;
131 uint8_t bits_data[RLC_EGPRS_MAX_WS/8];
132
133 printf("=== start %s ===\n", __func__);
134
135 for (itr = 0 ; itr < (sizeof(test) / sizeof(test_data)) ; itr++) {
Neels Hofmeyr77839642017-03-26 23:12:26 +0200136 memset(bits_data, 0, sizeof(bits_data));
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530137 dest.data = bits_data;
138 dest.data_len = sizeof(bits_data);
139 dest.cur_bit = 0;
Neels Hofmeyrdd1700a2017-03-26 23:21:16 +0200140 _LOG("\nTest:%d\n"
Neels Hofmeyr77839642017-03-26 23:12:26 +0200141 "Tree based decoding:\n"
Alexander Couzens7fe38952019-06-17 01:42:56 +0200142 "compressed data = %s\n"
Neels Hofmeyr77839642017-03-26 23:12:26 +0200143 "len = %d\n",
144 itr + 1,
145 osmo_hexdump(test[itr].crbb_data,
146 CEIL_DIV_8(test[itr].crbb_len)),
147 test[itr].crbb_len);
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530148 rc = egprs_compress::decompress_crbb(test[itr].crbb_len,
149 test[itr].cc, test[itr].crbb_data, &dest);
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +0200150 _LOG("rc = %d\n", rc);
151 OSMO_ASSERT(test[itr].expect_rc == rc);
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530152 if (rc < 0) {
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +0200153 _LOG("Failed to decode CRBB: length %d, data %s\n",
Neels Hofmeyr77839642017-03-26 23:12:26 +0200154 test[itr].crbb_len,
155 osmo_hexdump(test[itr].crbb_data,
156 CEIL_DIV_8(test[itr].crbb_len)));
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +0200157 continue;
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530158 }
Neels Hofmeyre6d26ec2017-03-27 00:13:14 +0200159 if (!result_matches(dest, test[itr].ucmp_data,
160 test[itr].ucmp_len)) {
161 _LOG("\nTree based decoding: Error\n"
162 "expected data = %s\n"
163 "expected len = %d\n",
164 osmo_hexdump(test[itr].ucmp_data,
165 CEIL_DIV_8(test[itr].ucmp_len)),
166 test[itr].ucmp_len);
167 _LOG("decoded data = %s\n"
168 "decoded len = %d\n",
169 osmo_hexdump(dest.data,
170 CEIL_DIV_8(dest.cur_bit)),
171 dest.cur_bit);
172 OSMO_ASSERT(0);
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530173 }
Neels Hofmeyrdd1700a2017-03-26 23:21:16 +0200174 _LOG("\nexpected data = %s\n"
175 "expected len = %d\n",
Neels Hofmeyr77839642017-03-26 23:12:26 +0200176 osmo_hexdump(test[itr].ucmp_data,
177 CEIL_DIV_8(test[itr].ucmp_len)),
Neels Hofmeyrdd1700a2017-03-26 23:21:16 +0200178 test[itr].ucmp_len);
179 _LOG("decoded data = %s\n"
180 "decoded len = %d\n",
Neels Hofmeyr77839642017-03-26 23:12:26 +0200181 osmo_hexdump(dest.data, CEIL_DIV_8(dest.cur_bit)),
182 dest.cur_bit);
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530183 }
184
185 printf("=== end %s ===\n", __func__);
186}
187
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530188int main(int argc, char **argv)
189{
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530190 tall_pcu_ctx = talloc_named_const(NULL, 1, "moiji-mobile bitcompTest context");
191 if (!tall_pcu_ctx)
192 abort();
193
Neels Hofmeyr42f2d612018-04-01 16:54:40 +0200194 osmo_init_logging2(tall_pcu_ctx, &gprs_log_info);
195 log_set_use_color(osmo_stderr_target, 0);
Pau Espin Pedrol00f52cc2021-02-19 14:01:52 +0100196 log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
Pau Espin Pedrolb18d2a52021-02-19 14:00:48 +0100197 log_set_print_category(osmo_stderr_target, 0);
198 log_set_print_category_hex(osmo_stderr_target, 0);
Neels Hofmeyr42f2d612018-04-01 16:54:40 +0200199 log_parse_category_mask(osmo_stderr_target, "DRLCMACUL,1");
200
Pravin Kumarvel0a4a6c12016-10-17 11:00:57 +0530201 test_EPDAN_decode_tree();
202
203 if (getenv("TALLOC_REPORT_FULL"))
204 talloc_report_full(tall_pcu_ctx, stderr);
205 talloc_free(tall_pcu_ctx);
206 return EXIT_SUCCESS;
207}
208
209/*
210 * stubs that should not be reached
211 */
212extern "C" {
213void l1if_pdch_req() { abort(); }
214void l1if_connect_pdch() { abort(); }
215void l1if_close_pdch() { abort(); }
216void l1if_open_pdch() { abort(); }
217}