blob: 83832b58f4e77cdcde99a436af06ff7a16b33e2f [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
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200311static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
312{
313 sgsn_peer->sin_family = AF_INET;
314 sgsn_peer->sin_port = htons(32000);
315 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
316}
317
318static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
319{
320 size_t i;
321
322 for (i = 0; i < size; ++i) {
323 bss_peers[i].sin_family = AF_INET;
324 bss_peers[i].sin_port = htons((i + 1) * 1111);
325 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
326 }
327}
328
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200329int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
330 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
331
332/* override */
333int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
334 struct msgb *msg, uint16_t bvci)
335{
336 printf("CALLBACK, event %d, msg length %d, bvci 0x%04x\n%s\n\n",
337 event, msgb_bssgp_len(msg), bvci,
338 osmo_hexdump(msgb_bssgph(msg), msgb_bssgp_len(msg)));
339
340 switch (event) {
341 case GPRS_NS_EVT_UNIT_DATA:
Jacob Erlbecke75fec62013-10-15 12:00:27 +0200342 return gbprox_rcvmsg(msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200343 default:
344 break;
345 }
346 return 0;
347}
348
349/* override */
350ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
351 const struct sockaddr *dest_addr, socklen_t addrlen)
352{
353 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
354 const struct sockaddr *, socklen_t);
355 static sendto_t real_sendto = NULL;
356 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200357 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200358
359 if (!real_sendto)
360 real_sendto = dlsym(RTLD_NEXT, "sendto");
361
362 if (dest_host == REMOTE_BSS_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200363 printf("MESSAGE to BSS at 0x%08x:%d, msg length %d\n%s\n\n",
364 dest_host, dest_port,
365 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200366 else if (dest_host == REMOTE_SGSN_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200367 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %d\n%s\n\n",
368 dest_host, dest_port,
369 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200370 else
371 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
372
373 return len;
374}
375
376/* override */
377int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
378{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200379 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
380 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200381 uint16_t bvci = msgb_bvci(msg);
382 uint16_t nsei = msgb_nsei(msg);
383
384 unsigned char *buf = msg->data;
385 size_t len = msg->len;
386
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200387 if (!real_gprs_ns_sendmsg)
388 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
389
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200390 if (nsei == SGSN_NSEI)
391 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, msg length %d\n%s\n\n",
392 bvci, len, osmo_hexdump(buf, len));
393 else
394 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, msg length %d\n%s\n\n",
395 bvci, len, osmo_hexdump(buf, len));
396
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200397 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200398}
399
400static void dump_rate_ctr_group(FILE *stream, const char *prefix,
401 struct rate_ctr_group *ctrg)
402{
403 unsigned int i;
404
405 for (i = 0; i < ctrg->desc->num_ctr; i++) {
406 struct rate_ctr *ctr = &ctrg->ctr[i];
407 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
408 fprintf(stream, " %s%s: %llu%s",
409 prefix, ctrg->desc->ctr_desc[i].description,
410 (long long)ctr->current,
411 "\n");
412 };
413}
414
415/* Signal handler for signals from NS layer */
416static int test_signal(unsigned int subsys, unsigned int signal,
417 void *handler_data, void *signal_data)
418{
419 struct ns_signal_data *nssd = signal_data;
420 int rc;
421
422 if (subsys != SS_L_NS)
423 return 0;
424
425 switch (signal) {
426 case S_NS_RESET:
427 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
428 nssd->nsvc->nsvci,
429 gprs_ns_ll_str(nssd->nsvc));
430 break;
431
432 case S_NS_ALIVE_EXP:
433 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
434 nssd->nsvc->nsvci,
435 gprs_ns_ll_str(nssd->nsvc));
436 break;
437
438 case S_NS_BLOCK:
439 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
440 nssd->nsvc->nsvci,
441 gprs_ns_ll_str(nssd->nsvc));
442 break;
443
444 case S_NS_UNBLOCK:
445 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
446 nssd->nsvc->nsvci,
447 gprs_ns_ll_str(nssd->nsvc));
448 break;
449
450 case S_NS_REPLACED:
451 printf("==> got signal NS_REPLACED: 0x%04x/%s",
452 nssd->nsvc->nsvci,
453 gprs_ns_ll_str(nssd->nsvc));
454 printf(" -> 0x%04x/%s\n",
455 nssd->old_nsvc->nsvci,
456 gprs_ns_ll_str(nssd->old_nsvc));
457 break;
458
459 default:
460 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
461 nssd->nsvc->nsvci,
462 gprs_ns_ll_str(nssd->nsvc));
463 break;
464 }
465 printf("\n");
466 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
467 return rc;
468}
469
470static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
471{
472 struct msgb *msg;
473 int ret;
474 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
475 fprintf(stderr, "message too long: %d\n", data_len);
476 return -1;
477 }
478
479 msg = gprs_ns_msgb_alloc();
480 memmove(msg->data, data, data_len);
481 msg->l2h = msg->data;
482 msgb_put(msg, data_len);
483
484 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
485 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
486 osmo_hexdump(data, data_len));
487
488 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
489
490 printf("result (%s) = %d\n\n", text, ret);
491
492 msgb_free(msg);
493
494 return ret;
495}
496
497static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
498{
499 struct gprs_nsvc *nsvc;
500
501 printf("Current NS-VCIs:\n");
502 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
503 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200504 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200505 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200506 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
507 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
508 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200509 );
510 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
511 }
512 printf("\n");
513}
514
515static void test_gbproxy()
516{
517 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
518 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200519 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200520
521 bssgp_nsi = nsi;
522 gbcfg.nsi = bssgp_nsi;
523 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
524
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200525 configure_sgsn_peer(&sgsn_peer);
526 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200527
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200528 printf("--- Initialise SGSN ---\n\n");
529
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200530 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200531 gprs_dump_nsi(nsi);
532
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200533 printf("--- Initialise BSS 1 ---\n\n");
534
535 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
536 setup_bssgp(nsi, &bss_peer[0], 0x1002);
537 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200538 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200539
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200540 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
541
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200542 printf("--- Initialise BSS 2 ---\n\n");
543
544 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
545 setup_bssgp(nsi, &bss_peer[1], 0x2002);
546 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200547 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200548
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200549 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
550
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200551 printf("--- Move BSS 1 to new port ---\n\n");
552
553 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
554 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200555 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200556
557 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
558
559 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
560 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200561 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200562
563 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
564
565 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
566 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200567 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200568
569 printf("--- Move BSS 2 to new port ---\n\n");
570
571 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
572 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200573 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200574
575 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
576
577 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
578 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200579 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200580
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200581 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
582
583 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
584 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200585 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200586
587 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
588
589 setup_bssgp(nsi, &bss_peer[0], 0x1012);
590 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200591 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200592
593 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
594
595 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
596
597 setup_bssgp(nsi, &bss_peer[0], 0x1002);
598 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200599 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200600
601 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
602
603 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
604
605 setup_bssgp(nsi, &bss_peer[0], 0x1002);
606 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200607 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200608
609 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
610
611 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
612
613 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
614
615 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
616
617 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
618
619 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
620
621 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
622
623 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
624
625 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
626
627 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
628
629 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
630
631 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
632
633 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
634
635 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
636
637 setup_bssgp(nsi, &bss_peer[2], 0x1002);
638 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200639 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200640
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200641 gbprox_dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200642
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200643 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
644
645 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
646
647 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
648
649 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
650
651 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
652
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200653 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
654
655 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
656
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200657 gbprox_dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200658
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200659 gprs_ns_destroy(nsi);
660 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200661 gbprox_reset();
662}
663
664static void test_gbproxy_ident_changes()
665{
666 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
667 struct sockaddr_in bss_peer[1] = {{0},};
668 struct sockaddr_in sgsn_peer= {0};
669 uint16_t nsei[2] = {0x1000, 0x2000};
670 uint16_t nsvci[2] = {0x1001, 0x2001};
671 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
672
673 bssgp_nsi = nsi;
674 gbcfg.nsi = bssgp_nsi;
675 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
676
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200677 configure_sgsn_peer(&sgsn_peer);
678 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200679
680 printf("--- Initialise SGSN ---\n\n");
681
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200682 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200683 gprs_dump_nsi(nsi);
684
685 printf("--- Initialise BSS 1 ---\n\n");
686
687 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
688 gprs_dump_nsi(nsi);
689
690 printf("--- Setup BVCI 1 ---\n\n");
691
692 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
693 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200694 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200695
696 printf("--- Setup BVCI 2 ---\n\n");
697
698 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
699 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200700 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200701
702 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
703
704 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
705 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
706
707 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
708
709 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
710 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
711
712 printf("--- Change NSEI ---\n\n");
713
714 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
715 gprs_dump_nsi(nsi);
716
717 printf("--- Setup BVCI 1 ---\n\n");
718
719 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
720 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200721 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200722
723 printf("--- Setup BVCI 3 ---\n\n");
724
725 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
726 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200727 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200728
729 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
730
731 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
732 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
733
734 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
735 " (should fail) ---\n\n");
736
737 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200738 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200739 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200740 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200741
742 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
743
744 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
745 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
746
747 printf("--- Change NSVCI ---\n\n");
748
749 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
750 gprs_dump_nsi(nsi);
751
752 printf("--- Setup BVCI 1 ---\n\n");
753
754 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
755 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200756 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200757
758 printf("--- Setup BVCI 4 ---\n\n");
759
760 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
761 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200762 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200763
764 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
765
766 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
767 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
768
769 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
770 " (should fail) ---\n\n");
771
772 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200773 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200774 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200775 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200776
777 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
778
779 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
780 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
781
782 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
783
784 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
785 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
786
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200787 gbprox_dump_global(stdout, 0);
788 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200789
790 gprs_ns_destroy(nsi);
791 nsi = NULL;
792 gbprox_reset();
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200793}
794
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200795static void test_gbproxy_ra_patching()
796{
797 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
798 struct sockaddr_in bss_peer[1] = {{0},};
799 struct sockaddr_in sgsn_peer= {0};
800 struct gprs_ra_id rai_bss =
801 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
802 struct gprs_ra_id rai_sgsn =
803 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
804 struct gprs_ra_id rai_unknown =
805 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
806
807 bssgp_nsi = nsi;
808 gbcfg.nsi = bssgp_nsi;
809 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
810
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200811 configure_sgsn_peer(&sgsn_peer);
812 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200813
814 printf("--- Initialise SGSN ---\n\n");
815
816 connect_sgsn(nsi, &sgsn_peer);
817 gprs_dump_nsi(nsi);
818
819 printf("--- Initialise BSS 1 ---\n\n");
820
821 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
822 setup_bssgp(nsi, &bss_peer[0], 0x1002);
823 gprs_dump_nsi(nsi);
824 gbprox_dump_peers(stdout, 0);
825
826 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
827
828 send_bssgp_suspend(nsi, &bss_peer[0], &rai_bss);
829 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_sgsn);
830
831 gbprox_dump_global(stdout, 0);
832 gbprox_dump_peers(stdout, 0);
833
834 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
835
836 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1002,
837 bssgp_attach_req, sizeof(bssgp_attach_req));
838
839 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1002,
840 bssgp_attach_acc, sizeof(bssgp_attach_acc));
841
842 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1002,
843 bssgp_ra_upd_req, sizeof(bssgp_ra_upd_req));
844
845 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1002,
846 bssgp_ra_upd_acc, sizeof(bssgp_ra_upd_acc));
847
848 /* Replace APN */
849 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1002,
850 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
851
852 /* TODO: Re-configure to test APN IE removal */
853
854 /* Remove 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 gbprox_dump_global(stdout, 0);
859 gbprox_dump_peers(stdout, 0);
860
861 printf("--- Bad cases ---\n\n");
862
863 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1eee);
864 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_unknown);
865
866 gbprox_dump_global(stdout, 0);
867 gbprox_dump_peers(stdout, 0);
868
869 gprs_ns_destroy(nsi);
870 nsi = NULL;
871 gbprox_reset();
872}
873
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200874
875static struct log_info info = {};
876
877int main(int argc, char **argv)
878{
879 osmo_init_logging(&info);
880 log_set_use_color(osmo_stderr_target, 0);
881 log_set_print_filename(osmo_stderr_target, 0);
882 osmo_signal_register_handler(SS_L_NS, &test_signal, NULL);
883
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200884 log_set_print_filename(osmo_stderr_target, 0);
885 log_set_log_level(osmo_stderr_target, LOGL_INFO);
886
887 rate_ctr_init(NULL);
888
889 setlinebuf(stdout);
890
891 printf("===== GbProxy test START\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200892 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200893 test_gbproxy_ident_changes();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200894 test_gbproxy_ra_patching();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200895 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200896
897 exit(EXIT_SUCCESS);
898}