blob: 6905fe200d85cf5ded4eaf6ffbb85d92bf433cba [file] [log] [blame]
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001/* test routines for gbproxy
2 * send NS messages to the gbproxy and dumps what happens
3 * (C) 2013 by sysmocom s.f.m.c. GmbH
4 * Author: Jacob Erlbeck <jerlbeck@sysmocom.de>
5 */
6
7#undef _GNU_SOURCE
8#define _GNU_SOURCE
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <stdint.h>
13#include <string.h>
14#include <getopt.h>
15#include <dlfcn.h>
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020016#include <time.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020017#include <sys/types.h>
18#include <sys/socket.h>
19
20#include <osmocom/core/msgb.h>
21#include <osmocom/core/application.h>
22#include <osmocom/core/utils.h>
23#include <osmocom/core/logging.h>
24#include <osmocom/core/talloc.h>
25#include <osmocom/core/signal.h>
26#include <osmocom/core/rate_ctr.h>
Jacob Erlbeckb1381062014-07-01 12:41:13 +020027#include <osmocom/gsm/tlv.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020028#include <osmocom/gprs/gprs_msgb.h>
29#include <osmocom/gprs/gprs_ns.h>
30#include <osmocom/gprs/gprs_bssgp.h>
31
32#include <openbsc/gb_proxy.h>
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020033#include <openbsc/debug.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020034
35#define REMOTE_BSS_ADDR 0x01020304
36#define REMOTE_SGSN_ADDR 0x05060708
37
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020038#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020039
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020040struct gbproxy_config gbcfg = {0};
41
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020042static int dump_global(FILE *stream, int indent)
43{
44 unsigned int i;
45 const struct rate_ctr_group_desc *desc;
46 int rc;
47
48 rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
49 if (rc < 0)
50 return rc;
51
52 desc = gbcfg.ctrg->desc;
53
54 for (i = 0; i < desc->num_ctr; i++) {
55 struct rate_ctr *ctr = &gbcfg.ctrg->ctr[i];
56 if (ctr->current) {
57 rc = fprintf(stream, "%*s %s: %llu\n",
58 indent, "",
59 desc->ctr_desc[i].description,
60 (long long)ctr->current);
61
62 if (rc < 0)
63 return rc;
64 }
65 }
66
67 return 0;
68}
69
70static int dump_peers(FILE *stream, int indent)
71{
72 struct gbprox_peer *peer;
73 struct gprs_ra_id raid;
74 unsigned int i;
75 const struct rate_ctr_group_desc *desc;
76 int rc;
77 time_t now = time(NULL);
78
79 rc = fprintf(stream, "%*sPeers:\n", indent, "");
80 if (rc < 0)
81 return rc;
82
83 llist_for_each_entry(peer, &gbcfg.bts_peers, list) {
84 struct gbprox_tlli_info *tlli_info;
85 struct gbprox_patch_state *state = &peer->patch_state;
86 gsm48_parse_ra(&raid, peer->ra);
87
88 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, "
89 "RAI %u-%u-%u-%u\n",
90 indent, "",
91 peer->nsei, peer->bvci,
92 peer->blocked ? "" : "not ",
93 raid.mcc, raid.mnc, raid.lac, raid.rac);
94
95 if (rc < 0)
96 return rc;
97
98 desc = peer->ctrg->desc;
99
100 for (i = 0; i < desc->num_ctr; i++) {
101 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
102 if (ctr->current) {
103 rc = fprintf(stream, "%*s %s: %llu\n",
104 indent, "",
105 desc->ctr_desc[i].description,
106 (long long)ctr->current);
107
108 if (rc < 0)
109 return rc;
110 }
111 }
112
113 fprintf(stream, "%*s TLLI-Cache: %d\n",
114 indent, "", state->enabled_tllis_count);
115 llist_for_each_entry(tlli_info, &state->enabled_tllis, list) {
116 char mi_buf[200];
117 time_t age = now - tlli_info->timestamp;
118 snprintf(mi_buf, sizeof(mi_buf), "(invalid)");
119 gsm48_mi_to_string(mi_buf, sizeof(mi_buf),
120 tlli_info->mi_data,
121 tlli_info->mi_data_len);
122 rc = fprintf(stream,
123 "%*s TLLI %08x, IMSI %s, AGE %d\n",
124 indent, "",
125 tlli_info->tlli, mi_buf, (int)age);
126 if (rc < 0)
127 return rc;
128 }
129 }
130
131 return 0;
132}
133
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200134/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Attach Request */
135static const unsigned char bssgp_attach_req[75] = {
136 0x01, 0xbb, 0xc5, 0x46, 0x79, 0x00, 0x00, 0x04,
137 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
138 0x75, 0x30, 0x00, 0x80, 0x0e, 0x00, 0x34, 0x01,
139 0xc0, 0x01, 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21,
140 0x08, 0x02, 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79,
141 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19, 0x18,
142 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60,
143 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80,
144 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
145 0x16, 0x6d, 0x01
146};
147
148/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Attach Accept */
149static const unsigned char bssgp_attach_acc[88] = {
150 0x00, 0xbb, 0xc5, 0x46, 0x79, 0x00, 0x50, 0x20,
151 0x16, 0x82, 0x02, 0x58, 0x13, 0x99, 0x18, 0xb3,
152 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80,
153 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba,
154 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00, 0x0a,
155 0x82, 0x08, 0x02, 0x0d, 0x88, 0x11, 0x12, 0x13,
156 0x14, 0x15, 0x16, 0x17, 0x18, 0x00, 0x81, 0x00,
157 0x0e, 0x9e, 0x41, 0xc0, 0x05, 0x08, 0x02, 0x01,
158 0x49, 0x04, 0x21, 0x63, 0x54, 0x40, 0x50, 0x60,
159 0x19, 0xcd, 0xd7, 0x08, 0x17, 0x16, 0x18, 0x05,
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +0200160 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x42, 0x67, 0x9a
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200161};
162
Jacob Erlbeck11669742014-06-06 18:47:36 +0200163/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - GMM Information */
164static const unsigned char bssgp_gmm_information[66] = {
165 0x00, 0xef, 0xe2, 0xb7, 0x00, 0x00, 0x50, 0x20,
166 0x16, 0x82, 0x02, 0x58, 0x13, 0x99, 0x18, 0xb3,
167 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80,
168 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba,
169 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00, 0x0a,
170 0x82, 0x08, 0x02, 0x0d, 0x88, 0x11, 0x12, 0x13,
171 0x14, 0x15, 0x16, 0x17, 0x18, 0x00, 0x81, 0x00,
172 0x0e, 0x88, 0x41, 0xc0, 0x09, 0x08, 0x21, 0x04,
173 0xba, 0x3d
174};
175
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200176/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Routing Area Update Request */
177static const unsigned char bssgp_ra_upd_req[85] = {
Jacob Erlbeck11669742014-06-06 18:47:36 +0200178 0x01, 0xbb, 0xc5, 0x46, 0x79, 0x00, 0x00, 0x04,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200179 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
180 0x70, 0x80, 0x00, 0x80, 0x0e, 0x00, 0x3e, 0x01,
181 0xc0, 0x15, 0x08, 0x08, 0x10, 0x11, 0x22, 0x33,
182 0x40, 0x50, 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33,
183 0x57, 0x2b, 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48,
184 0x50, 0xc8, 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8,
185 0x48, 0x02, 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02,
186 0x00, 0x19, 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27,
187 0x07, 0x04, 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02,
188 0x20, 0x00, 0x96, 0x3e, 0x97
189};
190
191/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Routing Area Update Accept */
192static const unsigned char bssgp_ra_upd_acc[91] = {
Jacob Erlbeck11669742014-06-06 18:47:36 +0200193 0x00, 0xbb, 0xc5, 0x46, 0x79, 0x00, 0x50, 0x20,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200194 0x16, 0x82, 0x02, 0x58, 0x13, 0x9d, 0x19, 0x13,
195 0x42, 0x33, 0x57, 0x2b, 0xf7, 0xc8, 0x48, 0x02,
196 0x13, 0x48, 0x50, 0xc8, 0x48, 0x02, 0x14, 0x48,
197 0x50, 0xc8, 0x48, 0x02, 0x17, 0x49, 0x10, 0xc8,
198 0x48, 0x02, 0x00, 0x0a, 0x82, 0x07, 0x04, 0x0d,
199 0x88, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
200 0x18, 0x00, 0x81, 0x00, 0x0e, 0x9d, 0x41, 0xc0,
201 0x19, 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
202 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
203 0x05, 0xf4, 0xef, 0xe2, 0x81, 0x17, 0x17, 0x16,
204 0xc3, 0xbf, 0xcc
205};
206
207/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Activate PDP Context Request */
208static const unsigned char bssgp_act_pdp_ctx_req[76] = {
209 0x01, 0xef, 0xe2, 0xb7, 0x00, 0x00, 0x00, 0x04,
210 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
211 0x75, 0x30, 0x00, 0x80, 0x0e, 0x00, 0x35, 0x01,
212 0xc0, 0x0d, 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
213 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
215 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
216 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
217 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
218 0x00, 0x5a, 0xff, 0x02
219};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200220
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200221/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Detach Request */
222static const unsigned char bssgp_detach_req[44] = {
223 0x01, 0xef, 0xe2, 0xb7, 0x00, 0x00, 0x00, 0x04,
224 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
225 0x75, 0x30, 0x00, 0x80, 0x0e, 0x00, 0x15, 0x01,
226 0xc0, 0x19, 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4,
227 0xef, 0xe2, 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97,
228 0xcb, 0x7e, 0xe1, 0x41
229};
230
231/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Detach Accept */
232static const unsigned char bssgp_detach_acc[67] = {
233 0x00, 0xef, 0xe2, 0xb7, 0x00, 0x00, 0x50, 0x20,
234 0x16, 0x82, 0x02, 0x58, 0x13, 0x99, 0x18, 0xb3,
235 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80,
236 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba,
237 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00, 0x0a,
238 0x82, 0x08, 0x02, 0x0d, 0x88, 0x11, 0x12, 0x13,
239 0x14, 0x15, 0x16, 0x17, 0x18, 0x00, 0x81, 0x00,
240 0x0e, 0x89, 0x41, 0xc0, 0x15, 0x08, 0x06, 0x00,
241 0xf7, 0x35, 0xf0
242};
243
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200244static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
245 struct sockaddr_in *peer, const unsigned char* data,
246 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200247
248static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
249 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
250{
251 /* GPRS Network Service, PDU type: NS_RESET,
252 */
253 unsigned char msg[12] = {
254 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
255 0x04, 0x82, 0x11, 0x22
256 };
257
258 msg[3] = cause;
259 msg[6] = nsvci / 256;
260 msg[7] = nsvci % 256;
261 msg[10] = nsei / 256;
262 msg[11] = nsei % 256;
263
264 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
265}
266
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200267static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
268 uint16_t nsvci, uint16_t nsei)
269{
270 /* GPRS Network Service, PDU type: NS_RESET_ACK,
271 */
272 unsigned char msg[9] = {
273 0x03, 0x01, 0x82, 0x11, 0x22,
274 0x04, 0x82, 0x11, 0x22
275 };
276
277 msg[3] = nsvci / 256;
278 msg[4] = nsvci % 256;
279 msg[7] = nsei / 256;
280 msg[8] = nsei % 256;
281
282 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
283}
284
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200285static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
286{
287 /* GPRS Network Service, PDU type: NS_ALIVE */
288 unsigned char msg[1] = {
289 0x0a
290 };
291
292 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
293}
294
295static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
296{
297 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
298 unsigned char msg[1] = {
299 0x0b
300 };
301
302 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
303}
304
305static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
306{
307 /* GPRS Network Service, PDU type: NS_UNBLOCK */
308 unsigned char msg[1] = {
309 0x06
310 };
311
312 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
313}
314
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200315static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
316{
317 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
318 unsigned char msg[1] = {
319 0x07
320 };
321
322 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
323}
324
325static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
326 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200327 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
328{
329 /* GPRS Network Service, PDU type: NS_UNITDATA */
330 unsigned char msg[4096] = {
331 0x00, 0x00, 0x00, 0x00
332 };
333
334 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
335
336 msg[2] = nsbvci / 256;
337 msg[3] = nsbvci % 256;
338 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
339
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200340 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200341}
342
343static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
344 uint16_t bvci)
345{
346 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
347 * BSSGP RESET */
348 unsigned char msg[22] = {
349 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200350 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
351 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200352 };
353
354 msg[3] = bvci / 256;
355 msg[4] = bvci % 256;
356
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200357 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
358}
359
360static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
361 struct sockaddr_in *src_addr, uint16_t bvci)
362{
363 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
364 * BSSGP RESET_ACK */
365 static unsigned char msg[5] = {
366 0x23, 0x04, 0x82, 0x00,
367 0x00
368 };
369
370 msg[3] = bvci / 256;
371 msg[4] = bvci % 256;
372
373 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200374}
375
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200376static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
377 struct sockaddr_in *src_addr,
378 struct gprs_ra_id *raid)
379{
380 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
381 unsigned char msg[15] = {
382 0x0b, 0x1f, 0x84, 0xcc, 0xd1, 0x75, 0x8b, 0x1b,
383 0x86, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60
384 };
385
386 gsm48_construct_ra(msg + 9, raid);
387
388 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
389}
390
391static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
392 struct sockaddr_in *src_addr,
393 struct gprs_ra_id *raid)
394{
395 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
396 unsigned char msg[18] = {
397 0x0c, 0x1f, 0x84, 0xcc, 0xd1, 0x75, 0x8b, 0x1b,
398 0x86, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x1d,
399 0x81, 0x01
400 };
401
402 gsm48_construct_ra(msg + 9, raid);
403
404 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
405}
406
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200407static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
408 uint16_t nsvci, uint16_t nsei)
409{
410 printf("Setup NS-VC: remote 0x%08x:%d, "
411 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
412 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
413 nsvci, nsvci, nsei, nsei);
414
415 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
416 send_ns_alive(nsi, src_addr);
417 send_ns_unblock(nsi, src_addr);
418 send_ns_alive_ack(nsi, src_addr);
419}
420
421static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
422 uint16_t bvci)
423{
424 printf("Setup BSSGP: remote 0x%08x:%d, "
425 "BVCI 0x%04x(%d)\n\n",
426 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
427 bvci, bvci);
428
429 send_bssgp_reset(nsi, src_addr, bvci);
430}
431
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200432static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer)
433{
434 gprs_ns_nsip_connect(nsi, sgsn_peer, SGSN_NSEI, SGSN_NSEI+1);
435 send_ns_reset_ack(nsi, sgsn_peer, SGSN_NSEI+1, SGSN_NSEI);
436 send_ns_alive_ack(nsi, sgsn_peer);
437 send_ns_unblock_ack(nsi, sgsn_peer);
438 send_ns_alive(nsi, sgsn_peer);
439}
440
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200441static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
442{
443 sgsn_peer->sin_family = AF_INET;
444 sgsn_peer->sin_port = htons(32000);
445 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
446}
447
448static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
449{
450 size_t i;
451
452 for (i = 0; i < size; ++i) {
453 bss_peers[i].sin_family = AF_INET;
454 bss_peers[i].sin_port = htons((i + 1) * 1111);
455 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
456 }
457}
458
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200459int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
460 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
461
462/* override */
463int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
464 struct msgb *msg, uint16_t bvci)
465{
466 printf("CALLBACK, event %d, msg length %d, bvci 0x%04x\n%s\n\n",
467 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200468 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200469
470 switch (event) {
471 case GPRS_NS_EVT_UNIT_DATA:
Jacob Erlbecke75fec62013-10-15 12:00:27 +0200472 return gbprox_rcvmsg(msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200473 default:
474 break;
475 }
476 return 0;
477}
478
479/* override */
480ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
481 const struct sockaddr *dest_addr, socklen_t addrlen)
482{
483 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
484 const struct sockaddr *, socklen_t);
485 static sendto_t real_sendto = NULL;
486 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200487 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200488
489 if (!real_sendto)
490 real_sendto = dlsym(RTLD_NEXT, "sendto");
491
492 if (dest_host == REMOTE_BSS_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200493 printf("MESSAGE to BSS at 0x%08x:%d, msg length %d\n%s\n\n",
494 dest_host, dest_port,
495 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200496 else if (dest_host == REMOTE_SGSN_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200497 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %d\n%s\n\n",
498 dest_host, dest_port,
499 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200500 else
501 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
502
503 return len;
504}
505
506/* override */
507int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
508{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200509 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
510 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200511 uint16_t bvci = msgb_bvci(msg);
512 uint16_t nsei = msgb_nsei(msg);
513
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200514 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200515
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200516 if (!real_gprs_ns_sendmsg)
517 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
518
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200519 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200520 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
521 "msg length %d (%s)\n",
522 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200523 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200524 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
525 "msg length %d (%s)\n",
526 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200527
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200528 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200529}
530
531static void dump_rate_ctr_group(FILE *stream, const char *prefix,
532 struct rate_ctr_group *ctrg)
533{
534 unsigned int i;
535
536 for (i = 0; i < ctrg->desc->num_ctr; i++) {
537 struct rate_ctr *ctr = &ctrg->ctr[i];
538 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
539 fprintf(stream, " %s%s: %llu%s",
540 prefix, ctrg->desc->ctr_desc[i].description,
541 (long long)ctr->current,
542 "\n");
543 };
544}
545
546/* Signal handler for signals from NS layer */
547static int test_signal(unsigned int subsys, unsigned int signal,
548 void *handler_data, void *signal_data)
549{
550 struct ns_signal_data *nssd = signal_data;
551 int rc;
552
553 if (subsys != SS_L_NS)
554 return 0;
555
556 switch (signal) {
557 case S_NS_RESET:
558 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
559 nssd->nsvc->nsvci,
560 gprs_ns_ll_str(nssd->nsvc));
561 break;
562
563 case S_NS_ALIVE_EXP:
564 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
565 nssd->nsvc->nsvci,
566 gprs_ns_ll_str(nssd->nsvc));
567 break;
568
569 case S_NS_BLOCK:
570 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
571 nssd->nsvc->nsvci,
572 gprs_ns_ll_str(nssd->nsvc));
573 break;
574
575 case S_NS_UNBLOCK:
576 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
577 nssd->nsvc->nsvci,
578 gprs_ns_ll_str(nssd->nsvc));
579 break;
580
581 case S_NS_REPLACED:
582 printf("==> got signal NS_REPLACED: 0x%04x/%s",
583 nssd->nsvc->nsvci,
584 gprs_ns_ll_str(nssd->nsvc));
585 printf(" -> 0x%04x/%s\n",
586 nssd->old_nsvc->nsvci,
587 gprs_ns_ll_str(nssd->old_nsvc));
588 break;
589
590 default:
591 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
592 nssd->nsvc->nsvci,
593 gprs_ns_ll_str(nssd->nsvc));
594 break;
595 }
596 printf("\n");
597 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
598 return rc;
599}
600
601static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
602{
603 struct msgb *msg;
604 int ret;
605 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
606 fprintf(stderr, "message too long: %d\n", data_len);
607 return -1;
608 }
609
610 msg = gprs_ns_msgb_alloc();
611 memmove(msg->data, data, data_len);
612 msg->l2h = msg->data;
613 msgb_put(msg, data_len);
614
615 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
616 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
617 osmo_hexdump(data, data_len));
618
619 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
620
621 printf("result (%s) = %d\n\n", text, ret);
622
623 msgb_free(msg);
624
625 return ret;
626}
627
628static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
629{
630 struct gprs_nsvc *nsvc;
631
632 printf("Current NS-VCIs:\n");
633 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
634 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200635 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200636 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200637 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
638 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
639 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200640 );
641 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
642 }
643 printf("\n");
644}
645
646static void test_gbproxy()
647{
648 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
649 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200650 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200651
652 bssgp_nsi = nsi;
653 gbcfg.nsi = bssgp_nsi;
654 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
655
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200656 configure_sgsn_peer(&sgsn_peer);
657 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200658
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200659 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200660 printf("--- Initialise SGSN ---\n\n");
661
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200662 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200663 gprs_dump_nsi(nsi);
664
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200665 printf("--- Initialise BSS 1 ---\n\n");
666
667 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
668 setup_bssgp(nsi, &bss_peer[0], 0x1002);
669 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200670 dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200671
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200672 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
673
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200674 printf("--- Initialise BSS 2 ---\n\n");
675
676 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
677 setup_bssgp(nsi, &bss_peer[1], 0x2002);
678 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200679 dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200680
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200681 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
682
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200683 printf("--- Move BSS 1 to new port ---\n\n");
684
685 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
686 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200687 dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200688
689 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
690
691 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
692 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200693 dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200694
695 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
696
697 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
698 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200699 dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200700
701 printf("--- Move BSS 2 to new port ---\n\n");
702
703 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
704 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200705 dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200706
707 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
708
709 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
710 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200711 dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200712
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200713 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
714
715 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
716 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200717 dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200718
719 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
720
721 setup_bssgp(nsi, &bss_peer[0], 0x1012);
722 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200723 dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200724
725 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
726
727 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
728
729 setup_bssgp(nsi, &bss_peer[0], 0x1002);
730 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200731 dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200732
733 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
734
735 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
736
737 setup_bssgp(nsi, &bss_peer[0], 0x1002);
738 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200739 dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200740
741 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
742
743 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
744
745 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
746
747 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
748
749 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
750
751 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
752
753 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
754
755 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
756
757 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
758
759 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
760
761 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
762
763 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
764
765 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
766
767 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
768
769 setup_bssgp(nsi, &bss_peer[2], 0x1002);
770 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200771 dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200772
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200773 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200774
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200775 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
776
777 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
778
779 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
780
781 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
782
783 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
784
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200785 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
786
787 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
788
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200789 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200790
Holger Hans Peter Freyther84db98f2014-07-07 19:22:02 +0200791 gbprox_reset();
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200792 gprs_ns_destroy(nsi);
793 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200794}
795
796static void test_gbproxy_ident_changes()
797{
798 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
799 struct sockaddr_in bss_peer[1] = {{0},};
800 struct sockaddr_in sgsn_peer= {0};
801 uint16_t nsei[2] = {0x1000, 0x2000};
802 uint16_t nsvci[2] = {0x1001, 0x2001};
803 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
804
805 bssgp_nsi = nsi;
806 gbcfg.nsi = bssgp_nsi;
807 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
808
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200809 configure_sgsn_peer(&sgsn_peer);
810 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200811
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200812 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200813 printf("--- Initialise SGSN ---\n\n");
814
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200815 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200816 gprs_dump_nsi(nsi);
817
818 printf("--- Initialise BSS 1 ---\n\n");
819
820 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
821 gprs_dump_nsi(nsi);
822
823 printf("--- Setup BVCI 1 ---\n\n");
824
825 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
826 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200827 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200828
829 printf("--- Setup BVCI 2 ---\n\n");
830
831 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
832 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200833 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200834
835 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
836
837 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
838 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
839
840 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
841
842 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
843 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
844
845 printf("--- Change NSEI ---\n\n");
846
847 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
848 gprs_dump_nsi(nsi);
849
850 printf("--- Setup BVCI 1 ---\n\n");
851
852 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
853 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200854 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200855
856 printf("--- Setup BVCI 3 ---\n\n");
857
858 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
859 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200860 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200861
862 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
863
864 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
865 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
866
867 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
868 " (should fail) ---\n\n");
869
870 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200871 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200872 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200873 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200874
875 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
876
877 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
878 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
879
880 printf("--- Change NSVCI ---\n\n");
881
882 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
883 gprs_dump_nsi(nsi);
884
885 printf("--- Setup BVCI 1 ---\n\n");
886
887 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
888 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200889 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200890
891 printf("--- Setup BVCI 4 ---\n\n");
892
893 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
894 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200895 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200896
897 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
898
899 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
900 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
901
902 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
903 " (should fail) ---\n\n");
904
905 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200906 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200907 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200908 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200909
910 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
911
912 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
913 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
914
915 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
916
917 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
918 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
919
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200920 dump_global(stdout, 0);
921 dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200922
Holger Hans Peter Freyther84db98f2014-07-07 19:22:02 +0200923 gbprox_reset();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200924 gprs_ns_destroy(nsi);
925 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200926}
927
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200928static void test_gbproxy_ra_patching()
929{
930 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
931 struct sockaddr_in bss_peer[1] = {{0},};
932 struct sockaddr_in sgsn_peer= {0};
933 struct gprs_ra_id rai_bss =
934 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
935 struct gprs_ra_id rai_sgsn =
936 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
937 struct gprs_ra_id rai_unknown =
938 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeck7c101d92014-06-06 18:49:23 +0200939 const char *err_msg = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200940
941 bssgp_nsi = nsi;
942 gbcfg.nsi = bssgp_nsi;
943 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Jacob Erlbeck67a44452014-05-19 10:14:58 +0200944 gbcfg.core_mcc = 123;
945 gbcfg.core_mnc = 456;
Jacob Erlbeck73685282014-05-23 20:48:07 +0200946 gbcfg.core_apn = talloc_zero_size(NULL, 100);
947 gbcfg.core_apn_size = gbprox_str_to_apn(gbcfg.core_apn, "foo.bar", 100);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200948
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200949 configure_sgsn_peer(&sgsn_peer);
950 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200951
Jacob Erlbeck7c101d92014-06-06 18:49:23 +0200952 gbcfg.match_re = talloc_strdup(NULL, "^9898|^121314");
953 if (gbprox_set_patch_filter(gbcfg.match_re, &err_msg) != 0) {
954 fprintf(stderr, "Failed to compile RE '%s': %s\n",
955 gbcfg.match_re, err_msg);
956 exit(1);
957 }
958
959
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200960 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200961 printf("--- Initialise SGSN ---\n\n");
962
963 connect_sgsn(nsi, &sgsn_peer);
964 gprs_dump_nsi(nsi);
965
966 printf("--- Initialise BSS 1 ---\n\n");
967
968 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
969 setup_bssgp(nsi, &bss_peer[0], 0x1002);
970 gprs_dump_nsi(nsi);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200971 dump_peers(stdout, 0);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200972
973 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
974
975 send_bssgp_suspend(nsi, &bss_peer[0], &rai_bss);
976 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_sgsn);
977
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200978 dump_global(stdout, 0);
979 dump_peers(stdout, 0);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200980
981 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
982
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200983 send_ns_unitdata(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200984 bssgp_attach_req, sizeof(bssgp_attach_req));
985
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200986 send_ns_unitdata(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200987 bssgp_attach_acc, sizeof(bssgp_attach_acc));
988
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +0200989 /* Replace APN (1) */
990 send_ns_unitdata(nsi, "ACT PDP CTX REQ (REPLACE APN)",
991 &bss_peer[0], 0x1002,
992 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200993
Jacob Erlbeck11669742014-06-06 18:47:36 +0200994 send_ns_unitdata(nsi, "GMM INFO", &sgsn_peer, 0x1002,
995 bssgp_gmm_information, sizeof(bssgp_gmm_information));
996
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +0200997 /* Replace APN (2) */
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200998 send_ns_unitdata(nsi, "ACT PDP CTX REQ (REPLACE APN)",
999 &bss_peer[0], 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001000 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
1001
Jacob Erlbeck73685282014-05-23 20:48:07 +02001002 gbcfg.core_apn[0] = 0;
1003 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001004
1005 /* Remove APN */
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001006 send_ns_unitdata(nsi, "ACT PDP CTX REQ (REMOVE APN)",
1007 &bss_peer[0], 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001008 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
1009
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001010 dump_peers(stdout, 0);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001011
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001012 /* Detach */
1013 send_ns_unitdata(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1014 bssgp_detach_req, sizeof(bssgp_detach_req));
1015
1016 send_ns_unitdata(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1017 bssgp_detach_acc, sizeof(bssgp_detach_acc));
1018
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001019 dump_peers(stdout, 0);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001020
1021 printf("--- RA update ---\n\n");
1022
1023 send_ns_unitdata(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
1024 bssgp_ra_upd_req, sizeof(bssgp_ra_upd_req));
1025
1026 send_ns_unitdata(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
1027 bssgp_ra_upd_acc, sizeof(bssgp_ra_upd_acc));
1028
1029 /* Remove APN */
1030 send_ns_unitdata(nsi, "ACT PDP CTX REQ (REMOVE APN)",
1031 &bss_peer[0], 0x1002,
1032 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
1033
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001034 dump_peers(stdout, 0);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001035
1036 /* Detach */
1037 send_ns_unitdata(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1038 bssgp_detach_req, sizeof(bssgp_detach_req));
1039
1040 send_ns_unitdata(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1041 bssgp_detach_acc, sizeof(bssgp_detach_acc));
1042
1043
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001044 dump_global(stdout, 0);
1045 dump_peers(stdout, 0);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001046
1047 printf("--- Bad cases ---\n\n");
1048
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001049 printf("TLLI is already detached, shouldn't patch\n");
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001050 send_ns_unitdata(nsi, "ACT PDP CTX REQ", &bss_peer[0], 0x1002,
1051 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
1052
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001053 printf("Invalid RAI, shouldn't patch\n");
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001054 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_unknown);
1055
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001056 dump_global(stdout, 0);
1057 dump_peers(stdout, 0);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001058
Holger Hans Peter Freyther84db98f2014-07-07 19:22:02 +02001059 gbprox_reset();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001060 gprs_ns_destroy(nsi);
1061 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001062}
1063
Jacob Erlbeckb1381062014-07-01 12:41:13 +02001064/* TODO: Move tlv testing to libosmocore */
1065int v_fixed_shift(uint8_t **data, size_t *data_len, size_t len, uint8_t **value);
1066int tv_fixed_match(uint8_t **data, size_t *data_len, uint8_t tag, size_t len,
1067 uint8_t **value);
1068int tlv_match(uint8_t **data, size_t *data_len, uint8_t tag, uint8_t **value,
1069 size_t *value_len);
1070int lv_shift(uint8_t **data, size_t *data_len,
1071 uint8_t **value, size_t *value_len);
1072
1073static void check_tlv_match(uint8_t **data, size_t *data_len,
1074 uint8_t tag, size_t exp_len, const uint8_t *exp_val)
1075{
1076 uint8_t *value;
1077 size_t value_len;
1078 int rc;
1079
1080 rc = tlv_match(data, data_len, tag ^ 1, NULL, NULL);
1081 OSMO_ASSERT(rc == 0);
1082
1083 rc = tlv_match(data, data_len, tag, &value, &value_len);
1084 OSMO_ASSERT(rc == value_len + 2);
1085 OSMO_ASSERT(value_len == exp_len);
1086 OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
1087}
1088
1089static void check_tv_fixed_match(uint8_t **data, size_t *data_len,
1090 uint8_t tag, size_t len, const uint8_t *exp_val)
1091{
1092 uint8_t *value;
1093 int rc;
1094
1095 rc = tv_fixed_match(data, data_len, tag ^ 1, len, NULL);
1096 OSMO_ASSERT(rc == 0);
1097
1098 rc = tv_fixed_match(data, data_len, tag, len, &value);
1099 OSMO_ASSERT(rc == len + 1);
1100 OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
1101}
1102
1103static void check_v_fixed_shift(uint8_t **data, size_t *data_len,
1104 size_t len, const uint8_t *exp_val)
1105{
1106 uint8_t *value;
1107 int rc;
1108
1109 rc = v_fixed_shift(data, data_len, len, &value);
1110 OSMO_ASSERT(rc == len);
1111 OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
1112}
1113
1114static void check_lv_shift(uint8_t **data, size_t *data_len,
1115 size_t exp_len, const uint8_t *exp_val)
1116{
1117 uint8_t *value;
1118 size_t value_len;
1119 int rc;
1120
1121 rc = lv_shift(data, data_len, &value, &value_len);
1122 OSMO_ASSERT(rc == value_len + 1);
1123 OSMO_ASSERT(value_len == exp_len);
1124 OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
1125}
1126
1127static void check_tlv_match_data_len(size_t data_len, uint8_t tag, size_t len,
1128 const uint8_t *test_data)
1129{
1130 uint8_t buf[300] = {0};
1131
1132 uint8_t *unchanged_ptr = buf - 1;
1133 size_t unchanged_len = 0xdead;
1134 size_t tmp_data_len = data_len;
1135 uint8_t *value = unchanged_ptr;
1136 size_t value_len = unchanged_len;
1137 uint8_t *data = buf;
1138
1139 OSMO_ASSERT(data_len <= sizeof(buf));
1140
1141 tlv_put(data, tag, len, test_data);
1142 if (data_len < len + 2) {
1143 OSMO_ASSERT(-1 == tlv_match(&data, &tmp_data_len,
1144 tag, &value, &value_len));
1145 OSMO_ASSERT(tmp_data_len == 0);
1146 OSMO_ASSERT(data == buf + data_len);
1147 OSMO_ASSERT(value == unchanged_ptr);
1148 OSMO_ASSERT(value_len == unchanged_len);
1149 } else {
1150 OSMO_ASSERT(0 <= tlv_match(&data, &tmp_data_len,
1151 tag, &value, &value_len));
1152 OSMO_ASSERT(value != unchanged_ptr);
1153 OSMO_ASSERT(value_len != unchanged_len);
1154 }
1155}
1156
1157static void check_tv_fixed_match_data_len(size_t data_len,
1158 uint8_t tag, size_t len,
1159 const uint8_t *test_data)
1160{
1161 uint8_t buf[300] = {0};
1162
1163 uint8_t *unchanged_ptr = buf - 1;
1164 size_t tmp_data_len = data_len;
1165 uint8_t *value = unchanged_ptr;
1166 uint8_t *data = buf;
1167
1168 OSMO_ASSERT(data_len <= sizeof(buf));
1169
1170 tv_fixed_put(data, tag, len, test_data);
1171
1172 if (data_len < len + 1) {
1173 OSMO_ASSERT(-1 == tv_fixed_match(&data, &tmp_data_len,
1174 tag, len, &value));
1175 OSMO_ASSERT(tmp_data_len == 0);
1176 OSMO_ASSERT(data == buf + data_len);
1177 OSMO_ASSERT(value == unchanged_ptr);
1178 } else {
1179 OSMO_ASSERT(0 <= tv_fixed_match(&data, &tmp_data_len,
1180 tag, len, &value));
1181 OSMO_ASSERT(value != unchanged_ptr);
1182 }
1183}
1184
1185static void check_v_fixed_shift_data_len(size_t data_len,
1186 size_t len, const uint8_t *test_data)
1187{
1188 uint8_t buf[300] = {0};
1189
1190 uint8_t *unchanged_ptr = buf - 1;
1191 size_t tmp_data_len = data_len;
1192 uint8_t *value = unchanged_ptr;
1193 uint8_t *data = buf;
1194
1195 OSMO_ASSERT(data_len <= sizeof(buf));
1196
1197 memcpy(data, test_data, len);
1198
1199 if (data_len < len) {
1200 OSMO_ASSERT(-1 == v_fixed_shift(&data, &tmp_data_len,
1201 len, &value));
1202 OSMO_ASSERT(tmp_data_len == 0);
1203 OSMO_ASSERT(data == buf + data_len);
1204 OSMO_ASSERT(value == unchanged_ptr);
1205 } else {
1206 OSMO_ASSERT(0 <= v_fixed_shift(&data, &tmp_data_len,
1207 len, &value));
1208 OSMO_ASSERT(value != unchanged_ptr);
1209 }
1210}
1211
1212static void check_lv_shift_data_len(size_t data_len,
1213 size_t len, const uint8_t *test_data)
1214{
1215 uint8_t buf[300] = {0};
1216
1217 uint8_t *unchanged_ptr = buf - 1;
1218 size_t unchanged_len = 0xdead;
1219 size_t tmp_data_len = data_len;
1220 uint8_t *value = unchanged_ptr;
1221 size_t value_len = unchanged_len;
1222 uint8_t *data = buf;
1223
1224 lv_put(data, len, test_data);
1225 if (data_len < len + 1) {
1226 OSMO_ASSERT(-1 == lv_shift(&data, &tmp_data_len,
1227 &value, &value_len));
1228 OSMO_ASSERT(tmp_data_len == 0);
1229 OSMO_ASSERT(data == buf + data_len);
1230 OSMO_ASSERT(value == unchanged_ptr);
1231 OSMO_ASSERT(value_len == unchanged_len);
1232 } else {
1233 OSMO_ASSERT(0 <= lv_shift(&data, &tmp_data_len,
1234 &value, &value_len));
1235 OSMO_ASSERT(value != unchanged_ptr);
1236 OSMO_ASSERT(value_len != unchanged_len);
1237 }
1238}
1239
1240static void test_tlv_shift_functions()
1241{
1242 uint8_t test_data[1024];
1243 uint8_t buf[1024];
1244 uint8_t *data_end;
1245 int i, len;
1246 uint8_t *data;
1247 size_t data_len;
1248 const uint8_t tag = 0x1a;
1249
1250 printf("Test shift functions\n");
1251
1252 for (i = 0; i < ARRAY_SIZE(test_data); i++)
1253 test_data[i] = (uint8_t)i;
1254
1255 for (len = 0; len < 256; len++) {
1256 const int iterations = sizeof(buf) / (len + 2) / 4;
1257
1258 memset(buf, 0xee, sizeof(buf));
1259 data_end = data = buf;
1260
1261 for (i = 0; i < iterations; i++) {
1262 data_end = tlv_put(data_end, tag, len, test_data);
1263 data_end = tv_fixed_put(data_end, tag, len, test_data);
1264 /* v_fixed_put */
1265 memcpy(data_end, test_data, len);
1266 data_end += len;
1267 data_end = lv_put(data_end, len, test_data);
1268 }
1269
1270 data_len = data_end - data;
1271 OSMO_ASSERT(data_len <= sizeof(buf));
1272
1273 for (i = 0; i < iterations; i++) {
1274 check_tlv_match(&data, &data_len, tag, len, test_data);
1275 check_tv_fixed_match(&data, &data_len, tag, len, test_data);
1276 check_v_fixed_shift(&data, &data_len, len, test_data);
1277 check_lv_shift(&data, &data_len, len, test_data);
1278 }
1279
1280 OSMO_ASSERT(data == data_end);
1281
1282 /* Test at end of data */
1283
1284 OSMO_ASSERT(-1 == tlv_match(&data, &data_len, tag, NULL, NULL));
1285 OSMO_ASSERT(-1 == tv_fixed_match(&data, &data_len, tag, len, NULL));
1286 OSMO_ASSERT((len ? -1 : 0) == v_fixed_shift(&data, &data_len, len, NULL));
1287 OSMO_ASSERT(-1 == lv_shift(&data, &data_len, NULL, NULL));
1288
1289 /* Test invalid data_len */
1290 for (data_len = 0; data_len <= len + 2 + 1; data_len += 1) {
1291 check_tlv_match_data_len(data_len, tag, len, test_data);
1292 check_tv_fixed_match_data_len(data_len, tag, len, test_data);
1293 check_v_fixed_shift_data_len(data_len, len, test_data);
1294 check_lv_shift_data_len(data_len, len, test_data);
1295 }
1296 }
1297}
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02001298static struct log_info_cat gprs_categories[] = {
1299 [DGPRS] = {
1300 .name = "DGPRS",
1301 .description = "GPRS Packet Service",
1302 .enabled = 1, .loglevel = LOGL_DEBUG,
1303 },
1304 [DNS] = {
1305 .name = "DNS",
1306 .description = "GPRS Network Service (NS)",
1307 .enabled = 1, .loglevel = LOGL_INFO,
1308 },
1309 [DBSSGP] = {
1310 .name = "DBSSGP",
1311 .description = "GPRS BSS Gateway Protocol (BSSGP)",
1312 .enabled = 1, .loglevel = LOGL_DEBUG,
1313 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02001314};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001315
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02001316static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02001317 .cat = gprs_categories,
1318 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02001319};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001320
1321int main(int argc, char **argv)
1322{
1323 osmo_init_logging(&info);
1324 log_set_use_color(osmo_stderr_target, 0);
1325 log_set_print_filename(osmo_stderr_target, 0);
1326 osmo_signal_register_handler(SS_L_NS, &test_signal, NULL);
1327
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001328 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02001329 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
1330 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001331
1332 rate_ctr_init(NULL);
1333
1334 setlinebuf(stdout);
1335
1336 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02001337 gbproxy_init_config(&gbcfg);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02001338 test_tlv_shift_functions();
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001339 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001340 test_gbproxy_ident_changes();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001341 test_gbproxy_ra_patching();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001342 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001343
1344 exit(EXIT_SUCCESS);
1345}