blob: c5654f6d7d4ef262f74b3e5ce02edd9bc173ea02 [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 {
Jacob Erlbecka3a567e2015-12-28 13:46:32 +0100150 gprs_rlc_dl_window dl_win;
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100151 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 {
Jacob Erlbecka3a567e2015-12-28 13:46:32 +0100195 gprs_rlc_ul_window ul_win;
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));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100221 ul_win.receive_bsn(0);
222 count = ul_win.raise_v_q();
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100223 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100224 OSMO_ASSERT(ul_win.v_q() == 1);
225 OSMO_ASSERT(ul_win.v_r() == 1);
226 OSMO_ASSERT(count == 1);
227
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100228 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIR";
229 OSMO_ASSERT(ul_win.ssn() == 1);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100230 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100231 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100232 Encoding::encode_rbb(win_rbb, bin_rbb);
233 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100234 Decoding::extract_rbb(bin_rbb, win_rbb);
235 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100236
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100237 OSMO_ASSERT(ul_win.is_in_window(1));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100238 ul_win.receive_bsn(1);
239 count = ul_win.raise_v_q();
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100240 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100241 OSMO_ASSERT(ul_win.v_q() == 2);
242 OSMO_ASSERT(ul_win.v_r() == 2);
243 OSMO_ASSERT(count == 1);
244
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100245 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRR";
246 OSMO_ASSERT(ul_win.ssn() == 2);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100247 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100248 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100249 Encoding::encode_rbb(win_rbb, bin_rbb);
250 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100251 Decoding::extract_rbb(bin_rbb, win_rbb);
252 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100253
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100254 OSMO_ASSERT(ul_win.is_in_window(5));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100255 ul_win.receive_bsn(5);
256 count = ul_win.raise_v_q();
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100257 OSMO_ASSERT(ul_win.m_v_n.is_received(0));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100258 OSMO_ASSERT(ul_win.v_q() == 2);
259 OSMO_ASSERT(ul_win.v_r() == 6);
260 OSMO_ASSERT(count == 0);
261
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100262 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRRIIIR";
263 OSMO_ASSERT(ul_win.ssn() == 6);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100264 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100265 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100266 Encoding::encode_rbb(win_rbb, bin_rbb);
267 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100268 Decoding::extract_rbb(bin_rbb, win_rbb);
269 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100270
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100271 OSMO_ASSERT(ul_win.is_in_window(65));
272 OSMO_ASSERT(ul_win.is_in_window(2));
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100273 OSMO_ASSERT(ul_win.m_v_n.is_received(5));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100274 ul_win.receive_bsn(65);
275 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100276 OSMO_ASSERT(count == 0);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100277 OSMO_ASSERT(ul_win.m_v_n.is_received(5));
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100278 OSMO_ASSERT(ul_win.v_q() == 2);
279 OSMO_ASSERT(ul_win.v_r() == 66);
280
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100281 rbb = "IIIRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIR";
282 OSMO_ASSERT(ul_win.ssn() == 66);
Daniel Willmann7c3751b2013-12-28 13:59:24 +0100283 ul_win.update_rbb(win_rbb);
Daniel Willmannc3f43302013-12-11 16:47:19 +0100284 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmann0f2b5fc2013-12-11 16:49:43 +0100285 Encoding::encode_rbb(win_rbb, bin_rbb);
286 printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));
Daniel Willmannf1786a32013-12-11 18:44:49 +0100287 Decoding::extract_rbb(bin_rbb, win_rbb);
288 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
Daniel Willmannf86fb7a2013-11-27 17:56:02 +0100289
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100290 OSMO_ASSERT(ul_win.is_in_window(2));
291 OSMO_ASSERT(!ul_win.is_in_window(66));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100292 ul_win.receive_bsn(2);
293 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100294 OSMO_ASSERT(count == 1);
295 OSMO_ASSERT(ul_win.v_q() == 3);
296 OSMO_ASSERT(ul_win.v_r() == 66);
297
298 OSMO_ASSERT(ul_win.is_in_window(66));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100299 ul_win.receive_bsn(66);
300 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100301 OSMO_ASSERT(count == 0);
302 OSMO_ASSERT(ul_win.v_q() == 3);
303 OSMO_ASSERT(ul_win.v_r() == 67);
304
305 for (int i = 3; i <= 67; ++i) {
Daniel Willmann55844792013-12-28 14:41:00 +0100306 ul_win.receive_bsn(i);
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100307 ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100308 }
309
310 OSMO_ASSERT(ul_win.v_q() == 68);
311 OSMO_ASSERT(ul_win.v_r() == 68);
312
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100313 ul_win.receive_bsn(68);
314 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100315 OSMO_ASSERT(ul_win.v_q() == 69);
316 OSMO_ASSERT(ul_win.v_r() == 69);
317 OSMO_ASSERT(count == 1);
318
319 /* now test the wrapping */
320 OSMO_ASSERT(ul_win.is_in_window(4));
321 OSMO_ASSERT(!ul_win.is_in_window(5));
Jacob Erlbeckd87e1d62015-12-14 11:43:04 +0100322 ul_win.receive_bsn(4);
323 count = ul_win.raise_v_q();
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100324 OSMO_ASSERT(count == 0);
Aravind Sirsikara35c9112016-08-30 13:00:14 +0530325
326 /*
327 * SSN wrap around case
328 * TODO: Should not expect any BSN as nacked.
329 * should be fixed in subsequent patch
330 */
331 rbb = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIRR";
332 for (int i = 0; i < 128; ++i) {
333 ul_win.receive_bsn(i);
334 ul_win.raise_v_q();
335 }
336 ul_win.receive_bsn(0);
337 ul_win.raise_v_q();
338 ul_win.receive_bsn(1);
339 ul_win.raise_v_q();
340 ul_win.update_rbb(win_rbb);
341 OSMO_ASSERT_STR_EQ(win_rbb, rbb);
342 OSMO_ASSERT(ul_win.ssn() == 2);
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100343 }
Daniel Willmann48df40d2013-12-11 16:51:26 +0100344
345 {
Daniel Willmann48df40d2013-12-11 16:51:26 +0100346 uint16_t lost = 0, recv = 0;
347 char show_rbb[65];
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100348 uint8_t bits_data[8];
Daniel Willmann48df40d2013-12-11 16:51:26 +0100349 BTS dummy_bts;
Jacob Erlbecka3a567e2015-12-28 13:46:32 +0100350 gprs_rlc_dl_window dl_win;
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100351 bitvec bits;
352 int bsn_begin, bsn_end, num_blocks;
353 Ack_Nack_Description_t desc;
Daniel Willmann48df40d2013-12-11 16:51:26 +0100354
Daniel Willmann146514e2013-12-28 18:24:42 +0100355 dl_win.m_v_b.reset();
Daniel Willmann48df40d2013-12-11 16:51:26 +0100356
357 OSMO_ASSERT(dl_win.window_empty());
358 OSMO_ASSERT(!dl_win.window_stalled());
359 OSMO_ASSERT(dl_win.distance() == 0);
360
361 dl_win.increment_send();
362 OSMO_ASSERT(!dl_win.window_empty());
363 OSMO_ASSERT(!dl_win.window_stalled());
364 OSMO_ASSERT(dl_win.distance() == 1);
365
366 for (int i = 0; i < 35; ++i) {
367 dl_win.increment_send();
368 OSMO_ASSERT(!dl_win.window_empty());
369 OSMO_ASSERT(dl_win.distance() == i + 2);
370 }
371
372 uint8_t rbb_cmp[8] = { 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff };
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100373 bits.data = bits_data;
374 bits.data_len = sizeof(bits_data);
375 bits.cur_bit = 0;
376
377 memcpy(desc.RECEIVED_BLOCK_BITMAP, rbb_cmp,
378 sizeof(desc.RECEIVED_BLOCK_BITMAP));
379 desc.FINAL_ACK_INDICATION = 0;
380 desc.STARTING_SEQUENCE_NUMBER = 35;
381
382 num_blocks = Decoding::decode_gprs_acknack_bits(
383 &desc, &bits,
384 &bsn_begin, &bsn_end, &dl_win);
385 Decoding::extract_rbb(&bits, show_rbb);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100386 printf("show_rbb: %s\n", show_rbb);
387
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100388 dl_win.update(&dummy_bts, &bits, 0, &lost, &recv);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100389 OSMO_ASSERT(lost == 0);
390 OSMO_ASSERT(recv == 35);
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100391 OSMO_ASSERT(bsn_begin == 0);
392 OSMO_ASSERT(bsn_end == 35);
393 OSMO_ASSERT(num_blocks == 35);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100394
Jacob Erlbeck419b0342016-01-14 13:40:01 +0100395 dl_win.raise(dl_win.move_window());
396
397 for (int i = 0; i < 8; ++i) {
398 dl_win.increment_send();
399 OSMO_ASSERT(!dl_win.window_empty());
400 OSMO_ASSERT(dl_win.distance() == 2 + i);
401 }
402
403 uint8_t rbb_cmp2[8] = { 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x31 };
404 bits.data = bits_data;
405 bits.data_len = sizeof(bits_data);
406 bits.cur_bit = 0;
407
408 memcpy(desc.RECEIVED_BLOCK_BITMAP, rbb_cmp2,
409 sizeof(desc.RECEIVED_BLOCK_BITMAP));
410 desc.FINAL_ACK_INDICATION = 0;
411 desc.STARTING_SEQUENCE_NUMBER = 35 + 8;
412
413 num_blocks = Decoding::decode_gprs_acknack_bits(
414 &desc, &bits,
415 &bsn_begin, &bsn_end, &dl_win);
416 Decoding::extract_rbb(&bits, show_rbb);
417 printf("show_rbb: %s\n", show_rbb);
418
419 lost = recv = 0;
420 dl_win.update(&dummy_bts, &bits, 0, &lost, &recv);
421 OSMO_ASSERT(lost == 5);
422 OSMO_ASSERT(recv == 3);
423 OSMO_ASSERT(bitvec_get_bit_pos(&bits, 0) == 0);
424 OSMO_ASSERT(bitvec_get_bit_pos(&bits, 7) == 1);
425 OSMO_ASSERT(bsn_begin == 35);
426 OSMO_ASSERT(bsn_end == 43);
427 OSMO_ASSERT(num_blocks == 8);
Daniel Willmann48df40d2013-12-11 16:51:26 +0100428 }
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100429}
430
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100431int main(int argc, char **argv)
432{
Holger Hans Peter Freyther11f2d582013-11-26 23:32:49 +0100433 osmo_init_logging(&gprs_log_info);
434 log_set_use_color(osmo_stderr_target, 0);
435 log_set_print_filename(osmo_stderr_target, 0);
436
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100437 printf("Making some basic type testing.\n");
438 test_llc();
Holger Hans Peter Freytherc6382dd2013-11-21 21:42:20 +0100439 test_rlc();
Holger Hans Peter Freyther95255672013-11-23 16:18:18 +0100440 test_rlc_v_b();
Holger Hans Peter Freythere9b1ebb2013-11-24 22:00:43 +0100441 test_rlc_v_n();
Holger Hans Peter Freytherfaf3ef42013-11-24 22:17:40 +0100442 test_rlc_dl_ul_basic();
Holger Hans Peter Freyther60582202013-11-21 21:30:23 +0100443 return EXIT_SUCCESS;
444}
445
446/*
447 * stubs that should not be reached
448 */
449extern "C" {
450void l1if_pdch_req() { abort(); }
451void l1if_connect_pdch() { abort(); }
452void l1if_close_pdch() { abort(); }
453void l1if_open_pdch() { abort(); }
454}