blob: 75dc173e257a93794df0923f4ddec6608a7d72af [file] [log] [blame]
Jacob Erlbeck76fa57a2013-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 Erlbeckeb3102e2014-07-07 10:46:01 +020031#include <openbsc/debug.h>
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +020032
33#define REMOTE_BSS_ADDR 0x01020304
34#define REMOTE_SGSN_ADDR 0x05060708
35
Jacob Erlbeck45017722013-10-18 13:04:47 +020036#define SGSN_NSEI 0x0100
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +020037
Jacob Erlbeckeb3102e2014-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
Jacob Erlbeckab7366f2014-06-06 18:47:36 +020069/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - GMM Information */
70static const unsigned char bssgp_gmm_information[66] = {
71 0x00, 0xef, 0xe2, 0xb7, 0x00, 0x00, 0x50, 0x20,
72 0x16, 0x82, 0x02, 0x58, 0x13, 0x99, 0x18, 0xb3,
73 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80,
74 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba,
75 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00, 0x0a,
76 0x82, 0x08, 0x02, 0x0d, 0x88, 0x11, 0x12, 0x13,
77 0x14, 0x15, 0x16, 0x17, 0x18, 0x00, 0x81, 0x00,
78 0x0e, 0x88, 0x41, 0xc0, 0x09, 0x08, 0x21, 0x04,
79 0xba, 0x3d
80};
81
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +020082/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Routing Area Update Request */
83static const unsigned char bssgp_ra_upd_req[85] = {
Jacob Erlbeckab7366f2014-06-06 18:47:36 +020084 0x01, 0xbb, 0xc5, 0x46, 0x79, 0x00, 0x00, 0x04,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +020085 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
86 0x70, 0x80, 0x00, 0x80, 0x0e, 0x00, 0x3e, 0x01,
87 0xc0, 0x15, 0x08, 0x08, 0x10, 0x11, 0x22, 0x33,
88 0x40, 0x50, 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33,
89 0x57, 0x2b, 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48,
90 0x50, 0xc8, 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8,
91 0x48, 0x02, 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02,
92 0x00, 0x19, 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27,
93 0x07, 0x04, 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02,
94 0x20, 0x00, 0x96, 0x3e, 0x97
95};
96
97/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Routing Area Update Accept */
98static const unsigned char bssgp_ra_upd_acc[91] = {
Jacob Erlbeckab7366f2014-06-06 18:47:36 +020099 0x00, 0xbb, 0xc5, 0x46, 0x79, 0x00, 0x50, 0x20,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200100 0x16, 0x82, 0x02, 0x58, 0x13, 0x9d, 0x19, 0x13,
101 0x42, 0x33, 0x57, 0x2b, 0xf7, 0xc8, 0x48, 0x02,
102 0x13, 0x48, 0x50, 0xc8, 0x48, 0x02, 0x14, 0x48,
103 0x50, 0xc8, 0x48, 0x02, 0x17, 0x49, 0x10, 0xc8,
104 0x48, 0x02, 0x00, 0x0a, 0x82, 0x07, 0x04, 0x0d,
105 0x88, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
106 0x18, 0x00, 0x81, 0x00, 0x0e, 0x9d, 0x41, 0xc0,
107 0x19, 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
108 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
109 0x05, 0xf4, 0xef, 0xe2, 0x81, 0x17, 0x17, 0x16,
110 0xc3, 0xbf, 0xcc
111};
112
113/* Base Station Subsystem GPRS Protocol: GSM A-I/F DTAP - Activate PDP Context Request */
114static const unsigned char bssgp_act_pdp_ctx_req[76] = {
115 0x01, 0xef, 0xe2, 0xb7, 0x00, 0x00, 0x00, 0x04,
116 0x08, 0x88, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
117 0x75, 0x30, 0x00, 0x80, 0x0e, 0x00, 0x35, 0x01,
118 0xc0, 0x0d, 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
119 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
121 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
122 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
123 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
124 0x00, 0x5a, 0xff, 0x02
125};
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200126
Jacob Erlbeck45017722013-10-18 13:04:47 +0200127static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
128 struct sockaddr_in *peer, const unsigned char* data,
129 size_t data_len);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200130
131static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
132 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
133{
134 /* GPRS Network Service, PDU type: NS_RESET,
135 */
136 unsigned char msg[12] = {
137 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
138 0x04, 0x82, 0x11, 0x22
139 };
140
141 msg[3] = cause;
142 msg[6] = nsvci / 256;
143 msg[7] = nsvci % 256;
144 msg[10] = nsei / 256;
145 msg[11] = nsei % 256;
146
147 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
148}
149
Jacob Erlbeck45017722013-10-18 13:04:47 +0200150static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
151 uint16_t nsvci, uint16_t nsei)
152{
153 /* GPRS Network Service, PDU type: NS_RESET_ACK,
154 */
155 unsigned char msg[9] = {
156 0x03, 0x01, 0x82, 0x11, 0x22,
157 0x04, 0x82, 0x11, 0x22
158 };
159
160 msg[3] = nsvci / 256;
161 msg[4] = nsvci % 256;
162 msg[7] = nsei / 256;
163 msg[8] = nsei % 256;
164
165 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
166}
167
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200168static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
169{
170 /* GPRS Network Service, PDU type: NS_ALIVE */
171 unsigned char msg[1] = {
172 0x0a
173 };
174
175 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
176}
177
178static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
179{
180 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
181 unsigned char msg[1] = {
182 0x0b
183 };
184
185 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
186}
187
188static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
189{
190 /* GPRS Network Service, PDU type: NS_UNBLOCK */
191 unsigned char msg[1] = {
192 0x06
193 };
194
195 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
196}
197
Jacob Erlbeck45017722013-10-18 13:04:47 +0200198static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
199{
200 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
201 unsigned char msg[1] = {
202 0x07
203 };
204
205 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
206}
207
208static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
209 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200210 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
211{
212 /* GPRS Network Service, PDU type: NS_UNITDATA */
213 unsigned char msg[4096] = {
214 0x00, 0x00, 0x00, 0x00
215 };
216
217 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
218
219 msg[2] = nsbvci / 256;
220 msg[3] = nsbvci % 256;
221 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
222
Jacob Erlbeck45017722013-10-18 13:04:47 +0200223 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200224}
225
226static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
227 uint16_t bvci)
228{
229 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
230 * BSSGP RESET */
231 unsigned char msg[22] = {
232 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeck3f086322014-06-02 10:48:59 +0200233 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
234 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200235 };
236
237 msg[3] = bvci / 256;
238 msg[4] = bvci % 256;
239
Jacob Erlbeck45017722013-10-18 13:04:47 +0200240 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
241}
242
243static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
244 struct sockaddr_in *src_addr, uint16_t bvci)
245{
246 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
247 * BSSGP RESET_ACK */
248 static unsigned char msg[5] = {
249 0x23, 0x04, 0x82, 0x00,
250 0x00
251 };
252
253 msg[3] = bvci / 256;
254 msg[4] = bvci % 256;
255
256 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200257}
258
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200259static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
260 struct sockaddr_in *src_addr,
261 struct gprs_ra_id *raid)
262{
263 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
264 unsigned char msg[15] = {
265 0x0b, 0x1f, 0x84, 0xcc, 0xd1, 0x75, 0x8b, 0x1b,
266 0x86, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60
267 };
268
269 gsm48_construct_ra(msg + 9, raid);
270
271 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
272}
273
274static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
275 struct sockaddr_in *src_addr,
276 struct gprs_ra_id *raid)
277{
278 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
279 unsigned char msg[18] = {
280 0x0c, 0x1f, 0x84, 0xcc, 0xd1, 0x75, 0x8b, 0x1b,
281 0x86, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x1d,
282 0x81, 0x01
283 };
284
285 gsm48_construct_ra(msg + 9, raid);
286
287 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
288}
289
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200290static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
291 uint16_t nsvci, uint16_t nsei)
292{
293 printf("Setup NS-VC: remote 0x%08x:%d, "
294 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
295 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
296 nsvci, nsvci, nsei, nsei);
297
298 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
299 send_ns_alive(nsi, src_addr);
300 send_ns_unblock(nsi, src_addr);
301 send_ns_alive_ack(nsi, src_addr);
302}
303
304static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
305 uint16_t bvci)
306{
307 printf("Setup BSSGP: remote 0x%08x:%d, "
308 "BVCI 0x%04x(%d)\n\n",
309 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
310 bvci, bvci);
311
312 send_bssgp_reset(nsi, src_addr, bvci);
313}
314
Jacob Erlbeck738b1c82014-07-07 10:46:00 +0200315static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer)
316{
317 gprs_ns_nsip_connect(nsi, sgsn_peer, SGSN_NSEI, SGSN_NSEI+1);
318 send_ns_reset_ack(nsi, sgsn_peer, SGSN_NSEI+1, SGSN_NSEI);
319 send_ns_alive_ack(nsi, sgsn_peer);
320 send_ns_unblock_ack(nsi, sgsn_peer);
321 send_ns_alive(nsi, sgsn_peer);
322}
323
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +0200324static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
325{
326 sgsn_peer->sin_family = AF_INET;
327 sgsn_peer->sin_port = htons(32000);
328 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
329}
330
331static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
332{
333 size_t i;
334
335 for (i = 0; i < size; ++i) {
336 bss_peers[i].sin_family = AF_INET;
337 bss_peers[i].sin_port = htons((i + 1) * 1111);
338 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
339 }
340}
341
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200342int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
343 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
344
345/* override */
346int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
347 struct msgb *msg, uint16_t bvci)
348{
349 printf("CALLBACK, event %d, msg length %d, bvci 0x%04x\n%s\n\n",
350 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200351 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200352
353 switch (event) {
354 case GPRS_NS_EVT_UNIT_DATA:
Jacob Erlbecke48c3472013-10-15 12:00:27 +0200355 return gbprox_rcvmsg(msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200356 default:
357 break;
358 }
359 return 0;
360}
361
362/* override */
363ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
364 const struct sockaddr *dest_addr, socklen_t addrlen)
365{
366 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
367 const struct sockaddr *, socklen_t);
368 static sendto_t real_sendto = NULL;
369 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200370 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200371
372 if (!real_sendto)
373 real_sendto = dlsym(RTLD_NEXT, "sendto");
374
375 if (dest_host == REMOTE_BSS_ADDR)
Jacob Erlbeck45017722013-10-18 13:04:47 +0200376 printf("MESSAGE to BSS at 0x%08x:%d, msg length %d\n%s\n\n",
377 dest_host, dest_port,
378 len, osmo_hexdump(buf, len));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200379 else if (dest_host == REMOTE_SGSN_ADDR)
Jacob Erlbeck45017722013-10-18 13:04:47 +0200380 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %d\n%s\n\n",
381 dest_host, dest_port,
382 len, osmo_hexdump(buf, len));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200383 else
384 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
385
386 return len;
387}
388
389/* override */
390int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
391{
Jacob Erlbeck45017722013-10-18 13:04:47 +0200392 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
393 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200394 uint16_t bvci = msgb_bvci(msg);
395 uint16_t nsei = msgb_nsei(msg);
396
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200397 size_t len = msgb_length(msg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200398
Jacob Erlbeck45017722013-10-18 13:04:47 +0200399 if (!real_gprs_ns_sendmsg)
400 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
401
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200402 if (nsei == SGSN_NSEI)
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200403 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
404 "msg length %d (%s)\n",
405 bvci, len, __func__);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200406 else
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200407 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
408 "msg length %d (%s)\n",
409 bvci, len, __func__);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200410
Jacob Erlbeck45017722013-10-18 13:04:47 +0200411 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200412}
413
414static void dump_rate_ctr_group(FILE *stream, const char *prefix,
415 struct rate_ctr_group *ctrg)
416{
417 unsigned int i;
418
419 for (i = 0; i < ctrg->desc->num_ctr; i++) {
420 struct rate_ctr *ctr = &ctrg->ctr[i];
421 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
422 fprintf(stream, " %s%s: %llu%s",
423 prefix, ctrg->desc->ctr_desc[i].description,
424 (long long)ctr->current,
425 "\n");
426 };
427}
428
429/* Signal handler for signals from NS layer */
430static int test_signal(unsigned int subsys, unsigned int signal,
431 void *handler_data, void *signal_data)
432{
433 struct ns_signal_data *nssd = signal_data;
434 int rc;
435
436 if (subsys != SS_L_NS)
437 return 0;
438
439 switch (signal) {
440 case S_NS_RESET:
441 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
442 nssd->nsvc->nsvci,
443 gprs_ns_ll_str(nssd->nsvc));
444 break;
445
446 case S_NS_ALIVE_EXP:
447 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
448 nssd->nsvc->nsvci,
449 gprs_ns_ll_str(nssd->nsvc));
450 break;
451
452 case S_NS_BLOCK:
453 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
454 nssd->nsvc->nsvci,
455 gprs_ns_ll_str(nssd->nsvc));
456 break;
457
458 case S_NS_UNBLOCK:
459 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
460 nssd->nsvc->nsvci,
461 gprs_ns_ll_str(nssd->nsvc));
462 break;
463
464 case S_NS_REPLACED:
465 printf("==> got signal NS_REPLACED: 0x%04x/%s",
466 nssd->nsvc->nsvci,
467 gprs_ns_ll_str(nssd->nsvc));
468 printf(" -> 0x%04x/%s\n",
469 nssd->old_nsvc->nsvci,
470 gprs_ns_ll_str(nssd->old_nsvc));
471 break;
472
473 default:
474 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
475 nssd->nsvc->nsvci,
476 gprs_ns_ll_str(nssd->nsvc));
477 break;
478 }
479 printf("\n");
480 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
481 return rc;
482}
483
484static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
485{
486 struct msgb *msg;
487 int ret;
488 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
489 fprintf(stderr, "message too long: %d\n", data_len);
490 return -1;
491 }
492
493 msg = gprs_ns_msgb_alloc();
494 memmove(msg->data, data, data_len);
495 msg->l2h = msg->data;
496 msgb_put(msg, data_len);
497
498 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
499 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
500 osmo_hexdump(data, data_len));
501
502 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
503
504 printf("result (%s) = %d\n\n", text, ret);
505
506 msgb_free(msg);
507
508 return ret;
509}
510
511static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
512{
513 struct gprs_nsvc *nsvc;
514
515 printf("Current NS-VCIs:\n");
516 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
517 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200518 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200519 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck45017722013-10-18 13:04:47 +0200520 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
521 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
522 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200523 );
524 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
525 }
526 printf("\n");
527}
528
529static void test_gbproxy()
530{
531 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
532 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck45017722013-10-18 13:04:47 +0200533 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200534
535 bssgp_nsi = nsi;
536 gbcfg.nsi = bssgp_nsi;
537 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
538
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +0200539 configure_sgsn_peer(&sgsn_peer);
540 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200541
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200542 printf("=== %s ===\n", __func__);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200543 printf("--- Initialise SGSN ---\n\n");
544
Jacob Erlbeck738b1c82014-07-07 10:46:00 +0200545 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200546 gprs_dump_nsi(nsi);
547
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200548 printf("--- Initialise BSS 1 ---\n\n");
549
550 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
551 setup_bssgp(nsi, &bss_peer[0], 0x1002);
552 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200553 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200554
Jacob Erlbeck45017722013-10-18 13:04:47 +0200555 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
556
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200557 printf("--- Initialise BSS 2 ---\n\n");
558
559 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
560 setup_bssgp(nsi, &bss_peer[1], 0x2002);
561 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200562 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200563
Jacob Erlbeck45017722013-10-18 13:04:47 +0200564 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
565
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200566 printf("--- Move BSS 1 to new port ---\n\n");
567
568 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
569 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200570 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200571
572 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
573
574 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
575 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200576 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200577
578 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
579
580 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
581 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200582 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200583
584 printf("--- Move BSS 2 to new port ---\n\n");
585
586 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
587 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200588 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200589
590 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
591
592 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
593 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200594 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200595
Jacob Erlbeck45017722013-10-18 13:04:47 +0200596 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
597
598 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
599 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200600 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200601
602 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
603
604 setup_bssgp(nsi, &bss_peer[0], 0x1012);
605 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200606 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200607
608 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
609
610 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
611
612 setup_bssgp(nsi, &bss_peer[0], 0x1002);
613 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200614 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200615
616 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
617
618 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
619
620 setup_bssgp(nsi, &bss_peer[0], 0x1002);
621 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200622 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200623
624 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
625
626 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
627
628 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
629
630 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
631
632 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
633
634 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
635
636 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
637
638 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
639
640 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
641
642 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
643
644 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
645
646 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
647
648 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
649
650 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
651
652 setup_bssgp(nsi, &bss_peer[2], 0x1002);
653 gprs_dump_nsi(nsi);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200654 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck45017722013-10-18 13:04:47 +0200655
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200656 gbprox_dump_global(stdout, 0);
Jacob Erlbeckcc4a2aa2013-10-18 22:12:16 +0200657
Jacob Erlbeck45017722013-10-18 13:04:47 +0200658 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
659
660 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
661
662 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
663
664 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
665
666 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
667
Jacob Erlbeckcc4a2aa2013-10-18 22:12:16 +0200668 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
669
670 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
671
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200672 gbprox_dump_global(stdout, 0);
Jacob Erlbeckcc4a2aa2013-10-18 22:12:16 +0200673
Holger Hans Peter Freythera9279872014-07-07 19:22:02 +0200674 gbprox_reset();
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200675 gprs_ns_destroy(nsi);
676 nsi = NULL;
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200677}
678
679static void test_gbproxy_ident_changes()
680{
681 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
682 struct sockaddr_in bss_peer[1] = {{0},};
683 struct sockaddr_in sgsn_peer= {0};
684 uint16_t nsei[2] = {0x1000, 0x2000};
685 uint16_t nsvci[2] = {0x1001, 0x2001};
686 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
687
688 bssgp_nsi = nsi;
689 gbcfg.nsi = bssgp_nsi;
690 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
691
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +0200692 configure_sgsn_peer(&sgsn_peer);
693 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200694
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200695 printf("=== %s ===\n", __func__);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200696 printf("--- Initialise SGSN ---\n\n");
697
Jacob Erlbeck738b1c82014-07-07 10:46:00 +0200698 connect_sgsn(nsi, &sgsn_peer);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200699 gprs_dump_nsi(nsi);
700
701 printf("--- Initialise BSS 1 ---\n\n");
702
703 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
704 gprs_dump_nsi(nsi);
705
706 printf("--- Setup BVCI 1 ---\n\n");
707
708 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
709 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200710 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200711
712 printf("--- Setup BVCI 2 ---\n\n");
713
714 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
715 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200716 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200717
718 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
719
720 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
721 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
722
723 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
724
725 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
726 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
727
728 printf("--- Change NSEI ---\n\n");
729
730 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
731 gprs_dump_nsi(nsi);
732
733 printf("--- Setup BVCI 1 ---\n\n");
734
735 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
736 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200737 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200738
739 printf("--- Setup BVCI 3 ---\n\n");
740
741 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
742 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200743 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200744
745 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
746
747 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
748 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
749
750 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
751 " (should fail) ---\n\n");
752
753 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200754 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200755 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200756 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200757
758 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
759
760 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
761 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
762
763 printf("--- Change NSVCI ---\n\n");
764
765 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
766 gprs_dump_nsi(nsi);
767
768 printf("--- Setup BVCI 1 ---\n\n");
769
770 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
771 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200772 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200773
774 printf("--- Setup BVCI 4 ---\n\n");
775
776 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
777 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200778 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200779
780 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
781
782 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
783 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
784
785 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
786 " (should fail) ---\n\n");
787
788 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200789 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200790 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200791 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200792
793 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
794
795 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
796 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
797
798 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
799
800 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
801 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
802
Jacob Erlbeckeed33ef2014-07-07 10:45:59 +0200803 gbprox_dump_global(stdout, 0);
804 gbprox_dump_peers(stdout, 0);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200805
Holger Hans Peter Freythera9279872014-07-07 19:22:02 +0200806 gbprox_reset();
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200807 gprs_ns_destroy(nsi);
808 nsi = NULL;
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200809}
810
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200811static void test_gbproxy_ra_patching()
812{
813 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
814 struct sockaddr_in bss_peer[1] = {{0},};
815 struct sockaddr_in sgsn_peer= {0};
816 struct gprs_ra_id rai_bss =
817 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
818 struct gprs_ra_id rai_sgsn =
819 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
820 struct gprs_ra_id rai_unknown =
821 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
822
823 bssgp_nsi = nsi;
824 gbcfg.nsi = bssgp_nsi;
825 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Jacob Erlbeck2504bc42014-05-19 10:14:58 +0200826 gbcfg.core_mcc = 123;
827 gbcfg.core_mnc = 456;
Jacob Erlbeck5620c6d2014-05-23 20:48:07 +0200828 gbcfg.core_apn = talloc_zero_size(NULL, 100);
829 gbcfg.core_apn_size = gbprox_str_to_apn(gbcfg.core_apn, "foo.bar", 100);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200830
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +0200831 configure_sgsn_peer(&sgsn_peer);
832 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200833
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200834 printf("=== %s ===\n", __func__);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200835 printf("--- Initialise SGSN ---\n\n");
836
837 connect_sgsn(nsi, &sgsn_peer);
838 gprs_dump_nsi(nsi);
839
840 printf("--- Initialise BSS 1 ---\n\n");
841
842 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
843 setup_bssgp(nsi, &bss_peer[0], 0x1002);
844 gprs_dump_nsi(nsi);
845 gbprox_dump_peers(stdout, 0);
846
847 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
848
849 send_bssgp_suspend(nsi, &bss_peer[0], &rai_bss);
850 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_sgsn);
851
852 gbprox_dump_global(stdout, 0);
853 gbprox_dump_peers(stdout, 0);
854
855 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
856
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200857 send_ns_unitdata(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200858 bssgp_attach_req, sizeof(bssgp_attach_req));
859
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200860 send_ns_unitdata(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200861 bssgp_attach_acc, sizeof(bssgp_attach_acc));
862
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200863 send_ns_unitdata(nsi, "UPDATE REQ", &bss_peer[0], 0x1002,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200864 bssgp_ra_upd_req, sizeof(bssgp_ra_upd_req));
865
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200866 send_ns_unitdata(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200867 bssgp_ra_upd_acc, sizeof(bssgp_ra_upd_acc));
868
Jacob Erlbeckab7366f2014-06-06 18:47:36 +0200869 send_ns_unitdata(nsi, "GMM INFO", &sgsn_peer, 0x1002,
870 bssgp_gmm_information, sizeof(bssgp_gmm_information));
871
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200872 /* Replace APN */
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200873 send_ns_unitdata(nsi, "ACT PDP CTX REQ (REPLACE APN)",
874 &bss_peer[0], 0x1002,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200875 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
876
Jacob Erlbeck5620c6d2014-05-23 20:48:07 +0200877 gbcfg.core_apn[0] = 0;
878 gbcfg.core_apn_size = 0;
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200879
880 /* Remove APN */
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200881 send_ns_unitdata(nsi, "ACT PDP CTX REQ (REMOVE APN)",
882 &bss_peer[0], 0x1002,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200883 bssgp_act_pdp_ctx_req, sizeof(bssgp_act_pdp_ctx_req));
884
885 gbprox_dump_global(stdout, 0);
886 gbprox_dump_peers(stdout, 0);
887
888 printf("--- Bad cases ---\n\n");
889
890 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1eee);
891 send_bssgp_suspend_ack(nsi, &sgsn_peer, &rai_unknown);
892
893 gbprox_dump_global(stdout, 0);
894 gbprox_dump_peers(stdout, 0);
895
Holger Hans Peter Freythera9279872014-07-07 19:22:02 +0200896 gbprox_reset();
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200897 gprs_ns_destroy(nsi);
898 nsi = NULL;
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200899}
900
Jacob Erlbeckb440bf82014-07-03 13:28:13 +0200901static struct log_info_cat gprs_categories[] = {
902 [DGPRS] = {
903 .name = "DGPRS",
904 .description = "GPRS Packet Service",
905 .enabled = 1, .loglevel = LOGL_DEBUG,
906 },
907 [DNS] = {
908 .name = "DNS",
909 .description = "GPRS Network Service (NS)",
910 .enabled = 1, .loglevel = LOGL_INFO,
911 },
912 [DBSSGP] = {
913 .name = "DBSSGP",
914 .description = "GPRS BSS Gateway Protocol (BSSGP)",
915 .enabled = 1, .loglevel = LOGL_DEBUG,
916 },
Holger Hans Peter Freyther89276422014-07-07 19:48:14 +0200917};
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200918
Holger Hans Peter Freyther89276422014-07-07 19:48:14 +0200919static struct log_info info = {
Jacob Erlbeckb440bf82014-07-03 13:28:13 +0200920 .cat = gprs_categories,
921 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther89276422014-07-07 19:48:14 +0200922};
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200923
924int main(int argc, char **argv)
925{
926 osmo_init_logging(&info);
927 log_set_use_color(osmo_stderr_target, 0);
928 log_set_print_filename(osmo_stderr_target, 0);
929 osmo_signal_register_handler(SS_L_NS, &test_signal, NULL);
930
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200931 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeckb440bf82014-07-03 13:28:13 +0200932 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
933 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200934
935 rate_ctr_init(NULL);
936
937 setlinebuf(stdout);
938
939 printf("===== GbProxy test START\n");
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200940 test_gbproxy();
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200941 test_gbproxy_ident_changes();
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200942 test_gbproxy_ra_patching();
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +0200943 printf("===== GbProxy test END\n\n");
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200944
945 exit(EXIT_SUCCESS);
946}