blob: 3083644bccbb380bfd20de1e7082ec2034b8b371 [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;
64 uint8_t *msg_data;
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020065 const gprs_llc_queue::MetaInfo *info_res;
Jacob Erlbeck626369c2015-06-15 11:04:25 +020066
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020067 llc_msg = queue->dequeue(&info_res);
Jacob Erlbeck626369c2015-06-15 11:04:25 +020068 OSMO_ASSERT(llc_msg != NULL);
69
Neels Hofmeyrd34646a2017-02-08 17:07:40 +010070 fprintf(stderr, "dequeued msg, length %u (expected %zu), data %s\n",
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020071 msgb_length(llc_msg), len, msgb_hexdump(llc_msg));
Jacob Erlbeck626369c2015-06-15 11:04:25 +020072
73 OSMO_ASSERT(msgb_length(llc_msg) == len);
74 msg_data = msgb_data(llc_msg);
75
76 OSMO_ASSERT(memcmp(msg_data, exp_data, len) == 0);
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020077
78 if (exp_info)
79 OSMO_ASSERT(memcmp(exp_info, info_res, sizeof(*exp_info)) == 0);
80
Jacob Erlbeck626369c2015-06-15 11:04:25 +020081 msgb_free(llc_msg);
82}
83
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020084static void enqueue_data(gprs_llc_queue *queue, const char *message,
85 gprs_llc_queue::MetaInfo *info = 0)
Jacob Erlbeck626369c2015-06-15 11:04:25 +020086{
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020087 enqueue_data(queue, (uint8_t *)(message), strlen(message), info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +020088}
89
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020090static void dequeue_and_check(gprs_llc_queue *queue, const char *exp_message,
91 const gprs_llc_queue::MetaInfo *exp_info = 0)
Jacob Erlbeck626369c2015-06-15 11:04:25 +020092{
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +020093 dequeue_and_check(queue,
94 (uint8_t *)(exp_message), strlen(exp_message), exp_info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +020095}
96
97static void test_llc_queue()
98{
99 gprs_llc_queue queue;
100
101 printf("=== start %s ===\n", __func__);
102
103 queue.init();
104 OSMO_ASSERT(queue.size() == 0);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200105 OSMO_ASSERT(queue.octets() == 0);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200106
107 enqueue_data(&queue, "LLC message");
108 OSMO_ASSERT(queue.size() == 1);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200109 OSMO_ASSERT(queue.octets() == 11);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200110
111 enqueue_data(&queue, "other LLC message");
112 OSMO_ASSERT(queue.size() == 2);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200113 OSMO_ASSERT(queue.octets() == 28);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200114
115 dequeue_and_check(&queue, "LLC message");
116 OSMO_ASSERT(queue.size() == 1);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200117 OSMO_ASSERT(queue.octets() == 17);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200118
119 dequeue_and_check(&queue, "other LLC message");
120 OSMO_ASSERT(queue.size() == 0);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200121 OSMO_ASSERT(queue.octets() == 0);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200122
123 enqueue_data(&queue, "LLC");
124 OSMO_ASSERT(queue.size() == 1);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200125 OSMO_ASSERT(queue.octets() == 3);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200126
127 queue.clear(NULL);
128 OSMO_ASSERT(queue.size() == 0);
Jacob Erlbeck07eb6552015-06-15 11:05:44 +0200129 OSMO_ASSERT(queue.octets() == 0);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200130
131 printf("=== end %s ===\n", __func__);
132}
133
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +0200134static void test_llc_meta()
135{
136 gprs_llc_queue queue;
Jacob Erlbeck34cf1562015-06-29 10:21:52 +0200137 gprs_llc_queue::MetaInfo info1;
138 gprs_llc_queue::MetaInfo info2;
139
140 info1.recv_time.tv_sec = 123456777;
141 info1.recv_time.tv_usec = 123456;
142 info1.expire_time.tv_sec = 123456789;
143 info1.expire_time.tv_usec = 987654;
144
145 info2.recv_time.tv_sec = 987654321;
146 info2.recv_time.tv_usec = 547352;
147 info2.expire_time.tv_sec = 987654327;
148 info2.expire_time.tv_usec = 867252;
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +0200149
150 printf("=== start %s ===\n", __func__);
151
152 queue.init();
153 OSMO_ASSERT(queue.size() == 0);
154 OSMO_ASSERT(queue.octets() == 0);
155
156 enqueue_data(&queue, "LLC message 1", &info1);
157 enqueue_data(&queue, "LLC message 2", &info2);
158
159 dequeue_and_check(&queue, "LLC message 1", &info1);
160 dequeue_and_check(&queue, "LLC message 2", &info2);
161
162 queue.clear(NULL);
163 OSMO_ASSERT(queue.size() == 0);
164 OSMO_ASSERT(queue.octets() == 0);
165
166 printf("=== end %s ===\n", __func__);
167}
168
Jacob Erlbeck257b6302015-08-21 18:07:47 +0200169static void test_llc_merge()
170{
171 gprs_llc_queue queue1;
172 gprs_llc_queue queue2;
173 gprs_llc_queue::MetaInfo info = {0};
174
175 printf("=== start %s ===\n", __func__);
176
177 queue1.init();
178 queue2.init();
179
180 info.recv_time.tv_sec += 1;
181 enqueue_data(&queue1, "*A*", &info);
182
183 info.recv_time.tv_sec += 1;
184 enqueue_data(&queue1, "*B*", &info);
185
186 info.recv_time.tv_sec += 1;
187 enqueue_data(&queue2, "*C*", &info);
188
189 info.recv_time.tv_sec += 1;
190 enqueue_data(&queue1, "*D*", &info);
191
192 info.recv_time.tv_sec += 1;
193 enqueue_data(&queue2, "*E*", &info);
194
195 OSMO_ASSERT(queue1.size() == 3);
196 OSMO_ASSERT(queue1.octets() == 9);
197 OSMO_ASSERT(queue2.size() == 2);
198 OSMO_ASSERT(queue2.octets() == 6);
199
200 queue2.move_and_merge(&queue1);
201
202 OSMO_ASSERT(queue1.size() == 0);
203 OSMO_ASSERT(queue1.octets() == 0);
204 OSMO_ASSERT(queue2.size() == 5);
205 OSMO_ASSERT(queue2.octets() == 15);
206
207 dequeue_and_check(&queue2, "*A*");
208 dequeue_and_check(&queue2, "*B*");
209 dequeue_and_check(&queue2, "*C*");
210 dequeue_and_check(&queue2, "*D*");
211 dequeue_and_check(&queue2, "*E*");
212
213 OSMO_ASSERT(queue2.size() == 0);
214 OSMO_ASSERT(queue2.octets() == 0);
215
216 printf("=== end %s ===\n", __func__);
217}
218
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200219int main(int argc, char **argv)
220{
221 struct vty_app_info pcu_vty_info = {0};
222
223 tall_pcu_ctx = talloc_named_const(NULL, 1, "LlcTest context");
224 if (!tall_pcu_ctx)
225 abort();
226
Neels Hofmeyrd34646a2017-02-08 17:07:40 +0100227 msgb_talloc_ctx_init(tall_pcu_ctx, 0);
Neels Hofmeyr42f2d612018-04-01 16:54:40 +0200228 osmo_init_logging2(tall_pcu_ctx, &gprs_log_info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200229 log_set_use_color(osmo_stderr_target, 0);
230 log_set_print_filename(osmo_stderr_target, 0);
231 log_set_log_level(osmo_stderr_target, LOGL_INFO);
Harald Welteac0490a2017-10-29 10:39:32 +0100232 log_parse_category_mask(osmo_stderr_target, "DPCU,3");
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200233
234 vty_init(&pcu_vty_info);
Harald Welteac0490a2017-10-29 10:39:32 +0100235 pcu_vty_init(&gprs_log_info);
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200236
237 test_llc_queue();
Jacob Erlbeckb671dbf2015-06-15 14:32:33 +0200238 test_llc_meta();
Jacob Erlbeck257b6302015-08-21 18:07:47 +0200239 test_llc_merge();
Jacob Erlbeck626369c2015-06-15 11:04:25 +0200240
241 if (getenv("TALLOC_REPORT_FULL"))
242 talloc_report_full(tall_pcu_ctx, stderr);
243
244 return EXIT_SUCCESS;
245}
246
247extern "C" {
248void l1if_pdch_req() { abort(); }
249void l1if_connect_pdch() { abort(); }
250void l1if_close_pdch() { abort(); }
251void l1if_open_pdch() { abort(); }
252}