blob: 5d6afa361a7d39260b41b0a9925de01fff681fa9 [file] [log] [blame]
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001/* test routines for gbproxy
2 * send NS messages to the gbproxy and dumps what happens
3 * (C) 2013 by sysmocom s.f.m.c. GmbH
4 * Author: Jacob Erlbeck <jerlbeck@sysmocom.de>
5 */
6
7#undef _GNU_SOURCE
8#define _GNU_SOURCE
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <stdint.h>
13#include <string.h>
14#include <getopt.h>
15#include <dlfcn.h>
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020016#include <time.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020017#include <sys/types.h>
18#include <sys/socket.h>
19
20#include <osmocom/core/msgb.h>
21#include <osmocom/core/application.h>
22#include <osmocom/core/utils.h>
23#include <osmocom/core/logging.h>
24#include <osmocom/core/talloc.h>
25#include <osmocom/core/signal.h>
26#include <osmocom/core/rate_ctr.h>
Jacob Erlbeckb1381062014-07-01 12:41:13 +020027#include <osmocom/gsm/tlv.h>
Jacob Erlbeck59748e62014-08-11 17:26:21 +020028#include <osmocom/gsm/gsm_utils.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020029#include <osmocom/gprs/gprs_msgb.h>
30#include <osmocom/gprs/gprs_ns.h>
31#include <osmocom/gprs/gprs_bssgp.h>
32
33#include <openbsc/gb_proxy.h>
Holger Hans Peter Freyther7127b022014-08-04 11:52:52 +020034#include <openbsc/gprs_utils.h>
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +020035#include <openbsc/gprs_llc.h>
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020036#include <openbsc/debug.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020037
38#define REMOTE_BSS_ADDR 0x01020304
39#define REMOTE_SGSN_ADDR 0x05060708
40
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020041#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020042
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +020043#define REMOTE_SGSN2_ADDR 0x15161718
44#define SGSN2_NSEI 0x0102
45
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020046struct gbproxy_config gbcfg = {0};
47
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020048static int dump_global(FILE *stream, int indent)
49{
50 unsigned int i;
51 const struct rate_ctr_group_desc *desc;
52 int rc;
53
54 rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
55 if (rc < 0)
56 return rc;
57
58 desc = gbcfg.ctrg->desc;
59
60 for (i = 0; i < desc->num_ctr; i++) {
61 struct rate_ctr *ctr = &gbcfg.ctrg->ctr[i];
62 if (ctr->current) {
63 rc = fprintf(stream, "%*s %s: %llu\n",
64 indent, "",
65 desc->ctr_desc[i].description,
66 (long long)ctr->current);
67
68 if (rc < 0)
69 return rc;
70 }
71 }
72
73 return 0;
74}
75
Jacob Erlbeck7b821d02014-08-08 08:37:37 +020076static int dump_peers(FILE *stream, int indent, time_t now,
77 struct gbproxy_config *cfg)
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020078{
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +020079 struct gbproxy_peer *peer;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020080 struct gprs_ra_id raid;
81 unsigned int i;
82 const struct rate_ctr_group_desc *desc;
83 int rc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020084
85 rc = fprintf(stream, "%*sPeers:\n", indent, "");
86 if (rc < 0)
87 return rc;
88
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +020089 llist_for_each_entry(peer, &cfg->bts_peers, list) {
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +020090 struct gbproxy_tlli_info *tlli_info;
91 struct gbproxy_patch_state *state = &peer->patch_state;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020092 gsm48_parse_ra(&raid, peer->ra);
93
94 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, "
95 "RAI %u-%u-%u-%u\n",
96 indent, "",
97 peer->nsei, peer->bvci,
98 peer->blocked ? "" : "not ",
99 raid.mcc, raid.mnc, raid.lac, raid.rac);
100
101 if (rc < 0)
102 return rc;
103
104 desc = peer->ctrg->desc;
105
106 for (i = 0; i < desc->num_ctr; i++) {
107 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
108 if (ctr->current) {
109 rc = fprintf(stream, "%*s %s: %llu\n",
110 indent, "",
111 desc->ctr_desc[i].description,
112 (long long)ctr->current);
113
114 if (rc < 0)
115 return rc;
116 }
117 }
118
119 fprintf(stream, "%*s TLLI-Cache: %d\n",
120 indent, "", state->enabled_tllis_count);
121 llist_for_each_entry(tlli_info, &state->enabled_tllis, list) {
122 char mi_buf[200];
Jacob Erlbeck7b821d02014-08-08 08:37:37 +0200123 time_t age = now ? now - tlli_info->timestamp : 0;
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200124 int stored_msgs = 0;
125 struct llist_head *iter;
126 llist_for_each(iter, &tlli_info->stored_msgs)
127 stored_msgs++;
128
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +0200129 if (tlli_info->imsi_len > 0) {
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200130 snprintf(mi_buf, sizeof(mi_buf), "(invalid)");
131 gsm48_mi_to_string(mi_buf, sizeof(mi_buf),
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +0200132 tlli_info->imsi,
133 tlli_info->imsi_len);
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200134 } else {
135 snprintf(mi_buf, sizeof(mi_buf), "(none)");
136 }
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200137 fprintf(stream, "%*s TLLI %08x",
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200138 indent, "", tlli_info->tlli.current);
139 if (tlli_info->tlli.assigned)
140 fprintf(stream, "/%08x", tlli_info->tlli.assigned);
141 if (tlli_info->sgsn_tlli.current) {
142 fprintf(stream, " -> %08x",
143 tlli_info->sgsn_tlli.current);
144 if (tlli_info->sgsn_tlli.assigned)
145 fprintf(stream, "/%08x",
146 tlli_info->sgsn_tlli.assigned);
147 }
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200148 fprintf(stream, ", IMSI %s, AGE %d",
149 mi_buf, (int)age);
150
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200151 if (stored_msgs)
152 fprintf(stream, ", STORED %d", stored_msgs);
153
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200154 if (cfg->check_imsi && tlli_info->enable_patching)
155 fprintf(stream, ", IMSI matches");
156
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200157 if (tlli_info->imsi_acq_pending)
158 fprintf(stream, ", IMSI acquisition in progress");
159
Jacob Erlbeck7430da62014-09-12 15:09:56 +0200160 if (tlli_info->is_deregistered)
161 fprintf(stream, ", DE-REGISTERED");
162
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200163 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200164 if (rc < 0)
165 return rc;
166 }
167 }
168
169 return 0;
170}
171
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200172const uint8_t *convert_ra(struct gprs_ra_id *raid)
173{
174 static uint8_t buf[6];
175 gsm48_construct_ra(buf, raid);
176 return buf;
177}
178
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200179/* DTAP - Attach Request */
180static const unsigned char dtap_attach_req[] = {
181 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
182 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
183 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
184 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
185 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
186 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200187};
188
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200189/* DTAP - Attach Request (invalid RAI) */
190static const unsigned char dtap_attach_req2[] = {
191 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
192 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
193 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
194 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
195 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
196 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
197};
198
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200199/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
200static const unsigned char dtap_attach_req3[] = {
201 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
202 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
203 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
204 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
205 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
206 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
207};
208
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200209/* DTAP - Identity Request */
210static const unsigned char dtap_identity_req[] = {
211 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200212};
213
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200214/* DTAP - Identity Response */
215static const unsigned char dtap_identity_resp[] = {
216 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
217 0x16, 0x17, 0x18
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200218};
219
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200220/* DTAP - Identity Response, IMSI 2 */
221static const unsigned char dtap_identity2_resp[] = {
222 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
223 0x16, 0x17, 0x18
224};
225
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200226/* DTAP - Attach Accept */
227static const unsigned char dtap_attach_acc[] = {
228 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
229 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
230 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200231};
232
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200233/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200234static const unsigned char dtap_attach_acc2[] = {
235 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
236 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
237 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
238};
239
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200240/* DTAP - Attach Complete */
241static const unsigned char dtap_attach_complete[] = {
242 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200243};
244
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200245/* DTAP - GMM Information */
246static const unsigned char dtap_gmm_information[] = {
247 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200248};
249
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200250/* DTAP - Routing Area Update Request */
251static const unsigned char dtap_ra_upd_req[] = {
252 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
253 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
254 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
255 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
256 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
257 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
258 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200259};
260
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200261/* DTAP - Routing Area Update Accept */
262static const unsigned char dtap_ra_upd_acc[] = {
263 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
264 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
265 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200266};
267
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200268/* DTAP - Routing Area Update Accept, P-TMSI 2 */
269static const unsigned char dtap_ra_upd_acc2[] = {
270 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
271 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
272 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
273};
274
275/* DTAP - Routing Area Update Accept, P-TMSI 3 */
276static const unsigned char dtap_ra_upd_acc3[] = {
277 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
278 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
279 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
280};
281
282/* DTAP - Routing Area Update Complete */
283static const unsigned char dtap_ra_upd_complete[] = {
284 0x08, 0x0a
285};
286
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200287/* DTAP - Routing Area Update Reject */
288/* cause = 10 ("Implicitly detached"), force_standby = 0 */
289static const unsigned char dtap_ra_upd_rej[] = {
290 0x08, 0x0b, 0x0a, 0x00,
291};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200292
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200293/* DTAP - Activate PDP Context Request */
294static const unsigned char dtap_act_pdp_ctx_req[] = {
295 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200296 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
298 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
299 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
300 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200301 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200302};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200303
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200304/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200305/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200306static const unsigned char dtap_detach_po_req[] = {
307 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
308 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200309};
310
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200311/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200312/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200313static const unsigned char dtap_detach_req[] = {
314 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
315 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200316};
317
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200318/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200319static const unsigned char dtap_detach_acc[] = {
320 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200321};
322
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200323/* DTAP - Detach Request (MT) */
324/* normal detach, reattach required, implicitly detached */
325static const unsigned char dtap_mt_detach_rea_req[] = {
326 0x08, 0x05, 0x01, 0x25, 0x0a
327};
328
329/* DTAP - Detach Request (MT) */
330/* normal detach, reattach not required, implicitly detached */
331static const unsigned char dtap_mt_detach_req[] = {
332 0x08, 0x05, 0x02, 0x25, 0x0a
333};
334
335/* DTAP - Detach Accept (MT) */
336static const unsigned char dtap_mt_detach_acc[] = {
337 0x08, 0x06
338};
339
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200340/* GPRS-LLC - SAPI: LLGMM, U, XID */
341static const unsigned char llc_u_xid_ul[] = {
342 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
343 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
344};
345
346/* GPRS-LLC - SAPI: LLGMM, U, XID */
347static const unsigned char llc_u_xid_dl[] = {
348 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
349 0xe4, 0xa9, 0x1a, 0x9e
350};
351
352/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
353static const unsigned char llc_ui_ll11_dns_query_ul[] = {
354 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
355 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
356 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
357 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
358 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
359 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
360 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
361 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
362 0x8f, 0x07
363};
364
365/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
366static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
367 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
368 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
369 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
370 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
371 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
372 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
373 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
374 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
375 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
376 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
377 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
378 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
379 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
380 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
381 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
382 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
383 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
384 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
385 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
386 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
387 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
388 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
389 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
390 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
391 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
392 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
393};
394
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200395static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
396 struct sockaddr_in *peer, const unsigned char* data,
397 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200398
399static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
400 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
401{
402 /* GPRS Network Service, PDU type: NS_RESET,
403 */
404 unsigned char msg[12] = {
405 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
406 0x04, 0x82, 0x11, 0x22
407 };
408
409 msg[3] = cause;
410 msg[6] = nsvci / 256;
411 msg[7] = nsvci % 256;
412 msg[10] = nsei / 256;
413 msg[11] = nsei % 256;
414
415 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
416}
417
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200418static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
419 uint16_t nsvci, uint16_t nsei)
420{
421 /* GPRS Network Service, PDU type: NS_RESET_ACK,
422 */
423 unsigned char msg[9] = {
424 0x03, 0x01, 0x82, 0x11, 0x22,
425 0x04, 0x82, 0x11, 0x22
426 };
427
428 msg[3] = nsvci / 256;
429 msg[4] = nsvci % 256;
430 msg[7] = nsei / 256;
431 msg[8] = nsei % 256;
432
433 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
434}
435
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200436static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
437{
438 /* GPRS Network Service, PDU type: NS_ALIVE */
439 unsigned char msg[1] = {
440 0x0a
441 };
442
443 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
444}
445
446static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
447{
448 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
449 unsigned char msg[1] = {
450 0x0b
451 };
452
453 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
454}
455
456static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
457{
458 /* GPRS Network Service, PDU type: NS_UNBLOCK */
459 unsigned char msg[1] = {
460 0x06
461 };
462
463 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
464}
465
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200466static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
467{
468 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
469 unsigned char msg[1] = {
470 0x07
471 };
472
473 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
474}
475
476static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
477 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200478 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
479{
480 /* GPRS Network Service, PDU type: NS_UNITDATA */
481 unsigned char msg[4096] = {
482 0x00, 0x00, 0x00, 0x00
483 };
484
485 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
486
487 msg[2] = nsbvci / 256;
488 msg[3] = nsbvci % 256;
489 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
490
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200491 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200492}
493
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200494static void send_bssgp_ul_unitdata(
495 struct gprs_ns_inst *nsi, const char *text,
496 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
497 struct gprs_ra_id *raid, uint16_t cell_id,
498 const uint8_t *llc_msg, size_t llc_msg_size)
499{
500 /* GPRS Network Service, PDU type: NS_UNITDATA */
501 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
502 unsigned char msg[4096] = {
503 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
504 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
505 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
506 };
507
508 size_t bssgp_msg_size = 23 + llc_msg_size;
509
510 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
511
512 gsm48_construct_ra(msg + 10, raid);
513 msg[1] = (uint8_t)(tlli >> 24);
514 msg[2] = (uint8_t)(tlli >> 16);
515 msg[3] = (uint8_t)(tlli >> 8);
516 msg[4] = (uint8_t)(tlli >> 0);
517 msg[16] = cell_id / 256;
518 msg[17] = cell_id % 256;
519 msg[21] = llc_msg_size / 256;
520 msg[22] = llc_msg_size % 256;
521 memcpy(msg + 23, llc_msg, llc_msg_size);
522
523 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
524 src_addr, nsbvci, msg, bssgp_msg_size);
525}
526
527static void send_bssgp_dl_unitdata(
528 struct gprs_ns_inst *nsi, const char *text,
529 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
530 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
531 const uint8_t *llc_msg, size_t llc_msg_size)
532{
533 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
534 unsigned char msg[4096] = {
535 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
536 0x16, 0x82, 0x02, 0x58,
537 };
538 unsigned char racap_drx[] = {
539 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
540 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
541 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
542 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
543 };
544
545 size_t bssgp_msg_size = 0;
546
547 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
548
549 msg[1] = (uint8_t)(tlli >> 24);
550 msg[2] = (uint8_t)(tlli >> 16);
551 msg[3] = (uint8_t)(tlli >> 8);
552 msg[4] = (uint8_t)(tlli >> 0);
553
554 bssgp_msg_size = 12;
555
556 if (with_racap_drx) {
557 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
558 bssgp_msg_size += sizeof(racap_drx);
559 }
560
561 if (imsi) {
562 OSMO_ASSERT(imsi_size <= 127);
563 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
564 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
565 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
566 bssgp_msg_size += 2 + imsi_size;
567 }
568
569 if ((bssgp_msg_size % 4) != 0) {
570 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
571 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
572 msg[bssgp_msg_size + 1] = 0x80 | abytes;
573 memset(msg + bssgp_msg_size + 2, 0, abytes);
574 bssgp_msg_size += 2 + abytes;
575 }
576
577 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
578 if (llc_msg_size < 128) {
579 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
580 bssgp_msg_size += 2;
581 } else {
582 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
583 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
584 bssgp_msg_size += 3;
585 }
586 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
587 bssgp_msg_size += llc_msg_size;
588
589
590 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
591 src_addr, nsbvci, msg, bssgp_msg_size);
592}
593
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200594static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
595 uint16_t bvci)
596{
597 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
598 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200599 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200600 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200601 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
602 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200603 };
604
605 msg[3] = bvci / 256;
606 msg[4] = bvci % 256;
607
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200608 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
609}
610
611static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
612 struct sockaddr_in *src_addr, uint16_t bvci)
613{
614 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
615 * BSSGP RESET_ACK */
616 static unsigned char msg[5] = {
617 0x23, 0x04, 0x82, 0x00,
618 0x00
619 };
620
621 msg[3] = bvci / 256;
622 msg[4] = bvci % 256;
623
624 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200625}
626
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200627static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
628 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200629 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200630 struct gprs_ra_id *raid)
631{
632 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
633 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200634 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
635 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200636 };
637
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200638 msg[3] = (uint8_t)(tlli >> 24);
639 msg[4] = (uint8_t)(tlli >> 16);
640 msg[5] = (uint8_t)(tlli >> 8);
641 msg[6] = (uint8_t)(tlli >> 0);
642
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200643 gsm48_construct_ra(msg + 9, raid);
644
645 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
646}
647
648static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
649 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200650 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200651 struct gprs_ra_id *raid)
652{
653 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
654 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200655 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
656 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200657 0x81, 0x01
658 };
659
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200660 msg[3] = (uint8_t)(tlli >> 24);
661 msg[4] = (uint8_t)(tlli >> 16);
662 msg[5] = (uint8_t)(tlli >> 8);
663 msg[6] = (uint8_t)(tlli >> 0);
664
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200665 gsm48_construct_ra(msg + 9, raid);
666
667 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
668}
669
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200670static void send_bssgp_llc_discarded(struct gprs_ns_inst *nsi,
671 struct sockaddr_in *src_addr,
672 uint16_t bvci, uint32_t tlli,
673 unsigned n_frames, unsigned n_octets)
674{
675 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
676 unsigned char msg[] = {
677 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
678 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
679 /* n octets */ 0xff, 0xff, 0xff
680 };
681
682 msg[3] = (uint8_t)(tlli >> 24);
683 msg[4] = (uint8_t)(tlli >> 16);
684 msg[5] = (uint8_t)(tlli >> 8);
685 msg[6] = (uint8_t)(tlli >> 0);
686 msg[9] = (uint8_t)(n_frames);
687 msg[12] = (uint8_t)(bvci >> 8);
688 msg[13] = (uint8_t)(bvci >> 0);
689 msg[16] = (uint8_t)(n_octets >> 16);
690 msg[17] = (uint8_t)(n_octets >> 8);
691 msg[18] = (uint8_t)(n_octets >> 0);
692
693 send_ns_unitdata(nsi, "LLC_DISCARDED", src_addr, 0, msg, sizeof(msg));
694}
695
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200696static void send_bssgp_flow_control_bvc(struct gprs_ns_inst *nsi,
697 struct sockaddr_in *src_addr,
698 uint16_t bvci, uint8_t tag)
699{
700 /* GPRS Network Service, PDU type: NS_UNITDATA,
701 * BSSGP FLOW_CONTROL_BVC */
702 unsigned char msg[] = {
703 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
704 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
705 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
706 };
707
708 msg[3] = tag;
709
710 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", src_addr, bvci,
711 msg, sizeof(msg));
712}
713
714static void send_bssgp_flow_control_bvc_ack(struct gprs_ns_inst *nsi,
715 struct sockaddr_in *src_addr,
716 uint16_t bvci, uint8_t tag)
717{
718 /* GPRS Network Service, PDU type: NS_UNITDATA,
719 * BSSGP FLOW_CONTROL_BVC_ACK */
720 unsigned char msg[] = {
721 0x27, 0x1e, 0x81, /* Tag */ 0xce
722 };
723
724 msg[3] = tag;
725
726 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", src_addr, bvci,
727 msg, sizeof(msg));
728}
729
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200730static void send_llc_ul_ui(
731 struct gprs_ns_inst *nsi, const char *text,
732 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
733 struct gprs_ra_id *raid, uint16_t cell_id,
734 unsigned sapi, unsigned nu,
735 const uint8_t *msg, size_t msg_size)
736{
737 unsigned char llc_msg[4096] = {
738 0x00, 0xc0, 0x01
739 };
740
741 size_t llc_msg_size = 3 + msg_size + 3;
742 uint8_t e_bit = 0;
743 uint8_t pm_bit = 1;
744 unsigned fcs;
745
746 nu &= 0x01ff;
747
748 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
749
750 llc_msg[0] = (sapi & 0x0f);
751 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
752 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
753
754 memcpy(llc_msg + 3, msg, msg_size);
755
756 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
757 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
758 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
759 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
760
761 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
762 src_addr, nsbvci, tlli, raid, cell_id,
763 llc_msg, llc_msg_size);
764}
765
766static void send_llc_dl_ui(
767 struct gprs_ns_inst *nsi, const char *text,
768 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
769 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
770 unsigned sapi, unsigned nu,
771 const uint8_t *msg, size_t msg_size)
772{
773 /* GPRS Network Service, PDU type: NS_UNITDATA */
774 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
775 unsigned char llc_msg[4096] = {
776 0x00, 0x00, 0x01
777 };
778
779 size_t llc_msg_size = 3 + msg_size + 3;
780 uint8_t e_bit = 0;
781 uint8_t pm_bit = 1;
782 unsigned fcs;
783
784 nu &= 0x01ff;
785
786 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
787
788 llc_msg[0] = 0x40 | (sapi & 0x0f);
789 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
790 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
791
792 memcpy(llc_msg + 3, msg, msg_size);
793
794 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
795 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
796 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
797 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
798
799 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
800 src_addr, nsbvci, tlli,
801 with_racap_drx, imsi, imsi_size,
802 llc_msg, llc_msg_size);
803}
804
805
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200806static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
807 uint16_t nsvci, uint16_t nsei)
808{
809 printf("Setup NS-VC: remote 0x%08x:%d, "
810 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
811 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
812 nsvci, nsvci, nsei, nsei);
813
814 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
815 send_ns_alive(nsi, src_addr);
816 send_ns_unblock(nsi, src_addr);
817 send_ns_alive_ack(nsi, src_addr);
818}
819
820static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
821 uint16_t bvci)
822{
823 printf("Setup BSSGP: remote 0x%08x:%d, "
824 "BVCI 0x%04x(%d)\n\n",
825 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
826 bvci, bvci);
827
828 send_bssgp_reset(nsi, src_addr, bvci);
829}
830
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200831static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer,
832 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200833{
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200834 gprs_ns_nsip_connect(nsi, sgsn_peer, sgsn_nsei, sgsn_nsei+1);
835 send_ns_reset_ack(nsi, sgsn_peer, sgsn_nsei+1, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200836 send_ns_alive_ack(nsi, sgsn_peer);
837 send_ns_unblock_ack(nsi, sgsn_peer);
838 send_ns_alive(nsi, sgsn_peer);
839}
840
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200841static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
842{
843 sgsn_peer->sin_family = AF_INET;
844 sgsn_peer->sin_port = htons(32000);
845 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
846}
847
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200848static void configure_sgsn2_peer(struct sockaddr_in *sgsn_peer)
849{
850 sgsn_peer->sin_family = AF_INET;
851 sgsn_peer->sin_port = htons(32001);
852 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN2_ADDR);
853}
854
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200855static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
856{
857 size_t i;
858
859 for (i = 0; i < size; ++i) {
860 bss_peers[i].sin_family = AF_INET;
861 bss_peers[i].sin_port = htons((i + 1) * 1111);
862 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
863 }
864}
865
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200866int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
867 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
868
869/* override */
870int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
871 struct msgb *msg, uint16_t bvci)
872{
873 printf("CALLBACK, event %d, msg length %d, bvci 0x%04x\n%s\n\n",
874 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200875 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200876
877 switch (event) {
878 case GPRS_NS_EVT_UNIT_DATA:
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +0200879 return gbprox_rcvmsg(&gbcfg, msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200880 default:
881 break;
882 }
883 return 0;
884}
885
886/* override */
887ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
888 const struct sockaddr *dest_addr, socklen_t addrlen)
889{
890 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
891 const struct sockaddr *, socklen_t);
892 static sendto_t real_sendto = NULL;
893 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200894 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200895
896 if (!real_sendto)
897 real_sendto = dlsym(RTLD_NEXT, "sendto");
898
899 if (dest_host == REMOTE_BSS_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200900 printf("MESSAGE to BSS at 0x%08x:%d, msg length %d\n%s\n\n",
901 dest_host, dest_port,
902 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200903 else if (dest_host == REMOTE_SGSN_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200904 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %d\n%s\n\n",
905 dest_host, dest_port,
906 len, osmo_hexdump(buf, len));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200907 else if (dest_host == REMOTE_SGSN2_ADDR)
908 printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %d\n%s\n\n",
909 dest_host, dest_port,
910 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200911 else
912 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
913
914 return len;
915}
916
917/* override */
918int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
919{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200920 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
921 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200922 uint16_t bvci = msgb_bvci(msg);
923 uint16_t nsei = msgb_nsei(msg);
924
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200925 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200926
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200927 if (!real_gprs_ns_sendmsg)
928 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
929
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200930 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200931 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
932 "msg length %d (%s)\n",
933 bvci, len, __func__);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200934 else if (nsei == SGSN2_NSEI)
935 printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
936 "msg length %d (%s)\n",
937 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200938 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200939 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
940 "msg length %d (%s)\n",
941 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200942
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200943 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200944}
945
946static void dump_rate_ctr_group(FILE *stream, const char *prefix,
947 struct rate_ctr_group *ctrg)
948{
949 unsigned int i;
950
951 for (i = 0; i < ctrg->desc->num_ctr; i++) {
952 struct rate_ctr *ctr = &ctrg->ctr[i];
953 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
954 fprintf(stream, " %s%s: %llu%s",
955 prefix, ctrg->desc->ctr_desc[i].description,
956 (long long)ctr->current,
957 "\n");
958 };
959}
960
961/* Signal handler for signals from NS layer */
962static int test_signal(unsigned int subsys, unsigned int signal,
963 void *handler_data, void *signal_data)
964{
965 struct ns_signal_data *nssd = signal_data;
966 int rc;
967
968 if (subsys != SS_L_NS)
969 return 0;
970
971 switch (signal) {
972 case S_NS_RESET:
973 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
974 nssd->nsvc->nsvci,
975 gprs_ns_ll_str(nssd->nsvc));
976 break;
977
978 case S_NS_ALIVE_EXP:
979 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
980 nssd->nsvc->nsvci,
981 gprs_ns_ll_str(nssd->nsvc));
982 break;
983
984 case S_NS_BLOCK:
985 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
986 nssd->nsvc->nsvci,
987 gprs_ns_ll_str(nssd->nsvc));
988 break;
989
990 case S_NS_UNBLOCK:
991 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
992 nssd->nsvc->nsvci,
993 gprs_ns_ll_str(nssd->nsvc));
994 break;
995
996 case S_NS_REPLACED:
997 printf("==> got signal NS_REPLACED: 0x%04x/%s",
998 nssd->nsvc->nsvci,
999 gprs_ns_ll_str(nssd->nsvc));
1000 printf(" -> 0x%04x/%s\n",
1001 nssd->old_nsvc->nsvci,
1002 gprs_ns_ll_str(nssd->old_nsvc));
1003 break;
1004
1005 default:
1006 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
1007 nssd->nsvc->nsvci,
1008 gprs_ns_ll_str(nssd->nsvc));
1009 break;
1010 }
1011 printf("\n");
1012 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
1013 return rc;
1014}
1015
1016static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
1017{
1018 struct msgb *msg;
1019 int ret;
1020 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
1021 fprintf(stderr, "message too long: %d\n", data_len);
1022 return -1;
1023 }
1024
1025 msg = gprs_ns_msgb_alloc();
1026 memmove(msg->data, data, data_len);
1027 msg->l2h = msg->data;
1028 msgb_put(msg, data_len);
1029
1030 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
1031 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1032 osmo_hexdump(data, data_len));
1033
1034 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
1035
1036 printf("result (%s) = %d\n\n", text, ret);
1037
1038 msgb_free(msg);
1039
1040 return ret;
1041}
1042
1043static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
1044{
1045 struct gprs_nsvc *nsvc;
1046
1047 printf("Current NS-VCIs:\n");
1048 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
1049 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001050 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001051 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001052 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1053 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
1054 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001055 );
1056 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
1057 }
1058 printf("\n");
1059}
1060
1061static void test_gbproxy()
1062{
1063 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1064 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001065 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001066
1067 bssgp_nsi = nsi;
1068 gbcfg.nsi = bssgp_nsi;
1069 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1070
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001071 configure_sgsn_peer(&sgsn_peer);
1072 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001073
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001074 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001075 printf("--- Initialise SGSN ---\n\n");
1076
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001077 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001078 gprs_dump_nsi(nsi);
1079
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001080 printf("--- Initialise BSS 1 ---\n\n");
1081
1082 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1083 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1084 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001085 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001086
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001087 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1088
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001089 printf("--- Initialise BSS 2 ---\n\n");
1090
1091 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
1092 setup_bssgp(nsi, &bss_peer[1], 0x2002);
1093 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001094 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001095
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001096 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
1097
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001098 printf("--- Move BSS 1 to new port ---\n\n");
1099
1100 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
1101 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001102 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001103
1104 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1105
1106 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1107 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001108 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001109
1110 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
1111
1112 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1113 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001114 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001115
1116 printf("--- Move BSS 2 to new port ---\n\n");
1117
1118 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
1119 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001120 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001121
1122 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1123
1124 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
1125 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001126 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001127
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001128 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
1129
1130 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1131 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001132 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001133
1134 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1135
1136 setup_bssgp(nsi, &bss_peer[0], 0x1012);
1137 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001138 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001139
1140 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
1141
1142 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1143
1144 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1145 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001146 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001147
1148 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1149
1150 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1151
1152 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1153 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001154 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001155
1156 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1157
1158 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1159
1160 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1161
1162 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1163
1164 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1165
1166 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1167
1168 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1169
1170 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1171
1172 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1173
1174 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1175
1176 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
1177
1178 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1179
1180 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
1181
1182 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1183
1184 setup_bssgp(nsi, &bss_peer[2], 0x1002);
1185 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001186 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001187
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001188 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001189
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001190 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1191
1192 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1193
1194 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1195
1196 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1197
1198 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1199
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001200 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1201
1202 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
1203
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001204 /* Find peer */
1205 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1206 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1207 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1208 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1209 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1210 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1211
1212
1213 /* Cleanup */
1214 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1215 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1216 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1217 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1218 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1219
1220 dump_peers(stdout, 0, 0, &gbcfg);
1221
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001222 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001223
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001224 gbprox_reset(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001225 gprs_ns_destroy(nsi);
1226 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001227}
1228
1229static void test_gbproxy_ident_changes()
1230{
1231 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1232 struct sockaddr_in bss_peer[1] = {{0},};
1233 struct sockaddr_in sgsn_peer= {0};
1234 uint16_t nsei[2] = {0x1000, 0x2000};
1235 uint16_t nsvci[2] = {0x1001, 0x2001};
1236 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
1237
1238 bssgp_nsi = nsi;
1239 gbcfg.nsi = bssgp_nsi;
1240 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1241
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001242 configure_sgsn_peer(&sgsn_peer);
1243 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001244
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001245 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001246 printf("--- Initialise SGSN ---\n\n");
1247
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001248 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001249 gprs_dump_nsi(nsi);
1250
1251 printf("--- Initialise BSS 1 ---\n\n");
1252
1253 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
1254 gprs_dump_nsi(nsi);
1255
1256 printf("--- Setup BVCI 1 ---\n\n");
1257
1258 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1259 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001260 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001261
1262 printf("--- Setup BVCI 2 ---\n\n");
1263
1264 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
1265 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001266 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001267
1268 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1269
1270 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1271 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1272
1273 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1274
1275 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
1276 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
1277
1278 printf("--- Change NSEI ---\n\n");
1279
1280 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
1281 gprs_dump_nsi(nsi);
1282
1283 printf("--- Setup BVCI 1 ---\n\n");
1284
1285 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1286 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001287 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001288
1289 printf("--- Setup BVCI 3 ---\n\n");
1290
1291 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
1292 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001293 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001294
1295 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1296
1297 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1298 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1299
1300 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1301 " (should fail) ---\n\n");
1302
1303 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001304 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001305 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001306 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001307
1308 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1309
1310 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1311 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1312
1313 printf("--- Change NSVCI ---\n\n");
1314
1315 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
1316 gprs_dump_nsi(nsi);
1317
1318 printf("--- Setup BVCI 1 ---\n\n");
1319
1320 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1321 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001322 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001323
1324 printf("--- Setup BVCI 4 ---\n\n");
1325
1326 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
1327 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001328 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001329
1330 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1331
1332 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1333 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1334
1335 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1336 " (should fail) ---\n\n");
1337
1338 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001339 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001340 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001341 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001342
1343 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1344
1345 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1346 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1347
1348 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
1349
1350 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
1351 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
1352
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001353 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001354 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001355
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001356 gbprox_reset(&gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001357 gprs_ns_destroy(nsi);
1358 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001359}
1360
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001361static void test_gbproxy_ra_patching()
1362{
1363 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1364 struct sockaddr_in bss_peer[1] = {{0},};
1365 struct sockaddr_in sgsn_peer= {0};
1366 struct gprs_ra_id rai_bss =
1367 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1368 struct gprs_ra_id rai_sgsn =
1369 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1370 struct gprs_ra_id rai_unknown =
1371 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001372 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001373 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001374 const uint32_t ptmsi = 0xefe2b700;
1375 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001376 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001377 const uint32_t foreign_tlli2 = 0xbb00beef;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001378 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001379 struct gbproxy_tlli_info *tlli_info;
1380 struct gbproxy_peer *peer;
1381
1382 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001383
1384 bssgp_nsi = nsi;
1385 gbcfg.nsi = bssgp_nsi;
1386 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Jacob Erlbeck67a44452014-05-19 10:14:58 +02001387 gbcfg.core_mcc = 123;
1388 gbcfg.core_mnc = 456;
Jacob Erlbeck73685282014-05-23 20:48:07 +02001389 gbcfg.core_apn = talloc_zero_size(NULL, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001390 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001391 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001392
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001393 configure_sgsn_peer(&sgsn_peer);
1394 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001395
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001396 gbcfg.match_re = talloc_strdup(NULL, "^9898|^121314");
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001397 if (gbproxy_set_patch_filter(&gbcfg, gbcfg.match_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001398 fprintf(stderr, "Failed to compile RE '%s': %s\n",
1399 gbcfg.match_re, err_msg);
1400 exit(1);
1401 }
1402
1403
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001404 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001405 printf("--- Initialise SGSN ---\n\n");
1406
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001407 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001408 gprs_dump_nsi(nsi);
1409
1410 printf("--- Initialise BSS 1 ---\n\n");
1411
1412 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1413 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1414 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001415 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001416
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001417 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001418 OSMO_ASSERT(peer != NULL);
1419
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001420 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1421
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001422 send_bssgp_suspend(nsi, &bss_peer[0], 0xccd1758b, &rai_bss);
1423 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001424
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001425 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001426 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001427
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001428 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1429 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1430
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001431 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1432
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001433 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1434 foreign_tlli, &rai_bss, cell_id,
1435 GPRS_SAPI_GMM, 0,
1436 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001437
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001438 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1439
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001440 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1441 foreign_tlli, 0, NULL, 0,
1442 GPRS_SAPI_GMM, 0,
1443 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001444
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001445 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1446 foreign_tlli, &rai_bss, cell_id,
1447 GPRS_SAPI_GMM, 3,
1448 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001449
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001450 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1451 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1452
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001453 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1454 foreign_tlli, 1, imsi, sizeof(imsi),
1455 GPRS_SAPI_GMM, 1,
1456 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001457
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001458 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1459
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001460 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1461 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1462 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1463
1464 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1465 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1466 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1467
1468 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1469 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1470 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1471
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001472 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001473 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001474 OSMO_ASSERT(tlli_info->tlli.assigned == local_tlli);
1475 OSMO_ASSERT(tlli_info->tlli.current != local_tlli);
1476 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
1477 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1478 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_tlli);
1479 OSMO_ASSERT(tlli_info->sgsn_tlli.current != local_tlli);
1480 OSMO_ASSERT(!tlli_info->sgsn_tlli.bss_validated);
1481 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001482
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001483 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1484 local_tlli, &rai_bss, cell_id,
1485 GPRS_SAPI_GMM, 4,
1486 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001487
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001488 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1489
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001490 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001491 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001492 OSMO_ASSERT(tlli_info->tlli.assigned == local_tlli);
1493 OSMO_ASSERT(tlli_info->tlli.current != local_tlli);
1494 OSMO_ASSERT(tlli_info->tlli.bss_validated);
1495 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1496 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_tlli);
1497 OSMO_ASSERT(tlli_info->sgsn_tlli.current != local_tlli);
1498 OSMO_ASSERT(tlli_info->sgsn_tlli.bss_validated);
1499 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001500
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001501 /* Replace APN (1) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001502 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1503 local_tlli, &rai_bss, cell_id,
1504 GPRS_SAPI_GMM, 3,
1505 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001506
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001507 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1508
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001509 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001510 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001511 OSMO_ASSERT(tlli_info->tlli.assigned == local_tlli);
1512 OSMO_ASSERT(tlli_info->tlli.current != local_tlli);
1513 OSMO_ASSERT(tlli_info->tlli.bss_validated);
1514 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1515 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_tlli);
1516 OSMO_ASSERT(tlli_info->sgsn_tlli.current != local_tlli);
1517 OSMO_ASSERT(tlli_info->sgsn_tlli.bss_validated);
1518 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001519
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001520 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1521 local_tlli, 1, imsi, sizeof(imsi),
1522 GPRS_SAPI_GMM, 2,
1523 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001524
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001525 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1526
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001527 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001528 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001529 OSMO_ASSERT(tlli_info->tlli.assigned == 0);
1530 OSMO_ASSERT(tlli_info->tlli.current == local_tlli);
1531 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == 0);
1532 OSMO_ASSERT(tlli_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001533
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001534 /* Replace APN (2) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001535 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1536 local_tlli, &rai_bss, cell_id,
1537 GPRS_SAPI_GMM, 3,
1538 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001539
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001540 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1541
Jacob Erlbeck73685282014-05-23 20:48:07 +02001542 gbcfg.core_apn[0] = 0;
1543 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001544
1545 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001546 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1547 local_tlli, &rai_bss, cell_id,
1548 GPRS_SAPI_GMM, 3,
1549 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001550
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001551 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1552
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001553 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001554
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001555 /* Detach */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001556 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1557 local_tlli, &rai_bss, cell_id,
1558 GPRS_SAPI_GMM, 6,
1559 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001560
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001561 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1562 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1563
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001564 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1565 local_tlli, 1, imsi, sizeof(imsi),
1566 GPRS_SAPI_GMM, 5,
1567 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001568
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001569 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001570
1571 printf("--- RA update ---\n\n");
1572
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001573 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
1574 foreign_tlli, &rai_bss, 0x7080,
1575 GPRS_SAPI_GMM, 5,
1576 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001577
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001578 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1579
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001580 send_llc_dl_ui(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
1581 foreign_tlli, 1, imsi, sizeof(imsi),
1582 GPRS_SAPI_GMM, 6,
1583 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001584
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001585 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1586
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001587 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001588 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1589 local_tlli, &rai_bss, cell_id,
1590 GPRS_SAPI_GMM, 3,
1591 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001592
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001593 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1594
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001595 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001596
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001597 /* Detach (power off -> no Detach Accept) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001598 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", &bss_peer[0], 0x1002,
1599 local_tlli, &rai_bss, cell_id,
1600 GPRS_SAPI_GMM, 6,
1601 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001602
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001603 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1604
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001605 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001606 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001607
1608 printf("--- Bad cases ---\n\n");
1609
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001610 /* The RAI in the Attach Request message differs from the RAI in the
1611 * BSSGP message, only patch the latter */
1612
1613 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", &bss_peer[0], 0x1002,
1614 foreign_tlli2, &rai_bss, cell_id,
1615 GPRS_SAPI_GMM, 0,
1616 dtap_attach_req2, sizeof(dtap_attach_req2));
1617
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001618 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1619
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001620 printf("TLLI is already detached, shouldn't patch\n");
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001621 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", &bss_peer[0], 0x1002,
1622 local_tlli, &rai_bss, cell_id,
1623 GPRS_SAPI_GMM, 3,
1624 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001625
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001626 printf("Invalid RAI, shouldn't patch\n");
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001627 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001628
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001629 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001630 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001631
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001632 gbprox_reset(&gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001633 gprs_ns_destroy(nsi);
1634 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001635}
1636
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001637static void test_gbproxy_ptmsi_assignment()
1638{
1639 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1640 struct sockaddr_in bss_peer[1] = {{0},};
1641 struct sockaddr_in sgsn_peer= {0};
1642 struct gprs_ra_id rai_bss =
1643 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1644 struct gprs_ra_id rai_unknown =
1645 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1646 uint16_t cell_id = 0x1234;
1647
1648 const uint32_t ptmsi = 0xefe2b700;
1649 const uint32_t local_tlli = 0xefe2b700;
1650
1651 const uint32_t foreign_tlli1 = 0x8000dead;
1652 const uint32_t foreign_tlli2 = 0x8000beef;
1653
1654 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
1655 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
1656
1657 struct gbproxy_tlli_info *tlli_info, *tlli_info2;
1658 struct gbproxy_peer *peer;
1659 unsigned bss_nu = 0;
1660 unsigned sgsn_nu = 0;
1661
1662 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
1663
1664 bssgp_nsi = nsi;
1665 gbcfg.nsi = bssgp_nsi;
1666 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1667 gbcfg.core_mcc = 0;
1668 gbcfg.core_mnc = 0;
1669 gbcfg.core_apn = talloc_zero_size(NULL, 100);
1670 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1671 gbcfg.patch_ptmsi = 0;
1672 gbcfg.bss_ptmsi_state = 0;
1673 gbcfg.sgsn_tlli_state = 1;
1674
1675 configure_sgsn_peer(&sgsn_peer);
1676 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
1677
1678 printf("=== %s ===\n", __func__);
1679 printf("--- Initialise SGSN ---\n\n");
1680
1681 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
1682
1683 printf("--- Initialise BSS 1 ---\n\n");
1684
1685 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1686 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1687
1688 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
1689 OSMO_ASSERT(peer != NULL);
1690
1691 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1692
1693 gprs_dump_nsi(nsi);
1694 dump_global(stdout, 0);
1695 dump_peers(stdout, 0, 0, &gbcfg);
1696
1697 printf("--- Establish first LLC connection ---\n\n");
1698
1699 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1700 foreign_tlli1, &rai_unknown, cell_id,
1701 GPRS_SAPI_GMM, bss_nu++,
1702 dtap_attach_req, sizeof(dtap_attach_req));
1703
1704 dump_peers(stdout, 0, 0, &gbcfg);
1705
1706 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1707 foreign_tlli1, 0, NULL, 0,
1708 GPRS_SAPI_GMM, sgsn_nu++,
1709 dtap_identity_req, sizeof(dtap_identity_req));
1710
1711 dump_peers(stdout, 0, 0, &gbcfg);
1712
1713 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1714 foreign_tlli1, &rai_bss, cell_id,
1715 GPRS_SAPI_GMM, bss_nu++,
1716 dtap_identity_resp, sizeof(dtap_identity_resp));
1717
1718 dump_peers(stdout, 0, 0, &gbcfg);
1719
1720 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1721 foreign_tlli1, 1, imsi1, sizeof(imsi1),
1722 GPRS_SAPI_GMM, sgsn_nu++,
1723 dtap_attach_acc, sizeof(dtap_attach_acc));
1724
1725 dump_peers(stdout, 0, 0, &gbcfg);
1726
1727 tlli_info = gbproxy_find_tlli(peer, foreign_tlli1);
1728 tlli_info2 = gbproxy_find_tlli(peer, local_tlli);
1729 OSMO_ASSERT(tlli_info);
1730 OSMO_ASSERT(tlli_info == tlli_info2);
1731 OSMO_ASSERT(tlli_info->tlli.assigned == local_tlli);
1732 OSMO_ASSERT(tlli_info->tlli.current == foreign_tlli1);
1733 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
1734 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1735 OSMO_ASSERT(tlli_info->tlli.ptmsi == ptmsi);
1736
1737 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1738 local_tlli, &rai_bss, cell_id,
1739 GPRS_SAPI_GMM, bss_nu++,
1740 dtap_attach_complete, sizeof(dtap_attach_complete));
1741
1742 dump_peers(stdout, 0, 0, &gbcfg);
1743
1744 tlli_info = gbproxy_find_tlli(peer, local_tlli);
1745 OSMO_ASSERT(tlli_info);
1746 OSMO_ASSERT(tlli_info->tlli.assigned == local_tlli);
1747 OSMO_ASSERT(tlli_info->tlli.current == foreign_tlli1);
1748 OSMO_ASSERT(tlli_info->tlli.bss_validated);
1749 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1750 OSMO_ASSERT(tlli_info->tlli.ptmsi == ptmsi);
1751
1752
1753 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1754 local_tlli, 1, imsi1, sizeof(imsi1),
1755 GPRS_SAPI_GMM, sgsn_nu++,
1756 dtap_gmm_information, sizeof(dtap_gmm_information));
1757
1758 dump_peers(stdout, 0, 0, &gbcfg);
1759
1760 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
1761 OSMO_ASSERT(tlli_info);
1762 OSMO_ASSERT(tlli_info->tlli.ptmsi == ptmsi);
1763 OSMO_ASSERT(!gbproxy_find_tlli_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
1764
1765 tlli_info2 = gbproxy_find_tlli(peer, local_tlli);
1766 OSMO_ASSERT(tlli_info == tlli_info2);
1767 OSMO_ASSERT(tlli_info->tlli.assigned == 0);
1768 OSMO_ASSERT(tlli_info->tlli.current == local_tlli);
1769 OSMO_ASSERT(tlli_info->tlli.ptmsi == ptmsi);
1770
1771 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
1772
1773 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1774 foreign_tlli2, &rai_unknown, cell_id,
1775 GPRS_SAPI_GMM, bss_nu++,
1776 dtap_attach_req, sizeof(dtap_attach_req));
1777
1778 dump_peers(stdout, 0, 0, &gbcfg);
1779
1780 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1781 foreign_tlli2, 0, NULL, 0,
1782 GPRS_SAPI_GMM, sgsn_nu++,
1783 dtap_identity_req, sizeof(dtap_identity_req));
1784
1785 dump_peers(stdout, 0, 0, &gbcfg);
1786
1787 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1788 foreign_tlli2, &rai_bss, cell_id,
1789 GPRS_SAPI_GMM, bss_nu++,
1790 dtap_identity2_resp, sizeof(dtap_identity2_resp));
1791
1792 dump_peers(stdout, 0, 0, &gbcfg);
1793
1794 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1795 foreign_tlli2, 1, imsi2, sizeof(imsi2),
1796 GPRS_SAPI_GMM, sgsn_nu++,
1797 dtap_attach_acc, sizeof(dtap_attach_acc));
1798
1799 dump_peers(stdout, 0, 0, &gbcfg);
1800
1801 tlli_info = gbproxy_find_tlli(peer, foreign_tlli2);
1802 tlli_info2 = gbproxy_find_tlli(peer, local_tlli);
1803 OSMO_ASSERT(tlli_info);
1804 OSMO_ASSERT(tlli_info == tlli_info2);
1805 OSMO_ASSERT(tlli_info->tlli.assigned == local_tlli);
1806 OSMO_ASSERT(tlli_info->tlli.current == foreign_tlli2);
1807 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
1808 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1809 OSMO_ASSERT(tlli_info->tlli.ptmsi == ptmsi);
1810
1811 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1812 local_tlli, &rai_bss, cell_id,
1813 GPRS_SAPI_GMM, bss_nu++,
1814 dtap_attach_complete, sizeof(dtap_attach_complete));
1815
1816 dump_peers(stdout, 0, 0, &gbcfg);
1817
1818 tlli_info = gbproxy_find_tlli(peer, local_tlli);
1819 OSMO_ASSERT(tlli_info);
1820 OSMO_ASSERT(tlli_info->tlli.assigned == local_tlli);
1821 OSMO_ASSERT(tlli_info->tlli.current == foreign_tlli2);
1822 OSMO_ASSERT(tlli_info->tlli.bss_validated);
1823 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1824 OSMO_ASSERT(tlli_info->tlli.ptmsi == ptmsi);
1825
1826 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1827 local_tlli, 1, imsi2, sizeof(imsi2),
1828 GPRS_SAPI_GMM, sgsn_nu++,
1829 dtap_gmm_information, sizeof(dtap_gmm_information));
1830
1831 dump_peers(stdout, 0, 0, &gbcfg);
1832
1833 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
1834 OSMO_ASSERT(tlli_info);
1835 OSMO_ASSERT(tlli_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck1a024422014-09-16 14:10:27 +02001836 OSMO_ASSERT(!gbproxy_find_tlli_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001837
1838 tlli_info2 = gbproxy_find_tlli(peer, local_tlli);
Jacob Erlbeck1a024422014-09-16 14:10:27 +02001839 OSMO_ASSERT(tlli_info == tlli_info2);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001840 OSMO_ASSERT(tlli_info->tlli.assigned == 0);
1841 OSMO_ASSERT(tlli_info->tlli.current == local_tlli);
1842 OSMO_ASSERT(tlli_info->tlli.ptmsi == ptmsi);
1843
1844 dump_global(stdout, 0);
1845
1846 gbprox_reset(&gbcfg);
1847 gprs_ns_destroy(nsi);
1848 nsi = NULL;
1849}
1850
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001851static void test_gbproxy_ptmsi_patching()
1852{
1853 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1854 struct sockaddr_in bss_peer[1] = {{0},};
1855 struct sockaddr_in sgsn_peer= {0};
1856 struct gprs_ra_id rai_bss =
1857 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1858 struct gprs_ra_id rai_sgsn =
1859 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001860 struct gprs_ra_id rai_wrong_mcc_sgsn =
1861 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001862 struct gprs_ra_id rai_unknown =
1863 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1864 uint16_t cell_id = 0x1234;
1865
1866 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001867 const uint32_t sgsn_ptmsi2 = 0xe0987654;
1868 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001869 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001870 const uint32_t local_sgsn_tlli2 = 0xe0987654;
1871 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001872 const uint32_t random_sgsn_tlli = 0x7c69fb81;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001873 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001874
1875 const uint32_t bss_ptmsi = 0xc00f7304;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001876 const uint32_t bss_ptmsi2 = 0xe656aa1f;
1877 const uint32_t bss_ptmsi3 = 0xead4775a;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001878 const uint32_t local_bss_tlli = 0xc00f7304;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001879 const uint32_t local_bss_tlli2 = 0xe656aa1f;
1880 const uint32_t local_bss_tlli3 = 0xead4775a;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001881 const uint32_t foreign_bss_tlli = 0x8000dead;
1882
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001883
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001884 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
1885 struct gbproxy_tlli_info *tlli_info;
1886 struct gbproxy_peer *peer;
1887 unsigned bss_nu = 0;
1888 unsigned sgsn_nu = 0;
1889
1890 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001891 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
1892 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
1893 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
1894 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
1895 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001896
1897 bssgp_nsi = nsi;
1898 gbcfg.nsi = bssgp_nsi;
1899 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1900 gbcfg.core_mcc = 123;
1901 gbcfg.core_mnc = 456;
1902 gbcfg.core_apn = talloc_zero_size(NULL, 100);
1903 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1904 gbcfg.patch_ptmsi = 1;
1905 gbcfg.bss_ptmsi_state = 0;
1906 gbcfg.sgsn_tlli_state = 1;
1907
1908 configure_sgsn_peer(&sgsn_peer);
1909 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
1910
1911 printf("=== %s ===\n", __func__);
1912 printf("--- Initialise SGSN ---\n\n");
1913
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001914 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001915
1916 printf("--- Initialise BSS 1 ---\n\n");
1917
1918 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1919 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1920
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001921 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001922 OSMO_ASSERT(peer != NULL);
1923
1924 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1925
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001926 gprs_dump_nsi(nsi);
1927 dump_global(stdout, 0);
1928 dump_peers(stdout, 0, 0, &gbcfg);
1929
1930 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1931
1932 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1933 foreign_bss_tlli, &rai_unknown, cell_id,
1934 GPRS_SAPI_GMM, bss_nu++,
1935 dtap_attach_req, sizeof(dtap_attach_req));
1936
1937 dump_peers(stdout, 0, 0, &gbcfg);
1938
1939 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1940 random_sgsn_tlli, 0, NULL, 0,
1941 GPRS_SAPI_GMM, sgsn_nu++,
1942 dtap_identity_req, sizeof(dtap_identity_req));
1943
1944 dump_peers(stdout, 0, 0, &gbcfg);
1945
1946 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1947 foreign_bss_tlli, &rai_bss, cell_id,
1948 GPRS_SAPI_GMM, bss_nu++,
1949 dtap_identity_resp, sizeof(dtap_identity_resp));
1950
1951 dump_peers(stdout, 0, 0, &gbcfg);
1952
1953 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1954 random_sgsn_tlli, 1, imsi, sizeof(imsi),
1955 GPRS_SAPI_GMM, sgsn_nu++,
1956 dtap_attach_acc, sizeof(dtap_attach_acc));
1957
1958 dump_peers(stdout, 0, 0, &gbcfg);
1959
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001960 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, random_sgsn_tlli);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001961 OSMO_ASSERT(tlli_info);
1962 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli);
1963 OSMO_ASSERT(tlli_info->tlli.current == foreign_bss_tlli);
1964 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
1965 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1966 OSMO_ASSERT(tlli_info->tlli.ptmsi == bss_ptmsi);
1967 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli);
1968 OSMO_ASSERT(tlli_info->sgsn_tlli.current == random_sgsn_tlli);
1969 OSMO_ASSERT(!tlli_info->sgsn_tlli.bss_validated);
1970 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
1971 OSMO_ASSERT(tlli_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
1972
1973 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1974 local_bss_tlli, &rai_bss, cell_id,
1975 GPRS_SAPI_GMM, bss_nu++,
1976 dtap_attach_complete, sizeof(dtap_attach_complete));
1977
1978 dump_peers(stdout, 0, 0, &gbcfg);
1979
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001980 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001981 OSMO_ASSERT(tlli_info);
1982 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli);
1983 OSMO_ASSERT(tlli_info->tlli.current == foreign_bss_tlli);
1984 OSMO_ASSERT(tlli_info->tlli.bss_validated);
1985 OSMO_ASSERT(!tlli_info->tlli.net_validated);
1986 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli);
1987 OSMO_ASSERT(tlli_info->sgsn_tlli.current == random_sgsn_tlli);
1988 OSMO_ASSERT(tlli_info->sgsn_tlli.bss_validated);
1989 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
1990
1991 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1992 local_sgsn_tlli, 1, imsi, sizeof(imsi),
1993 GPRS_SAPI_GMM, sgsn_nu++,
1994 dtap_gmm_information, sizeof(dtap_gmm_information));
1995
1996 dump_peers(stdout, 0, 0, &gbcfg);
1997
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001998 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001999 OSMO_ASSERT(tlli_info);
2000 OSMO_ASSERT(tlli_info->tlli.current == local_bss_tlli);
2001 OSMO_ASSERT(tlli_info->tlli.assigned == 0);
2002 OSMO_ASSERT(tlli_info->sgsn_tlli.current == local_sgsn_tlli);
2003 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == 0);
2004
Jacob Erlbeck82add782014-09-05 18:08:12 +02002005 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
2006 local_bss_tlli, &rai_bss, cell_id,
2007 GPRS_SAPI_GMM, bss_nu++,
2008 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2009
2010 dump_peers(stdout, 0, 0, &gbcfg);
2011
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002012 /* Non-DTAP */
2013 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2014 local_bss_tlli, &rai_bss, cell_id,
2015 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2016
2017 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2018 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2019 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2020
2021 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2022 local_bss_tlli, &rai_bss, cell_id,
2023 llc_ui_ll11_dns_query_ul,
2024 sizeof(llc_ui_ll11_dns_query_ul));
2025
2026 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2027 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2028 llc_ui_ll11_dns_resp_dl,
2029 sizeof(llc_ui_ll11_dns_resp_dl));
2030
2031 dump_peers(stdout, 0, 0, &gbcfg);
2032
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002033 /* Repeated RA Update Requests */
2034 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", &bss_peer[0], 0x1002,
2035 local_bss_tlli, &rai_bss, 0x7080,
2036 GPRS_SAPI_GMM, bss_nu++,
2037 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2038
2039 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", &sgsn_peer, 0x1002,
2040 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2041 GPRS_SAPI_GMM, sgsn_nu++,
2042 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2043
2044 dump_peers(stdout, 0, 0, &gbcfg);
2045
2046 OSMO_ASSERT(gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli2) != NULL);
2047 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli);
2048 OSMO_ASSERT(tlli_info);
2049 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli2);
2050 OSMO_ASSERT(tlli_info->tlli.current == local_bss_tlli);
2051 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
2052 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2053 OSMO_ASSERT(tlli_info->tlli.ptmsi == bss_ptmsi2);
2054 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2055 OSMO_ASSERT(tlli_info->sgsn_tlli.current == local_sgsn_tlli);
2056 OSMO_ASSERT(!tlli_info->sgsn_tlli.bss_validated);
2057 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2058 OSMO_ASSERT(tlli_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
2059
2060 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", &bss_peer[0], 0x1002,
2061 local_bss_tlli2, &rai_bss, 0x7080,
2062 GPRS_SAPI_GMM, bss_nu++,
2063 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2064
2065 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", &sgsn_peer, 0x1002,
2066 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2067 GPRS_SAPI_GMM, sgsn_nu++,
2068 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2069
2070 dump_peers(stdout, 0, 0, &gbcfg);
2071
2072 OSMO_ASSERT(gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli2) == NULL);
2073 OSMO_ASSERT(gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli3) != NULL);
2074 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli);
2075 OSMO_ASSERT(tlli_info);
2076 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli3);
2077 OSMO_ASSERT(tlli_info->tlli.current == local_bss_tlli);
2078 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
2079 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2080 OSMO_ASSERT(tlli_info->tlli.ptmsi == bss_ptmsi3);
2081 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2082 OSMO_ASSERT(tlli_info->sgsn_tlli.current == local_sgsn_tlli);
2083 OSMO_ASSERT(!tlli_info->sgsn_tlli.bss_validated);
2084 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2085 OSMO_ASSERT(tlli_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
2086
2087 send_llc_ul_ui(nsi, "RA UPD COMPLETE", &bss_peer[0], 0x1002,
2088 local_bss_tlli3, &rai_bss, 0x7080,
2089 GPRS_SAPI_GMM, bss_nu++,
2090 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2091
2092 tlli_info = gbproxy_find_tlli(peer, local_bss_tlli3);
2093
2094 OSMO_ASSERT(tlli_info);
2095 OSMO_ASSERT(tlli_info->tlli.bss_validated);
2096 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2097 OSMO_ASSERT(tlli_info->sgsn_tlli.bss_validated);
2098 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2099
2100 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2101 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2102 GPRS_SAPI_GMM, sgsn_nu++,
2103 dtap_gmm_information, sizeof(dtap_gmm_information));
2104
2105 dump_peers(stdout, 0, 0, &gbcfg);
2106
2107 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli3);
2108 OSMO_ASSERT(tlli_info);
2109 OSMO_ASSERT(tlli_info->tlli.current == local_bss_tlli3);
2110 OSMO_ASSERT(tlli_info->tlli.assigned == 0);
2111 OSMO_ASSERT(tlli_info->sgsn_tlli.current == local_sgsn_tlli3);
2112 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == 0);
2113
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002114 /* Other messages */
2115 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002116 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002117
2118 dump_peers(stdout, 0, 0, &gbcfg);
2119
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002120 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002121
2122 dump_peers(stdout, 0, 0, &gbcfg);
2123
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002124 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002125
2126 dump_peers(stdout, 0, 0, &gbcfg);
2127
2128 /* Bad case: Invalid BVCI */
2129 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002130 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002131 dump_global(stdout, 0);
2132
2133 /* Bad case: Invalid RAI */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002134 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002135
2136 dump_global(stdout, 0);
2137
2138 /* Bad case: Invalid MCC (LAC ok) */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002139 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002140 &rai_wrong_mcc_sgsn);
2141
2142 dump_global(stdout, 0);
2143
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002144 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
2145 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2146 unknown_sgsn_tlli, 1, NULL, 0,
2147 GPRS_SAPI_GMM, 2,
2148 dtap_gmm_information, sizeof(dtap_gmm_information));
2149
2150 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
2151 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2152 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2153 GPRS_SAPI_GMM, 3,
2154 dtap_gmm_information, sizeof(dtap_gmm_information));
2155
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002156 /* Detach */
2157 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002158 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002159 GPRS_SAPI_GMM, bss_nu++,
2160 dtap_detach_req, sizeof(dtap_detach_req));
2161
2162 dump_peers(stdout, 0, 0, &gbcfg);
2163
2164 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002165 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002166 GPRS_SAPI_GMM, sgsn_nu++,
2167 dtap_detach_acc, sizeof(dtap_detach_acc));
2168
2169 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002170
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002171 dump_global(stdout, 0);
2172
2173 gbprox_reset(&gbcfg);
2174 gprs_ns_destroy(nsi);
2175 nsi = NULL;
2176}
2177
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002178static void test_gbproxy_imsi_acquisition()
2179{
2180 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2181 struct sockaddr_in bss_peer[1] = {{0},};
2182 struct sockaddr_in sgsn_peer= {0};
2183 struct gprs_ra_id rai_bss =
2184 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2185 struct gprs_ra_id rai_sgsn =
2186 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2187 struct gprs_ra_id rai_wrong_mcc_sgsn =
2188 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2189 struct gprs_ra_id rai_unknown =
2190 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2191 uint16_t cell_id = 0x1234;
2192
2193 const uint32_t sgsn_ptmsi = 0xefe2b700;
2194 const uint32_t local_sgsn_tlli = 0xefe2b700;
2195 const uint32_t random_sgsn_tlli = 0x7c69fb81;
2196
2197 const uint32_t bss_ptmsi = 0xc00f7304;
2198 const uint32_t local_bss_tlli = 0xc00f7304;
2199 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002200 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002201
2202 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
2203 struct gbproxy_tlli_info *tlli_info;
2204 struct gbproxy_peer *peer;
2205 unsigned bss_nu = 0;
2206 unsigned sgsn_nu = 0;
2207
2208 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2209
2210 bssgp_nsi = nsi;
2211 gbcfg.nsi = bssgp_nsi;
2212 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2213 gbcfg.core_mcc = 123;
2214 gbcfg.core_mnc = 456;
2215 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2216 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2217 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002218 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002219 gbcfg.bss_ptmsi_state = 0;
2220 gbcfg.sgsn_tlli_state = 1;
2221
2222 configure_sgsn_peer(&sgsn_peer);
2223 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2224
2225 printf("=== %s ===\n", __func__);
2226 printf("--- Initialise SGSN ---\n\n");
2227
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002228 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002229
2230 printf("--- Initialise BSS 1 ---\n\n");
2231
2232 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2233 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2234
2235 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2236 OSMO_ASSERT(peer != NULL);
2237
2238 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2239
2240 gprs_dump_nsi(nsi);
2241 dump_global(stdout, 0);
2242 dump_peers(stdout, 0, 0, &gbcfg);
2243
2244 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2245
2246 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002247 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002248 GPRS_SAPI_GMM, bss_nu++,
2249 dtap_attach_req, sizeof(dtap_attach_req));
2250
2251 dump_peers(stdout, 0, 0, &gbcfg);
2252
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002253 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2254 foreign_bss_tlli, &rai_bss, cell_id,
2255 GPRS_SAPI_GMM, bss_nu++,
2256 dtap_identity_resp, sizeof(dtap_identity_resp));
2257
2258 dump_peers(stdout, 0, 0, &gbcfg);
2259
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002260 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2261 random_sgsn_tlli, 0, NULL, 0,
2262 GPRS_SAPI_GMM, sgsn_nu++,
2263 dtap_identity_req, sizeof(dtap_identity_req));
2264
2265 dump_peers(stdout, 0, 0, &gbcfg);
2266
2267 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2268 foreign_bss_tlli, &rai_bss, cell_id,
2269 GPRS_SAPI_GMM, bss_nu++,
2270 dtap_identity_resp, sizeof(dtap_identity_resp));
2271
2272 dump_peers(stdout, 0, 0, &gbcfg);
2273
2274 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2275 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2276 GPRS_SAPI_GMM, sgsn_nu++,
2277 dtap_attach_acc, sizeof(dtap_attach_acc));
2278
2279 dump_peers(stdout, 0, 0, &gbcfg);
2280
2281 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, random_sgsn_tlli);
2282 OSMO_ASSERT(tlli_info);
2283 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli);
2284 OSMO_ASSERT(tlli_info->tlli.current == foreign_bss_tlli);
2285 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
2286 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2287 OSMO_ASSERT(tlli_info->tlli.ptmsi == bss_ptmsi);
2288 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli);
2289 OSMO_ASSERT(tlli_info->sgsn_tlli.current == random_sgsn_tlli);
2290 OSMO_ASSERT(!tlli_info->sgsn_tlli.bss_validated);
2291 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2292 OSMO_ASSERT(tlli_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2293
2294 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2295 local_bss_tlli, &rai_bss, cell_id,
2296 GPRS_SAPI_GMM, bss_nu++,
2297 dtap_attach_complete, sizeof(dtap_attach_complete));
2298
2299 dump_peers(stdout, 0, 0, &gbcfg);
2300
2301 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli);
2302 OSMO_ASSERT(tlli_info);
2303 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli);
2304 OSMO_ASSERT(tlli_info->tlli.current == foreign_bss_tlli);
2305 OSMO_ASSERT(tlli_info->tlli.bss_validated);
2306 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2307 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli);
2308 OSMO_ASSERT(tlli_info->sgsn_tlli.current == random_sgsn_tlli);
2309 OSMO_ASSERT(tlli_info->sgsn_tlli.bss_validated);
2310 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2311
2312 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2313 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2314 GPRS_SAPI_GMM, sgsn_nu++,
2315 dtap_gmm_information, sizeof(dtap_gmm_information));
2316
2317 dump_peers(stdout, 0, 0, &gbcfg);
2318
2319 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli);
2320 OSMO_ASSERT(tlli_info);
2321 OSMO_ASSERT(tlli_info->tlli.current == local_bss_tlli);
2322 OSMO_ASSERT(tlli_info->tlli.assigned == 0);
2323 OSMO_ASSERT(tlli_info->sgsn_tlli.current == local_sgsn_tlli);
2324 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == 0);
2325
2326 /* Non-DTAP */
2327 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2328 local_bss_tlli, &rai_bss, cell_id,
2329 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2330
2331 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2332 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2333 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2334
2335 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2336 local_bss_tlli, &rai_bss, cell_id,
2337 llc_ui_ll11_dns_query_ul,
2338 sizeof(llc_ui_ll11_dns_query_ul));
2339
2340 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2341 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2342 llc_ui_ll11_dns_resp_dl,
2343 sizeof(llc_ui_ll11_dns_resp_dl));
2344
2345 dump_peers(stdout, 0, 0, &gbcfg);
2346
2347 /* Other messages */
2348 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2349 local_bss_tlli, 1, 12);
2350
2351 dump_peers(stdout, 0, 0, &gbcfg);
2352
2353 send_bssgp_llc_discarded(nsi, &sgsn_peer, 0x1002,
2354 local_sgsn_tlli, 1, 12);
2355
2356 dump_peers(stdout, 0, 0, &gbcfg);
2357
2358 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2359
2360 dump_peers(stdout, 0, 0, &gbcfg);
2361
2362 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_sgsn);
2363
2364 dump_peers(stdout, 0, 0, &gbcfg);
2365
2366 /* Bad case: Invalid BVCI */
2367 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
2368 local_bss_tlli, 1, 12);
2369 dump_global(stdout, 0);
2370
2371 /* Bad case: Invalid RAI */
2372 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_unknown);
2373
2374 dump_global(stdout, 0);
2375
2376 /* Bad case: Invalid MCC (LAC ok) */
2377 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli,
2378 &rai_wrong_mcc_sgsn);
2379
2380 dump_global(stdout, 0);
2381
2382 /* Detach */
2383 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2384 local_bss_tlli, &rai_bss, cell_id,
2385 GPRS_SAPI_GMM, bss_nu++,
2386 dtap_detach_req, sizeof(dtap_detach_req));
2387
2388 dump_peers(stdout, 0, 0, &gbcfg);
2389
2390 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2391 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2392 GPRS_SAPI_GMM, sgsn_nu++,
2393 dtap_detach_acc, sizeof(dtap_detach_acc));
2394
2395 dump_peers(stdout, 0, 0, &gbcfg);
2396
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002397 /* Special case: Repeated Attach Requests */
2398
2399 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2400 foreign_bss_tlli, &rai_unknown, cell_id,
2401 GPRS_SAPI_GMM, bss_nu++,
2402 dtap_attach_req, sizeof(dtap_attach_req));
2403
2404 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2405 foreign_bss_tlli, &rai_unknown, cell_id,
2406 GPRS_SAPI_GMM, bss_nu++,
2407 dtap_attach_req, sizeof(dtap_attach_req));
2408
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002409 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2410 foreign_bss_tlli, &rai_bss, cell_id,
2411 GPRS_SAPI_GMM, bss_nu++,
2412 dtap_detach_req, sizeof(dtap_detach_req));
2413
2414 dump_peers(stdout, 0, 0, &gbcfg);
2415
2416 /* Special case: Detach from an unknown TLLI */
2417
2418 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", &bss_peer[0], 0x1002,
2419 other_bss_tlli, &rai_bss, cell_id,
2420 GPRS_SAPI_GMM, bss_nu++,
2421 dtap_detach_req, sizeof(dtap_detach_req));
2422
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002423 dump_peers(stdout, 0, 0, &gbcfg);
2424
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002425 dump_global(stdout, 0);
2426
2427 gbprox_reset(&gbcfg);
2428 gprs_ns_destroy(nsi);
2429 nsi = NULL;
2430}
2431
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002432static void test_gbproxy_secondary_sgsn()
2433{
2434 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2435 struct sockaddr_in bss_peer[1] = {{0},};
2436 struct sockaddr_in sgsn_peer[2]= {{0},};
2437 struct gprs_ra_id rai_bss =
2438 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2439 struct gprs_ra_id rai_sgsn =
2440 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2441 struct gprs_ra_id rai_unknown =
2442 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2443 uint16_t cell_id = 0x1234;
2444
2445 const uint32_t sgsn_ptmsi = 0xefe2b700;
2446 const uint32_t local_sgsn_tlli = 0xefe2b700;
2447 const uint32_t random_sgsn_tlli = 0x7c69fb81;
2448
2449 const uint32_t bss_ptmsi = 0xc00f7304;
2450 const uint32_t local_bss_tlli = 0xc00f7304;
2451 const uint32_t foreign_bss_tlli = 0x8000dead;
2452
2453 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2454 const uint32_t local_sgsn_tlli2 = 0xe0987654;
2455 const uint32_t random_sgsn_tlli2 = 0x7eb52dfb;
2456 const uint32_t bss_ptmsi2 = 0xe656aa1f;
2457 const uint32_t local_bss_tlli2 = 0xe656aa1f;
2458 const uint32_t foreign_bss_tlli2 = 0x8000beef;
2459
2460 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
2461 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
2462 struct gbproxy_tlli_info *tlli_info;
2463 struct gbproxy_peer *peer;
2464 unsigned bss_nu = 0;
2465 unsigned sgsn_nu = 0;
2466
2467 const char *err_msg = NULL;
2468 const char *filter_re = "999999";
2469
2470 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2471 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2472
2473 bssgp_nsi = nsi;
2474 gbcfg.nsi = bssgp_nsi;
2475 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2476 gbcfg.core_mcc = 123;
2477 gbcfg.core_mnc = 456;
2478 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2479 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2480 gbcfg.patch_ptmsi = 1;
2481 gbcfg.acquire_imsi = 1;
2482 gbcfg.bss_ptmsi_state = 0;
2483 gbcfg.sgsn_tlli_state = 1;
2484 gbcfg.route_to_sgsn2 = 1;
2485 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
2486
2487 if (gbproxy_set_patch_filter(&gbcfg, filter_re, &err_msg) != 0) {
2488 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
2489 err_msg);
2490 OSMO_ASSERT(err_msg == NULL);
2491 }
2492
2493 configure_sgsn_peer(&sgsn_peer[0]);
2494 configure_sgsn2_peer(&sgsn_peer[1]);
2495 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2496
2497 printf("=== %s ===\n", __func__);
2498 printf("--- Initialise SGSN 1 ---\n\n");
2499
2500 connect_sgsn(nsi, &sgsn_peer[0], SGSN_NSEI);
2501
2502 printf("--- Initialise SGSN 2 ---\n\n");
2503
2504 connect_sgsn(nsi, &sgsn_peer[1], SGSN2_NSEI);
2505
2506 printf("--- Initialise BSS 1 ---\n\n");
2507
2508 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2509 setup_bssgp(nsi, &bss_peer[0], 0x0);
2510 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x0);
2511 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2512 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x1002);
2513 send_bssgp_reset_ack(nsi, &sgsn_peer[1], 0x1002);
2514
2515 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2516 OSMO_ASSERT(peer != NULL);
2517
2518 gprs_dump_nsi(nsi);
2519 dump_global(stdout, 0);
2520 dump_peers(stdout, 0, 0, &gbcfg);
2521
2522 printf("--- Flow control ---\n\n");
2523
2524 send_bssgp_flow_control_bvc(nsi, &bss_peer[0], 0x1002, 1);
2525 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[0], 0x1002, 1);
2526 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[1], 0x1002, 1);
2527
2528 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
2529
2530 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2531 foreign_bss_tlli, &rai_unknown, cell_id,
2532 GPRS_SAPI_GMM, bss_nu++,
2533 dtap_attach_req, sizeof(dtap_attach_req));
2534
2535 dump_peers(stdout, 0, 0, &gbcfg);
2536
2537 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2538 foreign_bss_tlli, &rai_bss, cell_id,
2539 GPRS_SAPI_GMM, bss_nu++,
2540 dtap_identity_resp, sizeof(dtap_identity_resp));
2541
2542 dump_peers(stdout, 0, 0, &gbcfg);
2543
2544 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[0], 0x1002,
2545 random_sgsn_tlli, 0, NULL, 0,
2546 GPRS_SAPI_GMM, sgsn_nu++,
2547 dtap_identity_req, sizeof(dtap_identity_req));
2548
2549 dump_peers(stdout, 0, 0, &gbcfg);
2550
2551 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2552 foreign_bss_tlli, &rai_bss, cell_id,
2553 GPRS_SAPI_GMM, bss_nu++,
2554 dtap_identity_resp, sizeof(dtap_identity_resp));
2555
2556 dump_peers(stdout, 0, 0, &gbcfg);
2557
2558 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[0], 0x1002,
2559 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2560 GPRS_SAPI_GMM, sgsn_nu++,
2561 dtap_attach_acc, sizeof(dtap_attach_acc));
2562
2563 dump_peers(stdout, 0, 0, &gbcfg);
2564
2565 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, random_sgsn_tlli);
2566 OSMO_ASSERT(tlli_info);
2567 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli);
2568 OSMO_ASSERT(tlli_info->tlli.current == foreign_bss_tlli);
2569 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
2570 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2571 OSMO_ASSERT(tlli_info->tlli.ptmsi == bss_ptmsi);
2572 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli);
2573 OSMO_ASSERT(tlli_info->sgsn_tlli.current == random_sgsn_tlli);
2574 OSMO_ASSERT(!tlli_info->sgsn_tlli.bss_validated);
2575 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2576 OSMO_ASSERT(tlli_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2577
2578 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2579 local_bss_tlli, &rai_bss, cell_id,
2580 GPRS_SAPI_GMM, bss_nu++,
2581 dtap_attach_complete, sizeof(dtap_attach_complete));
2582
2583 dump_peers(stdout, 0, 0, &gbcfg);
2584
2585 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli);
2586 OSMO_ASSERT(tlli_info);
2587 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli);
2588 OSMO_ASSERT(tlli_info->tlli.current == foreign_bss_tlli);
2589 OSMO_ASSERT(tlli_info->tlli.bss_validated);
2590 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2591 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli);
2592 OSMO_ASSERT(tlli_info->sgsn_tlli.current == random_sgsn_tlli);
2593 OSMO_ASSERT(tlli_info->sgsn_tlli.bss_validated);
2594 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2595
2596 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[0], 0x1002,
2597 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2598 GPRS_SAPI_GMM, sgsn_nu++,
2599 dtap_gmm_information, sizeof(dtap_gmm_information));
2600
2601 dump_peers(stdout, 0, 0, &gbcfg);
2602
2603 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli);
2604 OSMO_ASSERT(tlli_info);
2605 OSMO_ASSERT(tlli_info->tlli.current == local_bss_tlli);
2606 OSMO_ASSERT(tlli_info->tlli.assigned == 0);
2607 OSMO_ASSERT(tlli_info->sgsn_tlli.current == local_sgsn_tlli);
2608 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == 0);
2609
2610 /* Non-DTAP */
2611 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2612 local_bss_tlli, &rai_bss, cell_id,
2613 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2614
2615 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[0], 0x1002,
2616 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2617 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2618
2619 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2620 local_bss_tlli, &rai_bss, cell_id,
2621 llc_ui_ll11_dns_query_ul,
2622 sizeof(llc_ui_ll11_dns_query_ul));
2623
2624 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[0], 0x1002,
2625 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2626 llc_ui_ll11_dns_resp_dl,
2627 sizeof(llc_ui_ll11_dns_resp_dl));
2628
2629 dump_peers(stdout, 0, 0, &gbcfg);
2630
2631 /* Other messages */
2632 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2633 local_bss_tlli, 1, 12);
2634
2635 dump_peers(stdout, 0, 0, &gbcfg);
2636
2637 send_bssgp_llc_discarded(nsi, &sgsn_peer[0], 0x1002,
2638 local_sgsn_tlli, 1, 12);
2639
2640 dump_peers(stdout, 0, 0, &gbcfg);
2641
2642 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2643
2644 dump_peers(stdout, 0, 0, &gbcfg);
2645
2646 send_bssgp_suspend_ack(nsi, &sgsn_peer[0], local_sgsn_tlli, &rai_sgsn);
2647
2648 dump_peers(stdout, 0, 0, &gbcfg);
2649
2650 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
2651
2652 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2653 foreign_bss_tlli2, &rai_unknown, cell_id,
2654 GPRS_SAPI_GMM, bss_nu++,
2655 dtap_attach_req, sizeof(dtap_attach_req));
2656
2657 dump_peers(stdout, 0, 0, &gbcfg);
2658
2659 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2660 foreign_bss_tlli2, &rai_bss, cell_id,
2661 GPRS_SAPI_GMM, bss_nu++,
2662 dtap_identity2_resp, sizeof(dtap_identity2_resp));
2663
2664 dump_peers(stdout, 0, 0, &gbcfg);
2665
2666 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
2667 random_sgsn_tlli2, 0, NULL, 0,
2668 GPRS_SAPI_GMM, sgsn_nu++,
2669 dtap_identity_req, sizeof(dtap_identity_req));
2670
2671 dump_peers(stdout, 0, 0, &gbcfg);
2672
2673 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2674 foreign_bss_tlli2, &rai_bss, cell_id,
2675 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02002676 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002677
2678 dump_peers(stdout, 0, 0, &gbcfg);
2679
2680 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[1], 0x1002,
2681 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2682 GPRS_SAPI_GMM, sgsn_nu++,
2683 dtap_attach_acc2, sizeof(dtap_attach_acc2));
2684
2685 dump_peers(stdout, 0, 0, &gbcfg);
2686
2687 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, random_sgsn_tlli2);
2688 OSMO_ASSERT(tlli_info);
2689 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli2);
2690 OSMO_ASSERT(tlli_info->tlli.current == foreign_bss_tlli2);
2691 OSMO_ASSERT(!tlli_info->tlli.bss_validated);
2692 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2693 OSMO_ASSERT(tlli_info->tlli.ptmsi == bss_ptmsi2);
2694 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2695 OSMO_ASSERT(tlli_info->sgsn_tlli.current == random_sgsn_tlli2);
2696 OSMO_ASSERT(!tlli_info->sgsn_tlli.bss_validated);
2697 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2698 OSMO_ASSERT(tlli_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
2699
2700 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2701 local_bss_tlli2, &rai_bss, cell_id,
2702 GPRS_SAPI_GMM, bss_nu++,
2703 dtap_attach_complete, sizeof(dtap_attach_complete));
2704
2705 dump_peers(stdout, 0, 0, &gbcfg);
2706
2707 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli2);
2708 OSMO_ASSERT(tlli_info);
2709 OSMO_ASSERT(tlli_info->tlli.assigned == local_bss_tlli2);
2710 OSMO_ASSERT(tlli_info->tlli.current == foreign_bss_tlli2);
2711 OSMO_ASSERT(tlli_info->tlli.bss_validated);
2712 OSMO_ASSERT(!tlli_info->tlli.net_validated);
2713 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2714 OSMO_ASSERT(tlli_info->sgsn_tlli.current == random_sgsn_tlli2);
2715 OSMO_ASSERT(tlli_info->sgsn_tlli.bss_validated);
2716 OSMO_ASSERT(!tlli_info->sgsn_tlli.net_validated);
2717
2718 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
2719 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2720 GPRS_SAPI_GMM, sgsn_nu++,
2721 dtap_gmm_information, sizeof(dtap_gmm_information));
2722
2723 dump_peers(stdout, 0, 0, &gbcfg);
2724
2725 tlli_info = gbproxy_find_tlli_by_sgsn_tlli(peer, local_sgsn_tlli2);
2726 OSMO_ASSERT(tlli_info);
2727 OSMO_ASSERT(tlli_info->tlli.current == local_bss_tlli2);
2728 OSMO_ASSERT(tlli_info->tlli.assigned == 0);
2729 OSMO_ASSERT(tlli_info->sgsn_tlli.current == local_sgsn_tlli2);
2730 OSMO_ASSERT(tlli_info->sgsn_tlli.assigned == 0);
2731
2732 /* Non-DTAP */
2733 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2734 local_bss_tlli2, &rai_bss, cell_id,
2735 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2736
2737 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[1], 0x1002,
2738 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2739 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2740
2741 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2742 local_bss_tlli2, &rai_bss, cell_id,
2743 llc_ui_ll11_dns_query_ul,
2744 sizeof(llc_ui_ll11_dns_query_ul));
2745
2746 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[1], 0x1002,
2747 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2748 llc_ui_ll11_dns_resp_dl,
2749 sizeof(llc_ui_ll11_dns_resp_dl));
2750
2751 dump_peers(stdout, 0, 0, &gbcfg);
2752
2753 /* Other messages */
2754 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2755 local_bss_tlli2, 1, 12);
2756
2757 dump_peers(stdout, 0, 0, &gbcfg);
2758
2759 send_bssgp_llc_discarded(nsi, &sgsn_peer[1], 0x1002,
2760 local_sgsn_tlli2, 1, 12);
2761
2762 dump_peers(stdout, 0, 0, &gbcfg);
2763
2764 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli2, &rai_bss);
2765
2766 dump_peers(stdout, 0, 0, &gbcfg);
2767
2768 send_bssgp_suspend_ack(nsi, &sgsn_peer[1], local_sgsn_tlli2, &rai_sgsn);
2769
2770 dump_peers(stdout, 0, 0, &gbcfg);
2771
2772 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
2773
2774 /* Detach */
2775 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2776 local_bss_tlli, &rai_bss, cell_id,
2777 GPRS_SAPI_GMM, bss_nu++,
2778 dtap_detach_req, sizeof(dtap_detach_req));
2779
2780 dump_peers(stdout, 0, 0, &gbcfg);
2781
2782 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[0], 0x1002,
2783 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2784 GPRS_SAPI_GMM, sgsn_nu++,
2785 dtap_detach_acc, sizeof(dtap_detach_acc));
2786
2787 dump_peers(stdout, 0, 0, &gbcfg);
2788
2789 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
2790
2791 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2792 local_bss_tlli2, &rai_bss, cell_id,
2793 GPRS_SAPI_GMM, bss_nu++,
2794 dtap_detach_req, sizeof(dtap_detach_req));
2795
2796 dump_peers(stdout, 0, 0, &gbcfg);
2797
2798 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
2799 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2800 GPRS_SAPI_GMM, sgsn_nu++,
2801 dtap_detach_acc, sizeof(dtap_detach_acc));
2802
2803 dump_peers(stdout, 0, 0, &gbcfg);
2804
2805 dump_global(stdout, 0);
2806
2807 gbprox_reset(&gbcfg);
2808 gprs_ns_destroy(nsi);
2809 nsi = NULL;
2810}
2811
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02002812static void test_gbproxy_keep_info()
2813{
2814 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2815 struct sockaddr_in bss_peer[1] = {{0},};
2816 struct sockaddr_in sgsn_peer= {0};
2817 struct gprs_ra_id rai_bss =
2818 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2819 uint16_t cell_id = 0x1234;
2820
2821 const uint32_t ptmsi = 0xefe2b700;
2822 const uint32_t local_tlli = 0xefe2b700;
2823 const uint32_t foreign_tlli = 0xafe2b700;
2824
2825 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck7430da62014-09-12 15:09:56 +02002826 struct gbproxy_tlli_info *tlli_info, *tlli_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02002827 struct gbproxy_peer *peer;
2828 unsigned bss_nu = 0;
2829 unsigned sgsn_nu = 0;
2830
2831 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
2832
2833 bssgp_nsi = nsi;
2834 gbcfg.nsi = bssgp_nsi;
2835 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2836 gbcfg.patch_ptmsi = 0;
2837 gbcfg.acquire_imsi = 1;
2838 gbcfg.bss_ptmsi_state = 0;
2839 gbcfg.sgsn_tlli_state = 1;
2840 gbcfg.core_mcc = 0;
2841 gbcfg.core_mnc = 0;
2842 gbcfg.core_apn = NULL;
2843 gbcfg.core_apn_size = 0;
2844 gbcfg.route_to_sgsn2 = 0;
2845 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck7430da62014-09-12 15:09:56 +02002846 gbcfg.keep_tlli_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02002847
2848 configure_sgsn_peer(&sgsn_peer);
2849 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2850
2851 printf("=== %s ===\n", __func__);
2852 printf("--- Initialise SGSN ---\n\n");
2853
2854 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2855
2856 printf("--- Initialise BSS 1 ---\n\n");
2857
2858 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2859 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2860
2861 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2862 OSMO_ASSERT(peer != NULL);
2863
2864 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2865
2866 gprs_dump_nsi(nsi);
2867 dump_global(stdout, 0);
2868 dump_peers(stdout, 0, 0, &gbcfg);
2869
2870 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2871
2872 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2873 foreign_tlli, &rai_bss, cell_id,
2874 GPRS_SAPI_GMM, bss_nu++,
2875 dtap_attach_req, sizeof(dtap_attach_req));
2876
2877 dump_peers(stdout, 0, 0, &gbcfg);
2878
2879 tlli_info = gbproxy_find_tlli(peer, foreign_tlli);
2880 OSMO_ASSERT(tlli_info);
2881 OSMO_ASSERT(tlli_info->imsi_len == 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02002882 OSMO_ASSERT(!tlli_info->is_deregistered);
2883 OSMO_ASSERT(tlli_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02002884
2885 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2886 foreign_tlli, &rai_bss, cell_id,
2887 GPRS_SAPI_GMM, bss_nu++,
2888 dtap_identity_resp, sizeof(dtap_identity_resp));
2889
2890 dump_peers(stdout, 0, 0, &gbcfg);
2891
Jacob Erlbeck7430da62014-09-12 15:09:56 +02002892 tlli_info = gbproxy_find_tlli(peer, foreign_tlli);
2893 OSMO_ASSERT(tlli_info);
2894 OSMO_ASSERT(tlli_info->imsi_len > 0);
2895 OSMO_ASSERT(!tlli_info->imsi_acq_pending);
2896
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02002897 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2898 foreign_tlli, 0, NULL, 0,
2899 GPRS_SAPI_GMM, sgsn_nu++,
2900 dtap_identity_req, sizeof(dtap_identity_req));
2901
2902 dump_peers(stdout, 0, 0, &gbcfg);
2903
2904 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2905 foreign_tlli, &rai_bss, cell_id,
2906 GPRS_SAPI_GMM, bss_nu++,
2907 dtap_identity_resp, sizeof(dtap_identity_resp));
2908
2909 dump_peers(stdout, 0, 0, &gbcfg);
2910
2911 tlli_info = gbproxy_find_tlli(peer, foreign_tlli);
2912 OSMO_ASSERT(tlli_info);
2913 OSMO_ASSERT(tlli_info->imsi_len > 0);
2914 OSMO_ASSERT(gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi)));
2915
2916 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2917 foreign_tlli, 1, imsi, sizeof(imsi),
2918 GPRS_SAPI_GMM, sgsn_nu++,
2919 dtap_attach_acc, sizeof(dtap_attach_acc));
2920
2921 dump_peers(stdout, 0, 0, &gbcfg);
2922
2923 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2924 local_tlli, &rai_bss, cell_id,
2925 GPRS_SAPI_GMM, bss_nu++,
2926 dtap_attach_complete, sizeof(dtap_attach_complete));
2927
2928 dump_peers(stdout, 0, 0, &gbcfg);
2929
2930 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2931 local_tlli, 1, imsi, sizeof(imsi),
2932 GPRS_SAPI_GMM, sgsn_nu++,
2933 dtap_gmm_information, sizeof(dtap_gmm_information));
2934
2935 dump_peers(stdout, 0, 0, &gbcfg);
2936
2937 tlli_info = gbproxy_find_tlli(peer, local_tlli);
2938 OSMO_ASSERT(tlli_info);
2939
2940 /* Detach (MO) */
2941 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2942 local_tlli, &rai_bss, cell_id,
2943 GPRS_SAPI_GMM, bss_nu++,
2944 dtap_detach_req, sizeof(dtap_detach_req));
2945
2946 tlli_info = gbproxy_find_tlli(peer, local_tlli);
2947 OSMO_ASSERT(tlli_info);
2948
2949 dump_peers(stdout, 0, 0, &gbcfg);
2950
2951 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2952 local_tlli, 1, imsi, sizeof(imsi),
2953 GPRS_SAPI_GMM, sgsn_nu++,
2954 dtap_detach_acc, sizeof(dtap_detach_acc));
2955
2956 dump_peers(stdout, 0, 0, &gbcfg);
2957
Jacob Erlbeck7430da62014-09-12 15:09:56 +02002958 OSMO_ASSERT(!gbproxy_find_tlli(peer, local_tlli));
2959 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
2960 OSMO_ASSERT(tlli_info);
2961 OSMO_ASSERT(tlli_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02002962
2963 /* Re-Attach */
2964 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2965 foreign_tlli, &rai_bss, cell_id,
2966 GPRS_SAPI_GMM, bss_nu++,
2967 dtap_attach_req3, sizeof(dtap_attach_req3));
2968
2969 dump_peers(stdout, 0, 0, &gbcfg);
2970
Jacob Erlbeck7430da62014-09-12 15:09:56 +02002971 tlli_info2 = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
2972 tlli_info = gbproxy_find_tlli(peer, foreign_tlli);
2973 OSMO_ASSERT(tlli_info);
2974 OSMO_ASSERT(tlli_info == tlli_info2);
2975 OSMO_ASSERT(tlli_info->imsi_len != 0);
2976 OSMO_ASSERT(!tlli_info->is_deregistered);
2977 OSMO_ASSERT(!tlli_info->imsi_acq_pending);
2978
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02002979 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2980 foreign_tlli, 1, imsi, sizeof(imsi),
2981 GPRS_SAPI_GMM, sgsn_nu++,
2982 dtap_attach_acc, sizeof(dtap_attach_acc));
2983
2984 dump_peers(stdout, 0, 0, &gbcfg);
2985
2986 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2987 local_tlli, &rai_bss, cell_id,
2988 GPRS_SAPI_GMM, bss_nu++,
2989 dtap_attach_complete, sizeof(dtap_attach_complete));
2990
2991 dump_peers(stdout, 0, 0, &gbcfg);
2992
2993 /* Detach (MT) */
2994 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
2995 local_tlli, 1, imsi, sizeof(imsi),
2996 GPRS_SAPI_GMM, sgsn_nu++,
2997 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
2998
2999 dump_peers(stdout, 0, 0, &gbcfg);
3000
3001 tlli_info = gbproxy_find_tlli(peer, local_tlli);
3002 OSMO_ASSERT(tlli_info);
3003
3004 send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3005 local_tlli, &rai_bss, cell_id,
3006 GPRS_SAPI_GMM, bss_nu++,
3007 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3008
3009 dump_peers(stdout, 0, 0, &gbcfg);
3010
3011 OSMO_ASSERT(!gbproxy_find_tlli(peer, local_tlli));
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003012 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
3013 OSMO_ASSERT(tlli_info);
3014 OSMO_ASSERT(tlli_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003015
3016 /* Re-Attach */
3017 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3018 foreign_tlli, &rai_bss, cell_id,
3019 GPRS_SAPI_GMM, bss_nu++,
3020 dtap_attach_req3, sizeof(dtap_attach_req3));
3021
3022 dump_peers(stdout, 0, 0, &gbcfg);
3023
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003024 tlli_info2 = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
3025 tlli_info = gbproxy_find_tlli(peer, foreign_tlli);
3026 OSMO_ASSERT(tlli_info);
3027 OSMO_ASSERT(tlli_info == tlli_info2);
3028 OSMO_ASSERT(tlli_info->imsi_len != 0);
3029 OSMO_ASSERT(!tlli_info->is_deregistered);
3030 OSMO_ASSERT(!tlli_info->imsi_acq_pending);
3031
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003032 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3033 foreign_tlli, 1, imsi, sizeof(imsi),
3034 GPRS_SAPI_GMM, sgsn_nu++,
3035 dtap_attach_acc, sizeof(dtap_attach_acc));
3036
3037 dump_peers(stdout, 0, 0, &gbcfg);
3038
3039 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3040 local_tlli, &rai_bss, cell_id,
3041 GPRS_SAPI_GMM, bss_nu++,
3042 dtap_attach_complete, sizeof(dtap_attach_complete));
3043
3044 dump_peers(stdout, 0, 0, &gbcfg);
3045
3046 /* Detach (MT) */
3047 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3048 local_tlli, 1, imsi, sizeof(imsi),
3049 GPRS_SAPI_GMM, sgsn_nu++,
3050 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3051
3052 dump_peers(stdout, 0, 0, &gbcfg);
3053
3054 tlli_info = gbproxy_find_tlli(peer, local_tlli);
3055 OSMO_ASSERT(tlli_info);
3056
3057 send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3058 local_tlli, &rai_bss, cell_id,
3059 GPRS_SAPI_GMM, bss_nu++,
3060 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3061
3062 dump_peers(stdout, 0, 0, &gbcfg);
3063
3064 OSMO_ASSERT(!gbproxy_find_tlli(peer, local_tlli));
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003065 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
3066 OSMO_ASSERT(tlli_info);
3067 OSMO_ASSERT(tlli_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003068
3069 /* Re-Attach */
3070 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3071 foreign_tlli, &rai_bss, cell_id,
3072 GPRS_SAPI_GMM, bss_nu++,
3073 dtap_attach_req3, sizeof(dtap_attach_req3));
3074
3075 dump_peers(stdout, 0, 0, &gbcfg);
3076
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003077 tlli_info2 = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
3078 tlli_info = gbproxy_find_tlli(peer, foreign_tlli);
3079 OSMO_ASSERT(tlli_info);
3080 OSMO_ASSERT(tlli_info == tlli_info2);
3081 OSMO_ASSERT(tlli_info->imsi_len != 0);
3082 OSMO_ASSERT(!tlli_info->is_deregistered);
3083 OSMO_ASSERT(!tlli_info->imsi_acq_pending);
3084
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003085 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3086 foreign_tlli, 1, imsi, sizeof(imsi),
3087 GPRS_SAPI_GMM, sgsn_nu++,
3088 dtap_attach_acc, sizeof(dtap_attach_acc));
3089
3090 dump_peers(stdout, 0, 0, &gbcfg);
3091
3092 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3093 local_tlli, &rai_bss, cell_id,
3094 GPRS_SAPI_GMM, bss_nu++,
3095 dtap_attach_complete, sizeof(dtap_attach_complete));
3096
3097 dump_peers(stdout, 0, 0, &gbcfg);
3098
3099 /* RA update procedure (reject -> Detach) */
3100 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3101 local_tlli, &rai_bss, 0x7080,
3102 GPRS_SAPI_GMM, bss_nu++,
3103 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3104
3105 send_llc_dl_ui(nsi, "RA UDP REJ", &sgsn_peer, 0x1002,
3106 local_tlli, 1, imsi, sizeof(imsi),
3107 GPRS_SAPI_GMM, sgsn_nu++,
3108 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3109
3110 dump_peers(stdout, 0, 0, &gbcfg);
3111
Jacob Erlbeck85e5c8f2014-09-16 12:16:58 +02003112 OSMO_ASSERT(!gbproxy_find_tlli(peer, local_tlli));
3113 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
3114 OSMO_ASSERT(tlli_info);
3115 OSMO_ASSERT(tlli_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003116
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003117 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
3118 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3119 foreign_tlli, &rai_bss, cell_id,
3120 GPRS_SAPI_GMM, bss_nu++,
3121 dtap_attach_req, sizeof(dtap_attach_req));
3122
3123 dump_peers(stdout, 0, 0, &gbcfg);
3124
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003125 tlli_info2 = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
3126 tlli_info = gbproxy_find_tlli(peer, foreign_tlli);
3127 OSMO_ASSERT(tlli_info);
3128 OSMO_ASSERT(tlli_info != tlli_info2);
3129 OSMO_ASSERT(tlli_info->imsi_len == 0);
3130 OSMO_ASSERT(!tlli_info->is_deregistered);
3131 OSMO_ASSERT(tlli_info->imsi_acq_pending);
3132
3133 /* This wouldn't happen in reality, since the Attach Request hadn't
3134 * been forwarded to the SGSN.
3135 * TODO: Add the missing messages.
3136 */
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003137 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3138 foreign_tlli, 1, imsi, sizeof(imsi),
3139 GPRS_SAPI_GMM, sgsn_nu++,
3140 dtap_attach_acc, sizeof(dtap_attach_acc));
3141
3142 dump_peers(stdout, 0, 0, &gbcfg);
3143
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003144 tlli_info2 = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
3145 tlli_info = gbproxy_find_tlli(peer, foreign_tlli);
3146 OSMO_ASSERT(tlli_info);
3147 OSMO_ASSERT(tlli_info == tlli_info2);
3148 OSMO_ASSERT(tlli_info->imsi_len >= 0);
3149 OSMO_ASSERT(!tlli_info->is_deregistered);
3150 OSMO_ASSERT(tlli_info->imsi_acq_pending);
3151
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003152 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3153 local_tlli, &rai_bss, cell_id,
3154 GPRS_SAPI_GMM, bss_nu++,
3155 dtap_attach_complete, sizeof(dtap_attach_complete));
3156
3157 dump_peers(stdout, 0, 0, &gbcfg);
3158
3159 /* Detach (MT) */
3160 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3161 local_tlli, 1, imsi, sizeof(imsi),
3162 GPRS_SAPI_GMM, sgsn_nu++,
3163 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3164
3165 dump_peers(stdout, 0, 0, &gbcfg);
3166
3167 tlli_info = gbproxy_find_tlli(peer, local_tlli);
3168 OSMO_ASSERT(tlli_info);
3169
3170 send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3171 local_tlli, &rai_bss, cell_id,
3172 GPRS_SAPI_GMM, bss_nu++,
3173 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3174
3175 dump_peers(stdout, 0, 0, &gbcfg);
3176
Jacob Erlbeck16a3cd32014-09-15 11:46:42 +02003177 OSMO_ASSERT(!gbproxy_find_tlli(peer, local_tlli));
3178 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi, sizeof(imsi));
3179 OSMO_ASSERT(tlli_info);
3180 OSMO_ASSERT(tlli_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003181
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003182 dump_global(stdout, 0);
3183
3184 gbprox_reset(&gbcfg);
3185 gprs_ns_destroy(nsi);
3186 nsi = NULL;
3187}
3188
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003189/* TODO: Move tlv testing to libosmocore */
3190int v_fixed_shift(uint8_t **data, size_t *data_len, size_t len, uint8_t **value);
3191int tv_fixed_match(uint8_t **data, size_t *data_len, uint8_t tag, size_t len,
3192 uint8_t **value);
3193int tlv_match(uint8_t **data, size_t *data_len, uint8_t tag, uint8_t **value,
3194 size_t *value_len);
3195int lv_shift(uint8_t **data, size_t *data_len,
3196 uint8_t **value, size_t *value_len);
3197
3198static void check_tlv_match(uint8_t **data, size_t *data_len,
3199 uint8_t tag, size_t exp_len, const uint8_t *exp_val)
3200{
3201 uint8_t *value;
3202 size_t value_len;
3203 int rc;
3204
3205 rc = tlv_match(data, data_len, tag ^ 1, NULL, NULL);
3206 OSMO_ASSERT(rc == 0);
3207
3208 rc = tlv_match(data, data_len, tag, &value, &value_len);
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003209 OSMO_ASSERT(rc == (int)value_len + 2);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003210 OSMO_ASSERT(value_len == exp_len);
3211 OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
3212}
3213
3214static void check_tv_fixed_match(uint8_t **data, size_t *data_len,
3215 uint8_t tag, size_t len, const uint8_t *exp_val)
3216{
3217 uint8_t *value;
3218 int rc;
3219
3220 rc = tv_fixed_match(data, data_len, tag ^ 1, len, NULL);
3221 OSMO_ASSERT(rc == 0);
3222
3223 rc = tv_fixed_match(data, data_len, tag, len, &value);
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003224 OSMO_ASSERT(rc == (int)len + 1);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003225 OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
3226}
3227
3228static void check_v_fixed_shift(uint8_t **data, size_t *data_len,
3229 size_t len, const uint8_t *exp_val)
3230{
3231 uint8_t *value;
3232 int rc;
3233
3234 rc = v_fixed_shift(data, data_len, len, &value);
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003235 OSMO_ASSERT(rc == (int)len);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003236 OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
3237}
3238
3239static void check_lv_shift(uint8_t **data, size_t *data_len,
3240 size_t exp_len, const uint8_t *exp_val)
3241{
3242 uint8_t *value;
3243 size_t value_len;
3244 int rc;
3245
3246 rc = lv_shift(data, data_len, &value, &value_len);
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003247 OSMO_ASSERT(rc == (int)value_len + 1);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003248 OSMO_ASSERT(value_len == exp_len);
3249 OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
3250}
3251
3252static void check_tlv_match_data_len(size_t data_len, uint8_t tag, size_t len,
3253 const uint8_t *test_data)
3254{
3255 uint8_t buf[300] = {0};
3256
3257 uint8_t *unchanged_ptr = buf - 1;
3258 size_t unchanged_len = 0xdead;
3259 size_t tmp_data_len = data_len;
3260 uint8_t *value = unchanged_ptr;
3261 size_t value_len = unchanged_len;
3262 uint8_t *data = buf;
3263
3264 OSMO_ASSERT(data_len <= sizeof(buf));
3265
3266 tlv_put(data, tag, len, test_data);
3267 if (data_len < len + 2) {
3268 OSMO_ASSERT(-1 == tlv_match(&data, &tmp_data_len,
3269 tag, &value, &value_len));
3270 OSMO_ASSERT(tmp_data_len == 0);
3271 OSMO_ASSERT(data == buf + data_len);
3272 OSMO_ASSERT(value == unchanged_ptr);
3273 OSMO_ASSERT(value_len == unchanged_len);
3274 } else {
3275 OSMO_ASSERT(0 <= tlv_match(&data, &tmp_data_len,
3276 tag, &value, &value_len));
3277 OSMO_ASSERT(value != unchanged_ptr);
3278 OSMO_ASSERT(value_len != unchanged_len);
3279 }
3280}
3281
3282static void check_tv_fixed_match_data_len(size_t data_len,
3283 uint8_t tag, size_t len,
3284 const uint8_t *test_data)
3285{
3286 uint8_t buf[300] = {0};
3287
3288 uint8_t *unchanged_ptr = buf - 1;
3289 size_t tmp_data_len = data_len;
3290 uint8_t *value = unchanged_ptr;
3291 uint8_t *data = buf;
3292
3293 OSMO_ASSERT(data_len <= sizeof(buf));
3294
3295 tv_fixed_put(data, tag, len, test_data);
3296
3297 if (data_len < len + 1) {
3298 OSMO_ASSERT(-1 == tv_fixed_match(&data, &tmp_data_len,
3299 tag, len, &value));
3300 OSMO_ASSERT(tmp_data_len == 0);
3301 OSMO_ASSERT(data == buf + data_len);
3302 OSMO_ASSERT(value == unchanged_ptr);
3303 } else {
3304 OSMO_ASSERT(0 <= tv_fixed_match(&data, &tmp_data_len,
3305 tag, len, &value));
3306 OSMO_ASSERT(value != unchanged_ptr);
3307 }
3308}
3309
3310static void check_v_fixed_shift_data_len(size_t data_len,
3311 size_t len, const uint8_t *test_data)
3312{
3313 uint8_t buf[300] = {0};
3314
3315 uint8_t *unchanged_ptr = buf - 1;
3316 size_t tmp_data_len = data_len;
3317 uint8_t *value = unchanged_ptr;
3318 uint8_t *data = buf;
3319
3320 OSMO_ASSERT(data_len <= sizeof(buf));
3321
3322 memcpy(data, test_data, len);
3323
3324 if (data_len < len) {
3325 OSMO_ASSERT(-1 == v_fixed_shift(&data, &tmp_data_len,
3326 len, &value));
3327 OSMO_ASSERT(tmp_data_len == 0);
3328 OSMO_ASSERT(data == buf + data_len);
3329 OSMO_ASSERT(value == unchanged_ptr);
3330 } else {
3331 OSMO_ASSERT(0 <= v_fixed_shift(&data, &tmp_data_len,
3332 len, &value));
3333 OSMO_ASSERT(value != unchanged_ptr);
3334 }
3335}
3336
3337static void check_lv_shift_data_len(size_t data_len,
3338 size_t len, const uint8_t *test_data)
3339{
3340 uint8_t buf[300] = {0};
3341
3342 uint8_t *unchanged_ptr = buf - 1;
3343 size_t unchanged_len = 0xdead;
3344 size_t tmp_data_len = data_len;
3345 uint8_t *value = unchanged_ptr;
3346 size_t value_len = unchanged_len;
3347 uint8_t *data = buf;
3348
3349 lv_put(data, len, test_data);
3350 if (data_len < len + 1) {
3351 OSMO_ASSERT(-1 == lv_shift(&data, &tmp_data_len,
3352 &value, &value_len));
3353 OSMO_ASSERT(tmp_data_len == 0);
3354 OSMO_ASSERT(data == buf + data_len);
3355 OSMO_ASSERT(value == unchanged_ptr);
3356 OSMO_ASSERT(value_len == unchanged_len);
3357 } else {
3358 OSMO_ASSERT(0 <= lv_shift(&data, &tmp_data_len,
3359 &value, &value_len));
3360 OSMO_ASSERT(value != unchanged_ptr);
3361 OSMO_ASSERT(value_len != unchanged_len);
3362 }
3363}
3364
3365static void test_tlv_shift_functions()
3366{
3367 uint8_t test_data[1024];
3368 uint8_t buf[1024];
3369 uint8_t *data_end;
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003370 unsigned i, len;
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003371 uint8_t *data;
3372 size_t data_len;
3373 const uint8_t tag = 0x1a;
3374
3375 printf("Test shift functions\n");
3376
3377 for (i = 0; i < ARRAY_SIZE(test_data); i++)
3378 test_data[i] = (uint8_t)i;
3379
3380 for (len = 0; len < 256; len++) {
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003381 const unsigned iterations = sizeof(buf) / (len + 2) / 4;
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003382
3383 memset(buf, 0xee, sizeof(buf));
3384 data_end = data = buf;
3385
3386 for (i = 0; i < iterations; i++) {
3387 data_end = tlv_put(data_end, tag, len, test_data);
3388 data_end = tv_fixed_put(data_end, tag, len, test_data);
3389 /* v_fixed_put */
3390 memcpy(data_end, test_data, len);
3391 data_end += len;
3392 data_end = lv_put(data_end, len, test_data);
3393 }
3394
3395 data_len = data_end - data;
3396 OSMO_ASSERT(data_len <= sizeof(buf));
3397
3398 for (i = 0; i < iterations; i++) {
3399 check_tlv_match(&data, &data_len, tag, len, test_data);
3400 check_tv_fixed_match(&data, &data_len, tag, len, test_data);
3401 check_v_fixed_shift(&data, &data_len, len, test_data);
3402 check_lv_shift(&data, &data_len, len, test_data);
3403 }
3404
3405 OSMO_ASSERT(data == data_end);
3406
3407 /* Test at end of data */
3408
3409 OSMO_ASSERT(-1 == tlv_match(&data, &data_len, tag, NULL, NULL));
3410 OSMO_ASSERT(-1 == tv_fixed_match(&data, &data_len, tag, len, NULL));
3411 OSMO_ASSERT((len ? -1 : 0) == v_fixed_shift(&data, &data_len, len, NULL));
3412 OSMO_ASSERT(-1 == lv_shift(&data, &data_len, NULL, NULL));
3413
3414 /* Test invalid data_len */
3415 for (data_len = 0; data_len <= len + 2 + 1; data_len += 1) {
3416 check_tlv_match_data_len(data_len, tag, len, test_data);
3417 check_tv_fixed_match_data_len(data_len, tag, len, test_data);
3418 check_v_fixed_shift_data_len(data_len, len, test_data);
3419 check_lv_shift_data_len(data_len, len, test_data);
3420 }
3421 }
3422}
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003423
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003424struct gbproxy_tlli_info *register_tlli(
3425 struct gbproxy_peer *peer, uint32_t tlli,
3426 const uint8_t *imsi, size_t imsi_len, time_t now)
3427{
3428 struct gbproxy_tlli_info *tlli_info;
3429 int enable_patching = -1;
3430 int tlli_already_known = 0;
3431
3432 /* Check, whether the IMSI matches */
3433 if (gprs_is_mi_imsi(imsi, imsi_len)) {
3434 enable_patching = gbproxy_check_imsi(peer, imsi, imsi_len);
3435 if (enable_patching < 0)
3436 return NULL;
3437 }
3438
3439 tlli_info = gbproxy_find_tlli(peer, tlli);
3440
3441 if (!tlli_info) {
3442 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi, imsi_len);
3443
3444 if (tlli_info) {
3445 /* TLLI has changed somehow, adjust it */
3446 LOGP(DGPRS, LOGL_INFO,
3447 "The TLLI has changed from %08x to %08x\n",
3448 tlli_info->tlli.current, tlli);
3449 tlli_info->tlli.current = tlli;
3450 }
3451 }
3452
3453 if (!tlli_info) {
3454 tlli_info = gbproxy_tlli_info_alloc(peer);
3455 tlli_info->tlli.current = tlli;
3456 } else {
3457 gbproxy_detach_tlli_info(peer, tlli_info);
3458 tlli_already_known = 1;
3459 }
3460
3461 OSMO_ASSERT(tlli_info != NULL);
3462
3463 if (!tlli_already_known)
3464 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
3465
3466 gbproxy_attach_tlli_info(peer, now, tlli_info);
3467 gbproxy_update_tlli_info(tlli_info, imsi, imsi_len);
3468
3469 if (enable_patching >= 0)
3470 tlli_info->enable_patching = enable_patching;
3471
3472 return tlli_info;
3473}
3474
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003475static void test_gbproxy_tlli_expire(void)
3476{
3477 struct gbproxy_config cfg = {0};
3478 struct gbproxy_peer *peer;
3479 const char *err_msg = NULL;
3480 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0x26 };
3481 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0x29 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003482 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003483 const uint32_t tlli1 = 1234 | 0xc0000000;
3484 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003485 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003486 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02003487 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003488
3489 printf("Test TLLI info expiry\n\n");
3490
3491 gbproxy_init_config(&cfg);
3492
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003493 if (gbproxy_set_patch_filter(&cfg, filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003494 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
3495 err_msg);
3496 OSMO_ASSERT(err_msg == NULL);
3497 }
3498
3499 {
3500 struct gbproxy_tlli_info *tlli_info;
3501
3502 printf("Test TLLI replacement:\n");
3503
3504 cfg.tlli_max_len = 0;
3505 cfg.tlli_max_age = 0;
3506 peer = gbproxy_peer_alloc(&cfg, 20);
3507 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 0);
3508
3509 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003510 tlli_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003511 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck5e68ecf2014-08-07 20:18:47 +02003512 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003513 OSMO_ASSERT(tlli_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003514 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3515
3516 /* replace the old entry */
3517 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003518 tlli_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003519 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck5e68ecf2014-08-07 20:18:47 +02003520 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003521 OSMO_ASSERT(tlli_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003522 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3523
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02003524 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003525
3526 /* verify that 5678 has survived */
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003527 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003528 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003529 OSMO_ASSERT(tlli_info->tlli.current == tlli2);
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003530 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003531 OSMO_ASSERT(!tlli_info);
3532
3533 printf("\n");
3534
3535 gbproxy_peer_free(peer);
3536 }
3537
3538 {
3539 struct gbproxy_tlli_info *tlli_info;
3540
3541 printf("Test IMSI replacement:\n");
3542
3543 cfg.tlli_max_len = 0;
3544 cfg.tlli_max_age = 0;
3545 peer = gbproxy_peer_alloc(&cfg, 20);
3546 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 0);
3547
3548 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003549 tlli_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003550 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck5e68ecf2014-08-07 20:18:47 +02003551 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003552 OSMO_ASSERT(tlli_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003553 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3554
3555 /* try to replace the old entry */
3556 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003557 tlli_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003558 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck5e68ecf2014-08-07 20:18:47 +02003559 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003560 OSMO_ASSERT(tlli_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003561 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3562
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02003563 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003564
3565 /* verify that 5678 has survived */
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003566 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003567 OSMO_ASSERT(!tlli_info);
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003568 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003569 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003570 OSMO_ASSERT(tlli_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003571
3572 printf("\n");
3573
3574 gbproxy_peer_free(peer);
3575 }
3576
3577 {
3578 struct gbproxy_tlli_info *tlli_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02003579 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003580
3581 printf("Test TLLI expiry, max_len == 1:\n");
3582
3583 cfg.tlli_max_len = 1;
3584 cfg.tlli_max_age = 0;
3585 peer = gbproxy_peer_alloc(&cfg, 20);
3586 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 0);
3587
3588 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003589 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003590 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3591
3592 /* replace the old entry */
3593 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003594 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02003595 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 2);
3596
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003597 num_removed = gbproxy_remove_stale_tllis(peer, time(NULL) + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02003598 OSMO_ASSERT(num_removed == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003599 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3600
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02003601 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003602
3603 /* verify that 5678 has survived */
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003604 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003605 OSMO_ASSERT(!tlli_info);
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003606 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003607 OSMO_ASSERT(tlli_info);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003608 OSMO_ASSERT(tlli_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003609
3610 printf("\n");
3611
3612 gbproxy_peer_free(peer);
3613 }
3614
3615 {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003616 struct gbproxy_tlli_info *tlli_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02003617 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003618
3619 printf("Test TLLI expiry, max_age == 1:\n");
3620
3621 cfg.tlli_max_len = 0;
3622 cfg.tlli_max_age = 1;
3623 peer = gbproxy_peer_alloc(&cfg, 20);
3624 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 0);
3625
3626 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003627 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003628 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3629
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003630 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003631 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003632 now + 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003633 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 2);
3634
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003635 num_removed = gbproxy_remove_stale_tllis(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003636 OSMO_ASSERT(num_removed == 1);
3637 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3638
3639 dump_peers(stdout, 2, now + 2, &cfg);
3640
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003641 /* verify that 5678 has survived */
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003642 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003643 OSMO_ASSERT(!tlli_info);
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003644 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003645 OSMO_ASSERT(tlli_info);
3646 OSMO_ASSERT(tlli_info->tlli.current == tlli2);
3647
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003648 printf("\n");
3649
3650 gbproxy_peer_free(peer);
3651 }
3652
3653 {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003654 struct gbproxy_tlli_info *tlli_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003655 int num_removed;
3656
3657 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
3658
3659 cfg.tlli_max_len = 0;
3660 cfg.tlli_max_age = 1;
3661 peer = gbproxy_peer_alloc(&cfg, 20);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003662 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 0);
3663
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003664 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003665 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003666 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3667
3668 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003669 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003670 now + 1);
3671 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 2);
3672
3673 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003674 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003675 now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003676 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 3);
3677
3678 dump_peers(stdout, 2, now + 2, &cfg);
3679
3680 printf(" Remove stale TLLIs\n");
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003681 num_removed = gbproxy_remove_stale_tllis(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003682 OSMO_ASSERT(num_removed == 2);
3683 OSMO_ASSERT(peer->patch_state.enabled_tllis_count == 1);
3684
3685 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003686
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003687 /* verify that tlli3 has survived */
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003688 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003689 OSMO_ASSERT(!tlli_info);
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003690 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003691 OSMO_ASSERT(!tlli_info);
Jacob Erlbeck2fd1ba42014-09-11 14:57:03 +02003692 tlli_info = gbproxy_find_tlli_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003693 OSMO_ASSERT(tlli_info);
3694 OSMO_ASSERT(tlli_info->tlli.current == tlli3);
3695
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003696 printf("\n");
3697
3698 gbproxy_peer_free(peer);
3699 }
3700}
3701
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003702static void test_gbproxy_imsi_matching(void)
3703{
3704 struct gbproxy_config cfg = {0};
3705 struct gbproxy_peer *peer;
3706 const char *err_msg = NULL;
3707 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
3708 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
3709 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
3710 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
3711 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
3712 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
3713 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
3714 const char *filter_re1 = ".*";
3715 const char *filter_re2 = "^1234";
3716 const char *filter_re3 = "^4321";
3717 const char *filter_re4_bad = "^12[";
3718
3719 printf("=== Test IMSI/TMSI matching ===\n\n");
3720
3721 gbproxy_init_config(&cfg);
3722 OSMO_ASSERT(cfg.check_imsi == 0);
3723
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003724 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re1, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003725 OSMO_ASSERT(cfg.check_imsi == 1);
3726
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003727 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re2, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003728 OSMO_ASSERT(cfg.check_imsi == 1);
3729
3730 err_msg = NULL;
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003731 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003732 OSMO_ASSERT(err_msg != NULL);
3733 OSMO_ASSERT(cfg.check_imsi == 0);
3734
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003735 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re2, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003736 OSMO_ASSERT(cfg.check_imsi == 1);
3737
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003738 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, NULL, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003739 OSMO_ASSERT(cfg.check_imsi == 0);
3740
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003741 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re2, &err_msg) == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02003742 OSMO_ASSERT(cfg.check_imsi == 1);
3743
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003744 gbproxy_clear_patch_filter(&cfg);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02003745 OSMO_ASSERT(cfg.check_imsi == 0);
3746
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003747 peer = gbproxy_peer_alloc(&cfg, 20);
3748
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003749 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re2, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003750 OSMO_ASSERT(cfg.check_imsi == 1);
3751
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003752 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi1, ARRAY_SIZE(imsi1)) == 1);
3753 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi2, ARRAY_SIZE(imsi2)) == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003754 /* imsi3_bad contains 0xE and 0xF digits, but the conversion function
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003755 * doesn't complain, so gbproxy_check_imsi() doesn't return -1 in this
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003756 * case. */
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003757 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
3758 OSMO_ASSERT(gbproxy_check_imsi(peer, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
3759 OSMO_ASSERT(gbproxy_check_imsi(peer, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
3760 OSMO_ASSERT(gbproxy_check_imsi(peer, imei1, ARRAY_SIZE(imei1)) == -1);
3761 OSMO_ASSERT(gbproxy_check_imsi(peer, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003762
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003763 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re3, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003764 OSMO_ASSERT(cfg.check_imsi == 1);
3765
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003766 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi1, ARRAY_SIZE(imsi1)) == 0);
3767 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi2, ARRAY_SIZE(imsi2)) == 0);
3768 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
3769 OSMO_ASSERT(gbproxy_check_imsi(peer, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
3770 OSMO_ASSERT(gbproxy_check_imsi(peer, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
3771 OSMO_ASSERT(gbproxy_check_imsi(peer, imei1, ARRAY_SIZE(imei1)) == -1);
3772 OSMO_ASSERT(gbproxy_check_imsi(peer, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003773
3774 /* TODO: Check correct length but wrong type with is_mi_tmsi */
3775
3776 gbproxy_peer_free(peer);
3777}
3778
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02003779static struct log_info_cat gprs_categories[] = {
3780 [DGPRS] = {
3781 .name = "DGPRS",
3782 .description = "GPRS Packet Service",
3783 .enabled = 1, .loglevel = LOGL_DEBUG,
3784 },
3785 [DNS] = {
3786 .name = "DNS",
3787 .description = "GPRS Network Service (NS)",
3788 .enabled = 1, .loglevel = LOGL_INFO,
3789 },
3790 [DBSSGP] = {
3791 .name = "DBSSGP",
3792 .description = "GPRS BSS Gateway Protocol (BSSGP)",
3793 .enabled = 1, .loglevel = LOGL_DEBUG,
3794 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02003795};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02003796
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02003797static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02003798 .cat = gprs_categories,
3799 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02003800};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02003801
3802int main(int argc, char **argv)
3803{
3804 osmo_init_logging(&info);
3805 log_set_use_color(osmo_stderr_target, 0);
3806 log_set_print_filename(osmo_stderr_target, 0);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02003807 osmo_signal_register_handler(SS_L_NS, &test_signal, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02003808
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02003809 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02003810 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
3811 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02003812
3813 rate_ctr_init(NULL);
3814
3815 setlinebuf(stdout);
3816
3817 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02003818 gbproxy_init_config(&gbcfg);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003819 test_tlv_shift_functions();
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02003820 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02003821 test_gbproxy_ident_changes();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02003822 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02003823 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02003824 test_gbproxy_ra_patching();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02003825 test_gbproxy_ptmsi_patching();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02003826 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003827 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003828 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003829 test_gbproxy_tlli_expire();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02003830 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02003831
3832 exit(EXIT_SUCCESS);
3833}