blob: 663594cda784effbf5910891264256a3f4690d22 [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
Philippb4cb8382016-09-29 17:01:57 +0200194int main(int argc, char **argv)
195{
196 void *ctx;
197
198 struct gsm_bts *bts;
199 struct gsm_network *net;
200 struct gsm_bts_trx *trx;
201
Harald Weltef2b04c62017-10-03 15:45:30 +0800202 osmo_init_logging(&log_info);
203 log_set_log_level(osmo_stderr_target, LOGL_INFO);
204
Philippb4cb8382016-09-29 17:01:57 +0200205 ctx = talloc_named_const(NULL, 0, "ctx");
206
207 /* Allocate environmental structs (bts, net, trx) */
208 net = talloc_zero(ctx, struct gsm_network);
209 INIT_LLIST_HEAD(&net->bts_list);
210 gsm_bts_model_register(&bts_model_nanobts);
211 bts = gsm_bts_alloc_register(net, GSM_BTS_TYPE_NANOBTS, 63);
212 OSMO_ASSERT(bts);
Harald Welte824b2742017-10-01 11:21:16 +0800213 bts->network = net;
Philippb4cb8382016-09-29 17:01:57 +0200214 trx = talloc_zero(ctx, struct gsm_bts_trx);
215
216 /* Parameters needed by nanobts_attr_bts_get() */
217 bts->rach_b_thresh = -1;
218 bts->rach_ldavg_slots = -1;
219 bts->c0->arfcn = 866;
220 bts->cell_identity = 1337;
Neels Hofmeyrf93970b2018-03-05 02:09:40 +0100221 bts->network->plmn = (struct osmo_plmn_id){ .mcc=1, .mnc=1 };
Philippb4cb8382016-09-29 17:01:57 +0200222 bts->location_area_code = 1;
223 bts->gprs.rac = 0;
224 uint8_t attr_bts_expected[] =
225 { 0x19, 0x55, 0x5b, 0x61, 0x67, 0x6d, 0x73, 0x18, 0x06, 0x0e, 0x00,
226 0x02, 0x01, 0x20, 0x33, 0x1e, 0x24, 0x24, 0xa8, 0x34, 0x21,
227 0xa8, 0x1f, 0x3f, 0x25,
Harald Welte5d224582018-02-27 09:56:39 +0100228 0x00, 0x01, 0x0a, 0x0c, 0x0a, 0x0b, 0x01, 0x2a, 0x5a, 0x2b,
Andreas Eversberg30b6df62013-06-12 08:30:53 +0200229 0x03, 0xe8, 0x0a, 0x0d,
Philippb4cb8382016-09-29 17:01:57 +0200230 0x23, 0x0a, 0x08, 0x03, 0x62, 0x09, 0x3f, 0x99, 0x00, 0x07,
231 0x00, 0xf1, 0x10, 0x00,
232 0x01, 0x05, 0x39
233 };
234
235 /* Parameters needed to test nanobts_attr_nse_get() */
236 bts->gprs.nse.nsei = 101;
237 uint8_t attr_nse_expected[] =
238 { 0x9d, 0x00, 0x02, 0x00, 0x65, 0xa0, 0x00, 0x07, 0x03, 0x03, 0x03,
239 0x03, 0x1e, 0x03, 0x0a, 0xa1, 0x00, 0x0b, 0x03, 0x03, 0x03,
240 0x03, 0x03, 0x0a, 0x03,
241 0x0a, 0x03, 0x0a, 0x03
242 };
243
244 /* Parameters needed to test nanobts_attr_cell_get() */
245 bts->gprs.rac = 0x00;
246 bts->gprs.cell.bvci = 2;
247 bts->gprs.mode = BTS_GPRS_GPRS;
248 uint8_t attr_cell_expected[] =
249 { 0x9a, 0x00, 0x01, 0x00, 0x9c, 0x00, 0x02, 0x05, 0x03, 0x9e, 0x00,
250 0x02, 0x00, 0x02, 0xa3, 0x00, 0x09, 0x14, 0x05, 0x05, 0xa0,
251 0x05, 0x0a, 0x04, 0x08,
252 0x0f, 0xa8, 0x00, 0x02, 0x0f, 0x00, 0xa9, 0x00, 0x05, 0x00,
253 0xfa, 0x00, 0xfa, 0x02
254 };
255
256 /* Parameters needed to test nanobts_attr_nscv_get() */
257 bts->gprs.nsvc[0].nsvci = 0x65;
258 bts->gprs.nsvc[0].remote_port = 0x59d8;
259 bts->gprs.nsvc[0].remote_ip = 0x0a090165;
260 bts->gprs.nsvc[0].local_port = 0x5a3c;
261 uint8_t attr_nscv_expected[] =
262 { 0x9f, 0x00, 0x02, 0x00, 0x65, 0xa2, 0x00, 0x08, 0x59, 0xd8, 0x0a,
263 0x09, 0x01, 0x65, 0x5a, 0x3c
264 };
265
266 /* Parameters needed to test nanobts_attr_radio_get() */
267 trx->arfcn = 866;
268 trx->max_power_red = 22;
269 bts->c0->max_power_red = 22;
270 uint8_t attr_radio_expected[] =
271 { 0x2d, 0x0b, 0x05, 0x00, 0x02, 0x03, 0x62 };
272
273 /* Run tests */
274 test_nanobts_attr_bts_get(bts, attr_bts_expected);
275 test_nanobts_attr_nse_get(bts, attr_nse_expected);
276 test_nanobts_attr_cell_get(bts, attr_cell_expected);
277 test_nanobts_attr_nscv_get(bts, attr_nscv_expected);
278 test_nanobts_attr_radio_get(bts, trx, attr_radio_expected);
279
280 printf("Done\n");
281 talloc_free(bts);
282 talloc_free(net);
283 talloc_free(trx);
284 talloc_report_full(ctx, stderr);
285 OSMO_ASSERT(talloc_total_blocks(ctx) == 1);
286 return 0;
287}
288
289/* stubs */
290struct osmo_prim_hdr;
291int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx)
292{
293 abort();
294}
Harald Welte3561bd42018-01-28 03:04:16 +0100295
296struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *net) {
297 OSMO_ASSERT(0);
298}