blob: 5d4fdf760e45bea354cca4735f7250d27df95685 [file] [log] [blame]
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001/*
2 * EdgeTest.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
23#include "gprs_debug.h"
24#include "gprs_coding_scheme.h"
25
26extern "C" {
27#include "pcu_vty.h"
28
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#include <osmocom/vty/vty.h>
34}
35
36#include <errno.h>
37
38void *tall_pcu_ctx;
39int16_t spoof_mnc = 0, spoof_mcc = 0;
40
41static void check_coding_scheme(GprsCodingScheme& cs, GprsCodingScheme::Mode mode)
42{
43 volatile unsigned expected_size;
44 GprsCodingScheme new_cs;
45
46 OSMO_ASSERT(cs.isValid());
47 OSMO_ASSERT(cs.isCompatible(mode));
48
49 /* Check static getBySizeUL() */
50 expected_size = cs.maxBytesUL();
51 if (cs.spareBitsUL() > 0)
52 expected_size += 1;
53 OSMO_ASSERT(expected_size == cs.sizeUL());
54 OSMO_ASSERT(cs == GprsCodingScheme::getBySizeUL(expected_size));
55
56 /* Check static sizeUL() */
57 expected_size = cs.maxBytesDL();
58 if (cs.spareBitsDL() > 0)
59 expected_size += 1;
60 OSMO_ASSERT(expected_size == cs.sizeDL());
61
62 /* Check inc/dec */
63 new_cs = cs;
64 new_cs.inc(mode);
65 OSMO_ASSERT(new_cs.isCompatible(mode));
66 if (new_cs != cs) {
67 new_cs.dec(mode);
68 OSMO_ASSERT(new_cs.isCompatible(mode));
69 OSMO_ASSERT(new_cs == cs);
70 }
71 new_cs.dec(mode);
72 OSMO_ASSERT(new_cs.isCompatible(mode));
73 if (new_cs != cs) {
74 new_cs.inc(mode);
75 OSMO_ASSERT(new_cs.isCompatible(mode));
76 OSMO_ASSERT(new_cs == cs);
77 }
78}
79
80static void test_coding_scheme()
81{
82 unsigned i;
83 unsigned last_size_UL;
84 unsigned last_size_DL;
85 GprsCodingScheme::Scheme gprs_schemes[] = {
86 GprsCodingScheme::CS1,
87 GprsCodingScheme::CS2,
88 GprsCodingScheme::CS3,
89 GprsCodingScheme::CS4
90 };
91 struct {
92 GprsCodingScheme::Scheme s;
93 bool is_gmsk;
94 } egprs_schemes[] = {
95 {GprsCodingScheme::MCS1, true},
96 {GprsCodingScheme::MCS2, true},
97 {GprsCodingScheme::MCS3, true},
98 {GprsCodingScheme::MCS4, true},
99 {GprsCodingScheme::MCS5, false},
100 {GprsCodingScheme::MCS6, false},
101 {GprsCodingScheme::MCS7, false},
102 {GprsCodingScheme::MCS8, false},
103 {GprsCodingScheme::MCS9, false},
104 };
105
106 printf("=== start %s ===\n", __func__);
107
108 GprsCodingScheme cs;
109 OSMO_ASSERT(!cs);
110 OSMO_ASSERT(cs == GprsCodingScheme::UNKNOWN);
111 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::GPRS));
112 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::EGPRS_GMSK));
113 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::EGPRS));
114
115 last_size_UL = 0;
116 last_size_DL = 0;
117
118 for (i = 0; i < ARRAY_SIZE(gprs_schemes); i++) {
119 GprsCodingScheme current_cs(gprs_schemes[i]);
120 OSMO_ASSERT(current_cs.isGprs());
121 OSMO_ASSERT(!current_cs.isEgprs());
122 OSMO_ASSERT(!current_cs.isEgprsGmsk());
123 OSMO_ASSERT(current_cs == gprs_schemes[i]);
124 OSMO_ASSERT(current_cs == GprsCodingScheme(gprs_schemes[i]));
125
126 /* Check strong monotonicity */
127 OSMO_ASSERT(current_cs.maxBytesUL() > last_size_UL);
128 OSMO_ASSERT(current_cs.maxBytesDL() > last_size_DL);
129 last_size_UL = current_cs.maxBytesUL();
130 last_size_DL = current_cs.maxBytesDL();
131
Jacob Erlbeck6c3dc612015-12-14 10:21:26 +0100132 /* Check header types */
133 OSMO_ASSERT(current_cs.headerTypeData() ==
134 GprsCodingScheme::HEADER_GPRS_DATA);
135 OSMO_ASSERT(current_cs.headerTypeControl() ==
136 GprsCodingScheme::HEADER_GPRS_CONTROL);
137
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100138 check_coding_scheme(current_cs, GprsCodingScheme::GPRS);
139 }
140 OSMO_ASSERT(i == 4);
141
142 last_size_UL = 0;
143 last_size_DL = 0;
144
145 for (i = 0; i < ARRAY_SIZE(egprs_schemes); i++) {
146 GprsCodingScheme current_cs(egprs_schemes[i].s);
147 OSMO_ASSERT(!current_cs.isGprs());
148 OSMO_ASSERT(current_cs.isEgprs());
149 OSMO_ASSERT(!!current_cs.isEgprsGmsk() == !!egprs_schemes[i].is_gmsk);
150 OSMO_ASSERT(current_cs == egprs_schemes[i].s);
151 OSMO_ASSERT(current_cs == GprsCodingScheme(egprs_schemes[i].s));
152
153 /* Check strong monotonicity */
154 OSMO_ASSERT(current_cs.maxBytesUL() > last_size_UL);
155 OSMO_ASSERT(current_cs.maxBytesDL() > last_size_DL);
156 last_size_UL = current_cs.maxBytesUL();
157 last_size_DL = current_cs.maxBytesDL();
158
159 if (egprs_schemes[i].is_gmsk)
160 check_coding_scheme(current_cs, GprsCodingScheme::EGPRS_GMSK);
161 check_coding_scheme(current_cs, GprsCodingScheme::EGPRS);
162 }
163 OSMO_ASSERT(i == 9);
164
165 printf("=== end %s ===\n", __func__);
166}
167
168
169static const struct log_info_cat default_categories[] = {
170 {"DCSN1", "\033[1;31m", "Concrete Syntax Notation One (CSN1)", LOGL_INFO, 0},
171 {"DL1IF", "\033[1;32m", "GPRS PCU L1 interface (L1IF)", LOGL_DEBUG, 1},
172 {"DRLCMAC", "\033[0;33m", "GPRS RLC/MAC layer (RLCMAC)", LOGL_DEBUG, 1},
173 {"DRLCMACDATA", "\033[0;33m", "GPRS RLC/MAC layer Data (RLCMAC)", LOGL_DEBUG, 1},
174 {"DRLCMACDL", "\033[1;33m", "GPRS RLC/MAC layer Downlink (RLCMAC)", LOGL_DEBUG, 1},
175 {"DRLCMACUL", "\033[1;36m", "GPRS RLC/MAC layer Uplink (RLCMAC)", LOGL_DEBUG, 1},
176 {"DRLCMACSCHED", "\033[0;36m", "GPRS RLC/MAC layer Scheduling (RLCMAC)", LOGL_DEBUG, 1},
177 {"DRLCMACMEAS", "\033[1;31m", "GPRS RLC/MAC layer Measurements (RLCMAC)", LOGL_INFO, 1},
178 {"DNS","\033[1;34m", "GPRS Network Service Protocol (NS)", LOGL_INFO , 1},
179 {"DBSSGP","\033[1;34m", "GPRS BSS Gateway Protocol (BSSGP)", LOGL_INFO , 1},
180 {"DPCU", "\033[1;35m", "GPRS Packet Control Unit (PCU)", LOGL_NOTICE, 1},
181};
182
183static int filter_fn(const struct log_context *ctx,
184 struct log_target *tar)
185{
186 return 1;
187}
188
189const struct log_info debug_log_info = {
190 filter_fn,
191 (struct log_info_cat*)default_categories,
192 ARRAY_SIZE(default_categories),
193};
194
195int main(int argc, char **argv)
196{
197 struct vty_app_info pcu_vty_info = {0};
198
199 tall_pcu_ctx = talloc_named_const(NULL, 1, "EdgeTest context");
200 if (!tall_pcu_ctx)
201 abort();
202
203 msgb_set_talloc_ctx(tall_pcu_ctx);
204 osmo_init_logging(&debug_log_info);
205 log_set_use_color(osmo_stderr_target, 0);
206 log_set_print_filename(osmo_stderr_target, 0);
207
208 vty_init(&pcu_vty_info);
209 pcu_vty_init(&debug_log_info);
210
211 test_coding_scheme();
212
213 if (getenv("TALLOC_REPORT_FULL"))
214 talloc_report_full(tall_pcu_ctx, stderr);
215 return EXIT_SUCCESS;
216}
217
218/*
219 * stubs that should not be reached
220 */
221extern "C" {
222void l1if_pdch_req() { abort(); }
223void l1if_connect_pdch() { abort(); }
224void l1if_close_pdch() { abort(); }
225void l1if_open_pdch() { abort(); }
226}