blob: 9b2218cf3010ff1b4a2fd9f7c148ba83ff46b927 [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) {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +020090 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +020091 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",
Jacob Erlbeckf8562e32014-09-19 16:03:07 +0200120 indent, "", state->logical_link_count);
121 llist_for_each_entry(link_info, &state->logical_links, list) {
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200122 char mi_buf[200];
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200123 time_t age = now ? now - link_info->timestamp : 0;
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200124 int stored_msgs = 0;
125 struct llist_head *iter;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200126 llist_for_each(iter, &link_info->stored_msgs)
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200127 stored_msgs++;
128
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200129 if (link_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 Erlbeck91d2f8a2014-09-19 15:07:27 +0200132 link_info->imsi,
133 link_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 Erlbeck91d2f8a2014-09-19 15:07:27 +0200138 indent, "", link_info->tlli.current);
139 if (link_info->tlli.assigned)
140 fprintf(stream, "/%08x", link_info->tlli.assigned);
141 if (link_info->sgsn_tlli.current) {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200142 fprintf(stream, " -> %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200143 link_info->sgsn_tlli.current);
144 if (link_info->sgsn_tlli.assigned)
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200145 fprintf(stream, "/%08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200146 link_info->sgsn_tlli.assigned);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200147 }
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 Erlbeck91d2f8a2014-09-19 15:07:27 +0200154 if (cfg->check_imsi && link_info->imsi_matches)
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200155 fprintf(stream, ", IMSI matches");
156
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200157 if (link_info->imsi_acq_pending)
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200158 fprintf(stream, ", IMSI acquisition in progress");
159
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200160 if (cfg->route_to_sgsn2)
161 fprintf(stream, ", SGSN NSEI %d",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200162 link_info->sgsn_nsei);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200163
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200164 if (link_info->is_deregistered)
Jacob Erlbeck7430da62014-09-12 15:09:56 +0200165 fprintf(stream, ", DE-REGISTERED");
166
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200167 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200168 if (rc < 0)
169 return rc;
170 }
171 }
172
173 return 0;
174}
175
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200176const uint8_t *convert_ra(struct gprs_ra_id *raid)
177{
178 static uint8_t buf[6];
179 gsm48_construct_ra(buf, raid);
180 return buf;
181}
182
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200183/* DTAP - Attach Request */
184static const unsigned char dtap_attach_req[] = {
185 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
186 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
187 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
188 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
189 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
190 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200191};
192
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200193/* DTAP - Attach Request (invalid RAI) */
194static const unsigned char dtap_attach_req2[] = {
195 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
196 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
197 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
198 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
199 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
200 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
201};
202
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200203/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
204static const unsigned char dtap_attach_req3[] = {
205 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
206 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
207 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
208 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
209 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
210 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
211};
212
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200213/* DTAP - Identity Request */
214static const unsigned char dtap_identity_req[] = {
215 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200216};
217
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200218/* DTAP - Identity Response */
219static const unsigned char dtap_identity_resp[] = {
220 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
221 0x16, 0x17, 0x18
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200222};
223
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200224/* DTAP - Identity Response, IMSI 2 */
225static const unsigned char dtap_identity2_resp[] = {
226 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
227 0x16, 0x17, 0x18
228};
229
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200230/* DTAP - Identity Response, IMSI 3 */
231static const unsigned char dtap_identity3_resp[] = {
232 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
233 0x26, 0x27, 0x28
234};
235
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200236/* DTAP - Attach Accept */
237static const unsigned char dtap_attach_acc[] = {
238 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
239 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
240 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200241};
242
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200243/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200244static const unsigned char dtap_attach_acc2[] = {
245 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
246 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
247 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
248};
249
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200250/* DTAP - Attach Complete */
251static const unsigned char dtap_attach_complete[] = {
252 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200253};
254
Jacob Erlbeck2bf32612014-09-22 11:26:58 +0200255/* DTAP - Attach Reject (GPRS services not allowed) */
256static const unsigned char dtap_attach_rej7[] = {
257 0x08, 0x04, 0x07
258};
259
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200260/* DTAP - GMM Information */
261static const unsigned char dtap_gmm_information[] = {
262 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200263};
264
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200265/* DTAP - Routing Area Update Request */
266static const unsigned char dtap_ra_upd_req[] = {
267 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
268 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
269 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
270 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
271 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
272 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
273 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200274};
275
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200276/* DTAP - Routing Area Update Accept */
277static const unsigned char dtap_ra_upd_acc[] = {
278 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
279 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
280 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200281};
282
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200283/* DTAP - Routing Area Update Accept, P-TMSI 2 */
284static const unsigned char dtap_ra_upd_acc2[] = {
285 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
286 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
287 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
288};
289
290/* DTAP - Routing Area Update Accept, P-TMSI 3 */
291static const unsigned char dtap_ra_upd_acc3[] = {
292 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
293 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
294 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
295};
296
297/* DTAP - Routing Area Update Complete */
298static const unsigned char dtap_ra_upd_complete[] = {
299 0x08, 0x0a
300};
301
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200302/* DTAP - Routing Area Update Reject */
303/* cause = 10 ("Implicitly detached"), force_standby = 0 */
304static const unsigned char dtap_ra_upd_rej[] = {
305 0x08, 0x0b, 0x0a, 0x00,
306};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200307
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200308/* DTAP - Activate PDP Context Request */
309static const unsigned char dtap_act_pdp_ctx_req[] = {
310 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200311 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
313 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
314 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
315 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200316 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200317};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200318
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200319/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200320/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200321static const unsigned char dtap_detach_po_req[] = {
322 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
323 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200324};
325
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200326/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200327/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200328static const unsigned char dtap_detach_req[] = {
329 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
330 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200331};
332
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200333/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200334static const unsigned char dtap_detach_acc[] = {
335 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200336};
337
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200338/* DTAP - Detach Request (MT) */
339/* normal detach, reattach required, implicitly detached */
340static const unsigned char dtap_mt_detach_rea_req[] = {
341 0x08, 0x05, 0x01, 0x25, 0x0a
342};
343
344/* DTAP - Detach Request (MT) */
345/* normal detach, reattach not required, implicitly detached */
346static const unsigned char dtap_mt_detach_req[] = {
347 0x08, 0x05, 0x02, 0x25, 0x0a
348};
349
350/* DTAP - Detach Accept (MT) */
351static const unsigned char dtap_mt_detach_acc[] = {
352 0x08, 0x06
353};
354
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200355/* GPRS-LLC - SAPI: LLGMM, U, XID */
356static const unsigned char llc_u_xid_ul[] = {
357 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
358 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
359};
360
361/* GPRS-LLC - SAPI: LLGMM, U, XID */
362static const unsigned char llc_u_xid_dl[] = {
363 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
364 0xe4, 0xa9, 0x1a, 0x9e
365};
366
367/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
368static const unsigned char llc_ui_ll11_dns_query_ul[] = {
369 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
370 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
371 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
372 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
373 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
374 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
375 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
376 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
377 0x8f, 0x07
378};
379
380/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
381static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
382 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
383 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
384 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
385 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
386 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
387 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
388 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
389 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
390 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
391 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
392 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
393 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
394 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
395 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
396 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
397 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
398 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
399 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
400 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
401 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
402 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
403 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
404 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
405 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
406 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
407 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
408};
409
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200410static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
411 struct sockaddr_in *peer, const unsigned char* data,
412 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200413
414static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
415 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
416{
417 /* GPRS Network Service, PDU type: NS_RESET,
418 */
419 unsigned char msg[12] = {
420 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
421 0x04, 0x82, 0x11, 0x22
422 };
423
424 msg[3] = cause;
425 msg[6] = nsvci / 256;
426 msg[7] = nsvci % 256;
427 msg[10] = nsei / 256;
428 msg[11] = nsei % 256;
429
430 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
431}
432
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200433static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
434 uint16_t nsvci, uint16_t nsei)
435{
436 /* GPRS Network Service, PDU type: NS_RESET_ACK,
437 */
438 unsigned char msg[9] = {
439 0x03, 0x01, 0x82, 0x11, 0x22,
440 0x04, 0x82, 0x11, 0x22
441 };
442
443 msg[3] = nsvci / 256;
444 msg[4] = nsvci % 256;
445 msg[7] = nsei / 256;
446 msg[8] = nsei % 256;
447
448 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
449}
450
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200451static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
452{
453 /* GPRS Network Service, PDU type: NS_ALIVE */
454 unsigned char msg[1] = {
455 0x0a
456 };
457
458 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
459}
460
461static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
462{
463 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
464 unsigned char msg[1] = {
465 0x0b
466 };
467
468 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
469}
470
471static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
472{
473 /* GPRS Network Service, PDU type: NS_UNBLOCK */
474 unsigned char msg[1] = {
475 0x06
476 };
477
478 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
479}
480
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200481static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
482{
483 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
484 unsigned char msg[1] = {
485 0x07
486 };
487
488 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
489}
490
491static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
492 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200493 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
494{
495 /* GPRS Network Service, PDU type: NS_UNITDATA */
496 unsigned char msg[4096] = {
497 0x00, 0x00, 0x00, 0x00
498 };
499
500 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
501
502 msg[2] = nsbvci / 256;
503 msg[3] = nsbvci % 256;
504 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
505
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200506 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200507}
508
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200509static void send_bssgp_ul_unitdata(
510 struct gprs_ns_inst *nsi, const char *text,
511 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
512 struct gprs_ra_id *raid, uint16_t cell_id,
513 const uint8_t *llc_msg, size_t llc_msg_size)
514{
515 /* GPRS Network Service, PDU type: NS_UNITDATA */
516 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
517 unsigned char msg[4096] = {
518 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
519 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
520 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
521 };
522
523 size_t bssgp_msg_size = 23 + llc_msg_size;
524
525 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
526
527 gsm48_construct_ra(msg + 10, raid);
528 msg[1] = (uint8_t)(tlli >> 24);
529 msg[2] = (uint8_t)(tlli >> 16);
530 msg[3] = (uint8_t)(tlli >> 8);
531 msg[4] = (uint8_t)(tlli >> 0);
532 msg[16] = cell_id / 256;
533 msg[17] = cell_id % 256;
534 msg[21] = llc_msg_size / 256;
535 msg[22] = llc_msg_size % 256;
536 memcpy(msg + 23, llc_msg, llc_msg_size);
537
538 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
539 src_addr, nsbvci, msg, bssgp_msg_size);
540}
541
542static void send_bssgp_dl_unitdata(
543 struct gprs_ns_inst *nsi, const char *text,
544 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
545 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
546 const uint8_t *llc_msg, size_t llc_msg_size)
547{
548 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
549 unsigned char msg[4096] = {
550 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
551 0x16, 0x82, 0x02, 0x58,
552 };
553 unsigned char racap_drx[] = {
554 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
555 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
556 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
557 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
558 };
559
560 size_t bssgp_msg_size = 0;
561
562 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
563
564 msg[1] = (uint8_t)(tlli >> 24);
565 msg[2] = (uint8_t)(tlli >> 16);
566 msg[3] = (uint8_t)(tlli >> 8);
567 msg[4] = (uint8_t)(tlli >> 0);
568
569 bssgp_msg_size = 12;
570
571 if (with_racap_drx) {
572 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
573 bssgp_msg_size += sizeof(racap_drx);
574 }
575
576 if (imsi) {
577 OSMO_ASSERT(imsi_size <= 127);
578 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
579 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
580 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
581 bssgp_msg_size += 2 + imsi_size;
582 }
583
584 if ((bssgp_msg_size % 4) != 0) {
585 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
586 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
587 msg[bssgp_msg_size + 1] = 0x80 | abytes;
588 memset(msg + bssgp_msg_size + 2, 0, abytes);
589 bssgp_msg_size += 2 + abytes;
590 }
591
592 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
593 if (llc_msg_size < 128) {
594 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
595 bssgp_msg_size += 2;
596 } else {
597 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
598 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
599 bssgp_msg_size += 3;
600 }
601 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
602 bssgp_msg_size += llc_msg_size;
603
604
605 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
606 src_addr, nsbvci, msg, bssgp_msg_size);
607}
608
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200609static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
610 uint16_t bvci)
611{
612 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
613 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200614 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200615 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200616 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
617 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200618 };
619
620 msg[3] = bvci / 256;
621 msg[4] = bvci % 256;
622
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200623 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
624}
625
626static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
627 struct sockaddr_in *src_addr, uint16_t bvci)
628{
629 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
630 * BSSGP RESET_ACK */
631 static unsigned char msg[5] = {
632 0x23, 0x04, 0x82, 0x00,
633 0x00
634 };
635
636 msg[3] = bvci / 256;
637 msg[4] = bvci % 256;
638
639 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200640}
641
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200642static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
643 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200644 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200645 struct gprs_ra_id *raid)
646{
647 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
648 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200649 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
650 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200651 };
652
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200653 msg[3] = (uint8_t)(tlli >> 24);
654 msg[4] = (uint8_t)(tlli >> 16);
655 msg[5] = (uint8_t)(tlli >> 8);
656 msg[6] = (uint8_t)(tlli >> 0);
657
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200658 gsm48_construct_ra(msg + 9, raid);
659
660 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
661}
662
663static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
664 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200665 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200666 struct gprs_ra_id *raid)
667{
668 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
669 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200670 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
671 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200672 0x81, 0x01
673 };
674
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200675 msg[3] = (uint8_t)(tlli >> 24);
676 msg[4] = (uint8_t)(tlli >> 16);
677 msg[5] = (uint8_t)(tlli >> 8);
678 msg[6] = (uint8_t)(tlli >> 0);
679
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200680 gsm48_construct_ra(msg + 9, raid);
681
682 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
683}
684
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200685static void send_bssgp_llc_discarded(struct gprs_ns_inst *nsi,
686 struct sockaddr_in *src_addr,
687 uint16_t bvci, uint32_t tlli,
688 unsigned n_frames, unsigned n_octets)
689{
690 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
691 unsigned char msg[] = {
692 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
693 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
694 /* n octets */ 0xff, 0xff, 0xff
695 };
696
697 msg[3] = (uint8_t)(tlli >> 24);
698 msg[4] = (uint8_t)(tlli >> 16);
699 msg[5] = (uint8_t)(tlli >> 8);
700 msg[6] = (uint8_t)(tlli >> 0);
701 msg[9] = (uint8_t)(n_frames);
702 msg[12] = (uint8_t)(bvci >> 8);
703 msg[13] = (uint8_t)(bvci >> 0);
704 msg[16] = (uint8_t)(n_octets >> 16);
705 msg[17] = (uint8_t)(n_octets >> 8);
706 msg[18] = (uint8_t)(n_octets >> 0);
707
708 send_ns_unitdata(nsi, "LLC_DISCARDED", src_addr, 0, msg, sizeof(msg));
709}
710
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200711static void send_bssgp_flow_control_bvc(struct gprs_ns_inst *nsi,
712 struct sockaddr_in *src_addr,
713 uint16_t bvci, uint8_t tag)
714{
715 /* GPRS Network Service, PDU type: NS_UNITDATA,
716 * BSSGP FLOW_CONTROL_BVC */
717 unsigned char msg[] = {
718 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
719 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
720 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
721 };
722
723 msg[3] = tag;
724
725 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", src_addr, bvci,
726 msg, sizeof(msg));
727}
728
729static void send_bssgp_flow_control_bvc_ack(struct gprs_ns_inst *nsi,
730 struct sockaddr_in *src_addr,
731 uint16_t bvci, uint8_t tag)
732{
733 /* GPRS Network Service, PDU type: NS_UNITDATA,
734 * BSSGP FLOW_CONTROL_BVC_ACK */
735 unsigned char msg[] = {
736 0x27, 0x1e, 0x81, /* Tag */ 0xce
737 };
738
739 msg[3] = tag;
740
741 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", src_addr, bvci,
742 msg, sizeof(msg));
743}
744
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200745static void send_llc_ul_ui(
746 struct gprs_ns_inst *nsi, const char *text,
747 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
748 struct gprs_ra_id *raid, uint16_t cell_id,
749 unsigned sapi, unsigned nu,
750 const uint8_t *msg, size_t msg_size)
751{
752 unsigned char llc_msg[4096] = {
753 0x00, 0xc0, 0x01
754 };
755
756 size_t llc_msg_size = 3 + msg_size + 3;
757 uint8_t e_bit = 0;
758 uint8_t pm_bit = 1;
759 unsigned fcs;
760
761 nu &= 0x01ff;
762
763 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
764
765 llc_msg[0] = (sapi & 0x0f);
766 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
767 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
768
769 memcpy(llc_msg + 3, msg, msg_size);
770
771 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
772 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
773 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
774 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
775
776 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
777 src_addr, nsbvci, tlli, raid, cell_id,
778 llc_msg, llc_msg_size);
779}
780
781static void send_llc_dl_ui(
782 struct gprs_ns_inst *nsi, const char *text,
783 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
784 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
785 unsigned sapi, unsigned nu,
786 const uint8_t *msg, size_t msg_size)
787{
788 /* GPRS Network Service, PDU type: NS_UNITDATA */
789 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
790 unsigned char llc_msg[4096] = {
791 0x00, 0x00, 0x01
792 };
793
794 size_t llc_msg_size = 3 + msg_size + 3;
795 uint8_t e_bit = 0;
796 uint8_t pm_bit = 1;
797 unsigned fcs;
798
799 nu &= 0x01ff;
800
801 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
802
803 llc_msg[0] = 0x40 | (sapi & 0x0f);
804 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
805 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
806
807 memcpy(llc_msg + 3, msg, msg_size);
808
809 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
810 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
811 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
812 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
813
814 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
815 src_addr, nsbvci, tlli,
816 with_racap_drx, imsi, imsi_size,
817 llc_msg, llc_msg_size);
818}
819
820
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200821static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
822 uint16_t nsvci, uint16_t nsei)
823{
824 printf("Setup NS-VC: remote 0x%08x:%d, "
825 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
826 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
827 nsvci, nsvci, nsei, nsei);
828
829 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
830 send_ns_alive(nsi, src_addr);
831 send_ns_unblock(nsi, src_addr);
832 send_ns_alive_ack(nsi, src_addr);
833}
834
835static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
836 uint16_t bvci)
837{
838 printf("Setup BSSGP: remote 0x%08x:%d, "
839 "BVCI 0x%04x(%d)\n\n",
840 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
841 bvci, bvci);
842
843 send_bssgp_reset(nsi, src_addr, bvci);
844}
845
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200846static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer,
847 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200848{
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200849 gprs_ns_nsip_connect(nsi, sgsn_peer, sgsn_nsei, sgsn_nsei+1);
850 send_ns_reset_ack(nsi, sgsn_peer, sgsn_nsei+1, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200851 send_ns_alive_ack(nsi, sgsn_peer);
852 send_ns_unblock_ack(nsi, sgsn_peer);
853 send_ns_alive(nsi, sgsn_peer);
854}
855
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200856static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
857{
858 sgsn_peer->sin_family = AF_INET;
859 sgsn_peer->sin_port = htons(32000);
860 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
861}
862
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200863static void configure_sgsn2_peer(struct sockaddr_in *sgsn_peer)
864{
865 sgsn_peer->sin_family = AF_INET;
866 sgsn_peer->sin_port = htons(32001);
867 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN2_ADDR);
868}
869
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200870static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
871{
872 size_t i;
873
874 for (i = 0; i < size; ++i) {
875 bss_peers[i].sin_family = AF_INET;
876 bss_peers[i].sin_port = htons((i + 1) * 1111);
877 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
878 }
879}
880
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200881int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
882 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
883
884/* override */
885int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
886 struct msgb *msg, uint16_t bvci)
887{
888 printf("CALLBACK, event %d, msg length %d, bvci 0x%04x\n%s\n\n",
889 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200890 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200891
892 switch (event) {
893 case GPRS_NS_EVT_UNIT_DATA:
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +0200894 return gbprox_rcvmsg(&gbcfg, msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200895 default:
896 break;
897 }
898 return 0;
899}
900
901/* override */
902ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
903 const struct sockaddr *dest_addr, socklen_t addrlen)
904{
905 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
906 const struct sockaddr *, socklen_t);
907 static sendto_t real_sendto = NULL;
908 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200909 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200910
911 if (!real_sendto)
912 real_sendto = dlsym(RTLD_NEXT, "sendto");
913
914 if (dest_host == REMOTE_BSS_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200915 printf("MESSAGE to BSS at 0x%08x:%d, msg length %d\n%s\n\n",
916 dest_host, dest_port,
917 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200918 else if (dest_host == REMOTE_SGSN_ADDR)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200919 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %d\n%s\n\n",
920 dest_host, dest_port,
921 len, osmo_hexdump(buf, len));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200922 else if (dest_host == REMOTE_SGSN2_ADDR)
923 printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %d\n%s\n\n",
924 dest_host, dest_port,
925 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200926 else
927 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
928
929 return len;
930}
931
932/* override */
933int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
934{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200935 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
936 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200937 uint16_t bvci = msgb_bvci(msg);
938 uint16_t nsei = msgb_nsei(msg);
939
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200940 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200941
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200942 if (!real_gprs_ns_sendmsg)
943 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
944
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200945 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200946 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
947 "msg length %d (%s)\n",
948 bvci, len, __func__);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200949 else if (nsei == SGSN2_NSEI)
950 printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
951 "msg length %d (%s)\n",
952 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200953 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200954 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
955 "msg length %d (%s)\n",
956 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200957
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200958 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200959}
960
961static void dump_rate_ctr_group(FILE *stream, const char *prefix,
962 struct rate_ctr_group *ctrg)
963{
964 unsigned int i;
965
966 for (i = 0; i < ctrg->desc->num_ctr; i++) {
967 struct rate_ctr *ctr = &ctrg->ctr[i];
968 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
969 fprintf(stream, " %s%s: %llu%s",
970 prefix, ctrg->desc->ctr_desc[i].description,
971 (long long)ctr->current,
972 "\n");
973 };
974}
975
976/* Signal handler for signals from NS layer */
977static int test_signal(unsigned int subsys, unsigned int signal,
978 void *handler_data, void *signal_data)
979{
980 struct ns_signal_data *nssd = signal_data;
981 int rc;
982
983 if (subsys != SS_L_NS)
984 return 0;
985
986 switch (signal) {
987 case S_NS_RESET:
988 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
989 nssd->nsvc->nsvci,
990 gprs_ns_ll_str(nssd->nsvc));
991 break;
992
993 case S_NS_ALIVE_EXP:
994 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
995 nssd->nsvc->nsvci,
996 gprs_ns_ll_str(nssd->nsvc));
997 break;
998
999 case S_NS_BLOCK:
1000 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
1001 nssd->nsvc->nsvci,
1002 gprs_ns_ll_str(nssd->nsvc));
1003 break;
1004
1005 case S_NS_UNBLOCK:
1006 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
1007 nssd->nsvc->nsvci,
1008 gprs_ns_ll_str(nssd->nsvc));
1009 break;
1010
1011 case S_NS_REPLACED:
1012 printf("==> got signal NS_REPLACED: 0x%04x/%s",
1013 nssd->nsvc->nsvci,
1014 gprs_ns_ll_str(nssd->nsvc));
1015 printf(" -> 0x%04x/%s\n",
1016 nssd->old_nsvc->nsvci,
1017 gprs_ns_ll_str(nssd->old_nsvc));
1018 break;
1019
1020 default:
1021 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
1022 nssd->nsvc->nsvci,
1023 gprs_ns_ll_str(nssd->nsvc));
1024 break;
1025 }
1026 printf("\n");
1027 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
1028 return rc;
1029}
1030
1031static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
1032{
1033 struct msgb *msg;
1034 int ret;
1035 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
1036 fprintf(stderr, "message too long: %d\n", data_len);
1037 return -1;
1038 }
1039
1040 msg = gprs_ns_msgb_alloc();
1041 memmove(msg->data, data, data_len);
1042 msg->l2h = msg->data;
1043 msgb_put(msg, data_len);
1044
1045 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
1046 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1047 osmo_hexdump(data, data_len));
1048
1049 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
1050
1051 printf("result (%s) = %d\n\n", text, ret);
1052
1053 msgb_free(msg);
1054
1055 return ret;
1056}
1057
1058static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
1059{
1060 struct gprs_nsvc *nsvc;
1061
1062 printf("Current NS-VCIs:\n");
1063 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
1064 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001065 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001066 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001067 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1068 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
1069 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001070 );
1071 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
1072 }
1073 printf("\n");
1074}
1075
1076static void test_gbproxy()
1077{
1078 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1079 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001080 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001081
1082 bssgp_nsi = nsi;
1083 gbcfg.nsi = bssgp_nsi;
1084 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1085
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001086 configure_sgsn_peer(&sgsn_peer);
1087 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001088
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001089 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001090 printf("--- Initialise SGSN ---\n\n");
1091
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001092 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001093 gprs_dump_nsi(nsi);
1094
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001095 printf("--- Initialise BSS 1 ---\n\n");
1096
1097 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1098 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1099 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001100 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001101
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001102 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1103
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001104 printf("--- Initialise BSS 2 ---\n\n");
1105
1106 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
1107 setup_bssgp(nsi, &bss_peer[1], 0x2002);
1108 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001109 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001110
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001111 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
1112
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001113 printf("--- Move BSS 1 to new port ---\n\n");
1114
1115 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
1116 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001117 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001118
1119 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1120
1121 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1122 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001123 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001124
1125 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
1126
1127 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1128 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001129 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001130
1131 printf("--- Move BSS 2 to new port ---\n\n");
1132
1133 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
1134 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001135 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001136
1137 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1138
1139 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
1140 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001141 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001142
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001143 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
1144
1145 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1146 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001147 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001148
1149 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1150
1151 setup_bssgp(nsi, &bss_peer[0], 0x1012);
1152 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001153 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001154
1155 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
1156
1157 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1158
1159 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1160 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001161 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001162
1163 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1164
1165 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1166
1167 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1168 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001169 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001170
1171 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1172
1173 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1174
1175 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1176
1177 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1178
1179 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1180
1181 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1182
1183 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1184
1185 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1186
1187 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1188
1189 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1190
1191 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
1192
1193 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1194
1195 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
1196
1197 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1198
1199 setup_bssgp(nsi, &bss_peer[2], 0x1002);
1200 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001201 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001202
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001203 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001204
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001205 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1206
1207 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1208
1209 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1210
1211 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1212
1213 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1214
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001215 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1216
1217 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
1218
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001219 /* Find peer */
1220 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1221 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1222 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1223 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1224 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1225 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1226
1227
1228 /* Cleanup */
1229 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1230 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1231 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1232 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1233 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1234
1235 dump_peers(stdout, 0, 0, &gbcfg);
1236
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001237 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001238
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001239 gbprox_reset(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001240 gprs_ns_destroy(nsi);
1241 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001242}
1243
1244static void test_gbproxy_ident_changes()
1245{
1246 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1247 struct sockaddr_in bss_peer[1] = {{0},};
1248 struct sockaddr_in sgsn_peer= {0};
1249 uint16_t nsei[2] = {0x1000, 0x2000};
1250 uint16_t nsvci[2] = {0x1001, 0x2001};
1251 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
1252
1253 bssgp_nsi = nsi;
1254 gbcfg.nsi = bssgp_nsi;
1255 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1256
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001257 configure_sgsn_peer(&sgsn_peer);
1258 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001259
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001260 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001261 printf("--- Initialise SGSN ---\n\n");
1262
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001263 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001264 gprs_dump_nsi(nsi);
1265
1266 printf("--- Initialise BSS 1 ---\n\n");
1267
1268 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
1269 gprs_dump_nsi(nsi);
1270
1271 printf("--- Setup BVCI 1 ---\n\n");
1272
1273 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1274 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001275 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001276
1277 printf("--- Setup BVCI 2 ---\n\n");
1278
1279 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
1280 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001281 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001282
1283 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1284
1285 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1286 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1287
1288 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1289
1290 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
1291 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
1292
1293 printf("--- Change NSEI ---\n\n");
1294
1295 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
1296 gprs_dump_nsi(nsi);
1297
1298 printf("--- Setup BVCI 1 ---\n\n");
1299
1300 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1301 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001302 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001303
1304 printf("--- Setup BVCI 3 ---\n\n");
1305
1306 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
1307 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001308 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001309
1310 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1311
1312 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1313 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1314
1315 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1316 " (should fail) ---\n\n");
1317
1318 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001319 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001320 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001321 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001322
1323 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1324
1325 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1326 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1327
1328 printf("--- Change NSVCI ---\n\n");
1329
1330 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
1331 gprs_dump_nsi(nsi);
1332
1333 printf("--- Setup BVCI 1 ---\n\n");
1334
1335 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1336 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001337 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001338
1339 printf("--- Setup BVCI 4 ---\n\n");
1340
1341 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
1342 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001343 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001344
1345 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1346
1347 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1348 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1349
1350 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1351 " (should fail) ---\n\n");
1352
1353 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001354 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001355 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001356 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001357
1358 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1359
1360 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1361 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1362
1363 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
1364
1365 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
1366 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
1367
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001368 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001369 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001370
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001371 gbprox_reset(&gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001372 gprs_ns_destroy(nsi);
1373 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001374}
1375
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001376static void test_gbproxy_ra_patching()
1377{
1378 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1379 struct sockaddr_in bss_peer[1] = {{0},};
1380 struct sockaddr_in sgsn_peer= {0};
1381 struct gprs_ra_id rai_bss =
1382 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1383 struct gprs_ra_id rai_sgsn =
1384 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1385 struct gprs_ra_id rai_unknown =
1386 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001387 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001388 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001389 const uint32_t ptmsi = 0xefe2b700;
1390 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001391 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001392 const uint32_t foreign_tlli2 = 0xbb00beef;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001393 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001394 struct gbproxy_link_info *link_info;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001395 struct gbproxy_peer *peer;
1396
1397 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001398
1399 bssgp_nsi = nsi;
1400 gbcfg.nsi = bssgp_nsi;
1401 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Jacob Erlbeck67a44452014-05-19 10:14:58 +02001402 gbcfg.core_mcc = 123;
1403 gbcfg.core_mnc = 456;
Jacob Erlbeck73685282014-05-23 20:48:07 +02001404 gbcfg.core_apn = talloc_zero_size(NULL, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001405 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001406 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001407
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001408 configure_sgsn_peer(&sgsn_peer);
1409 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001410
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001411 gbcfg.match_re = talloc_strdup(NULL, "^9898|^121314");
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02001412 if (gbproxy_set_patch_filter(&gbcfg, gbcfg.match_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001413 fprintf(stderr, "Failed to compile RE '%s': %s\n",
1414 gbcfg.match_re, err_msg);
1415 exit(1);
1416 }
1417
1418
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001419 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001420 printf("--- Initialise SGSN ---\n\n");
1421
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001422 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001423 gprs_dump_nsi(nsi);
1424
1425 printf("--- Initialise BSS 1 ---\n\n");
1426
1427 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1428 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1429 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001430 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001431
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001432 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001433 OSMO_ASSERT(peer != NULL);
1434
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001435 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1436
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001437 send_bssgp_suspend(nsi, &bss_peer[0], 0xccd1758b, &rai_bss);
1438 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001439
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001440 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001441 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001442
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001443 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1444 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1445
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001446 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1447
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001448 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1449 foreign_tlli, &rai_bss, cell_id,
1450 GPRS_SAPI_GMM, 0,
1451 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001452
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001453 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1454
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001455 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1456 foreign_tlli, 0, NULL, 0,
1457 GPRS_SAPI_GMM, 0,
1458 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001459
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001460 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1461 foreign_tlli, &rai_bss, cell_id,
1462 GPRS_SAPI_GMM, 3,
1463 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001464
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001465 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1466 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1467
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001468 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1469 foreign_tlli, 1, imsi, sizeof(imsi),
1470 GPRS_SAPI_GMM, 1,
1471 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001472
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001473 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1474
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001475 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1476 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1477 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1478
1479 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1480 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1481 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1482
1483 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1484 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1485 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1486
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001487 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1488 OSMO_ASSERT(link_info);
1489 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1490 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1491 OSMO_ASSERT(!link_info->tlli.bss_validated);
1492 OSMO_ASSERT(!link_info->tlli.net_validated);
1493 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1494 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1495 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1496 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001497
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001498 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1499 local_tlli, &rai_bss, cell_id,
1500 GPRS_SAPI_GMM, 4,
1501 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001502
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001503 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1504
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001505 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1506 OSMO_ASSERT(link_info);
1507 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1508 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1509 OSMO_ASSERT(link_info->tlli.bss_validated);
1510 OSMO_ASSERT(!link_info->tlli.net_validated);
1511 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1512 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1513 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1514 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001515
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001516 /* Replace APN (1) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001517 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1518 local_tlli, &rai_bss, cell_id,
1519 GPRS_SAPI_GMM, 3,
1520 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001521
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001522 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1523
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001524 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1525 OSMO_ASSERT(link_info);
1526 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1527 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1528 OSMO_ASSERT(link_info->tlli.bss_validated);
1529 OSMO_ASSERT(!link_info->tlli.net_validated);
1530 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1531 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1532 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1533 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001534
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001535 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1536 local_tlli, 1, imsi, sizeof(imsi),
1537 GPRS_SAPI_GMM, 2,
1538 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001539
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001540 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1541
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001542 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1543 OSMO_ASSERT(link_info);
1544 OSMO_ASSERT(link_info->tlli.assigned == 0);
1545 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1546 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1547 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001548
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001549 /* Replace APN (2) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001550 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1551 local_tlli, &rai_bss, cell_id,
1552 GPRS_SAPI_GMM, 3,
1553 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001554
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001555 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1556
Jacob Erlbeck73685282014-05-23 20:48:07 +02001557 gbcfg.core_apn[0] = 0;
1558 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001559
1560 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001561 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1562 local_tlli, &rai_bss, cell_id,
1563 GPRS_SAPI_GMM, 3,
1564 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001565
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001566 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1567
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001568 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001569
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001570 /* Detach */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001571 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1572 local_tlli, &rai_bss, cell_id,
1573 GPRS_SAPI_GMM, 6,
1574 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001575
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001576 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1577 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1578
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001579 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1580 local_tlli, 1, imsi, sizeof(imsi),
1581 GPRS_SAPI_GMM, 5,
1582 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001583
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001584 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001585
1586 printf("--- RA update ---\n\n");
1587
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001588 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
1589 foreign_tlli, &rai_bss, 0x7080,
1590 GPRS_SAPI_GMM, 5,
1591 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001592
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001593 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1594
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001595 send_llc_dl_ui(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
1596 foreign_tlli, 1, imsi, sizeof(imsi),
1597 GPRS_SAPI_GMM, 6,
1598 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001599
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001600 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1601
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001602 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001603 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1604 local_tlli, &rai_bss, cell_id,
1605 GPRS_SAPI_GMM, 3,
1606 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001607
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001608 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1609
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001610 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001611
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001612 /* Detach (power off -> no Detach Accept) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001613 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", &bss_peer[0], 0x1002,
1614 local_tlli, &rai_bss, cell_id,
1615 GPRS_SAPI_GMM, 6,
1616 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001617
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001618 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1619
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001620 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001621 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001622
1623 printf("--- Bad cases ---\n\n");
1624
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001625 /* The RAI in the Attach Request message differs from the RAI in the
1626 * BSSGP message, only patch the latter */
1627
1628 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", &bss_peer[0], 0x1002,
1629 foreign_tlli2, &rai_bss, cell_id,
1630 GPRS_SAPI_GMM, 0,
1631 dtap_attach_req2, sizeof(dtap_attach_req2));
1632
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001633 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1634
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001635 printf("TLLI is already detached, shouldn't patch\n");
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001636 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", &bss_peer[0], 0x1002,
1637 local_tlli, &rai_bss, cell_id,
1638 GPRS_SAPI_GMM, 3,
1639 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001640
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001641 printf("Invalid RAI, shouldn't patch\n");
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001642 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001643
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001644 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001645 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001646
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001647 gbprox_reset(&gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001648 gprs_ns_destroy(nsi);
1649 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001650}
1651
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001652static void test_gbproxy_ptmsi_assignment()
1653{
1654 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1655 struct sockaddr_in bss_peer[1] = {{0},};
1656 struct sockaddr_in sgsn_peer= {0};
1657 struct gprs_ra_id rai_bss =
1658 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1659 struct gprs_ra_id rai_unknown =
1660 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1661 uint16_t cell_id = 0x1234;
1662
1663 const uint32_t ptmsi = 0xefe2b700;
1664 const uint32_t local_tlli = 0xefe2b700;
1665
1666 const uint32_t foreign_tlli1 = 0x8000dead;
1667 const uint32_t foreign_tlli2 = 0x8000beef;
1668
1669 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
1670 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
1671
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001672 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001673 struct gbproxy_peer *peer;
1674 unsigned bss_nu = 0;
1675 unsigned sgsn_nu = 0;
1676
1677 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
1678
1679 bssgp_nsi = nsi;
1680 gbcfg.nsi = bssgp_nsi;
1681 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1682 gbcfg.core_mcc = 0;
1683 gbcfg.core_mnc = 0;
1684 gbcfg.core_apn = talloc_zero_size(NULL, 100);
1685 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1686 gbcfg.patch_ptmsi = 0;
1687 gbcfg.bss_ptmsi_state = 0;
1688 gbcfg.sgsn_tlli_state = 1;
1689
1690 configure_sgsn_peer(&sgsn_peer);
1691 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
1692
1693 printf("=== %s ===\n", __func__);
1694 printf("--- Initialise SGSN ---\n\n");
1695
1696 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
1697
1698 printf("--- Initialise BSS 1 ---\n\n");
1699
1700 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1701 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1702
1703 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
1704 OSMO_ASSERT(peer != NULL);
1705
1706 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1707
1708 gprs_dump_nsi(nsi);
1709 dump_global(stdout, 0);
1710 dump_peers(stdout, 0, 0, &gbcfg);
1711
1712 printf("--- Establish first LLC connection ---\n\n");
1713
1714 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1715 foreign_tlli1, &rai_unknown, cell_id,
1716 GPRS_SAPI_GMM, bss_nu++,
1717 dtap_attach_req, sizeof(dtap_attach_req));
1718
1719 dump_peers(stdout, 0, 0, &gbcfg);
1720
1721 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1722 foreign_tlli1, 0, NULL, 0,
1723 GPRS_SAPI_GMM, sgsn_nu++,
1724 dtap_identity_req, sizeof(dtap_identity_req));
1725
1726 dump_peers(stdout, 0, 0, &gbcfg);
1727
1728 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1729 foreign_tlli1, &rai_bss, cell_id,
1730 GPRS_SAPI_GMM, bss_nu++,
1731 dtap_identity_resp, sizeof(dtap_identity_resp));
1732
1733 dump_peers(stdout, 0, 0, &gbcfg);
1734
1735 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1736 foreign_tlli1, 1, imsi1, sizeof(imsi1),
1737 GPRS_SAPI_GMM, sgsn_nu++,
1738 dtap_attach_acc, sizeof(dtap_attach_acc));
1739
1740 dump_peers(stdout, 0, 0, &gbcfg);
1741
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001742 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
1743 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1744 OSMO_ASSERT(link_info);
1745 OSMO_ASSERT(link_info == link_info2);
1746 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1747 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
1748 OSMO_ASSERT(!link_info->tlli.bss_validated);
1749 OSMO_ASSERT(!link_info->tlli.net_validated);
1750 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001751
1752 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1753 local_tlli, &rai_bss, cell_id,
1754 GPRS_SAPI_GMM, bss_nu++,
1755 dtap_attach_complete, sizeof(dtap_attach_complete));
1756
1757 dump_peers(stdout, 0, 0, &gbcfg);
1758
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001759 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
1760 OSMO_ASSERT(link_info);
1761 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1762 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
1763 OSMO_ASSERT(link_info->tlli.bss_validated);
1764 OSMO_ASSERT(!link_info->tlli.net_validated);
1765 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001766
1767
1768 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1769 local_tlli, 1, imsi1, sizeof(imsi1),
1770 GPRS_SAPI_GMM, sgsn_nu++,
1771 dtap_gmm_information, sizeof(dtap_gmm_information));
1772
1773 dump_peers(stdout, 0, 0, &gbcfg);
1774
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001775 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
1776 OSMO_ASSERT(link_info);
1777 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
1778 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001779
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001780 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1781 OSMO_ASSERT(link_info == link_info2);
1782 OSMO_ASSERT(link_info->tlli.assigned == 0);
1783 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1784 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001785
1786 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
1787
1788 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1789 foreign_tlli2, &rai_unknown, cell_id,
1790 GPRS_SAPI_GMM, bss_nu++,
1791 dtap_attach_req, sizeof(dtap_attach_req));
1792
1793 dump_peers(stdout, 0, 0, &gbcfg);
1794
1795 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1796 foreign_tlli2, 0, NULL, 0,
1797 GPRS_SAPI_GMM, sgsn_nu++,
1798 dtap_identity_req, sizeof(dtap_identity_req));
1799
1800 dump_peers(stdout, 0, 0, &gbcfg);
1801
1802 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1803 foreign_tlli2, &rai_bss, cell_id,
1804 GPRS_SAPI_GMM, bss_nu++,
1805 dtap_identity2_resp, sizeof(dtap_identity2_resp));
1806
1807 dump_peers(stdout, 0, 0, &gbcfg);
1808
1809 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1810 foreign_tlli2, 1, imsi2, sizeof(imsi2),
1811 GPRS_SAPI_GMM, sgsn_nu++,
1812 dtap_attach_acc, sizeof(dtap_attach_acc));
1813
1814 dump_peers(stdout, 0, 0, &gbcfg);
1815
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001816 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
1817 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1818 OSMO_ASSERT(link_info);
1819 OSMO_ASSERT(link_info == link_info2);
1820 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1821 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
1822 OSMO_ASSERT(!link_info->tlli.bss_validated);
1823 OSMO_ASSERT(!link_info->tlli.net_validated);
1824 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001825
1826 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1827 local_tlli, &rai_bss, cell_id,
1828 GPRS_SAPI_GMM, bss_nu++,
1829 dtap_attach_complete, sizeof(dtap_attach_complete));
1830
1831 dump_peers(stdout, 0, 0, &gbcfg);
1832
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001833 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
1834 OSMO_ASSERT(link_info);
1835 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1836 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
1837 OSMO_ASSERT(link_info->tlli.bss_validated);
1838 OSMO_ASSERT(!link_info->tlli.net_validated);
1839 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001840
1841 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1842 local_tlli, 1, imsi2, sizeof(imsi2),
1843 GPRS_SAPI_GMM, sgsn_nu++,
1844 dtap_gmm_information, sizeof(dtap_gmm_information));
1845
1846 dump_peers(stdout, 0, 0, &gbcfg);
1847
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001848 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
1849 OSMO_ASSERT(link_info);
1850 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
1851 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001852
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001853 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1854 OSMO_ASSERT(link_info == link_info2);
1855 OSMO_ASSERT(link_info->tlli.assigned == 0);
1856 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1857 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001858
1859 dump_global(stdout, 0);
1860
1861 gbprox_reset(&gbcfg);
1862 gprs_ns_destroy(nsi);
1863 nsi = NULL;
1864}
1865
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001866static void test_gbproxy_ptmsi_patching()
1867{
1868 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1869 struct sockaddr_in bss_peer[1] = {{0},};
1870 struct sockaddr_in sgsn_peer= {0};
1871 struct gprs_ra_id rai_bss =
1872 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1873 struct gprs_ra_id rai_sgsn =
1874 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001875 struct gprs_ra_id rai_wrong_mcc_sgsn =
1876 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001877 struct gprs_ra_id rai_unknown =
1878 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1879 uint16_t cell_id = 0x1234;
1880
1881 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001882 const uint32_t sgsn_ptmsi2 = 0xe0987654;
1883 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001884 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001885 const uint32_t local_sgsn_tlli2 = 0xe0987654;
1886 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001887 const uint32_t random_sgsn_tlli = 0x7c69fb81;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001888 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001889
1890 const uint32_t bss_ptmsi = 0xc00f7304;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001891 const uint32_t bss_ptmsi2 = 0xe656aa1f;
1892 const uint32_t bss_ptmsi3 = 0xead4775a;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001893 const uint32_t local_bss_tlli = 0xc00f7304;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001894 const uint32_t local_bss_tlli2 = 0xe656aa1f;
1895 const uint32_t local_bss_tlli3 = 0xead4775a;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001896 const uint32_t foreign_bss_tlli = 0x8000dead;
1897
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001898
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001899 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001900 struct gbproxy_link_info *link_info;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001901 struct gbproxy_peer *peer;
1902 unsigned bss_nu = 0;
1903 unsigned sgsn_nu = 0;
1904
1905 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001906 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
1907 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
1908 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
1909 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
1910 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001911
1912 bssgp_nsi = nsi;
1913 gbcfg.nsi = bssgp_nsi;
1914 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1915 gbcfg.core_mcc = 123;
1916 gbcfg.core_mnc = 456;
1917 gbcfg.core_apn = talloc_zero_size(NULL, 100);
1918 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1919 gbcfg.patch_ptmsi = 1;
1920 gbcfg.bss_ptmsi_state = 0;
1921 gbcfg.sgsn_tlli_state = 1;
1922
1923 configure_sgsn_peer(&sgsn_peer);
1924 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
1925
1926 printf("=== %s ===\n", __func__);
1927 printf("--- Initialise SGSN ---\n\n");
1928
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001929 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001930
1931 printf("--- Initialise BSS 1 ---\n\n");
1932
1933 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1934 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1935
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001936 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001937 OSMO_ASSERT(peer != NULL);
1938
1939 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1940
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001941 gprs_dump_nsi(nsi);
1942 dump_global(stdout, 0);
1943 dump_peers(stdout, 0, 0, &gbcfg);
1944
1945 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1946
1947 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1948 foreign_bss_tlli, &rai_unknown, cell_id,
1949 GPRS_SAPI_GMM, bss_nu++,
1950 dtap_attach_req, sizeof(dtap_attach_req));
1951
1952 dump_peers(stdout, 0, 0, &gbcfg);
1953
1954 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1955 random_sgsn_tlli, 0, NULL, 0,
1956 GPRS_SAPI_GMM, sgsn_nu++,
1957 dtap_identity_req, sizeof(dtap_identity_req));
1958
1959 dump_peers(stdout, 0, 0, &gbcfg);
1960
1961 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1962 foreign_bss_tlli, &rai_bss, cell_id,
1963 GPRS_SAPI_GMM, bss_nu++,
1964 dtap_identity_resp, sizeof(dtap_identity_resp));
1965
1966 dump_peers(stdout, 0, 0, &gbcfg);
1967
1968 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1969 random_sgsn_tlli, 1, imsi, sizeof(imsi),
1970 GPRS_SAPI_GMM, sgsn_nu++,
1971 dtap_attach_acc, sizeof(dtap_attach_acc));
1972
1973 dump_peers(stdout, 0, 0, &gbcfg);
1974
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001975 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
1976 OSMO_ASSERT(link_info);
1977 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
1978 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
1979 OSMO_ASSERT(!link_info->tlli.bss_validated);
1980 OSMO_ASSERT(!link_info->tlli.net_validated);
1981 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
1982 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
1983 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
1984 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1985 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
1986 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001987
1988 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1989 local_bss_tlli, &rai_bss, cell_id,
1990 GPRS_SAPI_GMM, bss_nu++,
1991 dtap_attach_complete, sizeof(dtap_attach_complete));
1992
1993 dump_peers(stdout, 0, 0, &gbcfg);
1994
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001995 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
1996 OSMO_ASSERT(link_info);
1997 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
1998 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
1999 OSMO_ASSERT(link_info->tlli.bss_validated);
2000 OSMO_ASSERT(!link_info->tlli.net_validated);
2001 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2002 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2003 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2004 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002005
2006 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2007 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2008 GPRS_SAPI_GMM, sgsn_nu++,
2009 dtap_gmm_information, sizeof(dtap_gmm_information));
2010
2011 dump_peers(stdout, 0, 0, &gbcfg);
2012
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002013 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2014 OSMO_ASSERT(link_info);
2015 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2016 OSMO_ASSERT(link_info->tlli.assigned == 0);
2017 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2018 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002019
Jacob Erlbeck82add782014-09-05 18:08:12 +02002020 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
2021 local_bss_tlli, &rai_bss, cell_id,
2022 GPRS_SAPI_GMM, bss_nu++,
2023 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2024
2025 dump_peers(stdout, 0, 0, &gbcfg);
2026
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002027 /* Non-DTAP */
2028 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2029 local_bss_tlli, &rai_bss, cell_id,
2030 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2031
2032 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2033 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2034 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2035
2036 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2037 local_bss_tlli, &rai_bss, cell_id,
2038 llc_ui_ll11_dns_query_ul,
2039 sizeof(llc_ui_ll11_dns_query_ul));
2040
2041 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2042 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2043 llc_ui_ll11_dns_resp_dl,
2044 sizeof(llc_ui_ll11_dns_resp_dl));
2045
2046 dump_peers(stdout, 0, 0, &gbcfg);
2047
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002048 /* Repeated RA Update Requests */
2049 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", &bss_peer[0], 0x1002,
2050 local_bss_tlli, &rai_bss, 0x7080,
2051 GPRS_SAPI_GMM, bss_nu++,
2052 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2053
2054 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", &sgsn_peer, 0x1002,
2055 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2056 GPRS_SAPI_GMM, sgsn_nu++,
2057 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2058
2059 dump_peers(stdout, 0, 0, &gbcfg);
2060
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002061 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2062 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2063 OSMO_ASSERT(link_info);
2064 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2065 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2066 OSMO_ASSERT(!link_info->tlli.bss_validated);
2067 OSMO_ASSERT(!link_info->tlli.net_validated);
2068 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2069 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2070 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2071 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2072 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2073 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002074
2075 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", &bss_peer[0], 0x1002,
2076 local_bss_tlli2, &rai_bss, 0x7080,
2077 GPRS_SAPI_GMM, bss_nu++,
2078 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2079
2080 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", &sgsn_peer, 0x1002,
2081 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2082 GPRS_SAPI_GMM, sgsn_nu++,
2083 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2084
2085 dump_peers(stdout, 0, 0, &gbcfg);
2086
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002087 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2088 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI) != NULL);
2089 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2090 OSMO_ASSERT(link_info);
2091 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2092 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2093 OSMO_ASSERT(!link_info->tlli.bss_validated);
2094 OSMO_ASSERT(!link_info->tlli.net_validated);
2095 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2096 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2097 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2098 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2099 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2100 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002101
2102 send_llc_ul_ui(nsi, "RA UPD COMPLETE", &bss_peer[0], 0x1002,
2103 local_bss_tlli3, &rai_bss, 0x7080,
2104 GPRS_SAPI_GMM, bss_nu++,
2105 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2106
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002107 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002108
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002109 OSMO_ASSERT(link_info);
2110 OSMO_ASSERT(link_info->tlli.bss_validated);
2111 OSMO_ASSERT(!link_info->tlli.net_validated);
2112 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2113 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002114
2115 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2116 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2117 GPRS_SAPI_GMM, sgsn_nu++,
2118 dtap_gmm_information, sizeof(dtap_gmm_information));
2119
2120 dump_peers(stdout, 0, 0, &gbcfg);
2121
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002122 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2123 OSMO_ASSERT(link_info);
2124 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2125 OSMO_ASSERT(link_info->tlli.assigned == 0);
2126 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2127 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002128
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002129 /* Other messages */
2130 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002131 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002132
2133 dump_peers(stdout, 0, 0, &gbcfg);
2134
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002135 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002136
2137 dump_peers(stdout, 0, 0, &gbcfg);
2138
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002139 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002140
2141 dump_peers(stdout, 0, 0, &gbcfg);
2142
2143 /* Bad case: Invalid BVCI */
2144 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002145 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002146 dump_global(stdout, 0);
2147
2148 /* Bad case: Invalid RAI */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002149 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002150
2151 dump_global(stdout, 0);
2152
2153 /* Bad case: Invalid MCC (LAC ok) */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002154 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002155 &rai_wrong_mcc_sgsn);
2156
2157 dump_global(stdout, 0);
2158
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002159 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
2160 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2161 unknown_sgsn_tlli, 1, NULL, 0,
2162 GPRS_SAPI_GMM, 2,
2163 dtap_gmm_information, sizeof(dtap_gmm_information));
2164
2165 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
2166 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2167 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2168 GPRS_SAPI_GMM, 3,
2169 dtap_gmm_information, sizeof(dtap_gmm_information));
2170
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002171 /* Detach */
2172 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002173 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002174 GPRS_SAPI_GMM, bss_nu++,
2175 dtap_detach_req, sizeof(dtap_detach_req));
2176
2177 dump_peers(stdout, 0, 0, &gbcfg);
2178
2179 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002180 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002181 GPRS_SAPI_GMM, sgsn_nu++,
2182 dtap_detach_acc, sizeof(dtap_detach_acc));
2183
2184 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002185
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002186 dump_global(stdout, 0);
2187
2188 gbprox_reset(&gbcfg);
2189 gprs_ns_destroy(nsi);
2190 nsi = NULL;
2191}
2192
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002193static void test_gbproxy_imsi_acquisition()
2194{
2195 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2196 struct sockaddr_in bss_peer[1] = {{0},};
2197 struct sockaddr_in sgsn_peer= {0};
2198 struct gprs_ra_id rai_bss =
2199 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2200 struct gprs_ra_id rai_sgsn =
2201 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2202 struct gprs_ra_id rai_wrong_mcc_sgsn =
2203 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2204 struct gprs_ra_id rai_unknown =
2205 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2206 uint16_t cell_id = 0x1234;
2207
2208 const uint32_t sgsn_ptmsi = 0xefe2b700;
2209 const uint32_t local_sgsn_tlli = 0xefe2b700;
2210 const uint32_t random_sgsn_tlli = 0x7c69fb81;
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002211 const uint32_t random_sgsn_tlli2 = 0x7eb52dfb;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002212
2213 const uint32_t bss_ptmsi = 0xc00f7304;
2214 const uint32_t local_bss_tlli = 0xc00f7304;
2215 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002216 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002217
2218 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002219 struct gbproxy_link_info *link_info;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002220 struct gbproxy_peer *peer;
2221 unsigned bss_nu = 0;
2222 unsigned sgsn_nu = 0;
2223
2224 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2225
2226 bssgp_nsi = nsi;
2227 gbcfg.nsi = bssgp_nsi;
2228 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2229 gbcfg.core_mcc = 123;
2230 gbcfg.core_mnc = 456;
2231 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2232 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2233 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002234 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002235 gbcfg.bss_ptmsi_state = 0;
2236 gbcfg.sgsn_tlli_state = 1;
2237
2238 configure_sgsn_peer(&sgsn_peer);
2239 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2240
2241 printf("=== %s ===\n", __func__);
2242 printf("--- Initialise SGSN ---\n\n");
2243
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002244 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002245
2246 printf("--- Initialise BSS 1 ---\n\n");
2247
2248 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2249 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2250
2251 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2252 OSMO_ASSERT(peer != NULL);
2253
2254 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2255
2256 gprs_dump_nsi(nsi);
2257 dump_global(stdout, 0);
2258 dump_peers(stdout, 0, 0, &gbcfg);
2259
2260 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2261
2262 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002263 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002264 GPRS_SAPI_GMM, bss_nu++,
2265 dtap_attach_req, sizeof(dtap_attach_req));
2266
2267 dump_peers(stdout, 0, 0, &gbcfg);
2268
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002269 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2270 foreign_bss_tlli, &rai_bss, cell_id,
2271 GPRS_SAPI_GMM, bss_nu++,
2272 dtap_identity_resp, sizeof(dtap_identity_resp));
2273
2274 dump_peers(stdout, 0, 0, &gbcfg);
2275
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002276 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2277 random_sgsn_tlli, 0, NULL, 0,
2278 GPRS_SAPI_GMM, sgsn_nu++,
2279 dtap_identity_req, sizeof(dtap_identity_req));
2280
2281 dump_peers(stdout, 0, 0, &gbcfg);
2282
2283 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2284 foreign_bss_tlli, &rai_bss, cell_id,
2285 GPRS_SAPI_GMM, bss_nu++,
2286 dtap_identity_resp, sizeof(dtap_identity_resp));
2287
2288 dump_peers(stdout, 0, 0, &gbcfg);
2289
2290 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2291 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2292 GPRS_SAPI_GMM, sgsn_nu++,
2293 dtap_attach_acc, sizeof(dtap_attach_acc));
2294
2295 dump_peers(stdout, 0, 0, &gbcfg);
2296
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002297 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2298 OSMO_ASSERT(link_info);
2299 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2300 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2301 OSMO_ASSERT(!link_info->tlli.bss_validated);
2302 OSMO_ASSERT(!link_info->tlli.net_validated);
2303 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2304 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2305 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2306 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2307 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2308 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002309
2310 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2311 local_bss_tlli, &rai_bss, cell_id,
2312 GPRS_SAPI_GMM, bss_nu++,
2313 dtap_attach_complete, sizeof(dtap_attach_complete));
2314
2315 dump_peers(stdout, 0, 0, &gbcfg);
2316
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002317 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2318 OSMO_ASSERT(link_info);
2319 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2320 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2321 OSMO_ASSERT(link_info->tlli.bss_validated);
2322 OSMO_ASSERT(!link_info->tlli.net_validated);
2323 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2324 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2325 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2326 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002327
2328 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2329 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2330 GPRS_SAPI_GMM, sgsn_nu++,
2331 dtap_gmm_information, sizeof(dtap_gmm_information));
2332
2333 dump_peers(stdout, 0, 0, &gbcfg);
2334
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002335 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2336 OSMO_ASSERT(link_info);
2337 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2338 OSMO_ASSERT(link_info->tlli.assigned == 0);
2339 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2340 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002341
2342 /* Non-DTAP */
2343 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2344 local_bss_tlli, &rai_bss, cell_id,
2345 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2346
2347 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2348 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2349 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2350
2351 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2352 local_bss_tlli, &rai_bss, cell_id,
2353 llc_ui_ll11_dns_query_ul,
2354 sizeof(llc_ui_ll11_dns_query_ul));
2355
2356 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2357 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2358 llc_ui_ll11_dns_resp_dl,
2359 sizeof(llc_ui_ll11_dns_resp_dl));
2360
2361 dump_peers(stdout, 0, 0, &gbcfg);
2362
2363 /* Other messages */
2364 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2365 local_bss_tlli, 1, 12);
2366
2367 dump_peers(stdout, 0, 0, &gbcfg);
2368
2369 send_bssgp_llc_discarded(nsi, &sgsn_peer, 0x1002,
2370 local_sgsn_tlli, 1, 12);
2371
2372 dump_peers(stdout, 0, 0, &gbcfg);
2373
2374 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2375
2376 dump_peers(stdout, 0, 0, &gbcfg);
2377
2378 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_sgsn);
2379
2380 dump_peers(stdout, 0, 0, &gbcfg);
2381
2382 /* Bad case: Invalid BVCI */
2383 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
2384 local_bss_tlli, 1, 12);
2385 dump_global(stdout, 0);
2386
2387 /* Bad case: Invalid RAI */
2388 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_unknown);
2389
2390 dump_global(stdout, 0);
2391
2392 /* Bad case: Invalid MCC (LAC ok) */
2393 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli,
2394 &rai_wrong_mcc_sgsn);
2395
2396 dump_global(stdout, 0);
2397
2398 /* Detach */
2399 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2400 local_bss_tlli, &rai_bss, cell_id,
2401 GPRS_SAPI_GMM, bss_nu++,
2402 dtap_detach_req, sizeof(dtap_detach_req));
2403
2404 dump_peers(stdout, 0, 0, &gbcfg);
2405
2406 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2407 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2408 GPRS_SAPI_GMM, sgsn_nu++,
2409 dtap_detach_acc, sizeof(dtap_detach_acc));
2410
2411 dump_peers(stdout, 0, 0, &gbcfg);
2412
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002413 /* RA Update request */
2414
2415 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2416 foreign_bss_tlli, &rai_unknown, 0x7080,
2417 GPRS_SAPI_GMM, bss_nu++,
2418 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2419
2420 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2421 foreign_bss_tlli, &rai_bss, cell_id,
2422 GPRS_SAPI_GMM, bss_nu++,
2423 dtap_identity_resp, sizeof(dtap_identity_resp));
2424
2425 dump_peers(stdout, 0, 0, &gbcfg);
2426
2427 send_llc_dl_ui(nsi, "RA UDP ACC", &sgsn_peer, 0x1002,
2428 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2429 GPRS_SAPI_GMM, sgsn_nu++,
2430 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2431
2432 dump_peers(stdout, 0, 0, &gbcfg);
2433
2434 /* Detach */
2435
2436 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2437 local_bss_tlli, &rai_bss, cell_id,
2438 GPRS_SAPI_GMM, bss_nu++,
2439 dtap_detach_req, sizeof(dtap_detach_req));
2440
2441 dump_peers(stdout, 0, 0, &gbcfg);
2442
2443 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2444 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2445 GPRS_SAPI_GMM, sgsn_nu++,
2446 dtap_detach_acc, sizeof(dtap_detach_acc));
2447
2448 dump_peers(stdout, 0, 0, &gbcfg);
2449
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002450 /* Special case: Repeated Attach Requests */
2451
2452 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2453 foreign_bss_tlli, &rai_unknown, cell_id,
2454 GPRS_SAPI_GMM, bss_nu++,
2455 dtap_attach_req, sizeof(dtap_attach_req));
2456
2457 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2458 foreign_bss_tlli, &rai_unknown, cell_id,
2459 GPRS_SAPI_GMM, bss_nu++,
2460 dtap_attach_req, sizeof(dtap_attach_req));
2461
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002462 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2463 foreign_bss_tlli, &rai_bss, cell_id,
2464 GPRS_SAPI_GMM, bss_nu++,
2465 dtap_detach_req, sizeof(dtap_detach_req));
2466
2467 dump_peers(stdout, 0, 0, &gbcfg);
2468
2469 /* Special case: Detach from an unknown TLLI */
2470
2471 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", &bss_peer[0], 0x1002,
2472 other_bss_tlli, &rai_bss, cell_id,
2473 GPRS_SAPI_GMM, bss_nu++,
2474 dtap_detach_req, sizeof(dtap_detach_req));
2475
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002476 dump_peers(stdout, 0, 0, &gbcfg);
2477
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002478 /* Special case: Repeated RA Update Requests */
2479
2480 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2481 foreign_bss_tlli, &rai_unknown, 0x7080,
2482 GPRS_SAPI_GMM, bss_nu++,
2483 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2484
2485 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2486 foreign_bss_tlli, &rai_unknown, 0x7080,
2487 GPRS_SAPI_GMM, bss_nu++,
2488 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2489
2490 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2491 foreign_bss_tlli, &rai_bss, cell_id,
2492 GPRS_SAPI_GMM, bss_nu++,
2493 dtap_detach_req, sizeof(dtap_detach_req));
2494
2495 dump_peers(stdout, 0, 0, &gbcfg);
2496
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002497 dump_global(stdout, 0);
2498
2499 gbprox_reset(&gbcfg);
2500 gprs_ns_destroy(nsi);
2501 nsi = NULL;
2502}
2503
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002504static void test_gbproxy_secondary_sgsn()
2505{
2506 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2507 struct sockaddr_in bss_peer[1] = {{0},};
2508 struct sockaddr_in sgsn_peer[2]= {{0},};
2509 struct gprs_ra_id rai_bss =
2510 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2511 struct gprs_ra_id rai_sgsn =
2512 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2513 struct gprs_ra_id rai_unknown =
2514 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2515 uint16_t cell_id = 0x1234;
2516
2517 const uint32_t sgsn_ptmsi = 0xefe2b700;
2518 const uint32_t local_sgsn_tlli = 0xefe2b700;
2519 const uint32_t random_sgsn_tlli = 0x7c69fb81;
2520
2521 const uint32_t bss_ptmsi = 0xc00f7304;
2522 const uint32_t local_bss_tlli = 0xc00f7304;
2523 const uint32_t foreign_bss_tlli = 0x8000dead;
2524
2525 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2526 const uint32_t local_sgsn_tlli2 = 0xe0987654;
2527 const uint32_t random_sgsn_tlli2 = 0x7eb52dfb;
2528 const uint32_t bss_ptmsi2 = 0xe656aa1f;
2529 const uint32_t local_bss_tlli2 = 0xe656aa1f;
2530 const uint32_t foreign_bss_tlli2 = 0x8000beef;
2531
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002532 const uint32_t random_sgsn_tlli3 = 0x7e23ef54;
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02002533 const uint32_t bss_ptmsi3 = 0xead4775a;
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002534 const uint32_t local_bss_tlli3 = 0xead4775a;
2535 const uint32_t foreign_bss_tlli3 = 0x8000feed;
2536
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002537 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
2538 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002539 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0x28};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002540 struct gbproxy_link_info *link_info;
2541 struct gbproxy_link_info *other_info;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002542 struct gbproxy_peer *peer;
2543 unsigned bss_nu = 0;
2544 unsigned sgsn_nu = 0;
2545
2546 const char *err_msg = NULL;
2547 const char *filter_re = "999999";
2548
2549 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2550 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2551
2552 bssgp_nsi = nsi;
2553 gbcfg.nsi = bssgp_nsi;
2554 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2555 gbcfg.core_mcc = 123;
2556 gbcfg.core_mnc = 456;
2557 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2558 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2559 gbcfg.patch_ptmsi = 1;
2560 gbcfg.acquire_imsi = 1;
2561 gbcfg.bss_ptmsi_state = 0;
2562 gbcfg.sgsn_tlli_state = 1;
2563 gbcfg.route_to_sgsn2 = 1;
2564 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
2565
2566 if (gbproxy_set_patch_filter(&gbcfg, filter_re, &err_msg) != 0) {
2567 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
2568 err_msg);
2569 OSMO_ASSERT(err_msg == NULL);
2570 }
2571
2572 configure_sgsn_peer(&sgsn_peer[0]);
2573 configure_sgsn2_peer(&sgsn_peer[1]);
2574 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2575
2576 printf("=== %s ===\n", __func__);
2577 printf("--- Initialise SGSN 1 ---\n\n");
2578
2579 connect_sgsn(nsi, &sgsn_peer[0], SGSN_NSEI);
2580
2581 printf("--- Initialise SGSN 2 ---\n\n");
2582
2583 connect_sgsn(nsi, &sgsn_peer[1], SGSN2_NSEI);
2584
2585 printf("--- Initialise BSS 1 ---\n\n");
2586
2587 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2588 setup_bssgp(nsi, &bss_peer[0], 0x0);
2589 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x0);
2590 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2591 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x1002);
2592 send_bssgp_reset_ack(nsi, &sgsn_peer[1], 0x1002);
2593
2594 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2595 OSMO_ASSERT(peer != NULL);
2596
2597 gprs_dump_nsi(nsi);
2598 dump_global(stdout, 0);
2599 dump_peers(stdout, 0, 0, &gbcfg);
2600
2601 printf("--- Flow control ---\n\n");
2602
2603 send_bssgp_flow_control_bvc(nsi, &bss_peer[0], 0x1002, 1);
2604 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[0], 0x1002, 1);
2605 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[1], 0x1002, 1);
2606
2607 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
2608
2609 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2610 foreign_bss_tlli, &rai_unknown, cell_id,
2611 GPRS_SAPI_GMM, bss_nu++,
2612 dtap_attach_req, sizeof(dtap_attach_req));
2613
2614 dump_peers(stdout, 0, 0, &gbcfg);
2615
2616 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2617 foreign_bss_tlli, &rai_bss, cell_id,
2618 GPRS_SAPI_GMM, bss_nu++,
2619 dtap_identity_resp, sizeof(dtap_identity_resp));
2620
2621 dump_peers(stdout, 0, 0, &gbcfg);
2622
2623 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[0], 0x1002,
2624 random_sgsn_tlli, 0, NULL, 0,
2625 GPRS_SAPI_GMM, sgsn_nu++,
2626 dtap_identity_req, sizeof(dtap_identity_req));
2627
2628 dump_peers(stdout, 0, 0, &gbcfg);
2629
2630 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2631 foreign_bss_tlli, &rai_bss, cell_id,
2632 GPRS_SAPI_GMM, bss_nu++,
2633 dtap_identity_resp, sizeof(dtap_identity_resp));
2634
2635 dump_peers(stdout, 0, 0, &gbcfg);
2636
2637 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[0], 0x1002,
2638 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2639 GPRS_SAPI_GMM, sgsn_nu++,
2640 dtap_attach_acc, sizeof(dtap_attach_acc));
2641
2642 dump_peers(stdout, 0, 0, &gbcfg);
2643
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002644 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2645 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2646 OSMO_ASSERT(link_info);
2647 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2648 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2649 OSMO_ASSERT(!link_info->tlli.bss_validated);
2650 OSMO_ASSERT(!link_info->tlli.net_validated);
2651 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2652 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2653 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2654 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2655 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2656 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002657
2658 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2659 local_bss_tlli, &rai_bss, cell_id,
2660 GPRS_SAPI_GMM, bss_nu++,
2661 dtap_attach_complete, sizeof(dtap_attach_complete));
2662
2663 dump_peers(stdout, 0, 0, &gbcfg);
2664
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002665 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2666 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2667 OSMO_ASSERT(link_info);
2668 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2669 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2670 OSMO_ASSERT(link_info->tlli.bss_validated);
2671 OSMO_ASSERT(!link_info->tlli.net_validated);
2672 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2673 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2674 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2675 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002676
2677 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[0], 0x1002,
2678 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2679 GPRS_SAPI_GMM, sgsn_nu++,
2680 dtap_gmm_information, sizeof(dtap_gmm_information));
2681
2682 dump_peers(stdout, 0, 0, &gbcfg);
2683
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002684 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2685 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2686 OSMO_ASSERT(link_info);
2687 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2688 OSMO_ASSERT(link_info->tlli.assigned == 0);
2689 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2690 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002691
2692 /* Non-DTAP */
2693 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2694 local_bss_tlli, &rai_bss, cell_id,
2695 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2696
2697 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[0], 0x1002,
2698 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2699 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2700
2701 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2702 local_bss_tlli, &rai_bss, cell_id,
2703 llc_ui_ll11_dns_query_ul,
2704 sizeof(llc_ui_ll11_dns_query_ul));
2705
2706 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[0], 0x1002,
2707 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2708 llc_ui_ll11_dns_resp_dl,
2709 sizeof(llc_ui_ll11_dns_resp_dl));
2710
2711 dump_peers(stdout, 0, 0, &gbcfg);
2712
2713 /* Other messages */
2714 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2715 local_bss_tlli, 1, 12);
2716
2717 dump_peers(stdout, 0, 0, &gbcfg);
2718
2719 send_bssgp_llc_discarded(nsi, &sgsn_peer[0], 0x1002,
2720 local_sgsn_tlli, 1, 12);
2721
2722 dump_peers(stdout, 0, 0, &gbcfg);
2723
2724 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2725
2726 dump_peers(stdout, 0, 0, &gbcfg);
2727
2728 send_bssgp_suspend_ack(nsi, &sgsn_peer[0], local_sgsn_tlli, &rai_sgsn);
2729
2730 dump_peers(stdout, 0, 0, &gbcfg);
2731
2732 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
2733
2734 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2735 foreign_bss_tlli2, &rai_unknown, cell_id,
2736 GPRS_SAPI_GMM, bss_nu++,
2737 dtap_attach_req, sizeof(dtap_attach_req));
2738
2739 dump_peers(stdout, 0, 0, &gbcfg);
2740
2741 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2742 foreign_bss_tlli2, &rai_bss, cell_id,
2743 GPRS_SAPI_GMM, bss_nu++,
2744 dtap_identity2_resp, sizeof(dtap_identity2_resp));
2745
2746 dump_peers(stdout, 0, 0, &gbcfg);
2747
2748 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
2749 random_sgsn_tlli2, 0, NULL, 0,
2750 GPRS_SAPI_GMM, sgsn_nu++,
2751 dtap_identity_req, sizeof(dtap_identity_req));
2752
2753 dump_peers(stdout, 0, 0, &gbcfg);
2754
2755 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2756 foreign_bss_tlli2, &rai_bss, cell_id,
2757 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02002758 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002759
2760 dump_peers(stdout, 0, 0, &gbcfg);
2761
2762 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[1], 0x1002,
2763 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2764 GPRS_SAPI_GMM, sgsn_nu++,
2765 dtap_attach_acc2, sizeof(dtap_attach_acc2));
2766
2767 dump_peers(stdout, 0, 0, &gbcfg);
2768
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002769 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
2770 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
2771 OSMO_ASSERT(link_info);
2772 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2773 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
2774 OSMO_ASSERT(!link_info->tlli.bss_validated);
2775 OSMO_ASSERT(!link_info->tlli.net_validated);
2776 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2777 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2778 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
2779 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2780 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2781 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002782
2783 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2784 local_bss_tlli2, &rai_bss, cell_id,
2785 GPRS_SAPI_GMM, bss_nu++,
2786 dtap_attach_complete, sizeof(dtap_attach_complete));
2787
2788 dump_peers(stdout, 0, 0, &gbcfg);
2789
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002790 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
2791 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
2792 OSMO_ASSERT(link_info);
2793 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2794 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
2795 OSMO_ASSERT(link_info->tlli.bss_validated);
2796 OSMO_ASSERT(!link_info->tlli.net_validated);
2797 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2798 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
2799 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2800 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002801
2802 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
2803 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2804 GPRS_SAPI_GMM, sgsn_nu++,
2805 dtap_gmm_information, sizeof(dtap_gmm_information));
2806
2807 dump_peers(stdout, 0, 0, &gbcfg);
2808
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002809 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
2810 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
2811 OSMO_ASSERT(link_info);
2812 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
2813 OSMO_ASSERT(link_info->tlli.assigned == 0);
2814 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
2815 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002816
2817 /* Non-DTAP */
2818 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2819 local_bss_tlli2, &rai_bss, cell_id,
2820 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2821
2822 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[1], 0x1002,
2823 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2824 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2825
2826 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2827 local_bss_tlli2, &rai_bss, cell_id,
2828 llc_ui_ll11_dns_query_ul,
2829 sizeof(llc_ui_ll11_dns_query_ul));
2830
2831 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[1], 0x1002,
2832 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2833 llc_ui_ll11_dns_resp_dl,
2834 sizeof(llc_ui_ll11_dns_resp_dl));
2835
2836 dump_peers(stdout, 0, 0, &gbcfg);
2837
2838 /* Other messages */
2839 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2840 local_bss_tlli2, 1, 12);
2841
2842 dump_peers(stdout, 0, 0, &gbcfg);
2843
2844 send_bssgp_llc_discarded(nsi, &sgsn_peer[1], 0x1002,
2845 local_sgsn_tlli2, 1, 12);
2846
2847 dump_peers(stdout, 0, 0, &gbcfg);
2848
2849 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli2, &rai_bss);
2850
2851 dump_peers(stdout, 0, 0, &gbcfg);
2852
2853 send_bssgp_suspend_ack(nsi, &sgsn_peer[1], local_sgsn_tlli2, &rai_sgsn);
2854
2855 dump_peers(stdout, 0, 0, &gbcfg);
2856
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002857 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
2858
2859 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2860 foreign_bss_tlli3, &rai_unknown, cell_id,
2861 GPRS_SAPI_GMM, bss_nu++,
2862 dtap_attach_req, sizeof(dtap_attach_req));
2863
2864 dump_peers(stdout, 0, 0, &gbcfg);
2865
2866 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2867 foreign_bss_tlli3, &rai_bss, cell_id,
2868 GPRS_SAPI_GMM, bss_nu++,
2869 dtap_identity3_resp, sizeof(dtap_identity3_resp));
2870
2871 dump_peers(stdout, 0, 0, &gbcfg);
2872
2873 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
2874 random_sgsn_tlli3, 0, NULL, 0,
2875 GPRS_SAPI_GMM, sgsn_nu++,
2876 dtap_identity_req, sizeof(dtap_identity_req));
2877
2878 dump_peers(stdout, 0, 0, &gbcfg);
2879
2880 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2881 foreign_bss_tlli3, &rai_bss, cell_id,
2882 GPRS_SAPI_GMM, bss_nu++,
2883 dtap_identity3_resp, sizeof(dtap_identity3_resp));
2884
2885 dump_peers(stdout, 0, 0, &gbcfg);
2886
2887 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", &sgsn_peer[1], 0x1002,
2888 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
2889 GPRS_SAPI_GMM, sgsn_nu++,
2890 dtap_attach_acc, sizeof(dtap_attach_acc));
2891
2892 dump_peers(stdout, 0, 0, &gbcfg);
2893
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002894 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
2895 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
2896 OSMO_ASSERT(link_info);
2897 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2898 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
2899 OSMO_ASSERT(!link_info->tlli.bss_validated);
2900 OSMO_ASSERT(!link_info->tlli.net_validated);
2901 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2902 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2903 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
2904 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2905 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2906 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02002907
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002908 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2909 local_bss_tlli3, &rai_bss, cell_id,
2910 GPRS_SAPI_GMM, bss_nu++,
2911 dtap_attach_complete, sizeof(dtap_attach_complete));
2912
2913 dump_peers(stdout, 0, 0, &gbcfg);
2914
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002915 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02002916 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002917 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
2918 OSMO_ASSERT(link_info);
2919 OSMO_ASSERT(link_info != other_info);
2920 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2921 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
2922 OSMO_ASSERT(link_info->tlli.bss_validated);
2923 OSMO_ASSERT(!link_info->tlli.net_validated);
2924 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2925 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
2926 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2927 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02002928
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002929 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
2930 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
2931 GPRS_SAPI_GMM, sgsn_nu++,
2932 dtap_gmm_information, sizeof(dtap_gmm_information));
2933
2934 dump_peers(stdout, 0, 0, &gbcfg);
2935
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002936 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02002937 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002938 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
2939 OSMO_ASSERT(link_info);
2940 OSMO_ASSERT(link_info != other_info);
2941 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2942 OSMO_ASSERT(link_info->tlli.assigned == 0);
2943 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2944 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02002945
2946
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002947 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
2948
2949 /* Detach */
2950 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2951 local_bss_tlli, &rai_bss, cell_id,
2952 GPRS_SAPI_GMM, bss_nu++,
2953 dtap_detach_req, sizeof(dtap_detach_req));
2954
2955 dump_peers(stdout, 0, 0, &gbcfg);
2956
2957 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[0], 0x1002,
2958 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2959 GPRS_SAPI_GMM, sgsn_nu++,
2960 dtap_detach_acc, sizeof(dtap_detach_acc));
2961
2962 dump_peers(stdout, 0, 0, &gbcfg);
2963
2964 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
2965
2966 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2967 local_bss_tlli2, &rai_bss, cell_id,
2968 GPRS_SAPI_GMM, bss_nu++,
2969 dtap_detach_req, sizeof(dtap_detach_req));
2970
2971 dump_peers(stdout, 0, 0, &gbcfg);
2972
2973 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
2974 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
2975 GPRS_SAPI_GMM, sgsn_nu++,
2976 dtap_detach_acc, sizeof(dtap_detach_acc));
2977
2978 dump_peers(stdout, 0, 0, &gbcfg);
2979
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002980 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
2981
2982 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2983 local_bss_tlli3, &rai_bss, cell_id,
2984 GPRS_SAPI_GMM, bss_nu++,
2985 dtap_detach_req, sizeof(dtap_detach_req));
2986
2987 dump_peers(stdout, 0, 0, &gbcfg);
2988
2989 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
2990 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
2991 GPRS_SAPI_GMM, sgsn_nu++,
2992 dtap_detach_acc, sizeof(dtap_detach_acc));
2993
2994 dump_peers(stdout, 0, 0, &gbcfg);
2995
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002996 dump_global(stdout, 0);
2997
2998 gbprox_reset(&gbcfg);
2999 gprs_ns_destroy(nsi);
3000 nsi = NULL;
3001}
3002
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003003static void test_gbproxy_keep_info()
3004{
3005 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
3006 struct sockaddr_in bss_peer[1] = {{0},};
3007 struct sockaddr_in sgsn_peer= {0};
3008 struct gprs_ra_id rai_bss =
3009 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3010 uint16_t cell_id = 0x1234;
3011
3012 const uint32_t ptmsi = 0xefe2b700;
3013 const uint32_t local_tlli = 0xefe2b700;
3014 const uint32_t foreign_tlli = 0xafe2b700;
3015
3016 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003017 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003018 struct gbproxy_peer *peer;
3019 unsigned bss_nu = 0;
3020 unsigned sgsn_nu = 0;
3021
3022 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3023
3024 bssgp_nsi = nsi;
3025 gbcfg.nsi = bssgp_nsi;
3026 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3027 gbcfg.patch_ptmsi = 0;
3028 gbcfg.acquire_imsi = 1;
3029 gbcfg.bss_ptmsi_state = 0;
3030 gbcfg.sgsn_tlli_state = 1;
3031 gbcfg.core_mcc = 0;
3032 gbcfg.core_mnc = 0;
3033 gbcfg.core_apn = NULL;
3034 gbcfg.core_apn_size = 0;
3035 gbcfg.route_to_sgsn2 = 0;
3036 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003037 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003038
3039 configure_sgsn_peer(&sgsn_peer);
3040 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3041
3042 printf("=== %s ===\n", __func__);
3043 printf("--- Initialise SGSN ---\n\n");
3044
3045 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
3046
3047 printf("--- Initialise BSS 1 ---\n\n");
3048
3049 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3050 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3051
3052 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3053 OSMO_ASSERT(peer != NULL);
3054
3055 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
3056
3057 gprs_dump_nsi(nsi);
3058 dump_global(stdout, 0);
3059 dump_peers(stdout, 0, 0, &gbcfg);
3060
3061 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3062
3063 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3064 foreign_tlli, &rai_bss, cell_id,
3065 GPRS_SAPI_GMM, bss_nu++,
3066 dtap_attach_req, sizeof(dtap_attach_req));
3067
3068 dump_peers(stdout, 0, 0, &gbcfg);
3069
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003070 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3071 OSMO_ASSERT(link_info);
3072 OSMO_ASSERT(link_info->imsi_len == 0);
3073 OSMO_ASSERT(!link_info->is_deregistered);
3074 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003075
3076 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3077 foreign_tlli, &rai_bss, cell_id,
3078 GPRS_SAPI_GMM, bss_nu++,
3079 dtap_identity_resp, sizeof(dtap_identity_resp));
3080
3081 dump_peers(stdout, 0, 0, &gbcfg);
3082
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003083 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3084 OSMO_ASSERT(link_info);
3085 OSMO_ASSERT(link_info->imsi_len > 0);
3086 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003087
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003088 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
3089 foreign_tlli, 0, NULL, 0,
3090 GPRS_SAPI_GMM, sgsn_nu++,
3091 dtap_identity_req, sizeof(dtap_identity_req));
3092
3093 dump_peers(stdout, 0, 0, &gbcfg);
3094
3095 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3096 foreign_tlli, &rai_bss, cell_id,
3097 GPRS_SAPI_GMM, bss_nu++,
3098 dtap_identity_resp, sizeof(dtap_identity_resp));
3099
3100 dump_peers(stdout, 0, 0, &gbcfg);
3101
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003102 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3103 OSMO_ASSERT(link_info);
3104 OSMO_ASSERT(link_info->imsi_len > 0);
3105 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003106
3107 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3108 foreign_tlli, 1, imsi, sizeof(imsi),
3109 GPRS_SAPI_GMM, sgsn_nu++,
3110 dtap_attach_acc, sizeof(dtap_attach_acc));
3111
3112 dump_peers(stdout, 0, 0, &gbcfg);
3113
3114 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3115 local_tlli, &rai_bss, cell_id,
3116 GPRS_SAPI_GMM, bss_nu++,
3117 dtap_attach_complete, sizeof(dtap_attach_complete));
3118
3119 dump_peers(stdout, 0, 0, &gbcfg);
3120
3121 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
3122 local_tlli, 1, imsi, sizeof(imsi),
3123 GPRS_SAPI_GMM, sgsn_nu++,
3124 dtap_gmm_information, sizeof(dtap_gmm_information));
3125
3126 dump_peers(stdout, 0, 0, &gbcfg);
3127
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003128 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3129 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003130
3131 /* Detach (MO) */
3132 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3133 local_tlli, &rai_bss, cell_id,
3134 GPRS_SAPI_GMM, bss_nu++,
3135 dtap_detach_req, sizeof(dtap_detach_req));
3136
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003137 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3138 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003139
3140 dump_peers(stdout, 0, 0, &gbcfg);
3141
3142 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3143 local_tlli, 1, imsi, sizeof(imsi),
3144 GPRS_SAPI_GMM, sgsn_nu++,
3145 dtap_detach_acc, sizeof(dtap_detach_acc));
3146
3147 dump_peers(stdout, 0, 0, &gbcfg);
3148
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003149 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3150 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3151 OSMO_ASSERT(link_info);
3152 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003153
3154 /* Re-Attach */
3155 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3156 foreign_tlli, &rai_bss, cell_id,
3157 GPRS_SAPI_GMM, bss_nu++,
3158 dtap_attach_req3, sizeof(dtap_attach_req3));
3159
3160 dump_peers(stdout, 0, 0, &gbcfg);
3161
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003162 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3163 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3164 OSMO_ASSERT(link_info);
3165 OSMO_ASSERT(link_info == link_info2);
3166 OSMO_ASSERT(link_info->imsi_len != 0);
3167 OSMO_ASSERT(!link_info->is_deregistered);
3168 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003169
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003170 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3171 foreign_tlli, 1, imsi, sizeof(imsi),
3172 GPRS_SAPI_GMM, sgsn_nu++,
3173 dtap_attach_acc, sizeof(dtap_attach_acc));
3174
3175 dump_peers(stdout, 0, 0, &gbcfg);
3176
3177 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3178 local_tlli, &rai_bss, cell_id,
3179 GPRS_SAPI_GMM, bss_nu++,
3180 dtap_attach_complete, sizeof(dtap_attach_complete));
3181
3182 dump_peers(stdout, 0, 0, &gbcfg);
3183
3184 /* Detach (MT) */
3185 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
3186 local_tlli, 1, imsi, sizeof(imsi),
3187 GPRS_SAPI_GMM, sgsn_nu++,
3188 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3189
3190 dump_peers(stdout, 0, 0, &gbcfg);
3191
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003192 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3193 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003194
3195 send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3196 local_tlli, &rai_bss, cell_id,
3197 GPRS_SAPI_GMM, bss_nu++,
3198 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3199
3200 dump_peers(stdout, 0, 0, &gbcfg);
3201
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003202 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3203 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3204 OSMO_ASSERT(link_info);
3205 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003206
3207 /* Re-Attach */
3208 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3209 foreign_tlli, &rai_bss, cell_id,
3210 GPRS_SAPI_GMM, bss_nu++,
3211 dtap_attach_req3, sizeof(dtap_attach_req3));
3212
3213 dump_peers(stdout, 0, 0, &gbcfg);
3214
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003215 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3216 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3217 OSMO_ASSERT(link_info);
3218 OSMO_ASSERT(link_info == link_info2);
3219 OSMO_ASSERT(link_info->imsi_len != 0);
3220 OSMO_ASSERT(!link_info->is_deregistered);
3221 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003222
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003223 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3224 foreign_tlli, 1, imsi, sizeof(imsi),
3225 GPRS_SAPI_GMM, sgsn_nu++,
3226 dtap_attach_acc, sizeof(dtap_attach_acc));
3227
3228 dump_peers(stdout, 0, 0, &gbcfg);
3229
3230 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3231 local_tlli, &rai_bss, cell_id,
3232 GPRS_SAPI_GMM, bss_nu++,
3233 dtap_attach_complete, sizeof(dtap_attach_complete));
3234
3235 dump_peers(stdout, 0, 0, &gbcfg);
3236
3237 /* Detach (MT) */
3238 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3239 local_tlli, 1, imsi, sizeof(imsi),
3240 GPRS_SAPI_GMM, sgsn_nu++,
3241 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3242
3243 dump_peers(stdout, 0, 0, &gbcfg);
3244
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003245 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3246 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003247
3248 send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3249 local_tlli, &rai_bss, cell_id,
3250 GPRS_SAPI_GMM, bss_nu++,
3251 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3252
3253 dump_peers(stdout, 0, 0, &gbcfg);
3254
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003255 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3256 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3257 OSMO_ASSERT(link_info);
3258 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003259
3260 /* Re-Attach */
3261 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3262 foreign_tlli, &rai_bss, cell_id,
3263 GPRS_SAPI_GMM, bss_nu++,
3264 dtap_attach_req3, sizeof(dtap_attach_req3));
3265
3266 dump_peers(stdout, 0, 0, &gbcfg);
3267
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003268 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3269 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3270 OSMO_ASSERT(link_info);
3271 OSMO_ASSERT(link_info == link_info2);
3272 OSMO_ASSERT(link_info->imsi_len != 0);
3273 OSMO_ASSERT(!link_info->is_deregistered);
3274 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003275
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003276 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3277 foreign_tlli, 1, imsi, sizeof(imsi),
3278 GPRS_SAPI_GMM, sgsn_nu++,
3279 dtap_attach_acc, sizeof(dtap_attach_acc));
3280
3281 dump_peers(stdout, 0, 0, &gbcfg);
3282
3283 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3284 local_tlli, &rai_bss, cell_id,
3285 GPRS_SAPI_GMM, bss_nu++,
3286 dtap_attach_complete, sizeof(dtap_attach_complete));
3287
3288 dump_peers(stdout, 0, 0, &gbcfg);
3289
3290 /* RA update procedure (reject -> Detach) */
3291 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3292 local_tlli, &rai_bss, 0x7080,
3293 GPRS_SAPI_GMM, bss_nu++,
3294 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3295
3296 send_llc_dl_ui(nsi, "RA UDP REJ", &sgsn_peer, 0x1002,
3297 local_tlli, 1, imsi, sizeof(imsi),
3298 GPRS_SAPI_GMM, sgsn_nu++,
3299 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3300
3301 dump_peers(stdout, 0, 0, &gbcfg);
3302
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003303 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3304 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3305 OSMO_ASSERT(link_info);
3306 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003307
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003308 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
3309 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3310 foreign_tlli, &rai_bss, cell_id,
3311 GPRS_SAPI_GMM, bss_nu++,
3312 dtap_attach_req, sizeof(dtap_attach_req));
3313
3314 dump_peers(stdout, 0, 0, &gbcfg);
3315
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003316 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3317 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3318 OSMO_ASSERT(link_info);
3319 OSMO_ASSERT(link_info != link_info2);
3320 OSMO_ASSERT(link_info->imsi_len == 0);
3321 OSMO_ASSERT(!link_info->is_deregistered);
3322 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003323
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003324 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3325 foreign_tlli, &rai_bss, cell_id,
3326 GPRS_SAPI_GMM, bss_nu++,
3327 dtap_identity_resp, sizeof(dtap_identity_resp));
3328
3329 dump_peers(stdout, 0, 0, &gbcfg);
3330
3331 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3332 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3333 OSMO_ASSERT(link_info);
3334 OSMO_ASSERT(link_info == link_info2);
3335 OSMO_ASSERT(link_info->imsi_len != 0);
3336 OSMO_ASSERT(!link_info->is_deregistered);
3337 OSMO_ASSERT(!link_info->imsi_acq_pending);
3338
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003339 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3340 foreign_tlli, 1, imsi, sizeof(imsi),
3341 GPRS_SAPI_GMM, sgsn_nu++,
3342 dtap_attach_acc, sizeof(dtap_attach_acc));
3343
3344 dump_peers(stdout, 0, 0, &gbcfg);
3345
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003346 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3347 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3348 OSMO_ASSERT(link_info);
3349 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeckea71b482014-09-22 09:28:27 +02003350 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003351
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003352 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3353 local_tlli, &rai_bss, cell_id,
3354 GPRS_SAPI_GMM, bss_nu++,
3355 dtap_attach_complete, sizeof(dtap_attach_complete));
3356
3357 dump_peers(stdout, 0, 0, &gbcfg);
3358
3359 /* Detach (MT) */
3360 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3361 local_tlli, 1, imsi, sizeof(imsi),
3362 GPRS_SAPI_GMM, sgsn_nu++,
3363 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3364
3365 dump_peers(stdout, 0, 0, &gbcfg);
3366
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003367 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3368 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003369
3370 send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3371 local_tlli, &rai_bss, cell_id,
3372 GPRS_SAPI_GMM, bss_nu++,
3373 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3374
3375 dump_peers(stdout, 0, 0, &gbcfg);
3376
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003377 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3378 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3379 OSMO_ASSERT(link_info);
3380 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003381
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003382 /* Attach rejected */
3383
3384 gbproxy_delete_link_infos(peer);
3385
3386 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3387 foreign_tlli, &rai_bss, cell_id,
3388 GPRS_SAPI_GMM, bss_nu++,
3389 dtap_attach_req, sizeof(dtap_attach_req));
3390
3391 dump_peers(stdout, 0, 0, &gbcfg);
3392
3393 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3394 OSMO_ASSERT(link_info);
3395 OSMO_ASSERT(link_info->imsi_len == 0);
3396 OSMO_ASSERT(!link_info->is_deregistered);
3397 OSMO_ASSERT(link_info->imsi_acq_pending);
3398
3399 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3400 foreign_tlli, &rai_bss, cell_id,
3401 GPRS_SAPI_GMM, bss_nu++,
3402 dtap_identity_resp, sizeof(dtap_identity_resp));
3403
3404 dump_peers(stdout, 0, 0, &gbcfg);
3405
3406 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3407 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3408 OSMO_ASSERT(link_info);
3409 OSMO_ASSERT(link_info == link_info2);
3410 OSMO_ASSERT(link_info->imsi_len != 0);
3411 OSMO_ASSERT(!link_info->is_deregistered);
3412 OSMO_ASSERT(!link_info->imsi_acq_pending);
3413
3414 send_llc_dl_ui(nsi, "ATTACH REJECT", &sgsn_peer, 0x1002,
3415 foreign_tlli, 1, imsi, sizeof(imsi),
3416 GPRS_SAPI_GMM, sgsn_nu++,
3417 dtap_attach_rej7, sizeof(dtap_attach_rej7));
3418
3419 dump_peers(stdout, 0, 0, &gbcfg);
3420
3421 /* Attach (incomplete) and Detach (MO) */
3422
3423 gbproxy_delete_link_infos(peer);
3424
3425 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3426 foreign_tlli, &rai_bss, cell_id,
3427 GPRS_SAPI_GMM, bss_nu++,
3428 dtap_attach_req, sizeof(dtap_attach_req));
3429
3430 dump_peers(stdout, 0, 0, &gbcfg);
3431
3432 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3433 OSMO_ASSERT(link_info);
3434 OSMO_ASSERT(link_info->imsi_len == 0);
3435 OSMO_ASSERT(!link_info->is_deregistered);
3436 OSMO_ASSERT(link_info->imsi_acq_pending);
3437
3438 send_llc_ul_ui(nsi, "DETACH REQ (MO)", &bss_peer[0], 0x1002,
3439 foreign_tlli, &rai_bss, cell_id,
3440 GPRS_SAPI_GMM, bss_nu++,
3441 dtap_detach_req, sizeof(dtap_detach_req));
3442
3443 dump_peers(stdout, 0, 0, &gbcfg);
3444
3445 /* Attach (incomplete) and Detach (MT) */
3446
3447 gbproxy_delete_link_infos(peer);
3448
3449 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3450 foreign_tlli, &rai_bss, cell_id,
3451 GPRS_SAPI_GMM, bss_nu++,
3452 dtap_attach_req, sizeof(dtap_attach_req));
3453
3454 dump_peers(stdout, 0, 0, &gbcfg);
3455
3456 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3457 OSMO_ASSERT(link_info);
3458 OSMO_ASSERT(link_info->imsi_len == 0);
3459 OSMO_ASSERT(!link_info->is_deregistered);
3460 OSMO_ASSERT(link_info->imsi_acq_pending);
3461
3462 send_llc_dl_ui(nsi, "DETACH REQ (MT)", &sgsn_peer, 0x1002,
3463 foreign_tlli, 1, imsi, sizeof(imsi),
3464 GPRS_SAPI_GMM, sgsn_nu++,
3465 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3466
3467 dump_peers(stdout, 0, 0, &gbcfg);
3468
3469 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3470 OSMO_ASSERT(link_info);
3471
3472 send_llc_ul_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3473 foreign_tlli, &rai_bss, cell_id,
3474 GPRS_SAPI_GMM, bss_nu++,
3475 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3476
3477 dump_peers(stdout, 0, 0, &gbcfg);
3478
3479 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
3480 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3481 OSMO_ASSERT(link_info);
3482 OSMO_ASSERT(link_info->is_deregistered);
3483
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003484 dump_global(stdout, 0);
3485
3486 gbprox_reset(&gbcfg);
3487 gprs_ns_destroy(nsi);
3488 nsi = NULL;
3489}
3490
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003491/* TODO: Move tlv testing to libosmocore */
3492int v_fixed_shift(uint8_t **data, size_t *data_len, size_t len, uint8_t **value);
3493int tv_fixed_match(uint8_t **data, size_t *data_len, uint8_t tag, size_t len,
3494 uint8_t **value);
3495int tlv_match(uint8_t **data, size_t *data_len, uint8_t tag, uint8_t **value,
3496 size_t *value_len);
3497int lv_shift(uint8_t **data, size_t *data_len,
3498 uint8_t **value, size_t *value_len);
3499
3500static void check_tlv_match(uint8_t **data, size_t *data_len,
3501 uint8_t tag, size_t exp_len, const uint8_t *exp_val)
3502{
3503 uint8_t *value;
3504 size_t value_len;
3505 int rc;
3506
3507 rc = tlv_match(data, data_len, tag ^ 1, NULL, NULL);
3508 OSMO_ASSERT(rc == 0);
3509
3510 rc = tlv_match(data, data_len, tag, &value, &value_len);
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003511 OSMO_ASSERT(rc == (int)value_len + 2);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003512 OSMO_ASSERT(value_len == exp_len);
3513 OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
3514}
3515
3516static void check_tv_fixed_match(uint8_t **data, size_t *data_len,
3517 uint8_t tag, size_t len, const uint8_t *exp_val)
3518{
3519 uint8_t *value;
3520 int rc;
3521
3522 rc = tv_fixed_match(data, data_len, tag ^ 1, len, NULL);
3523 OSMO_ASSERT(rc == 0);
3524
3525 rc = tv_fixed_match(data, data_len, tag, len, &value);
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003526 OSMO_ASSERT(rc == (int)len + 1);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003527 OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
3528}
3529
3530static void check_v_fixed_shift(uint8_t **data, size_t *data_len,
3531 size_t len, const uint8_t *exp_val)
3532{
3533 uint8_t *value;
3534 int rc;
3535
3536 rc = v_fixed_shift(data, data_len, len, &value);
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003537 OSMO_ASSERT(rc == (int)len);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003538 OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
3539}
3540
3541static void check_lv_shift(uint8_t **data, size_t *data_len,
3542 size_t exp_len, const uint8_t *exp_val)
3543{
3544 uint8_t *value;
3545 size_t value_len;
3546 int rc;
3547
3548 rc = lv_shift(data, data_len, &value, &value_len);
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003549 OSMO_ASSERT(rc == (int)value_len + 1);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003550 OSMO_ASSERT(value_len == exp_len);
3551 OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
3552}
3553
3554static void check_tlv_match_data_len(size_t data_len, uint8_t tag, size_t len,
3555 const uint8_t *test_data)
3556{
3557 uint8_t buf[300] = {0};
3558
3559 uint8_t *unchanged_ptr = buf - 1;
3560 size_t unchanged_len = 0xdead;
3561 size_t tmp_data_len = data_len;
3562 uint8_t *value = unchanged_ptr;
3563 size_t value_len = unchanged_len;
3564 uint8_t *data = buf;
3565
3566 OSMO_ASSERT(data_len <= sizeof(buf));
3567
3568 tlv_put(data, tag, len, test_data);
3569 if (data_len < len + 2) {
3570 OSMO_ASSERT(-1 == tlv_match(&data, &tmp_data_len,
3571 tag, &value, &value_len));
3572 OSMO_ASSERT(tmp_data_len == 0);
3573 OSMO_ASSERT(data == buf + data_len);
3574 OSMO_ASSERT(value == unchanged_ptr);
3575 OSMO_ASSERT(value_len == unchanged_len);
3576 } else {
3577 OSMO_ASSERT(0 <= tlv_match(&data, &tmp_data_len,
3578 tag, &value, &value_len));
3579 OSMO_ASSERT(value != unchanged_ptr);
3580 OSMO_ASSERT(value_len != unchanged_len);
3581 }
3582}
3583
3584static void check_tv_fixed_match_data_len(size_t data_len,
3585 uint8_t tag, size_t len,
3586 const uint8_t *test_data)
3587{
3588 uint8_t buf[300] = {0};
3589
3590 uint8_t *unchanged_ptr = buf - 1;
3591 size_t tmp_data_len = data_len;
3592 uint8_t *value = unchanged_ptr;
3593 uint8_t *data = buf;
3594
3595 OSMO_ASSERT(data_len <= sizeof(buf));
3596
3597 tv_fixed_put(data, tag, len, test_data);
3598
3599 if (data_len < len + 1) {
3600 OSMO_ASSERT(-1 == tv_fixed_match(&data, &tmp_data_len,
3601 tag, len, &value));
3602 OSMO_ASSERT(tmp_data_len == 0);
3603 OSMO_ASSERT(data == buf + data_len);
3604 OSMO_ASSERT(value == unchanged_ptr);
3605 } else {
3606 OSMO_ASSERT(0 <= tv_fixed_match(&data, &tmp_data_len,
3607 tag, len, &value));
3608 OSMO_ASSERT(value != unchanged_ptr);
3609 }
3610}
3611
3612static void check_v_fixed_shift_data_len(size_t data_len,
3613 size_t len, const uint8_t *test_data)
3614{
3615 uint8_t buf[300] = {0};
3616
3617 uint8_t *unchanged_ptr = buf - 1;
3618 size_t tmp_data_len = data_len;
3619 uint8_t *value = unchanged_ptr;
3620 uint8_t *data = buf;
3621
3622 OSMO_ASSERT(data_len <= sizeof(buf));
3623
3624 memcpy(data, test_data, len);
3625
3626 if (data_len < len) {
3627 OSMO_ASSERT(-1 == v_fixed_shift(&data, &tmp_data_len,
3628 len, &value));
3629 OSMO_ASSERT(tmp_data_len == 0);
3630 OSMO_ASSERT(data == buf + data_len);
3631 OSMO_ASSERT(value == unchanged_ptr);
3632 } else {
3633 OSMO_ASSERT(0 <= v_fixed_shift(&data, &tmp_data_len,
3634 len, &value));
3635 OSMO_ASSERT(value != unchanged_ptr);
3636 }
3637}
3638
3639static void check_lv_shift_data_len(size_t data_len,
3640 size_t len, const uint8_t *test_data)
3641{
3642 uint8_t buf[300] = {0};
3643
3644 uint8_t *unchanged_ptr = buf - 1;
3645 size_t unchanged_len = 0xdead;
3646 size_t tmp_data_len = data_len;
3647 uint8_t *value = unchanged_ptr;
3648 size_t value_len = unchanged_len;
3649 uint8_t *data = buf;
3650
3651 lv_put(data, len, test_data);
3652 if (data_len < len + 1) {
3653 OSMO_ASSERT(-1 == lv_shift(&data, &tmp_data_len,
3654 &value, &value_len));
3655 OSMO_ASSERT(tmp_data_len == 0);
3656 OSMO_ASSERT(data == buf + data_len);
3657 OSMO_ASSERT(value == unchanged_ptr);
3658 OSMO_ASSERT(value_len == unchanged_len);
3659 } else {
3660 OSMO_ASSERT(0 <= lv_shift(&data, &tmp_data_len,
3661 &value, &value_len));
3662 OSMO_ASSERT(value != unchanged_ptr);
3663 OSMO_ASSERT(value_len != unchanged_len);
3664 }
3665}
3666
3667static void test_tlv_shift_functions()
3668{
3669 uint8_t test_data[1024];
3670 uint8_t buf[1024];
3671 uint8_t *data_end;
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003672 unsigned i, len;
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003673 uint8_t *data;
3674 size_t data_len;
3675 const uint8_t tag = 0x1a;
3676
3677 printf("Test shift functions\n");
3678
3679 for (i = 0; i < ARRAY_SIZE(test_data); i++)
3680 test_data[i] = (uint8_t)i;
3681
3682 for (len = 0; len < 256; len++) {
Jacob Erlbeck948b7302014-08-11 10:37:35 +02003683 const unsigned iterations = sizeof(buf) / (len + 2) / 4;
Jacob Erlbeckb1381062014-07-01 12:41:13 +02003684
3685 memset(buf, 0xee, sizeof(buf));
3686 data_end = data = buf;
3687
3688 for (i = 0; i < iterations; i++) {
3689 data_end = tlv_put(data_end, tag, len, test_data);
3690 data_end = tv_fixed_put(data_end, tag, len, test_data);
3691 /* v_fixed_put */
3692 memcpy(data_end, test_data, len);
3693 data_end += len;
3694 data_end = lv_put(data_end, len, test_data);
3695 }
3696
3697 data_len = data_end - data;
3698 OSMO_ASSERT(data_len <= sizeof(buf));
3699
3700 for (i = 0; i < iterations; i++) {
3701 check_tlv_match(&data, &data_len, tag, len, test_data);
3702 check_tv_fixed_match(&data, &data_len, tag, len, test_data);
3703 check_v_fixed_shift(&data, &data_len, len, test_data);
3704 check_lv_shift(&data, &data_len, len, test_data);
3705 }
3706
3707 OSMO_ASSERT(data == data_end);
3708
3709 /* Test at end of data */
3710
3711 OSMO_ASSERT(-1 == tlv_match(&data, &data_len, tag, NULL, NULL));
3712 OSMO_ASSERT(-1 == tv_fixed_match(&data, &data_len, tag, len, NULL));
3713 OSMO_ASSERT((len ? -1 : 0) == v_fixed_shift(&data, &data_len, len, NULL));
3714 OSMO_ASSERT(-1 == lv_shift(&data, &data_len, NULL, NULL));
3715
3716 /* Test invalid data_len */
3717 for (data_len = 0; data_len <= len + 2 + 1; data_len += 1) {
3718 check_tlv_match_data_len(data_len, tag, len, test_data);
3719 check_tv_fixed_match_data_len(data_len, tag, len, test_data);
3720 check_v_fixed_shift_data_len(data_len, len, test_data);
3721 check_lv_shift_data_len(data_len, len, test_data);
3722 }
3723 }
3724}
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003725
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003726struct gbproxy_link_info *register_tlli(
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003727 struct gbproxy_peer *peer, uint32_t tlli,
3728 const uint8_t *imsi, size_t imsi_len, time_t now)
3729{
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003730 struct gbproxy_link_info *link_info;
Jacob Erlbeck8992f302014-09-19 13:17:55 +02003731 int imsi_matches = -1;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003732 int tlli_already_known = 0;
3733
3734 /* Check, whether the IMSI matches */
3735 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeck8992f302014-09-19 13:17:55 +02003736 imsi_matches = gbproxy_check_imsi(peer, imsi, imsi_len);
3737 if (imsi_matches < 0)
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003738 return NULL;
3739 }
3740
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003741 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003742
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003743 if (!link_info) {
3744 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003745
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003746 if (link_info) {
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003747 /* TLLI has changed somehow, adjust it */
3748 LOGP(DGPRS, LOGL_INFO,
3749 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003750 link_info->tlli.current, tlli);
3751 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003752 }
3753 }
3754
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003755 if (!link_info) {
3756 link_info = gbproxy_link_info_alloc(peer);
3757 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003758 } else {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003759 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003760 tlli_already_known = 1;
3761 }
3762
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003763 OSMO_ASSERT(link_info != NULL);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003764
3765 if (!tlli_already_known)
3766 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
3767
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003768 gbproxy_attach_link_info(peer, now, link_info);
3769 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003770
Jacob Erlbeck8992f302014-09-19 13:17:55 +02003771 if (imsi_matches >= 0)
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003772 link_info->imsi_matches = imsi_matches;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003773
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003774 return link_info;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003775}
3776
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003777static void test_gbproxy_tlli_expire(void)
3778{
3779 struct gbproxy_config cfg = {0};
3780 struct gbproxy_peer *peer;
3781 const char *err_msg = NULL;
3782 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0x26 };
3783 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0x29 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003784 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003785 const uint32_t tlli1 = 1234 | 0xc0000000;
3786 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003787 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003788 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02003789 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003790
3791 printf("Test TLLI info expiry\n\n");
3792
3793 gbproxy_init_config(&cfg);
3794
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003795 if (gbproxy_set_patch_filter(&cfg, filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003796 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
3797 err_msg);
3798 OSMO_ASSERT(err_msg == NULL);
3799 }
3800
3801 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003802 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003803
3804 printf("Test TLLI replacement:\n");
3805
3806 cfg.tlli_max_len = 0;
3807 cfg.tlli_max_age = 0;
3808 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003809 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003810
3811 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003812 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003813 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003814 OSMO_ASSERT(link_info);
3815 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003816 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003817
3818 /* replace the old entry */
3819 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003820 link_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003821 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003822 OSMO_ASSERT(link_info);
3823 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003824 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003825
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02003826 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003827
3828 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003829 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
3830 OSMO_ASSERT(link_info);
3831 OSMO_ASSERT(link_info->tlli.current == tlli2);
3832 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
3833 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003834
3835 printf("\n");
3836
3837 gbproxy_peer_free(peer);
3838 }
3839
3840 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003841 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003842
3843 printf("Test IMSI replacement:\n");
3844
3845 cfg.tlli_max_len = 0;
3846 cfg.tlli_max_age = 0;
3847 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003848 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003849
3850 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003851 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003852 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003853 OSMO_ASSERT(link_info);
3854 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003855 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003856
3857 /* try to replace the old entry */
3858 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003859 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003860 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003861 OSMO_ASSERT(link_info);
3862 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003863 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003864
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02003865 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003866
3867 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003868 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
3869 OSMO_ASSERT(!link_info);
3870 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
3871 OSMO_ASSERT(link_info);
3872 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003873
3874 printf("\n");
3875
3876 gbproxy_peer_free(peer);
3877 }
3878
3879 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003880 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02003881 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003882
3883 printf("Test TLLI expiry, max_len == 1:\n");
3884
3885 cfg.tlli_max_len = 1;
3886 cfg.tlli_max_age = 0;
3887 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003888 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003889
3890 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003891 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003892 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003893
3894 /* replace the old entry */
3895 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003896 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003897 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02003898
Jacob Erlbeck51fde082014-09-19 16:40:21 +02003899 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02003900 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003901 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003902
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02003903 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003904
3905 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003906 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
3907 OSMO_ASSERT(!link_info);
3908 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
3909 OSMO_ASSERT(link_info);
3910 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003911
3912 printf("\n");
3913
3914 gbproxy_peer_free(peer);
3915 }
3916
3917 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003918 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02003919 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003920
3921 printf("Test TLLI expiry, max_age == 1:\n");
3922
3923 cfg.tlli_max_len = 0;
3924 cfg.tlli_max_age = 1;
3925 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003926 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003927
3928 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003929 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003930 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003931
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003932 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003933 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003934 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003935 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003936
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003937 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003938 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003939 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003940
3941 dump_peers(stdout, 2, now + 2, &cfg);
3942
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003943 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003944 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
3945 OSMO_ASSERT(!link_info);
3946 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
3947 OSMO_ASSERT(link_info);
3948 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003949
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003950 printf("\n");
3951
3952 gbproxy_peer_free(peer);
3953 }
3954
3955 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003956 struct gbproxy_link_info *link_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003957 int num_removed;
3958
3959 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
3960
3961 cfg.tlli_max_len = 0;
3962 cfg.tlli_max_age = 1;
3963 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003964 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003965
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003966 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003967 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003968 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003969
3970 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003971 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003972 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003973 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003974
3975 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02003976 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02003977 now + 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003978 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003979
3980 dump_peers(stdout, 2, now + 2, &cfg);
3981
3982 printf(" Remove stale TLLIs\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003983 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003984 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02003985 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02003986
3987 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003988
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003989 /* verify that tlli3 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003990 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
3991 OSMO_ASSERT(!link_info);
3992 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
3993 OSMO_ASSERT(!link_info);
3994 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
3995 OSMO_ASSERT(link_info);
3996 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02003997
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02003998 printf("\n");
3999
4000 gbproxy_peer_free(peer);
4001 }
4002}
4003
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004004static void test_gbproxy_imsi_matching(void)
4005{
4006 struct gbproxy_config cfg = {0};
4007 struct gbproxy_peer *peer;
4008 const char *err_msg = NULL;
4009 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4010 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4011 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4012 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4013 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4014 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4015 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4016 const char *filter_re1 = ".*";
4017 const char *filter_re2 = "^1234";
4018 const char *filter_re3 = "^4321";
4019 const char *filter_re4_bad = "^12[";
4020
4021 printf("=== Test IMSI/TMSI matching ===\n\n");
4022
4023 gbproxy_init_config(&cfg);
4024 OSMO_ASSERT(cfg.check_imsi == 0);
4025
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004026 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re1, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004027 OSMO_ASSERT(cfg.check_imsi == 1);
4028
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004029 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re2, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004030 OSMO_ASSERT(cfg.check_imsi == 1);
4031
4032 err_msg = NULL;
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004033 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004034 OSMO_ASSERT(err_msg != NULL);
4035 OSMO_ASSERT(cfg.check_imsi == 0);
4036
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004037 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re2, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004038 OSMO_ASSERT(cfg.check_imsi == 1);
4039
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004040 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, NULL, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004041 OSMO_ASSERT(cfg.check_imsi == 0);
4042
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004043 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re2, &err_msg) == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004044 OSMO_ASSERT(cfg.check_imsi == 1);
4045
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004046 gbproxy_clear_patch_filter(&cfg);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004047 OSMO_ASSERT(cfg.check_imsi == 0);
4048
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004049 peer = gbproxy_peer_alloc(&cfg, 20);
4050
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004051 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re2, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004052 OSMO_ASSERT(cfg.check_imsi == 1);
4053
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004054 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi1, ARRAY_SIZE(imsi1)) == 1);
4055 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi2, ARRAY_SIZE(imsi2)) == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004056 /* imsi3_bad contains 0xE and 0xF digits, but the conversion function
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004057 * doesn't complain, so gbproxy_check_imsi() doesn't return -1 in this
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004058 * case. */
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004059 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4060 OSMO_ASSERT(gbproxy_check_imsi(peer, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4061 OSMO_ASSERT(gbproxy_check_imsi(peer, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4062 OSMO_ASSERT(gbproxy_check_imsi(peer, imei1, ARRAY_SIZE(imei1)) == -1);
4063 OSMO_ASSERT(gbproxy_check_imsi(peer, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004064
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004065 OSMO_ASSERT(gbproxy_set_patch_filter(&cfg, filter_re3, &err_msg) == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004066 OSMO_ASSERT(cfg.check_imsi == 1);
4067
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004068 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi1, ARRAY_SIZE(imsi1)) == 0);
4069 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi2, ARRAY_SIZE(imsi2)) == 0);
4070 OSMO_ASSERT(gbproxy_check_imsi(peer, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4071 OSMO_ASSERT(gbproxy_check_imsi(peer, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4072 OSMO_ASSERT(gbproxy_check_imsi(peer, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4073 OSMO_ASSERT(gbproxy_check_imsi(peer, imei1, ARRAY_SIZE(imei1)) == -1);
4074 OSMO_ASSERT(gbproxy_check_imsi(peer, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004075
4076 /* TODO: Check correct length but wrong type with is_mi_tmsi */
4077
4078 gbproxy_peer_free(peer);
4079}
4080
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004081static struct log_info_cat gprs_categories[] = {
4082 [DGPRS] = {
4083 .name = "DGPRS",
4084 .description = "GPRS Packet Service",
4085 .enabled = 1, .loglevel = LOGL_DEBUG,
4086 },
4087 [DNS] = {
4088 .name = "DNS",
4089 .description = "GPRS Network Service (NS)",
4090 .enabled = 1, .loglevel = LOGL_INFO,
4091 },
4092 [DBSSGP] = {
4093 .name = "DBSSGP",
4094 .description = "GPRS BSS Gateway Protocol (BSSGP)",
4095 .enabled = 1, .loglevel = LOGL_DEBUG,
4096 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004097};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004098
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004099static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004100 .cat = gprs_categories,
4101 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004102};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004103
4104int main(int argc, char **argv)
4105{
4106 osmo_init_logging(&info);
4107 log_set_use_color(osmo_stderr_target, 0);
4108 log_set_print_filename(osmo_stderr_target, 0);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02004109 osmo_signal_register_handler(SS_L_NS, &test_signal, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004110
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004111 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004112 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
4113 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004114
4115 rate_ctr_init(NULL);
4116
4117 setlinebuf(stdout);
4118
4119 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02004120 gbproxy_init_config(&gbcfg);
Jacob Erlbeckb1381062014-07-01 12:41:13 +02004121 test_tlv_shift_functions();
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004122 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004123 test_gbproxy_ident_changes();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004124 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02004125 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02004126 test_gbproxy_ra_patching();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02004127 test_gbproxy_ptmsi_patching();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02004128 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02004129 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004130 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004131 test_gbproxy_tlli_expire();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004132 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004133
4134 exit(EXIT_SUCCESS);
4135}