blob: a3ba8e00677f987d2d06cf76960b2bbd86c302ee [file] [log] [blame]
Philippb4cb8382016-09-29 17:01:57 +02001/* Test OML attribute generator */
2
3/* (C) 2016 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
4 * All Rights Reserved
5 *
6 * Author: Philipp Maier
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 Affero 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
Neels Hofmeyrc0164792017-09-04 15:15:32 +020022#include <osmocom/bsc/debug.h>
23#include <osmocom/bsc/gsm_data.h>
24#include <osmocom/bsc/bts_ipaccess_nanobts_omlattr.h>
Philippb4cb8382016-09-29 17:01:57 +020025
26#include <osmocom/core/talloc.h>
27#include <osmocom/core/utils.h>
28#include <osmocom/core/application.h>
29
30#include <stdio.h>
31#include <string.h>
32
33struct gsm_bts_model bts_model_nanobts = {
34 .type = GSM_BTS_TYPE_NANOBTS,
35 .name = "nanobts",
36 .start = NULL,
37 .oml_rcvmsg = NULL,
38 .e1line_bind_ops = NULL,
39 .nm_att_tlvdef = {
40 .def = {
41 /* ip.access specifics */
42 [NM_ATT_IPACC_DST_IP] = {TLV_TYPE_FIXED, 4},
43 [NM_ATT_IPACC_DST_IP_PORT] =
44 {TLV_TYPE_FIXED, 2},
45 [NM_ATT_IPACC_STREAM_ID] = {TLV_TYPE_TV,},
46 [NM_ATT_IPACC_SEC_OML_CFG] =
47 {TLV_TYPE_FIXED, 6},
48 [NM_ATT_IPACC_IP_IF_CFG] =
49 {TLV_TYPE_FIXED, 8},
50 [NM_ATT_IPACC_IP_GW_CFG] =
51 {TLV_TYPE_FIXED, 12},
52 [NM_ATT_IPACC_IN_SERV_TIME] =
53 {TLV_TYPE_FIXED, 4},
54 [NM_ATT_IPACC_LOCATION] = {TLV_TYPE_TL16V},
55 [NM_ATT_IPACC_PAGING_CFG] =
56 {TLV_TYPE_FIXED, 2},
57 [NM_ATT_IPACC_UNIT_ID] = {TLV_TYPE_TL16V},
58 [NM_ATT_IPACC_UNIT_NAME] = {TLV_TYPE_TL16V},
59 [NM_ATT_IPACC_SNMP_CFG] = {TLV_TYPE_TL16V},
60 [NM_ATT_IPACC_PRIM_OML_CFG_LIST] =
61 {TLV_TYPE_TL16V},
62 [NM_ATT_IPACC_NV_FLAGS] = {TLV_TYPE_TL16V},
63 [NM_ATT_IPACC_FREQ_CTRL] =
64 {TLV_TYPE_FIXED, 2},
65 [NM_ATT_IPACC_PRIM_OML_FB_TOUT] =
66 {TLV_TYPE_TL16V},
67 [NM_ATT_IPACC_CUR_SW_CFG] = {TLV_TYPE_TL16V},
68 [NM_ATT_IPACC_TIMING_BUS] = {TLV_TYPE_TL16V},
69 [NM_ATT_IPACC_CGI] = {TLV_TYPE_TL16V},
70 [NM_ATT_IPACC_RAC] = {TLV_TYPE_TL16V},
71 [NM_ATT_IPACC_OBJ_VERSION] = {TLV_TYPE_TL16V},
72 [NM_ATT_IPACC_GPRS_PAGING_CFG] =
73 {TLV_TYPE_TL16V},
74 [NM_ATT_IPACC_NSEI] = {TLV_TYPE_TL16V},
75 [NM_ATT_IPACC_BVCI] = {TLV_TYPE_TL16V},
76 [NM_ATT_IPACC_NSVCI] = {TLV_TYPE_TL16V},
77 [NM_ATT_IPACC_NS_CFG] = {TLV_TYPE_TL16V},
78 [NM_ATT_IPACC_BSSGP_CFG] = {TLV_TYPE_TL16V},
79 [NM_ATT_IPACC_NS_LINK_CFG] = {TLV_TYPE_TL16V},
80 [NM_ATT_IPACC_RLC_CFG] = {TLV_TYPE_TL16V},
81 [NM_ATT_IPACC_ALM_THRESH_LIST] =
82 {TLV_TYPE_TL16V},
83 [NM_ATT_IPACC_MONIT_VAL_LIST] =
84 {TLV_TYPE_TL16V},
85 [NM_ATT_IPACC_TIB_CONTROL] = {TLV_TYPE_TL16V},
86 [NM_ATT_IPACC_SUPP_FEATURES] =
87 {TLV_TYPE_TL16V},
88 [NM_ATT_IPACC_CODING_SCHEMES] =
89 {TLV_TYPE_TL16V},
90 [NM_ATT_IPACC_RLC_CFG_2] = {TLV_TYPE_TL16V},
91 [NM_ATT_IPACC_HEARTB_TOUT] = {TLV_TYPE_TL16V},
92 [NM_ATT_IPACC_UPTIME] = {TLV_TYPE_TL16V},
93 [NM_ATT_IPACC_RLC_CFG_3] = {TLV_TYPE_TL16V},
94 [NM_ATT_IPACC_SSL_CFG] = {TLV_TYPE_TL16V},
95 [NM_ATT_IPACC_SEC_POSSIBLE] =
96 {TLV_TYPE_TL16V},
97 [NM_ATT_IPACC_IML_SSL_STATE] =
98 {TLV_TYPE_TL16V},
99 [NM_ATT_IPACC_REVOC_DATE] = {TLV_TYPE_TL16V},
100 },
101 },
102};
103
104static void test_nanobts_attr_bts_get(struct gsm_bts *bts, uint8_t *expected)
105{
106 struct msgb *msgb;
107
108 printf("Testing nanobts_attr_bts_get()...\n");
109
110 msgb = nanobts_attr_bts_get(bts);
111 printf("result= %s\n", osmo_hexdump_nospc(msgb->data, msgb->len));
112 printf("expected=%s\n", osmo_hexdump_nospc(expected, msgb->len));
113 OSMO_ASSERT(memcmp(msgb->data, expected, msgb->len) == 0);
114 msgb_free(msgb);
115
116 printf("ok.\n");
117 printf("\n");
118}
119
120static void test_nanobts_attr_nse_get(struct gsm_bts *bts, uint8_t *expected)
121{
122 struct msgb *msgb;
123
124 printf("Testing nanobts_attr_nse_get()...\n");
125
126 msgb = nanobts_attr_nse_get(bts);
127 printf("result= %s\n", osmo_hexdump_nospc(msgb->data, msgb->len));
128 printf("expected=%s\n", osmo_hexdump_nospc(expected, msgb->len));
129 OSMO_ASSERT(memcmp(msgb->data, expected, msgb->len) == 0);
130 msgb_free(msgb);
131
132 printf("ok.\n");
133 printf("\n");
134}
135
136static void test_nanobts_attr_cell_get(struct gsm_bts *bts, uint8_t *expected)
137{
138 struct msgb *msgb;
139
140 printf("Testing nanobts_attr_cell_get()...\n");
141
142 msgb = nanobts_attr_cell_get(bts);
143 printf("result= %s\n", osmo_hexdump_nospc(msgb->data, msgb->len));
144 printf("expected=%s\n", osmo_hexdump_nospc(expected, msgb->len));
145 OSMO_ASSERT(memcmp(msgb->data, expected, msgb->len) == 0);
146 msgb_free(msgb);
147
148 printf("ok.\n");
149 printf("\n");
150}
151
152static void test_nanobts_attr_nscv_get(struct gsm_bts *bts, uint8_t *expected)
153{
154 struct msgb *msgb;
155
156 printf("Testing nanobts_attr_nscv_get()...\n");
157
158 msgb = nanobts_attr_nscv_get(bts);
159 printf("result= %s\n", osmo_hexdump_nospc(msgb->data, msgb->len));
160 printf("expected=%s\n", osmo_hexdump_nospc(expected, msgb->len));
161 OSMO_ASSERT(memcmp(msgb->data, expected, msgb->len) == 0);
162 msgb_free(msgb);
163
164 printf("ok.\n");
165 printf("\n");
166}
167
168static void test_nanobts_attr_radio_get(struct gsm_bts *bts,
169 struct gsm_bts_trx *trx,
170 uint8_t *expected)
171{
172 struct msgb *msgb;
173
174 printf("Testing nanobts_attr_nscv_get()...\n");
175
176 msgb = nanobts_attr_radio_get(bts, trx);
177 printf("result= %s\n", osmo_hexdump_nospc(msgb->data, msgb->len));
178 printf("expected=%s\n", osmo_hexdump_nospc(expected, msgb->len));
179 OSMO_ASSERT(memcmp(msgb->data, expected, msgb->len) == 0);
180 msgb_free(msgb);
181
182 printf("ok.\n");
183 printf("\n");
184}
185
Neels Hofmeyr7997bf42018-02-13 17:16:44 +0100186static const struct log_info_cat log_categories[] = {
187};
188
189static const struct log_info log_info = {
190 .cat = log_categories,
191 .num_cat = ARRAY_SIZE(log_categories),
192};
193
Neels Hofmeyra6078fe2019-01-28 03:52:14 +0100194static struct osmo_tdef gsm_network_T_defs[] = {
195 { .T=3105, .default_val=100, .val=13, .unit=OSMO_TDEF_MS, .desc="Physical Information" },
196 { .T=3212, .default_val=5, .unit=OSMO_TDEF_CUSTOM,
Neels Hofmeyr596c4022018-06-16 19:29:50 +0200197 .desc="Periodic Location Update timer, sent to MS (1 = 6 minutes)" },
198 {}
199};
200
Philippb4cb8382016-09-29 17:01:57 +0200201int main(int argc, char **argv)
202{
203 void *ctx;
204
205 struct gsm_bts *bts;
206 struct gsm_network *net;
207 struct gsm_bts_trx *trx;
208
209 ctx = talloc_named_const(NULL, 0, "ctx");
210
Neels Hofmeyre3416182018-03-05 05:31:14 +0100211 osmo_init_logging2(ctx, &log_info);
212 log_set_log_level(osmo_stderr_target, LOGL_INFO);
213
Philippb4cb8382016-09-29 17:01:57 +0200214 /* Allocate environmental structs (bts, net, trx) */
215 net = talloc_zero(ctx, struct gsm_network);
216 INIT_LLIST_HEAD(&net->bts_list);
Neels Hofmeyr596c4022018-06-16 19:29:50 +0200217 net->T_defs = gsm_network_T_defs;
Philippb4cb8382016-09-29 17:01:57 +0200218 gsm_bts_model_register(&bts_model_nanobts);
219 bts = gsm_bts_alloc_register(net, GSM_BTS_TYPE_NANOBTS, 63);
220 OSMO_ASSERT(bts);
Harald Welte824b2742017-10-01 11:21:16 +0800221 bts->network = net;
Philippb4cb8382016-09-29 17:01:57 +0200222 trx = talloc_zero(ctx, struct gsm_bts_trx);
223
224 /* Parameters needed by nanobts_attr_bts_get() */
225 bts->rach_b_thresh = -1;
226 bts->rach_ldavg_slots = -1;
227 bts->c0->arfcn = 866;
228 bts->cell_identity = 1337;
Neels Hofmeyrf93970b2018-03-05 02:09:40 +0100229 bts->network->plmn = (struct osmo_plmn_id){ .mcc=1, .mnc=1 };
Philippb4cb8382016-09-29 17:01:57 +0200230 bts->location_area_code = 1;
231 bts->gprs.rac = 0;
232 uint8_t attr_bts_expected[] =
233 { 0x19, 0x55, 0x5b, 0x61, 0x67, 0x6d, 0x73, 0x18, 0x06, 0x0e, 0x00,
234 0x02, 0x01, 0x20, 0x33, 0x1e, 0x24, 0x24, 0xa8, 0x34, 0x21,
235 0xa8, 0x1f, 0x3f, 0x25,
Harald Welte5d224582018-02-27 09:56:39 +0100236 0x00, 0x01, 0x0a, 0x0c, 0x0a, 0x0b, 0x01, 0x2a, 0x5a, 0x2b,
Andreas Eversberg30b6df62013-06-12 08:30:53 +0200237 0x03, 0xe8, 0x0a, 0x0d,
Philippb4cb8382016-09-29 17:01:57 +0200238 0x23, 0x0a, 0x08, 0x03, 0x62, 0x09, 0x3f, 0x99, 0x00, 0x07,
239 0x00, 0xf1, 0x10, 0x00,
240 0x01, 0x05, 0x39
241 };
242
243 /* Parameters needed to test nanobts_attr_nse_get() */
244 bts->gprs.nse.nsei = 101;
245 uint8_t attr_nse_expected[] =
246 { 0x9d, 0x00, 0x02, 0x00, 0x65, 0xa0, 0x00, 0x07, 0x03, 0x03, 0x03,
247 0x03, 0x1e, 0x03, 0x0a, 0xa1, 0x00, 0x0b, 0x03, 0x03, 0x03,
248 0x03, 0x03, 0x0a, 0x03,
249 0x0a, 0x03, 0x0a, 0x03
250 };
251
252 /* Parameters needed to test nanobts_attr_cell_get() */
253 bts->gprs.rac = 0x00;
254 bts->gprs.cell.bvci = 2;
255 bts->gprs.mode = BTS_GPRS_GPRS;
256 uint8_t attr_cell_expected[] =
257 { 0x9a, 0x00, 0x01, 0x00, 0x9c, 0x00, 0x02, 0x05, 0x03, 0x9e, 0x00,
258 0x02, 0x00, 0x02, 0xa3, 0x00, 0x09, 0x14, 0x05, 0x05, 0xa0,
259 0x05, 0x0a, 0x04, 0x08,
260 0x0f, 0xa8, 0x00, 0x02, 0x0f, 0x00, 0xa9, 0x00, 0x05, 0x00,
261 0xfa, 0x00, 0xfa, 0x02
262 };
263
264 /* Parameters needed to test nanobts_attr_nscv_get() */
265 bts->gprs.nsvc[0].nsvci = 0x65;
266 bts->gprs.nsvc[0].remote_port = 0x59d8;
267 bts->gprs.nsvc[0].remote_ip = 0x0a090165;
268 bts->gprs.nsvc[0].local_port = 0x5a3c;
269 uint8_t attr_nscv_expected[] =
270 { 0x9f, 0x00, 0x02, 0x00, 0x65, 0xa2, 0x00, 0x08, 0x59, 0xd8, 0x0a,
271 0x09, 0x01, 0x65, 0x5a, 0x3c
272 };
273
274 /* Parameters needed to test nanobts_attr_radio_get() */
275 trx->arfcn = 866;
276 trx->max_power_red = 22;
277 bts->c0->max_power_red = 22;
278 uint8_t attr_radio_expected[] =
279 { 0x2d, 0x0b, 0x05, 0x00, 0x02, 0x03, 0x62 };
280
281 /* Run tests */
282 test_nanobts_attr_bts_get(bts, attr_bts_expected);
283 test_nanobts_attr_nse_get(bts, attr_nse_expected);
284 test_nanobts_attr_cell_get(bts, attr_cell_expected);
285 test_nanobts_attr_nscv_get(bts, attr_nscv_expected);
286 test_nanobts_attr_radio_get(bts, trx, attr_radio_expected);
287
288 printf("Done\n");
289 talloc_free(bts);
290 talloc_free(net);
291 talloc_free(trx);
292 talloc_report_full(ctx, stderr);
Neels Hofmeyre3416182018-03-05 05:31:14 +0100293 /* Expecting something like:
294 * full talloc report on 'ctx' (total 813 bytes in 6 blocks)
295 * logging contains 813 bytes in 5 blocks (ref 0) 0x60b0000000a0
296 * struct log_target contains 196 bytes in 2 blocks (ref 0) 0x6110000000a0
297 * struct log_category contains 36 bytes in 1 blocks (ref 0) 0x60d0000003e0
298 * struct log_info contains 616 bytes in 2 blocks (ref 0) 0x60d000000310
299 * struct log_info_cat contains 576 bytes in 1 blocks (ref 0) 0x6170000000e0
300 * That's the root ctx + 5x logging: */
301 OSMO_ASSERT(talloc_total_blocks(ctx) == 6);
302 talloc_free(ctx);
Philippb4cb8382016-09-29 17:01:57 +0200303 return 0;
304}
305
306/* stubs */
307struct osmo_prim_hdr;
308int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx)
309{
310 abort();
311}
Harald Welte3561bd42018-01-28 03:04:16 +0100312
313struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *net) {
314 OSMO_ASSERT(0);
315}
Neels Hofmeyr958f2592018-05-27 01:26:31 +0200316
317bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts)
318{ return true; }
Neels Hofmeyr31f525e2018-05-14 18:14:15 +0200319
320void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {}
Pau Espin Pedrolf8d03892019-11-12 16:30:30 +0100321int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }