blob: 3a43897b21bc7e879e6391f9e3327a8a2f3b8d1b [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"
Max20c7c462017-12-22 14:20:05 +010024#include "pcu_utils.h"
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +010025#include "gprs_debug.h"
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +010026#include "encoding.h"
Daniel Willmannf1786a32013-12-11 18:44:49 +010027#include "decoding.h"
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +010028
29extern "C" {
30#include <osmocom/core/application.h>
31#include <osmocom/core/msgb.h>
32#include <osmocom/core/talloc.h>
33#include <osmocom/core/utils.h>
Max20c7c462017-12-22 14:20:05 +010034#include <osmocom/core/bits.h>
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +010035}
36
Daniel Willmannc3f43302013-12-11 16:47:19 +010037#define OSMO_ASSERT_STR_EQ(a, b) \
38 do { \
39 if (strcmp(a, b)) { \
40 printf("String mismatch:\nGot:\t%s\nWant:\t%s\n", a, b); \
41 OSMO_ASSERT(false); \
42 } \
43 } while (0)
44
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +010045void *tall_pcu_ctx;
46int16_t spoof_mnc = 0, spoof_mcc = 0;
Neels Hofmeyrbdc55fa2018-02-21 00:39:07 +010047bool spoof_mnc_3_digits = false;
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +010048
49static void test_llc(void)
50{
51 {
52 uint8_t data[LLC_MAX_LEN] = {1, 2, 3, 4, };
53 uint8_t out;
54 gprs_llc llc;
55 llc.init();
56
57 OSMO_ASSERT(llc.chunk_size() == 0);
58 OSMO_ASSERT(llc.remaining_space() == LLC_MAX_LEN);
59 OSMO_ASSERT(llc.frame_length() == 0);
60
61 llc.put_frame(data, 2);
62 OSMO_ASSERT(llc.remaining_space() == LLC_MAX_LEN - 2);
63 OSMO_ASSERT(llc.frame_length() == 2);
64 OSMO_ASSERT(llc.chunk_size() == 2);
65 OSMO_ASSERT(llc.frame[0] == 1);
66 OSMO_ASSERT(llc.frame[1] == 2);
67
68 llc.append_frame(&data[3], 1);
69 OSMO_ASSERT(llc.remaining_space() == LLC_MAX_LEN - 3);
70 OSMO_ASSERT(llc.frame_length() == 3);
71 OSMO_ASSERT(llc.chunk_size() == 3);
72
73 /* consume two bytes */
74 llc.consume(&out, 1);
75 OSMO_ASSERT(llc.remaining_space() == LLC_MAX_LEN - 3);
76 OSMO_ASSERT(llc.frame_length() == 3);
77 OSMO_ASSERT(llc.chunk_size() == 2);
78
79 /* check that the bytes are as we expected */
80 OSMO_ASSERT(llc.frame[0] == 1);
81 OSMO_ASSERT(llc.frame[1] == 2);
82 OSMO_ASSERT(llc.frame[2] == 4);
83
84 /* now fill the frame */
85 llc.append_frame(data, llc.remaining_space() - 1);
86 OSMO_ASSERT(llc.fits_in_current_frame(1));
87 OSMO_ASSERT(!llc.fits_in_current_frame(2));
88 }
89}
90
Holger Hans Peter Freytherc6382dd2013-11-21 21:42:20 +010091static void test_rlc()
92{
93 {
94 struct gprs_rlc_data rlc = { 0, };
95 memset(rlc.block, 0x23, RLC_MAX_LEN);
96 uint8_t *p = rlc.prepare(20);
97 OSMO_ASSERT(p == rlc.block);
98 for (int i = 0; i < 20; ++i)
99 OSMO_ASSERT(p[i] == 0x2B);
100 for (int i = 20; i < RLC_MAX_LEN; ++i)
101 OSMO_ASSERT(p[i] == 0x0);
102 }
103}
104
Holger Hans Peter Freyther95255672013-11-23 16:18:18 +0100105static void test_rlc_v_b()
106{
107 {
108 gprs_rlc_v_b vb;
109 vb.reset();
110
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100111 for (size_t i = 0; i < RLC_MAX_SNS; ++i)
Holger Hans Peter Freyther95255672013-11-23 16:18:18 +0100112 OSMO_ASSERT(vb.is_invalid(i));
113
114 vb.mark_unacked(23);
115 OSMO_ASSERT(vb.is_unacked(23));
116
117 vb.mark_nacked(23);
118 OSMO_ASSERT(vb.is_nacked(23));
119
120 vb.mark_acked(23);
121 OSMO_ASSERT(vb.is_acked(23));
122
123 vb.mark_resend(23);
124 OSMO_ASSERT(vb.is_resend(23));
125
126 vb.mark_invalid(23);
127 OSMO_ASSERT(vb.is_invalid(23));
128 }
129}
130
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100131static void test_rlc_v_n()
132{
133 {
134 gprs_rlc_v_n vn;
135 vn.reset();
136
137 OSMO_ASSERT(!vn.is_received(0x23));
Daniel Willmannd54d9f52013-12-28 21:16:13 +0100138 OSMO_ASSERT(vn.state(0x23) == GPRS_RLC_UL_BSN_INVALID);
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100139
140 vn.mark_received(0x23);
141 OSMO_ASSERT(vn.is_received(0x23));
Daniel Willmannd54d9f52013-12-28 21:16:13 +0100142 OSMO_ASSERT(vn.state(0x23) == GPRS_RLC_UL_BSN_RECEIVED);
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100143
144 vn.mark_missing(0x23);
145 OSMO_ASSERT(!vn.is_received(0x23));
Daniel Willmannd54d9f52013-12-28 21:16:13 +0100146 OSMO_ASSERT(vn.state(0x23) == GPRS_RLC_UL_BSN_MISSING);
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100147 }
148}
149
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100150static void test_rlc_dl_ul_basic()
151{
152 {
Jacob Erlbecka3a567e2015-12-28 13:46:32 +0100153 gprs_rlc_dl_window dl_win;
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100154 OSMO_ASSERT(dl_win.window_empty());
155 OSMO_ASSERT(!dl_win.window_stalled());
156 OSMO_ASSERT(dl_win.distance() == 0);
157
158 dl_win.increment_send();
159 OSMO_ASSERT(!dl_win.window_empty());
160 OSMO_ASSERT(!dl_win.window_stalled());
161 OSMO_ASSERT(dl_win.distance() == 1);
162
163 for (int i = 1; i < 64; ++i) {
164 dl_win.increment_send();
165 OSMO_ASSERT(!dl_win.window_empty());
166 OSMO_ASSERT(dl_win.distance() == i + 1);
167 }
168
169 OSMO_ASSERT(dl_win.distance() == 64);
170 OSMO_ASSERT(dl_win.window_stalled());
171
172 dl_win.raise(1);
173 OSMO_ASSERT(dl_win.distance() == 63);
174 OSMO_ASSERT(!dl_win.window_stalled());
175 for (int i = 62; i >= 0; --i) {
176 dl_win.raise(1);
177 OSMO_ASSERT(dl_win.distance() == i);
178 }
179
180 OSMO_ASSERT(dl_win.distance() == 0);
181 OSMO_ASSERT(dl_win.window_empty());
182
183 dl_win.increment_send();
184 dl_win.increment_send();
185 dl_win.increment_send();
186 dl_win.increment_send();
187 OSMO_ASSERT(dl_win.distance() == 4);
188
189 for (int i = 0; i < 128; ++i) {
190 dl_win.increment_send();
191 dl_win.increment_send();
192 dl_win.raise(2);
193 OSMO_ASSERT(dl_win.distance() == 4);
194 }
195 }
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100196
197 {
Jacob Erlbecka3a567e2015-12-28 13:46:32 +0100198 gprs_rlc_ul_window ul_win;
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100199 int count;
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100200 const char *rbb;
Daniel Willmannc3f43302013-12-11 16:47:19 +0100201 char win_rbb[65];
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100202 uint8_t bin_rbb[8];
Daniel Willmannc3f43302013-12-11 16:47:19 +0100203 win_rbb[64] = '\0';
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100204
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100205 ul_win.m_v_n.reset();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100206
207 OSMO_ASSERT(ul_win.is_in_window(0));
208 OSMO_ASSERT(ul_win.is_in_window(63));
209 OSMO_ASSERT(!ul_win.is_in_window(64));
210
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100211 OSMO_ASSERT(!ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100212
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100213 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
214 OSMO_ASSERT(ul_win.ssn() == 0);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100215 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100216 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100217 Encoding::encode_rbb(win_rbb, bin_rbb);
218 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100219 Decoding::extract_rbb(bin_rbb, win_rbb);
220 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100221
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100222 /* simulate to have received 0, 1 and 5 */
223 OSMO_ASSERT(ul_win.is_in_window(0));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100224 ul_win.receive_bsn(0);
225 count = ul_win.raise_v_q();
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100226 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100227 OSMO_ASSERT(ul_win.v_q() == 1);
228 OSMO_ASSERT(ul_win.v_r() == 1);
229 OSMO_ASSERT(count == 1);
230
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100231 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIR";
232 OSMO_ASSERT(ul_win.ssn() == 1);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100233 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100234 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100235 Encoding::encode_rbb(win_rbb, bin_rbb);
236 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100237 Decoding::extract_rbb(bin_rbb, win_rbb);
238 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100239
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100240 OSMO_ASSERT(ul_win.is_in_window(1));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100241 ul_win.receive_bsn(1);
242 count = ul_win.raise_v_q();
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100243 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100244 OSMO_ASSERT(ul_win.v_q() == 2);
245 OSMO_ASSERT(ul_win.v_r() == 2);
246 OSMO_ASSERT(count == 1);
247
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100248 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRR";
249 OSMO_ASSERT(ul_win.ssn() == 2);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100250 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100251 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100252 Encoding::encode_rbb(win_rbb, bin_rbb);
253 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100254 Decoding::extract_rbb(bin_rbb, win_rbb);
255 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100256
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100257 OSMO_ASSERT(ul_win.is_in_window(5));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100258 ul_win.receive_bsn(5);
259 count = ul_win.raise_v_q();
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100260 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100261 OSMO_ASSERT(ul_win.v_q() == 2);
262 OSMO_ASSERT(ul_win.v_r() == 6);
263 OSMO_ASSERT(count == 0);
264
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100265 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRIIIR";
266 OSMO_ASSERT(ul_win.ssn() == 6);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100267 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100268 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100269 Encoding::encode_rbb(win_rbb, bin_rbb);
270 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100271 Decoding::extract_rbb(bin_rbb, win_rbb);
272 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100273
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100274 OSMO_ASSERT(ul_win.is_in_window(65));
275 OSMO_ASSERT(ul_win.is_in_window(2));
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100276 OSMO_ASSERT(ul_win.m_v_n.is_received(5));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100277 ul_win.receive_bsn(65);
278 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100279 OSMO_ASSERT(count == 0);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100280 OSMO_ASSERT(ul_win.m_v_n.is_received(5));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100281 OSMO_ASSERT(ul_win.v_q() == 2);
282 OSMO_ASSERT(ul_win.v_r() == 66);
283
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100284 rbb = "IIIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIR";
285 OSMO_ASSERT(ul_win.ssn() == 66);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100286 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100287 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100288 Encoding::encode_rbb(win_rbb, bin_rbb);
289 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100290 Decoding::extract_rbb(bin_rbb, win_rbb);
291 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100292
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100293 OSMO_ASSERT(ul_win.is_in_window(2));
294 OSMO_ASSERT(!ul_win.is_in_window(66));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100295 ul_win.receive_bsn(2);
296 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100297 OSMO_ASSERT(count == 1);
298 OSMO_ASSERT(ul_win.v_q() == 3);
299 OSMO_ASSERT(ul_win.v_r() == 66);
300
301 OSMO_ASSERT(ul_win.is_in_window(66));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100302 ul_win.receive_bsn(66);
303 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100304 OSMO_ASSERT(count == 0);
305 OSMO_ASSERT(ul_win.v_q() == 3);
306 OSMO_ASSERT(ul_win.v_r() == 67);
307
308 for (int i = 3; i <= 67; ++i) {
Daniel Willmann55844792013-12-28 14:41:00 +0100309 ul_win.receive_bsn(i);
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100310 ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100311 }
312
313 OSMO_ASSERT(ul_win.v_q() == 68);
314 OSMO_ASSERT(ul_win.v_r() == 68);
315
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100316 ul_win.receive_bsn(68);
317 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100318 OSMO_ASSERT(ul_win.v_q() == 69);
319 OSMO_ASSERT(ul_win.v_r() == 69);
320 OSMO_ASSERT(count == 1);
321
322 /* now test the wrapping */
323 OSMO_ASSERT(ul_win.is_in_window(4));
324 OSMO_ASSERT(!ul_win.is_in_window(5));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100325 ul_win.receive_bsn(4);
326 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100327 OSMO_ASSERT(count == 0);
Aravind Sirsikara35c9112016-08-30 13:00:14 +0530328
329 /*
330 * SSN wrap around case
Aravind Sirsikar7c7a86c2016-08-30 13:08:28 +0530331 * Should not expect any BSN as nacked.
Aravind Sirsikara35c9112016-08-30 13:00:14 +0530332 */
Aravind Sirsikar7c7a86c2016-08-30 13:08:28 +0530333 rbb = "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR";
Aravind Sirsikara35c9112016-08-30 13:00:14 +0530334 for (int i = 0; i < 128; ++i) {
335 ul_win.receive_bsn(i);
336 ul_win.raise_v_q();
337 }
338 ul_win.receive_bsn(0);
339 ul_win.raise_v_q();
340 ul_win.receive_bsn(1);
341 ul_win.raise_v_q();
342 ul_win.update_rbb(win_rbb);
343 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
344 OSMO_ASSERT(ul_win.ssn() == 2);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100345 }
Daniel Willmann48df40d2013-12-11 16:51:26 +0100346
347 {
Daniel Willmann48df40d2013-12-11 16:51:26 +0100348 uint16_t lost = 0, recv = 0;
349 char show_rbb[65];
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100350 uint8_t bits_data[8];
Daniel Willmann48df40d2013-12-11 16:51:26 +0100351 BTS dummy_bts;
Jacob Erlbecka3a567e2015-12-28 13:46:32 +0100352 gprs_rlc_dl_window dl_win;
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100353 bitvec bits;
354 int bsn_begin, bsn_end, num_blocks;
355 Ack_Nack_Description_t desc;
Daniel Willmann48df40d2013-12-11 16:51:26 +0100356
Daniel Willmann146514e2013-12-28 18:24:42 +0100357 dl_win.m_v_b.reset();
Daniel Willmann48df40d2013-12-11 16:51:26 +0100358
359 OSMO_ASSERT(dl_win.window_empty());
360 OSMO_ASSERT(!dl_win.window_stalled());
361 OSMO_ASSERT(dl_win.distance() == 0);
362
363 dl_win.increment_send();
364 OSMO_ASSERT(!dl_win.window_empty());
365 OSMO_ASSERT(!dl_win.window_stalled());
366 OSMO_ASSERT(dl_win.distance() == 1);
367
368 for (int i = 0; i < 35; ++i) {
369 dl_win.increment_send();
370 OSMO_ASSERT(!dl_win.window_empty());
371 OSMO_ASSERT(dl_win.distance() == i + 2);
372 }
373
374 uint8_t rbb_cmp[8] = { 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff };
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100375 bits.data = bits_data;
376 bits.data_len = sizeof(bits_data);
377 bits.cur_bit = 0;
378
379 memcpy(desc.RECEIVED_BLOCK_BITMAP, rbb_cmp,
380 sizeof(desc.RECEIVED_BLOCK_BITMAP));
381 desc.FINAL_ACK_INDICATION = 0;
382 desc.STARTING_SEQUENCE_NUMBER = 35;
383
384 num_blocks = Decoding::decode_gprs_acknack_bits(
385 &desc, &bits,
386 &bsn_begin, &bsn_end, &dl_win);
387 Decoding::extract_rbb(&bits, show_rbb);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100388 printf("show_rbb: %s\n", show_rbb);
389
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100390 dl_win.update(&dummy_bts, &bits, 0, &lost, &recv);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100391 OSMO_ASSERT(lost == 0);
392 OSMO_ASSERT(recv == 35);
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100393 OSMO_ASSERT(bsn_begin == 0);
394 OSMO_ASSERT(bsn_end == 35);
395 OSMO_ASSERT(num_blocks == 35);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100396
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100397 dl_win.raise(dl_win.move_window());
398
399 for (int i = 0; i < 8; ++i) {
400 dl_win.increment_send();
401 OSMO_ASSERT(!dl_win.window_empty());
402 OSMO_ASSERT(dl_win.distance() == 2 + i);
403 }
404
405 uint8_t rbb_cmp2[8] = { 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x31 };
406 bits.data = bits_data;
407 bits.data_len = sizeof(bits_data);
408 bits.cur_bit = 0;
409
410 memcpy(desc.RECEIVED_BLOCK_BITMAP, rbb_cmp2,
411 sizeof(desc.RECEIVED_BLOCK_BITMAP));
412 desc.FINAL_ACK_INDICATION = 0;
413 desc.STARTING_SEQUENCE_NUMBER = 35 + 8;
414
415 num_blocks = Decoding::decode_gprs_acknack_bits(
416 &desc, &bits,
417 &bsn_begin, &bsn_end, &dl_win);
418 Decoding::extract_rbb(&bits, show_rbb);
419 printf("show_rbb: %s\n", show_rbb);
420
421 lost = recv = 0;
422 dl_win.update(&dummy_bts, &bits, 0, &lost, &recv);
423 OSMO_ASSERT(lost == 5);
424 OSMO_ASSERT(recv == 3);
425 OSMO_ASSERT(bitvec_get_bit_pos(&bits, 0) == 0);
426 OSMO_ASSERT(bitvec_get_bit_pos(&bits, 7) == 1);
427 OSMO_ASSERT(bsn_begin == 35);
428 OSMO_ASSERT(bsn_end == 43);
429 OSMO_ASSERT(num_blocks == 8);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100430 }
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100431}
432
aravind sirsikarc0c3afd2016-11-09 16:27:00 +0530433void test_immediate_assign_rej()
434{
435 uint8_t plen;
Alexander Couzensccde5c92017-02-04 03:10:08 +0100436 bitvec *immediate_assignment_rej = bitvec_alloc(22, tall_pcu_ctx);
aravind sirsikarc0c3afd2016-11-09 16:27:00 +0530437
438 bitvec_unhex(immediate_assignment_rej,
439 "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
440 plen = Encoding::write_immediate_assignment_reject(
441 immediate_assignment_rej, 112, 100,
442 GSM_L1_BURST_TYPE_ACCESS_1);
443
444 printf("assignment reject: %s\n",
445 osmo_hexdump(immediate_assignment_rej->data, 22));
446
447 OSMO_ASSERT(plen == 19);
448 /* RA value */
449 OSMO_ASSERT(immediate_assignment_rej->data[3] == 0x7f);
450 /* Extended RA value */
451 OSMO_ASSERT(immediate_assignment_rej->data[19] == 0xc0);
452
453 bitvec_unhex(immediate_assignment_rej,
454 "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
455
456 plen = Encoding::write_immediate_assignment_reject(
457 immediate_assignment_rej, 112, 100,
458 GSM_L1_BURST_TYPE_ACCESS_0);
459
460 printf("assignment reject: %s\n",
461 osmo_hexdump(immediate_assignment_rej->data, 22));
462
463 OSMO_ASSERT(plen == 19);
464 /* RA value */
465 OSMO_ASSERT(immediate_assignment_rej->data[3] == 0x70);
466
467}
468
Max20c7c462017-12-22 14:20:05 +0100469static void test_lsb()
470{
471 uint8_t u = 0;
472
473 printf("Testing LBS utility...\n");
474
475 do {
476 uint8_t x = pcu_lsb(u); /* equivalent of (1 << ffs(u)) / 2 */
477 printf("%2X " OSMO_BIT_SPEC ": {%d} %3d\n",
478 u, OSMO_BIT_PRINT(u), pcu_bitcount(u), x);
479 u++;
480 } while (u);
481}
482
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100483int main(int argc, char **argv)
484{
Max71affce2018-01-15 11:03:00 +0100485 tall_pcu_ctx = talloc_named_const(NULL, 1, "types test context");
486 if (!tall_pcu_ctx)
487 abort();
488
489 msgb_talloc_ctx_init(tall_pcu_ctx, 0);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100490 osmo_init_logging(&gprs_log_info);
491 log_set_use_color(osmo_stderr_target, 0);
492 log_set_print_filename(osmo_stderr_target, 0);
493
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100494 printf("Making some basic type testing.\n");
495 test_llc();
Holger Hans Peter Freytherc6382dd2013-11-21 21:42:20 +0100496 test_rlc();
Holger Hans Peter Freyther95255672013-11-23 16:18:18 +0100497 test_rlc_v_b();
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100498 test_rlc_v_n();
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100499 test_rlc_dl_ul_basic();
aravind sirsikarc0c3afd2016-11-09 16:27:00 +0530500 test_immediate_assign_rej();
Max20c7c462017-12-22 14:20:05 +0100501 test_lsb();
502
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100503 return EXIT_SUCCESS;
504}
505
506/*
507 * stubs that should not be reached
508 */
509extern "C" {
510void l1if_pdch_req() { abort(); }
511void l1if_connect_pdch() { abort(); }
512void l1if_close_pdch() { abort(); }
513void l1if_open_pdch() { abort(); }
514}