blob: 13bda3cccd59db2a00a8c03e747b44acb3885674 [file] [log] [blame]
Jacob Erlbeck626369c2015-06-15 11:04:25 +02001/*
2 * LlcTest.cpp
3 *
4 * Copyright (C) 2015 by Sysmocom s.f.m.c. GmbH
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
23extern "C" {
24 #include <osmocom/core/linuxlist.h>
25}
26
27#include "llc.h"
28#include "gprs_debug.h"
29
30extern "C" {
31#include "pcu_vty.h"
32
33#include <osmocom/core/application.h>
34#include <osmocom/core/msgb.h>
35#include <osmocom/core/talloc.h>
36#include <osmocom/core/utils.h>
37#include <osmocom/vty/vty.h>
38}
39
40
41void *tall_pcu_ctx;
42int16_t spoof_mnc = 0, spoof_mcc = 0;
Neels Hofmeyrbdc55fa2018-02-21 00:39:07 +010043bool spoof_mnc_3_digits = false;
Jacob Erlbeck626369c2015-06-15 11:04:25 +020044
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020045static void enqueue_data(gprs_llc_queue *queue, const uint8_t *data, size_t len,
46 gprs_llc_queue::MetaInfo *info = 0)
Jacob Erlbeck626369c2015-06-15 11:04:25 +020047{
48 struct timeval *tv;
49 uint8_t *msg_data;
50 struct msgb *llc_msg = msgb_alloc(len + sizeof(*tv) * 2,
51 "llc_pdu_queue");
52
Jacob Erlbeck626369c2015-06-15 11:04:25 +020053 msg_data = (uint8_t *)msgb_put(llc_msg, len);
54
55 memcpy(msg_data, data, len);
56
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020057 queue->enqueue(llc_msg, info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +020058}
59
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020060static void dequeue_and_check(gprs_llc_queue *queue, const uint8_t *exp_data,
61 size_t len, const gprs_llc_queue::MetaInfo *exp_info = 0)
Jacob Erlbeck626369c2015-06-15 11:04:25 +020062{
63 struct msgb *llc_msg;
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020064 const gprs_llc_queue::MetaInfo *info_res;
Jacob Erlbeck626369c2015-06-15 11:04:25 +020065
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020066 llc_msg = queue->dequeue(&info_res);
Jacob Erlbeck626369c2015-06-15 11:04:25 +020067 OSMO_ASSERT(llc_msg != NULL);
68
Neels Hofmeyrd34646a2017-02-08 17:07:40 +010069 fprintf(stderr, "dequeued msg, length %u (expected %zu), data %s\n",
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020070 msgb_length(llc_msg), len, msgb_hexdump(llc_msg));
Jacob Erlbeck626369c2015-06-15 11:04:25 +020071
Maxd3a0d912019-03-05 16:15:01 +010072 if (!msgb_eq_data_print(llc_msg, exp_data, len))
73 fprintf(stderr, "check failed!\n");
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020074
75 if (exp_info)
76 OSMO_ASSERT(memcmp(exp_info, info_res, sizeof(*exp_info)) == 0);
77
Jacob Erlbeck626369c2015-06-15 11:04:25 +020078 msgb_free(llc_msg);
79}
80
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020081static void enqueue_data(gprs_llc_queue *queue, const char *message,
82 gprs_llc_queue::MetaInfo *info = 0)
Jacob Erlbeck626369c2015-06-15 11:04:25 +020083{
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020084 enqueue_data(queue, (uint8_t *)(message), strlen(message), info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +020085}
86
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020087static void dequeue_and_check(gprs_llc_queue *queue, const char *exp_message,
88 const gprs_llc_queue::MetaInfo *exp_info = 0)
Jacob Erlbeck626369c2015-06-15 11:04:25 +020089{
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020090 dequeue_and_check(queue,
91 (uint8_t *)(exp_message), strlen(exp_message), exp_info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +020092}
93
94static void test_llc_queue()
95{
96 gprs_llc_queue queue;
97
98 printf("=== start %s ===\n", __func__);
99
100 queue.init();
101 OSMO_ASSERT(queue.size() == 0);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200102 OSMO_ASSERT(queue.octets() == 0);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200103
104 enqueue_data(&queue, "LLC message");
105 OSMO_ASSERT(queue.size() == 1);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200106 OSMO_ASSERT(queue.octets() == 11);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200107
108 enqueue_data(&queue, "other LLC message");
109 OSMO_ASSERT(queue.size() == 2);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200110 OSMO_ASSERT(queue.octets() == 28);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200111
112 dequeue_and_check(&queue, "LLC message");
113 OSMO_ASSERT(queue.size() == 1);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200114 OSMO_ASSERT(queue.octets() == 17);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200115
116 dequeue_and_check(&queue, "other LLC message");
117 OSMO_ASSERT(queue.size() == 0);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200118 OSMO_ASSERT(queue.octets() == 0);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200119
120 enqueue_data(&queue, "LLC");
121 OSMO_ASSERT(queue.size() == 1);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200122 OSMO_ASSERT(queue.octets() == 3);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200123
124 queue.clear(NULL);
125 OSMO_ASSERT(queue.size() == 0);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200126 OSMO_ASSERT(queue.octets() == 0);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200127
128 printf("=== end %s ===\n", __func__);
129}
130
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +0200131static void test_llc_meta()
132{
133 gprs_llc_queue queue;
Jacob Erlbeck34cf1562015-06-29 10:21:52 +0200134 gprs_llc_queue::MetaInfo info1;
135 gprs_llc_queue::MetaInfo info2;
136
137 info1.recv_time.tv_sec = 123456777;
138 info1.recv_time.tv_usec = 123456;
139 info1.expire_time.tv_sec = 123456789;
140 info1.expire_time.tv_usec = 987654;
141
142 info2.recv_time.tv_sec = 987654321;
143 info2.recv_time.tv_usec = 547352;
144 info2.expire_time.tv_sec = 987654327;
145 info2.expire_time.tv_usec = 867252;
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +0200146
147 printf("=== start %s ===\n", __func__);
148
149 queue.init();
150 OSMO_ASSERT(queue.size() == 0);
151 OSMO_ASSERT(queue.octets() == 0);
152
153 enqueue_data(&queue, "LLC message 1", &info1);
154 enqueue_data(&queue, "LLC message 2", &info2);
155
156 dequeue_and_check(&queue, "LLC message 1", &info1);
157 dequeue_and_check(&queue, "LLC message 2", &info2);
158
159 queue.clear(NULL);
160 OSMO_ASSERT(queue.size() == 0);
161 OSMO_ASSERT(queue.octets() == 0);
162
163 printf("=== end %s ===\n", __func__);
164}
165
Jacob Erlbeck257b6302015-08-21 18:07:47 +0200166static void test_llc_merge()
167{
168 gprs_llc_queue queue1;
169 gprs_llc_queue queue2;
170 gprs_llc_queue::MetaInfo info = {0};
171
172 printf("=== start %s ===\n", __func__);
173
174 queue1.init();
175 queue2.init();
176
177 info.recv_time.tv_sec += 1;
178 enqueue_data(&queue1, "*A*", &info);
179
180 info.recv_time.tv_sec += 1;
181 enqueue_data(&queue1, "*B*", &info);
182
183 info.recv_time.tv_sec += 1;
184 enqueue_data(&queue2, "*C*", &info);
185
186 info.recv_time.tv_sec += 1;
187 enqueue_data(&queue1, "*D*", &info);
188
189 info.recv_time.tv_sec += 1;
190 enqueue_data(&queue2, "*E*", &info);
191
192 OSMO_ASSERT(queue1.size() == 3);
193 OSMO_ASSERT(queue1.octets() == 9);
194 OSMO_ASSERT(queue2.size() == 2);
195 OSMO_ASSERT(queue2.octets() == 6);
196
197 queue2.move_and_merge(&queue1);
198
199 OSMO_ASSERT(queue1.size() == 0);
200 OSMO_ASSERT(queue1.octets() == 0);
201 OSMO_ASSERT(queue2.size() == 5);
202 OSMO_ASSERT(queue2.octets() == 15);
203
204 dequeue_and_check(&queue2, "*A*");
205 dequeue_and_check(&queue2, "*B*");
206 dequeue_and_check(&queue2, "*C*");
207 dequeue_and_check(&queue2, "*D*");
208 dequeue_and_check(&queue2, "*E*");
209
210 OSMO_ASSERT(queue2.size() == 0);
211 OSMO_ASSERT(queue2.octets() == 0);
212
213 printf("=== end %s ===\n", __func__);
214}
215
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200216int main(int argc, char **argv)
217{
218 struct vty_app_info pcu_vty_info = {0};
219
220 tall_pcu_ctx = talloc_named_const(NULL, 1, "LlcTest context");
221 if (!tall_pcu_ctx)
222 abort();
223
Neels Hofmeyrd34646a2017-02-08 17:07:40 +0100224 msgb_talloc_ctx_init(tall_pcu_ctx, 0);
Neels Hofmeyr42f2d612018-04-01 16:54:40 +0200225 osmo_init_logging2(tall_pcu_ctx, &gprs_log_info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200226 log_set_use_color(osmo_stderr_target, 0);
227 log_set_print_filename(osmo_stderr_target, 0);
228 log_set_log_level(osmo_stderr_target, LOGL_INFO);
Maxd3a0d912019-03-05 16:15:01 +0100229 log_parse_category_mask(osmo_stderr_target, "DPCU,3:DLGLOBAL,1:");
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200230
231 vty_init(&pcu_vty_info);
Harald Welteac0490a2017-10-29 10:39:32 +0100232 pcu_vty_init(&gprs_log_info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200233
234 test_llc_queue();
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +0200235 test_llc_meta();
Jacob Erlbeck257b6302015-08-21 18:07:47 +0200236 test_llc_merge();
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200237
238 if (getenv("TALLOC_REPORT_FULL"))
239 talloc_report_full(tall_pcu_ctx, stderr);
240
241 return EXIT_SUCCESS;
242}
243
244extern "C" {
245void l1if_pdch_req() { abort(); }
246void l1if_connect_pdch() { abort(); }
247void l1if_close_pdch() { abort(); }
248void l1if_open_pdch() { abort(); }
249}