blob: c45873325b37f0cdda91dc59b4679f4ecc301ddb [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,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200338 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200339
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
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200384 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200385
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200386 if (!real_gprs_ns_sendmsg)
387 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
388
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200389 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200390 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
391 "msg length %d (%s)\n",
392 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200393 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200394 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
395 "msg length %d (%s)\n",
396 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200397
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200398 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200399}
400
401static void dump_rate_ctr_group(FILE *stream, const char *prefix,
402 struct rate_ctr_group *ctrg)
403{
404 unsigned int i;
405
406 for (i = 0; i < ctrg->desc->num_ctr; i++) {
407 struct rate_ctr *ctr = &ctrg->ctr[i];
408 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
409 fprintf(stream, " %s%s: %llu%s",
410 prefix, ctrg->desc->ctr_desc[i].description,
411 (long long)ctr->current,
412 "\n");
413 };
414}
415
416/* Signal handler for signals from NS layer */
417static int test_signal(unsigned int subsys, unsigned int signal,
418 void *handler_data, void *signal_data)
419{
420 struct ns_signal_data *nssd = signal_data;
421 int rc;
422
423 if (subsys != SS_L_NS)
424 return 0;
425
426 switch (signal) {
427 case S_NS_RESET:
428 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
429 nssd->nsvc->nsvci,
430 gprs_ns_ll_str(nssd->nsvc));
431 break;
432
433 case S_NS_ALIVE_EXP:
434 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
435 nssd->nsvc->nsvci,
436 gprs_ns_ll_str(nssd->nsvc));
437 break;
438
439 case S_NS_BLOCK:
440 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
441 nssd->nsvc->nsvci,
442 gprs_ns_ll_str(nssd->nsvc));
443 break;
444
445 case S_NS_UNBLOCK:
446 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
447 nssd->nsvc->nsvci,
448 gprs_ns_ll_str(nssd->nsvc));
449 break;
450
451 case S_NS_REPLACED:
452 printf("==> got signal NS_REPLACED: 0x%04x/%s",
453 nssd->nsvc->nsvci,
454 gprs_ns_ll_str(nssd->nsvc));
455 printf(" -> 0x%04x/%s\n",
456 nssd->old_nsvc->nsvci,
457 gprs_ns_ll_str(nssd->old_nsvc));
458 break;
459
460 default:
461 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
462 nssd->nsvc->nsvci,
463 gprs_ns_ll_str(nssd->nsvc));
464 break;
465 }
466 printf("\n");
467 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
468 return rc;
469}
470
471static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
472{
473 struct msgb *msg;
474 int ret;
475 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
476 fprintf(stderr, "message too long: %d\n", data_len);
477 return -1;
478 }
479
480 msg = gprs_ns_msgb_alloc();
481 memmove(msg->data, data, data_len);
482 msg->l2h = msg->data;
483 msgb_put(msg, data_len);
484
485 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
486 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
487 osmo_hexdump(data, data_len));
488
489 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
490
491 printf("result (%s) = %d\n\n", text, ret);
492
493 msgb_free(msg);
494
495 return ret;
496}
497
498static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
499{
500 struct gprs_nsvc *nsvc;
501
502 printf("Current NS-VCIs:\n");
503 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
504 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200505 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200506 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200507 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
508 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
509 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200510 );
511 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
512 }
513 printf("\n");
514}
515
516static void test_gbproxy()
517{
518 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
519 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200520 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200521
522 bssgp_nsi = nsi;
523 gbcfg.nsi = bssgp_nsi;
524 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
525
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200526 configure_sgsn_peer(&sgsn_peer);
527 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200528
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200529 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200530 printf("--- Initialise SGSN ---\n\n");
531
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200532 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200533 gprs_dump_nsi(nsi);
534
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200535 printf("--- Initialise BSS 1 ---\n\n");
536
537 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
538 setup_bssgp(nsi, &bss_peer[0], 0x1002);
539 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200540 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200541
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200542 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
543
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200544 printf("--- Initialise BSS 2 ---\n\n");
545
546 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
547 setup_bssgp(nsi, &bss_peer[1], 0x2002);
548 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200549 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200550
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200551 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
552
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200553 printf("--- Move BSS 1 to new port ---\n\n");
554
555 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
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 2 to former BSS 1 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 1 to current BSS 2 port ---\n\n");
566
567 setup_ns(nsi, &bss_peer[0], 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 new port ---\n\n");
572
573 setup_ns(nsi, &bss_peer[3], 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
577 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
578
579 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
580 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200581 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200582
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200583 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
584
585 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
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 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
590
591 setup_bssgp(nsi, &bss_peer[0], 0x1012);
592 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200593 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200594
595 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
596
597 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
598
599 setup_bssgp(nsi, &bss_peer[0], 0x1002);
600 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200601 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200602
603 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
604
605 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
606
607 setup_bssgp(nsi, &bss_peer[0], 0x1002);
608 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200609 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200610
611 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
612
613 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
614
615 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
616
617 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
618
619 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
620
621 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
622
623 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
624
625 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
626
627 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
628
629 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
630
631 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
632
633 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
634
635 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
636
637 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
638
639 setup_bssgp(nsi, &bss_peer[2], 0x1002);
640 gprs_dump_nsi(nsi);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200641 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200642
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200643 gbprox_dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200644
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200645 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
646
647 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
648
649 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
650
651 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
652
653 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
654
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200655 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
656
657 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
658
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200659 gbprox_dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +0200660
Holger Hans Peter Freyther84db98f2014-07-07 19:22:02 +0200661 gbprox_reset();
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200662 gprs_ns_destroy(nsi);
663 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200664}
665
666static void test_gbproxy_ident_changes()
667{
668 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
669 struct sockaddr_in bss_peer[1] = {{0},};
670 struct sockaddr_in sgsn_peer= {0};
671 uint16_t nsei[2] = {0x1000, 0x2000};
672 uint16_t nsvci[2] = {0x1001, 0x2001};
673 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
674
675 bssgp_nsi = nsi;
676 gbcfg.nsi = bssgp_nsi;
677 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
678
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200679 configure_sgsn_peer(&sgsn_peer);
680 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200681
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200682 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200683 printf("--- Initialise SGSN ---\n\n");
684
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200685 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200686 gprs_dump_nsi(nsi);
687
688 printf("--- Initialise BSS 1 ---\n\n");
689
690 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
691 gprs_dump_nsi(nsi);
692
693 printf("--- Setup BVCI 1 ---\n\n");
694
695 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
696 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200697 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200698
699 printf("--- Setup BVCI 2 ---\n\n");
700
701 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
702 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200703 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200704
705 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
706
707 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
708 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
709
710 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
711
712 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
713 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
714
715 printf("--- Change NSEI ---\n\n");
716
717 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
718 gprs_dump_nsi(nsi);
719
720 printf("--- Setup BVCI 1 ---\n\n");
721
722 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
723 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200724 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200725
726 printf("--- Setup BVCI 3 ---\n\n");
727
728 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
729 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200730 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200731
732 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
733
734 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
735 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
736
737 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
738 " (should fail) ---\n\n");
739
740 send_ns_unitdata(nsi, NULL, &bss_peer[0], 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 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200743 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200744
745 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
746
747 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
748 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
749
750 printf("--- Change NSVCI ---\n\n");
751
752 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
753 gprs_dump_nsi(nsi);
754
755 printf("--- Setup BVCI 1 ---\n\n");
756
757 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
758 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200759 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200760
761 printf("--- Setup BVCI 4 ---\n\n");
762
763 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
764 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200765 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200766
767 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
768
769 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
770 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
771
772 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
773 " (should fail) ---\n\n");
774
775 send_ns_unitdata(nsi, NULL, &bss_peer[0], 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 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200778 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200779
780 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
781
782 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
783 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
784
785 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
786
787 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
788 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
789
Jacob Erlbeckb32d3c02014-07-07 10:45:59 +0200790 gbprox_dump_global(stdout, 0);
791 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200792
Holger Hans Peter Freyther84db98f2014-07-07 19:22:02 +0200793 gbprox_reset();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200794 gprs_ns_destroy(nsi);
795 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200796}
797
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200798static void test_gbproxy_ra_patching()
799{
800 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
801 struct sockaddr_in bss_peer[1] = {{0},};
802 struct sockaddr_in sgsn_peer= {0};
803 struct gprs_ra_id rai_bss =
804 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
805 struct gprs_ra_id rai_sgsn =
806 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
807 struct gprs_ra_id rai_unknown =
808 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
809
810 bssgp_nsi = nsi;
811 gbcfg.nsi = bssgp_nsi;
812 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
813
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200814 configure_sgsn_peer(&sgsn_peer);
815 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200816
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200817 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200818 printf("--- Initialise SGSN ---\n\n");
819
820 connect_sgsn(nsi, &sgsn_peer);
821 gprs_dump_nsi(nsi);
822
823 printf("--- Initialise BSS 1 ---\n\n");
824
825 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
826 setup_bssgp(nsi, &bss_peer[0], 0x1002);
827 gprs_dump_nsi(nsi);
828 gbprox_dump_peers(stdout, 0);
829
830 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
831
832 send_bssgp_suspend(nsi, &bss_peer[0], &rai_bss);
833 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_sgsn);
834
835 gbprox_dump_global(stdout, 0);
836 gbprox_dump_peers(stdout, 0);
837
838 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
839
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200840 send_ns_unitdata(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200841 bssgp_attach_req, sizeof(bssgp_attach_req));
842
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200843 send_ns_unitdata(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200844 bssgp_attach_acc, sizeof(bssgp_attach_acc));
845
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200846 send_ns_unitdata(nsi, "UPDATE REQ", &bss_peer[0], 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200847 bssgp_ra_upd_req, sizeof(bssgp_ra_upd_req));
848
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200849 send_ns_unitdata(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200850 bssgp_ra_upd_acc, sizeof(bssgp_ra_upd_acc));
851
852 /* Replace APN */
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200853 send_ns_unitdata(nsi, "ACT PDP CTX REQ (REPLACE APN)",
854 &bss_peer[0], 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200855 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
856
857 /* TODO: Re-configure to test APN IE removal */
858
859 /* Remove APN */
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200860 send_ns_unitdata(nsi, "ACT PDP CTX REQ (REMOVE APN)",
861 &bss_peer[0], 0x1002,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200862 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
Holger Hans Peter Freyther84db98f2014-07-07 19:22:02 +0200875 gbprox_reset();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200876 gprs_ns_destroy(nsi);
877 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200878}
879
Jacob Erlbeck627e7d92014-07-03 13:28:13 +0200880static struct log_info_cat gprs_categories[] = {
881 [DGPRS] = {
882 .name = "DGPRS",
883 .description = "GPRS Packet Service",
884 .enabled = 1, .loglevel = LOGL_DEBUG,
885 },
886 [DNS] = {
887 .name = "DNS",
888 .description = "GPRS Network Service (NS)",
889 .enabled = 1, .loglevel = LOGL_INFO,
890 },
891 [DBSSGP] = {
892 .name = "DBSSGP",
893 .description = "GPRS BSS Gateway Protocol (BSSGP)",
894 .enabled = 1, .loglevel = LOGL_DEBUG,
895 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +0200896};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200897
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +0200898static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +0200899 .cat = gprs_categories,
900 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +0200901};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200902
903int main(int argc, char **argv)
904{
905 osmo_init_logging(&info);
906 log_set_use_color(osmo_stderr_target, 0);
907 log_set_print_filename(osmo_stderr_target, 0);
908 osmo_signal_register_handler(SS_L_NS, &test_signal, NULL);
909
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200910 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +0200911 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
912 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200913
914 rate_ctr_init(NULL);
915
916 setlinebuf(stdout);
917
918 printf("===== GbProxy test START\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200919 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200920 test_gbproxy_ident_changes();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200921 test_gbproxy_ra_patching();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +0200922 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200923
924 exit(EXIT_SUCCESS);
925}