blob: 97dbfecd72a88d522e05eb81458a21331922bd9e [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>
16#include <sys/types.h>
17#include <sys/socket.h>
18
19#include <osmocom/core/msgb.h>
20#include <osmocom/core/application.h>
21#include <osmocom/core/utils.h>
22#include <osmocom/core/logging.h>
23#include <osmocom/core/talloc.h>
24#include <osmocom/core/signal.h>
25#include <osmocom/core/rate_ctr.h>
26#include <osmocom/gprs/gprs_msgb.h>
27#include <osmocom/gprs/gprs_ns.h>
28#include <osmocom/gprs/gprs_bssgp.h>
29
30#include <openbsc/gb_proxy.h>
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020031#include <openbsc/debug.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020032
33#define REMOTE_BSS_ADDR 0x01020304
34#define REMOTE_SGSN_ADDR 0x05060708
35
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020036#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020037
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020038struct gbproxy_config gbcfg = {0};
39
40/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Attach Request */
41static const unsigned char bssgp_attach_req[75] = {
42 0x01, 0xbb, 0xc5, 0x46, 0x79, 0x00, 0x00, 0x04,
43 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
44 0x75, 0x30, 0x00, 0x80, 0x0e, 0x00, 0x34, 0x01,
45 0xc0, 0x01, 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21,
46 0x08, 0x02, 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79,
47 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19, 0x18,
48 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60,
49 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80,
50 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
51 0x16, 0x6d, 0x01
52};
53
54/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Attach Accept */
55static const unsigned char bssgp_attach_acc[88] = {
56 0x00, 0xbb, 0xc5, 0x46, 0x79, 0x00, 0x50, 0x20,
57 0x16, 0x82, 0x02, 0x58, 0x13, 0x99, 0x18, 0xb3,
58 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80,
59 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba,
60 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00, 0x0a,
61 0x82, 0x08, 0x02, 0x0d, 0x88, 0x11, 0x12, 0x13,
62 0x14, 0x15, 0x16, 0x17, 0x18, 0x00, 0x81, 0x00,
63 0x0e, 0x9e, 0x41, 0xc0, 0x05, 0x08, 0x02, 0x01,
64 0x49, 0x04, 0x21, 0x63, 0x54, 0x40, 0x50, 0x60,
65 0x19, 0xcd, 0xd7, 0x08, 0x17, 0x16, 0x18, 0x05,
66 0xf4, 0xfb, 0xc5, 0x47, 0x22, 0x42, 0x67, 0x9a
67};
68
69/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Routing Area Update Request */
70static const unsigned char bssgp_ra_upd_req[85] = {
71 0x01, 0xaf, 0xe2, 0x80, 0x6e, 0x00, 0x00, 0x04,
72 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
73 0x70, 0x80, 0x00, 0x80, 0x0e, 0x00, 0x3e, 0x01,
74 0xc0, 0x15, 0x08, 0x08, 0x10, 0x11, 0x22, 0x33,
75 0x40, 0x50, 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33,
76 0x57, 0x2b, 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48,
77 0x50, 0xc8, 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8,
78 0x48, 0x02, 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02,
79 0x00, 0x19, 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27,
80 0x07, 0x04, 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02,
81 0x20, 0x00, 0x96, 0x3e, 0x97
82};
83
84/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Routing Area Update Accept */
85static const unsigned char bssgp_ra_upd_acc[91] = {
86 0x00, 0xaf, 0xe2, 0x80, 0x6e, 0x00, 0x50, 0x20,
87 0x16, 0x82, 0x02, 0x58, 0x13, 0x9d, 0x19, 0x13,
88 0x42, 0x33, 0x57, 0x2b, 0xf7, 0xc8, 0x48, 0x02,
89 0x13, 0x48, 0x50, 0xc8, 0x48, 0x02, 0x14, 0x48,
90 0x50, 0xc8, 0x48, 0x02, 0x17, 0x49, 0x10, 0xc8,
91 0x48, 0x02, 0x00, 0x0a, 0x82, 0x07, 0x04, 0x0d,
92 0x88, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
93 0x18, 0x00, 0x81, 0x00, 0x0e, 0x9d, 0x41, 0xc0,
94 0x19, 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
95 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
96 0x05, 0xf4, 0xef, 0xe2, 0x81, 0x17, 0x17, 0x16,
97 0xc3, 0xbf, 0xcc
98};
99
100/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Activate PDP Context Request */
101static const unsigned char bssgp_act_pdp_ctx_req[76] = {
102 0x01, 0xef, 0xe2, 0xb7, 0x00, 0x00, 0x00, 0x04,
103 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
104 0x75, 0x30, 0x00, 0x80, 0x0e, 0x00, 0x35, 0x01,
105 0xc0, 0x0d, 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
106 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
108 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
109 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
110 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
111 0x00, 0x5a, 0xff, 0x02
112};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200113
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200114static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
115 struct sockaddr_in *peer, const unsigned char* data,
116 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200117
118static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
119 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
120{
121 /* GPRS Network Service, PDU type: NS_RESET,
122 */
123 unsigned char msg[12] = {
124 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
125 0x04, 0x82, 0x11, 0x22
126 };
127
128 msg[3] = cause;
129 msg[6] = nsvci / 256;
130 msg[7] = nsvci % 256;
131 msg[10] = nsei / 256;
132 msg[11] = nsei % 256;
133
134 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
135}
136
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200137static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
138 uint16_t nsvci, uint16_t nsei)
139{
140 /* GPRS Network Service, PDU type: NS_RESET_ACK,
141 */
142 unsigned char msg[9] = {
143 0x03, 0x01, 0x82, 0x11, 0x22,
144 0x04, 0x82, 0x11, 0x22
145 };
146
147 msg[3] = nsvci / 256;
148 msg[4] = nsvci % 256;
149 msg[7] = nsei / 256;
150 msg[8] = nsei % 256;
151
152 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
153}
154
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200155static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
156{
157 /* GPRS Network Service, PDU type: NS_ALIVE */
158 unsigned char msg[1] = {
159 0x0a
160 };
161
162 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
163}
164
165static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
166{
167 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
168 unsigned char msg[1] = {
169 0x0b
170 };
171
172 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
173}
174
175static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
176{
177 /* GPRS Network Service, PDU type: NS_UNBLOCK */
178 unsigned char msg[1] = {
179 0x06
180 };
181
182 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
183}
184
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200185static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
186{
187 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
188 unsigned char msg[1] = {
189 0x07
190 };
191
192 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
193}
194
195static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
196 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200197 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
198{
199 /* GPRS Network Service, PDU type: NS_UNITDATA */
200 unsigned char msg[4096] = {
201 0x00, 0x00, 0x00, 0x00
202 };
203
204 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
205
206 msg[2] = nsbvci / 256;
207 msg[3] = nsbvci % 256;
208 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
209
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200210 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200211}
212
213static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
214 uint16_t bvci)
215{
216 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
217 * BSSGP RESET */
218 unsigned char msg[22] = {
219 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200220 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
221 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200222 };
223
224 msg[3] = bvci / 256;
225 msg[4] = bvci % 256;
226
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200227 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
228}
229
230static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
231 struct sockaddr_in *src_addr, uint16_t bvci)
232{
233 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
234 * BSSGP RESET_ACK */
235 static unsigned char msg[5] = {
236 0x23, 0x04, 0x82, 0x00,
237 0x00
238 };
239
240 msg[3] = bvci / 256;
241 msg[4] = bvci % 256;
242
243 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200244}
245
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200246static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
247 struct sockaddr_in *src_addr,
248 struct gprs_ra_id *raid)
249{
250 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
251 unsigned char msg[15] = {
252 0x0b, 0x1f, 0x84, 0xcc, 0xd1, 0x75, 0x8b, 0x1b,
253 0x86, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60
254 };
255
256 gsm48_construct_ra(msg + 9, raid);
257
258 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
259}
260
261static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
262 struct sockaddr_in *src_addr,
263 struct gprs_ra_id *raid)
264{
265 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
266 unsigned char msg[18] = {
267 0x0c, 0x1f, 0x84, 0xcc, 0xd1, 0x75, 0x8b, 0x1b,
268 0x86, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x1d,
269 0x81, 0x01
270 };
271
272 gsm48_construct_ra(msg + 9, raid);
273
274 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
275}
276
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200277static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
278 uint16_t nsvci, uint16_t nsei)
279{
280 printf("Setup NS-VC: remote 0x%08x:%d, "
281 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
282 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
283 nsvci, nsvci, nsei, nsei);
284
285 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
286 send_ns_alive(nsi, src_addr);
287 send_ns_unblock(nsi, src_addr);
288 send_ns_alive_ack(nsi, src_addr);
289}
290
291static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
292 uint16_t bvci)
293{
294 printf("Setup BSSGP: remote 0x%08x:%d, "
295 "BVCI 0x%04x(%d)\n\n",
296 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
297 bvci, bvci);
298
299 send_bssgp_reset(nsi, src_addr, bvci);
300}
301
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200302static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer)
303{
304 gprs_ns_nsip_connect(nsi, sgsn_peer, SGSN_NSEI, SGSN_NSEI+1);
305 send_ns_reset_ack(nsi, sgsn_peer, SGSN_NSEI+1, SGSN_NSEI);
306 send_ns_alive_ack(nsi, sgsn_peer);
307 send_ns_unblock_ack(nsi, sgsn_peer);
308 send_ns_alive(nsi, sgsn_peer);
309}
310
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200311int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
312 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
313
314/* override */
315int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
316 struct msgb *msg, uint16_t bvci)
317{
318 printf("CALLBACK, event %d, msg length %d, bvci 0x%04x\n%s\n\n",
319 event, msgb_bssgp_len(msg), bvci,
320 osmo_hexdump(msgb_bssgph(msg), msgb_bssgp_len(msg)));
321
322 switch (event) {
323 case GPRS_NS_EVT_UNIT_DATA:
Jacob Erlbecke75fec62013-10-15 12:00:27 +0200324 return gbprox_rcvmsg(msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200325 default:
326 break;
327 }
328 return 0;
329}
330
331/* override */
332ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
333 const struct sockaddr *dest_addr, socklen_t addrlen)
334{
335 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
336 const struct sockaddr *, socklen_t);
337 static sendto_t real_sendto = NULL;
338 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200339 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200340
341 if (!real_sendto)
342 real_sendto = dlsym(RTLD_NEXT, "sendto");
343
344 if (dest_host == REMOTE_BSS_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200345 printf("MESSAGE to BSS at 0x%08x:%d, msg length %d\n%s\n\n",
346 dest_host, dest_port,
347 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200348 else if (dest_host == REMOTE_SGSN_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200349 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %d\n%s\n\n",
350 dest_host, dest_port,
351 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200352 else
353 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
354
355 return len;
356}
357
358/* override */
359int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
360{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200361 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
362 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200363 uint16_t bvci = msgb_bvci(msg);
364 uint16_t nsei = msgb_nsei(msg);
365
366 unsigned char *buf = msg->data;
367 size_t len = msg->len;
368
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200369 if (!real_gprs_ns_sendmsg)
370 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
371
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200372 if (nsei == SGSN_NSEI)
373 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, msg length %d\n%s\n\n",
374 bvci, len, osmo_hexdump(buf, len));
375 else
376 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, msg length %d\n%s\n\n",
377 bvci, len, osmo_hexdump(buf, len));
378
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200379 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200380}
381
382static void dump_rate_ctr_group(FILE *stream, const char *prefix,
383 struct rate_ctr_group *ctrg)
384{
385 unsigned int i;
386
387 for (i = 0; i < ctrg->desc->num_ctr; i++) {
388 struct rate_ctr *ctr = &ctrg->ctr[i];
389 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
390 fprintf(stream, " %s%s: %llu%s",
391 prefix, ctrg->desc->ctr_desc[i].description,
392 (long long)ctr->current,
393 "\n");
394 };
395}
396
397/* Signal handler for signals from NS layer */
398static int test_signal(unsigned int subsys, unsigned int signal,
399 void *handler_data, void *signal_data)
400{
401 struct ns_signal_data *nssd = signal_data;
402 int rc;
403
404 if (subsys != SS_L_NS)
405 return 0;
406
407 switch (signal) {
408 case S_NS_RESET:
409 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
410 nssd->nsvc->nsvci,
411 gprs_ns_ll_str(nssd->nsvc));
412 break;
413
414 case S_NS_ALIVE_EXP:
415 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
416 nssd->nsvc->nsvci,
417 gprs_ns_ll_str(nssd->nsvc));
418 break;
419
420 case S_NS_BLOCK:
421 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
422 nssd->nsvc->nsvci,
423 gprs_ns_ll_str(nssd->nsvc));
424 break;
425
426 case S_NS_UNBLOCK:
427 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
428 nssd->nsvc->nsvci,
429 gprs_ns_ll_str(nssd->nsvc));
430 break;
431
432 case S_NS_REPLACED:
433 printf("==> got signal NS_REPLACED: 0x%04x/%s",
434 nssd->nsvc->nsvci,
435 gprs_ns_ll_str(nssd->nsvc));
436 printf(" -> 0x%04x/%s\n",
437 nssd->old_nsvc->nsvci,
438 gprs_ns_ll_str(nssd->old_nsvc));
439 break;
440
441 default:
442 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
443 nssd->nsvc->nsvci,
444 gprs_ns_ll_str(nssd->nsvc));
445 break;
446 }
447 printf("\n");
448 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
449 return rc;
450}
451
452static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
453{
454 struct msgb *msg;
455 int ret;
456 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
457 fprintf(stderr, "message too long: %d\n", data_len);
458 return -1;
459 }
460
461 msg = gprs_ns_msgb_alloc();
462 memmove(msg->data, data, data_len);
463 msg->l2h = msg->data;
464 msgb_put(msg, data_len);
465
466 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
467 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
468 osmo_hexdump(data, data_len));
469
470 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
471
472 printf("result (%s) = %d\n\n", text, ret);
473
474 msgb_free(msg);
475
476 return ret;
477}
478
479static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
480{
481 struct gprs_nsvc *nsvc;
482
483 printf("Current NS-VCIs:\n");
484 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
485 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200486 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200487 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200488 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
489 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
490 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200491 );
492 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
493 }
494 printf("\n");
495}
496
497static void test_gbproxy()
498{
499 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
500 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200501 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200502
503 bssgp_nsi = nsi;
504 gbcfg.nsi = bssgp_nsi;
505 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
506
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200507 sgsn_peer.sin_family = AF_INET;
508 sgsn_peer.sin_port = htons(32000);
509 sgsn_peer.sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
510
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200511 bss_peer[0].sin_family = AF_INET;
512 bss_peer[0].sin_port = htons(1111);
513 bss_peer[0].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
514 bss_peer[1].sin_family = AF_INET;
515 bss_peer[1].sin_port = htons(2222);
516 bss_peer[1].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
517 bss_peer[2].sin_family = AF_INET;
518 bss_peer[2].sin_port = htons(3333);
519 bss_peer[2].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
520 bss_peer[3].sin_family = AF_INET;
521 bss_peer[3].sin_port = htons(4444);
522 bss_peer[3].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
523
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200524 printf("--- Initialise SGSN ---\n\n");
525
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200526 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200527 gprs_dump_nsi(nsi);
528
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200529 printf("--- Initialise BSS 1 ---\n\n");
530
531 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
532 setup_bssgp(nsi, &bss_peer[0], 0x1002);
533 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200534 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200535
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200536 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
537
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200538 printf("--- Initialise BSS 2 ---\n\n");
539
540 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
541 setup_bssgp(nsi, &bss_peer[1], 0x2002);
542 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200543 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200544
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200545 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
546
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200547 printf("--- Move BSS 1 to new port ---\n\n");
548
549 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
550 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200551 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200552
553 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
554
555 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
556 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200557 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200558
559 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
560
561 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
562 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200563 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200564
565 printf("--- Move BSS 2 to new port ---\n\n");
566
567 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
568 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200569 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200570
571 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
572
573 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
574 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200575 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200576
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200577 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
578
579 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
580 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200581 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200582
583 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
584
585 setup_bssgp(nsi, &bss_peer[0], 0x1012);
586 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200587 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200588
589 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
590
591 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
592
593 setup_bssgp(nsi, &bss_peer[0], 0x1002);
594 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200595 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200596
597 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
598
599 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
600
601 setup_bssgp(nsi, &bss_peer[0], 0x1002);
602 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200603 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200604
605 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
606
607 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
608
609 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
610
611 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
612
613 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
614
615 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
616
617 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
618
619 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
620
621 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
622
623 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
624
625 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
626
627 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
628
629 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
630
631 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
632
633 setup_bssgp(nsi, &bss_peer[2], 0x1002);
634 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200635 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200636
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200637 gbprox_dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200638
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200639 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
640
641 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
642
643 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
644
645 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
646
647 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
648
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200649 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
650
651 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
652
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200653 gbprox_dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200654
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200655 gprs_ns_destroy(nsi);
656 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200657 gbprox_reset();
658}
659
660static void test_gbproxy_ident_changes()
661{
662 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
663 struct sockaddr_in bss_peer[1] = {{0},};
664 struct sockaddr_in sgsn_peer= {0};
665 uint16_t nsei[2] = {0x1000, 0x2000};
666 uint16_t nsvci[2] = {0x1001, 0x2001};
667 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
668
669 bssgp_nsi = nsi;
670 gbcfg.nsi = bssgp_nsi;
671 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
672
673 sgsn_peer.sin_family = AF_INET;
674 sgsn_peer.sin_port = htons(32000);
675 sgsn_peer.sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
676
677 bss_peer[0].sin_family = AF_INET;
678 bss_peer[0].sin_port = htons(1111);
679 bss_peer[0].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
680
681 printf("--- Initialise SGSN ---\n\n");
682
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200683 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200684 gprs_dump_nsi(nsi);
685
686 printf("--- Initialise BSS 1 ---\n\n");
687
688 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
689 gprs_dump_nsi(nsi);
690
691 printf("--- Setup BVCI 1 ---\n\n");
692
693 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
694 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200695 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200696
697 printf("--- Setup BVCI 2 ---\n\n");
698
699 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
700 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200701 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200702
703 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
704
705 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
706 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
707
708 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
709
710 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
711 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
712
713 printf("--- Change NSEI ---\n\n");
714
715 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
716 gprs_dump_nsi(nsi);
717
718 printf("--- Setup BVCI 1 ---\n\n");
719
720 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
721 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200722 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200723
724 printf("--- Setup BVCI 3 ---\n\n");
725
726 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
727 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200728 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200729
730 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
731
732 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
733 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
734
735 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
736 " (should fail) ---\n\n");
737
738 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200739 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200740 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200741 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200742
743 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
744
745 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
746 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
747
748 printf("--- Change NSVCI ---\n\n");
749
750 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
751 gprs_dump_nsi(nsi);
752
753 printf("--- Setup BVCI 1 ---\n\n");
754
755 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
756 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200757 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200758
759 printf("--- Setup BVCI 4 ---\n\n");
760
761 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
762 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200763 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200764
765 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
766
767 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
768 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
769
770 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
771 " (should fail) ---\n\n");
772
773 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200774 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200775 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200776 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200777
778 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
779
780 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
781 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
782
783 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
784
785 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
786 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
787
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200788 gbprox_dump_global(stdout, 0);
789 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200790
791 gprs_ns_destroy(nsi);
792 nsi = NULL;
793 gbprox_reset();
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200794}
795
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200796static void test_gbproxy_ra_patching()
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 struct gprs_ra_id rai_bss =
802 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
803 struct gprs_ra_id rai_sgsn =
804 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
805 struct gprs_ra_id rai_unknown =
806 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
807
808 bssgp_nsi = nsi;
809 gbcfg.nsi = bssgp_nsi;
810 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
811
812 sgsn_peer.sin_family = AF_INET;
813 sgsn_peer.sin_port = htons(32000);
814 sgsn_peer.sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
815
816 bss_peer[0].sin_family = AF_INET;
817 bss_peer[0].sin_port = htons(1111);
818 bss_peer[0].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
819
820 printf("--- Initialise SGSN ---\n\n");
821
822 connect_sgsn(nsi, &sgsn_peer);
823 gprs_dump_nsi(nsi);
824
825 printf("--- Initialise BSS 1 ---\n\n");
826
827 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
828 setup_bssgp(nsi, &bss_peer[0], 0x1002);
829 gprs_dump_nsi(nsi);
830 gbprox_dump_peers(stdout, 0);
831
832 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
833
834 send_bssgp_suspend(nsi, &bss_peer[0], &rai_bss);
835 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_sgsn);
836
837 gbprox_dump_global(stdout, 0);
838 gbprox_dump_peers(stdout, 0);
839
840 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
841
842 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1002,
843 bssgp_attach_req, sizeof(bssgp_attach_req));
844
845 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1002,
846 bssgp_attach_acc, sizeof(bssgp_attach_acc));
847
848 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1002,
849 bssgp_ra_upd_req, sizeof(bssgp_ra_upd_req));
850
851 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1002,
852 bssgp_ra_upd_acc, sizeof(bssgp_ra_upd_acc));
853
854 /* Replace APN */
855 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1002,
856 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
857
858 /* TODO: Re-configure to test APN IE removal */
859
860 /* Remove APN */
861 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1002,
862 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
863
864 gbprox_dump_global(stdout, 0);
865 gbprox_dump_peers(stdout, 0);
866
867 printf("--- Bad cases ---\n\n");
868
869 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1eee);
870 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_unknown);
871
872 gbprox_dump_global(stdout, 0);
873 gbprox_dump_peers(stdout, 0);
874
875 gprs_ns_destroy(nsi);
876 nsi = NULL;
877 gbprox_reset();
878}
879
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200880
881static struct log_info info = {};
882
883int main(int argc, char **argv)
884{
885 osmo_init_logging(&info);
886 log_set_use_color(osmo_stderr_target, 0);
887 log_set_print_filename(osmo_stderr_target, 0);
888 osmo_signal_register_handler(SS_L_NS, &test_signal, NULL);
889
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200890 log_set_print_filename(osmo_stderr_target, 0);
891 log_set_log_level(osmo_stderr_target, LOGL_INFO);
892
893 rate_ctr_init(NULL);
894
895 setlinebuf(stdout);
896
897 printf("===== GbProxy test START\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200898 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200899 test_gbproxy_ident_changes();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200900 test_gbproxy_ra_patching();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200901 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200902
903 exit(EXIT_SUCCESS);
904}