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