blob: 8a464b1f78d7db4144f40b68aedb1b2c6cc5c6a7 [file] [log] [blame]
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +01001/*
2 * TypesTest.cpp Test the primitive data types
3 *
4 * Copyright (C) 2013 by Holger Hans Peter Freyther
5 *
6 * All Rights Reserved
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU Affero General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU Affero General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22#include "bts.h"
23#include "tbf.h"
24#include "gprs_debug.h"
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +010025#include "encoding.h"
Daniel Willmannf1786a32013-12-11 18:44:49 +010026#include "decoding.h"
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +010027
28extern "C" {
29#include <osmocom/core/application.h>
30#include <osmocom/core/msgb.h>
31#include <osmocom/core/talloc.h>
32#include <osmocom/core/utils.h>
33}
34
Daniel Willmannc3f43302013-12-11 16:47:19 +010035#define OSMO_ASSERT_STR_EQ(a, b) \
36 do { \
37 if (strcmp(a, b)) { \
38 printf("String mismatch:\nGot:\t%s\nWant:\t%s\n", a, b); \
39 OSMO_ASSERT(false); \
40 } \
41 } while (0)
42
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +010043void *tall_pcu_ctx;
44int16_t spoof_mnc = 0, spoof_mcc = 0;
45
46static void test_llc(void)
47{
48 {
49 uint8_t data[LLC_MAX_LEN] = {1, 2, 3, 4, };
50 uint8_t out;
51 gprs_llc llc;
52 llc.init();
53
54 OSMO_ASSERT(llc.chunk_size() == 0);
55 OSMO_ASSERT(llc.remaining_space() == LLC_MAX_LEN);
56 OSMO_ASSERT(llc.frame_length() == 0);
57
58 llc.put_frame(data, 2);
59 OSMO_ASSERT(llc.remaining_space() == LLC_MAX_LEN - 2);
60 OSMO_ASSERT(llc.frame_length() == 2);
61 OSMO_ASSERT(llc.chunk_size() == 2);
62 OSMO_ASSERT(llc.frame[0] == 1);
63 OSMO_ASSERT(llc.frame[1] == 2);
64
65 llc.append_frame(&data[3], 1);
66 OSMO_ASSERT(llc.remaining_space() == LLC_MAX_LEN - 3);
67 OSMO_ASSERT(llc.frame_length() == 3);
68 OSMO_ASSERT(llc.chunk_size() == 3);
69
70 /* consume two bytes */
71 llc.consume(&out, 1);
72 OSMO_ASSERT(llc.remaining_space() == LLC_MAX_LEN - 3);
73 OSMO_ASSERT(llc.frame_length() == 3);
74 OSMO_ASSERT(llc.chunk_size() == 2);
75
76 /* check that the bytes are as we expected */
77 OSMO_ASSERT(llc.frame[0] == 1);
78 OSMO_ASSERT(llc.frame[1] == 2);
79 OSMO_ASSERT(llc.frame[2] == 4);
80
81 /* now fill the frame */
82 llc.append_frame(data, llc.remaining_space() - 1);
83 OSMO_ASSERT(llc.fits_in_current_frame(1));
84 OSMO_ASSERT(!llc.fits_in_current_frame(2));
85 }
86}
87
Holger Hans Peter Freytherc6382dd2013-11-21 21:42:20 +010088static void test_rlc()
89{
90 {
91 struct gprs_rlc_data rlc = { 0, };
92 memset(rlc.block, 0x23, RLC_MAX_LEN);
93 uint8_t *p = rlc.prepare(20);
94 OSMO_ASSERT(p == rlc.block);
95 for (int i = 0; i < 20; ++i)
96 OSMO_ASSERT(p[i] == 0x2B);
97 for (int i = 20; i < RLC_MAX_LEN; ++i)
98 OSMO_ASSERT(p[i] == 0x0);
99 }
100}
101
Holger Hans Peter Freyther95255672013-11-23 16:18:18 +0100102static void test_rlc_v_b()
103{
104 {
105 gprs_rlc_v_b vb;
106 vb.reset();
107
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100108 for (size_t i = 0; i < RLC_MAX_SNS; ++i)
Holger Hans Peter Freyther95255672013-11-23 16:18:18 +0100109 OSMO_ASSERT(vb.is_invalid(i));
110
111 vb.mark_unacked(23);
112 OSMO_ASSERT(vb.is_unacked(23));
113
114 vb.mark_nacked(23);
115 OSMO_ASSERT(vb.is_nacked(23));
116
117 vb.mark_acked(23);
118 OSMO_ASSERT(vb.is_acked(23));
119
120 vb.mark_resend(23);
121 OSMO_ASSERT(vb.is_resend(23));
122
123 vb.mark_invalid(23);
124 OSMO_ASSERT(vb.is_invalid(23));
125 }
126}
127
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100128static void test_rlc_v_n()
129{
130 {
131 gprs_rlc_v_n vn;
132 vn.reset();
133
134 OSMO_ASSERT(!vn.is_received(0x23));
Daniel Willmannd54d9f52013-12-28 21:16:13 +0100135 OSMO_ASSERT(vn.state(0x23) == GPRS_RLC_UL_BSN_INVALID);
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100136
137 vn.mark_received(0x23);
138 OSMO_ASSERT(vn.is_received(0x23));
Daniel Willmannd54d9f52013-12-28 21:16:13 +0100139 OSMO_ASSERT(vn.state(0x23) == GPRS_RLC_UL_BSN_RECEIVED);
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100140
141 vn.mark_missing(0x23);
142 OSMO_ASSERT(!vn.is_received(0x23));
Daniel Willmannd54d9f52013-12-28 21:16:13 +0100143 OSMO_ASSERT(vn.state(0x23) == GPRS_RLC_UL_BSN_MISSING);
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100144 }
145}
146
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100147static void test_rlc_dl_ul_basic()
148{
149 {
150 gprs_rlc_dl_window dl_win = { 0, };
151 OSMO_ASSERT(dl_win.window_empty());
152 OSMO_ASSERT(!dl_win.window_stalled());
153 OSMO_ASSERT(dl_win.distance() == 0);
154
155 dl_win.increment_send();
156 OSMO_ASSERT(!dl_win.window_empty());
157 OSMO_ASSERT(!dl_win.window_stalled());
158 OSMO_ASSERT(dl_win.distance() == 1);
159
160 for (int i = 1; i < 64; ++i) {
161 dl_win.increment_send();
162 OSMO_ASSERT(!dl_win.window_empty());
163 OSMO_ASSERT(dl_win.distance() == i + 1);
164 }
165
166 OSMO_ASSERT(dl_win.distance() == 64);
167 OSMO_ASSERT(dl_win.window_stalled());
168
169 dl_win.raise(1);
170 OSMO_ASSERT(dl_win.distance() == 63);
171 OSMO_ASSERT(!dl_win.window_stalled());
172 for (int i = 62; i >= 0; --i) {
173 dl_win.raise(1);
174 OSMO_ASSERT(dl_win.distance() == i);
175 }
176
177 OSMO_ASSERT(dl_win.distance() == 0);
178 OSMO_ASSERT(dl_win.window_empty());
179
180 dl_win.increment_send();
181 dl_win.increment_send();
182 dl_win.increment_send();
183 dl_win.increment_send();
184 OSMO_ASSERT(dl_win.distance() == 4);
185
186 for (int i = 0; i < 128; ++i) {
187 dl_win.increment_send();
188 dl_win.increment_send();
189 dl_win.raise(2);
190 OSMO_ASSERT(dl_win.distance() == 4);
191 }
192 }
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100193
194 {
195 gprs_rlc_ul_window ul_win = { 0, };
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100196 int count;
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100197 const char *rbb;
Daniel Willmannc3f43302013-12-11 16:47:19 +0100198 char win_rbb[65];
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100199 uint8_t bin_rbb[8];
Daniel Willmannc3f43302013-12-11 16:47:19 +0100200 win_rbb[64] = '\0';
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100201
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100202 ul_win.m_v_n.reset();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100203
204 OSMO_ASSERT(ul_win.is_in_window(0));
205 OSMO_ASSERT(ul_win.is_in_window(63));
206 OSMO_ASSERT(!ul_win.is_in_window(64));
207
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100208 OSMO_ASSERT(!ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100209
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100210 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
211 OSMO_ASSERT(ul_win.ssn() == 0);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100212 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100213 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100214 Encoding::encode_rbb(win_rbb, bin_rbb);
215 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100216 Decoding::extract_rbb(bin_rbb, win_rbb);
217 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100218
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100219 /* simulate to have received 0, 1 and 5 */
220 OSMO_ASSERT(ul_win.is_in_window(0));
Daniel Willmann55844792013-12-28 14:41:00 +0100221 count = ul_win.receive_bsn(0);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100222 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100223 OSMO_ASSERT(ul_win.v_q() == 1);
224 OSMO_ASSERT(ul_win.v_r() == 1);
225 OSMO_ASSERT(count == 1);
226
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100227 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIR";
228 OSMO_ASSERT(ul_win.ssn() == 1);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100229 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100230 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100231 Encoding::encode_rbb(win_rbb, bin_rbb);
232 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100233 Decoding::extract_rbb(bin_rbb, win_rbb);
234 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100235
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100236 OSMO_ASSERT(ul_win.is_in_window(1));
Daniel Willmann55844792013-12-28 14:41:00 +0100237 count = ul_win.receive_bsn(1);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100238 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100239 OSMO_ASSERT(ul_win.v_q() == 2);
240 OSMO_ASSERT(ul_win.v_r() == 2);
241 OSMO_ASSERT(count == 1);
242
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100243 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRR";
244 OSMO_ASSERT(ul_win.ssn() == 2);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100245 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100246 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100247 Encoding::encode_rbb(win_rbb, bin_rbb);
248 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100249 Decoding::extract_rbb(bin_rbb, win_rbb);
250 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100251
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100252 OSMO_ASSERT(ul_win.is_in_window(5));
Daniel Willmann55844792013-12-28 14:41:00 +0100253 count = ul_win.receive_bsn(5);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100254 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100255 OSMO_ASSERT(ul_win.v_q() == 2);
256 OSMO_ASSERT(ul_win.v_r() == 6);
257 OSMO_ASSERT(count == 0);
258
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100259 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRIIIR";
260 OSMO_ASSERT(ul_win.ssn() == 6);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100261 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100262 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100263 Encoding::encode_rbb(win_rbb, bin_rbb);
264 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100265 Decoding::extract_rbb(bin_rbb, win_rbb);
266 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100267
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100268 OSMO_ASSERT(ul_win.is_in_window(65));
269 OSMO_ASSERT(ul_win.is_in_window(2));
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100270 OSMO_ASSERT(ul_win.m_v_n.is_received(5));
Daniel Willmann55844792013-12-28 14:41:00 +0100271 count = ul_win.receive_bsn(65);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100272 OSMO_ASSERT(count == 0);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100273 OSMO_ASSERT(ul_win.m_v_n.is_received(5));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100274 OSMO_ASSERT(ul_win.v_q() == 2);
275 OSMO_ASSERT(ul_win.v_r() == 66);
276
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100277 rbb = "IIIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIR";
278 OSMO_ASSERT(ul_win.ssn() == 66);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100279 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100280 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100281 Encoding::encode_rbb(win_rbb, bin_rbb);
282 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100283 Decoding::extract_rbb(bin_rbb, win_rbb);
284 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100285
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100286 OSMO_ASSERT(ul_win.is_in_window(2));
287 OSMO_ASSERT(!ul_win.is_in_window(66));
Daniel Willmann55844792013-12-28 14:41:00 +0100288 count = ul_win.receive_bsn(2);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100289 OSMO_ASSERT(count == 1);
290 OSMO_ASSERT(ul_win.v_q() == 3);
291 OSMO_ASSERT(ul_win.v_r() == 66);
292
293 OSMO_ASSERT(ul_win.is_in_window(66));
Daniel Willmann55844792013-12-28 14:41:00 +0100294 count = ul_win.receive_bsn(66);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100295 OSMO_ASSERT(count == 0);
296 OSMO_ASSERT(ul_win.v_q() == 3);
297 OSMO_ASSERT(ul_win.v_r() == 67);
298
299 for (int i = 3; i <= 67; ++i) {
Daniel Willmann55844792013-12-28 14:41:00 +0100300 ul_win.receive_bsn(i);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100301 }
302
303 OSMO_ASSERT(ul_win.v_q() == 68);
304 OSMO_ASSERT(ul_win.v_r() == 68);
305
Daniel Willmann55844792013-12-28 14:41:00 +0100306 count = ul_win.receive_bsn(68);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100307 OSMO_ASSERT(ul_win.v_q() == 69);
308 OSMO_ASSERT(ul_win.v_r() == 69);
309 OSMO_ASSERT(count == 1);
310
311 /* now test the wrapping */
312 OSMO_ASSERT(ul_win.is_in_window(4));
313 OSMO_ASSERT(!ul_win.is_in_window(5));
Daniel Willmann55844792013-12-28 14:41:00 +0100314 count = ul_win.receive_bsn(4);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100315 OSMO_ASSERT(count == 0);
316 }
Daniel Willmann48df40d2013-12-11 16:51:26 +0100317
318 {
319 int count;
320 uint8_t rbb[8];
321 uint16_t lost = 0, recv = 0;
322 char show_rbb[65];
323 BTS dummy_bts;
324 gprs_rlc_dl_window dl_win = { 0, };
Daniel Willmann48df40d2013-12-11 16:51:26 +0100325
Daniel Willmann146514e2013-12-28 18:24:42 +0100326 dl_win.m_v_b.reset();
Daniel Willmann48df40d2013-12-11 16:51:26 +0100327
328 OSMO_ASSERT(dl_win.window_empty());
329 OSMO_ASSERT(!dl_win.window_stalled());
330 OSMO_ASSERT(dl_win.distance() == 0);
331
332 dl_win.increment_send();
333 OSMO_ASSERT(!dl_win.window_empty());
334 OSMO_ASSERT(!dl_win.window_stalled());
335 OSMO_ASSERT(dl_win.distance() == 1);
336
337 for (int i = 0; i < 35; ++i) {
338 dl_win.increment_send();
339 OSMO_ASSERT(!dl_win.window_empty());
340 OSMO_ASSERT(dl_win.distance() == i + 2);
341 }
342
343 uint8_t rbb_cmp[8] = { 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff };
344 Decoding::extract_rbb(rbb_cmp, show_rbb);
345 printf("show_rbb: %s\n", show_rbb);
346
Daniel Willmann146514e2013-12-28 18:24:42 +0100347 dl_win.update(&dummy_bts, show_rbb, 35, &lost, &recv);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100348 OSMO_ASSERT(lost == 0);
349 OSMO_ASSERT(recv == 35);
350
351 }
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100352}
353
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100354int main(int argc, char **argv)
355{
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100356 osmo_init_logging(&gprs_log_info);
357 log_set_use_color(osmo_stderr_target, 0);
358 log_set_print_filename(osmo_stderr_target, 0);
359
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100360 printf("Making some basic type testing.\n");
361 test_llc();
Holger Hans Peter Freytherc6382dd2013-11-21 21:42:20 +0100362 test_rlc();
Holger Hans Peter Freyther95255672013-11-23 16:18:18 +0100363 test_rlc_v_b();
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100364 test_rlc_v_n();
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100365 test_rlc_dl_ul_basic();
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100366 return EXIT_SUCCESS;
367}
368
369/*
370 * stubs that should not be reached
371 */
372extern "C" {
373void l1if_pdch_req() { abort(); }
374void l1if_connect_pdch() { abort(); }
375void l1if_close_pdch() { abort(); }
376void l1if_open_pdch() { abort(); }
377}