blob: e8a4ef983f17abf863a93d8fecd555db29086be3 [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>
Harald Welte53373bc2016-04-20 17:11:43 +020029#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020030#include <osmocom/gprs/gprs_msgb.h>
31#include <osmocom/gprs/gprs_ns.h>
32#include <osmocom/gprs/gprs_bssgp.h>
33
Neels Hofmeyr396f2e62017-09-04 15:13:25 +020034#include <osmocom/sgsn/gb_proxy.h>
35#include <osmocom/sgsn/gprs_utils.h>
36#include <osmocom/sgsn/gprs_llc.h>
37#include <osmocom/sgsn/gprs_gb_parse.h>
38#include <osmocom/sgsn/debug.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020039
Daniel Willmann537d4802015-10-12 19:36:35 +020040#include <openssl/rand.h>
41
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020042#define REMOTE_BSS_ADDR 0x01020304
43#define REMOTE_SGSN_ADDR 0x05060708
44
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020045#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020046
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +020047#define REMOTE_SGSN2_ADDR 0x15161718
48#define SGSN2_NSEI 0x0102
49
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020050#define MATCH_ANY (-1)
51
Neels Hofmeyree6cfdc2017-07-13 02:03:50 +020052void *tall_bsc_ctx;
53
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020054struct gbproxy_config gbcfg = {0};
55
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020056struct llist_head *received_messages = NULL;
57
Daniel Willmann537d4802015-10-12 19:36:35 +020058/* override, requires '-Wl,--wrap=RAND_bytes' */
59int __real_RAND_bytes(unsigned char *buf, int num);
60int mock_RAND_bytes(unsigned char *buf, int num);
61int (*RAND_bytes_cb)(unsigned char *, int) =
62 &mock_RAND_bytes;
63
64int __wrap_RAND_bytes(unsigned char *buf, int num)
65{
66 return (*RAND_bytes_cb)(buf, num);
67}
68
69static int rand_seq_num = 0;
70int mock_RAND_bytes(unsigned char *buf, int num)
71{
72 uint32_t val;
73
74 OSMO_ASSERT(num == sizeof(val));
75 OSMO_ASSERT(__real_RAND_bytes(buf, num) == 1);
76
77 val = 0x00dead00 + rand_seq_num;
78
79 rand_seq_num++;
80
81 memcpy(buf, &val, num);
82
83 return 1;
84}
85
Daniel Willmannd1554ec2015-10-12 19:36:34 +020086static void cleanup_test()
87{
Daniel Willmann537d4802015-10-12 19:36:35 +020088 rand_seq_num = 0;
Daniel Willmannd1554ec2015-10-12 19:36:34 +020089}
90
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020091static int dump_global(FILE *stream, int indent)
92{
93 unsigned int i;
94 const struct rate_ctr_group_desc *desc;
95 int rc;
96
97 rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
98 if (rc < 0)
99 return rc;
100
101 desc = gbcfg.ctrg->desc;
102
103 for (i = 0; i < desc->num_ctr; i++) {
104 struct rate_ctr *ctr = &gbcfg.ctrg->ctr[i];
105 if (ctr->current) {
106 rc = fprintf(stream, "%*s %s: %llu\n",
107 indent, "",
108 desc->ctr_desc[i].description,
109 (long long)ctr->current);
110
111 if (rc < 0)
112 return rc;
113 }
114 }
115
116 return 0;
117}
118
Jacob Erlbeck7b821d02014-08-08 08:37:37 +0200119static int dump_peers(FILE *stream, int indent, time_t now,
120 struct gbproxy_config *cfg)
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200121{
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200122 struct gbproxy_peer *peer;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200123 struct gprs_ra_id raid;
124 unsigned int i;
125 const struct rate_ctr_group_desc *desc;
126 int rc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200127
128 rc = fprintf(stream, "%*sPeers:\n", indent, "");
129 if (rc < 0)
130 return rc;
131
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +0200132 llist_for_each_entry(peer, &cfg->bts_peers, list) {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200133 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200134 struct gbproxy_patch_state *state = &peer->patch_state;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200135 gsm48_parse_ra(&raid, peer->ra);
136
137 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, "
138 "RAI %u-%u-%u-%u\n",
139 indent, "",
140 peer->nsei, peer->bvci,
141 peer->blocked ? "" : "not ",
142 raid.mcc, raid.mnc, raid.lac, raid.rac);
143
144 if (rc < 0)
145 return rc;
146
147 desc = peer->ctrg->desc;
148
149 for (i = 0; i < desc->num_ctr; i++) {
150 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
151 if (ctr->current) {
152 rc = fprintf(stream, "%*s %s: %llu\n",
153 indent, "",
154 desc->ctr_desc[i].description,
155 (long long)ctr->current);
156
157 if (rc < 0)
158 return rc;
159 }
160 }
161
162 fprintf(stream, "%*s TLLI-Cache: %d\n",
Jacob Erlbeckf8562e32014-09-19 16:03:07 +0200163 indent, "", state->logical_link_count);
164 llist_for_each_entry(link_info, &state->logical_links, list) {
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200165 char mi_buf[200];
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200166 time_t age = now ? now - link_info->timestamp : 0;
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200167 int stored_msgs = 0;
168 struct llist_head *iter;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200169 enum gbproxy_match_id match_id;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200170 llist_for_each(iter, &link_info->stored_msgs)
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200171 stored_msgs++;
172
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200173 if (link_info->imsi_len > 0) {
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200174 snprintf(mi_buf, sizeof(mi_buf), "(invalid)");
175 gsm48_mi_to_string(mi_buf, sizeof(mi_buf),
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200176 link_info->imsi,
177 link_info->imsi_len);
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200178 } else {
179 snprintf(mi_buf, sizeof(mi_buf), "(none)");
180 }
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200181 fprintf(stream, "%*s TLLI %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200182 indent, "", link_info->tlli.current);
183 if (link_info->tlli.assigned)
184 fprintf(stream, "/%08x", link_info->tlli.assigned);
185 if (link_info->sgsn_tlli.current) {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200186 fprintf(stream, " -> %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200187 link_info->sgsn_tlli.current);
188 if (link_info->sgsn_tlli.assigned)
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200189 fprintf(stream, "/%08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200190 link_info->sgsn_tlli.assigned);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200191 }
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200192 fprintf(stream, ", IMSI %s, AGE %d",
193 mi_buf, (int)age);
194
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200195 if (stored_msgs)
196 fprintf(stream, ", STORED %d", stored_msgs);
197
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200198 for (match_id = 0; match_id < ARRAY_SIZE(cfg->matches);
199 ++match_id) {
200 if (cfg->matches[match_id].enable &&
201 link_info->is_matching[match_id]) {
202 fprintf(stream, ", IMSI matches");
203 break;
204 }
205 }
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200206
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200207 if (link_info->imsi_acq_pending)
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200208 fprintf(stream, ", IMSI acquisition in progress");
209
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200210 if (cfg->route_to_sgsn2)
211 fprintf(stream, ", SGSN NSEI %d",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200212 link_info->sgsn_nsei);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200213
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200214 if (link_info->is_deregistered)
Jacob Erlbeck7430da62014-09-12 15:09:56 +0200215 fprintf(stream, ", DE-REGISTERED");
216
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200217 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200218 if (rc < 0)
219 return rc;
220 }
221 }
222
223 return 0;
224}
225
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200226const uint8_t *convert_ra(struct gprs_ra_id *raid)
227{
228 static uint8_t buf[6];
229 gsm48_construct_ra(buf, raid);
230 return buf;
231}
232
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200233/* DTAP - Attach Request */
234static const unsigned char dtap_attach_req[] = {
235 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
236 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
237 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
238 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
239 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
240 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200241};
242
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200243/* DTAP - Attach Request (invalid RAI) */
244static const unsigned char dtap_attach_req2[] = {
245 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
246 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
247 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
248 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
249 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
250 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
251};
252
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200253/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
254static const unsigned char dtap_attach_req3[] = {
255 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
256 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
257 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
258 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
259 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
260 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
261};
262
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100263/* DTAP - Attach Request (IMSI 12131415161718) */
264static const unsigned char dtap_attach_req4[] = {
265 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
266 0x08, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
267 0x18, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19,
268 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00,
269 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60,
270 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80,
271 0x00,
272};
273
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200274/* DTAP - Identity Request */
275static const unsigned char dtap_identity_req[] = {
276 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200277};
278
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200279/* DTAP - Identity Response */
280static const unsigned char dtap_identity_resp[] = {
281 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
282 0x16, 0x17, 0x18
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200283};
284
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200285/* DTAP - Identity Response, IMSI 2 */
286static const unsigned char dtap_identity2_resp[] = {
287 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
288 0x16, 0x17, 0x18
289};
290
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200291/* DTAP - Identity Response, IMSI 3 */
292static const unsigned char dtap_identity3_resp[] = {
293 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
294 0x26, 0x27, 0x28
295};
296
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200297/* DTAP - Attach Accept */
298static const unsigned char dtap_attach_acc[] = {
299 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
300 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
301 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200302};
303
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200304/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200305static const unsigned char dtap_attach_acc2[] = {
306 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
307 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
308 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
309};
310
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200311/* DTAP - Attach Complete */
312static const unsigned char dtap_attach_complete[] = {
313 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200314};
315
Jacob Erlbeck2bf32612014-09-22 11:26:58 +0200316/* DTAP - Attach Reject (GPRS services not allowed) */
317static const unsigned char dtap_attach_rej7[] = {
318 0x08, 0x04, 0x07
319};
320
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200321/* DTAP - GMM Information */
322static const unsigned char dtap_gmm_information[] = {
323 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200324};
325
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200326/* DTAP - Routing Area Update Request */
327static const unsigned char dtap_ra_upd_req[] = {
328 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
329 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
330 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
331 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
332 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
333 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
334 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200335};
336
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200337/* DTAP - Routing Area Update Accept */
338static const unsigned char dtap_ra_upd_acc[] = {
339 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
340 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
341 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200342};
343
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200344/* DTAP - Routing Area Update Accept, P-TMSI 2 */
345static const unsigned char dtap_ra_upd_acc2[] = {
346 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
347 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
348 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
349};
350
351/* DTAP - Routing Area Update Accept, P-TMSI 3 */
352static const unsigned char dtap_ra_upd_acc3[] = {
353 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
354 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
355 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
356};
357
358/* DTAP - Routing Area Update Complete */
359static const unsigned char dtap_ra_upd_complete[] = {
360 0x08, 0x0a
361};
362
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200363/* DTAP - Routing Area Update Reject */
364/* cause = 10 ("Implicitly detached"), force_standby = 0 */
365static const unsigned char dtap_ra_upd_rej[] = {
366 0x08, 0x0b, 0x0a, 0x00,
367};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200368
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200369/* DTAP - Activate PDP Context Request */
370static const unsigned char dtap_act_pdp_ctx_req[] = {
371 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200372 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
374 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
375 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
376 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200377 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200378};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200379
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200380/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200381/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200382static const unsigned char dtap_detach_po_req[] = {
383 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
384 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200385};
386
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200387/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200388/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200389static const unsigned char dtap_detach_req[] = {
390 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
391 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200392};
393
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200394/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200395static const unsigned char dtap_detach_acc[] = {
396 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200397};
398
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200399/* DTAP - Detach Request (MT) */
400/* normal detach, reattach required, implicitly detached */
401static const unsigned char dtap_mt_detach_rea_req[] = {
402 0x08, 0x05, 0x01, 0x25, 0x0a
403};
404
405/* DTAP - Detach Request (MT) */
406/* normal detach, reattach not required, implicitly detached */
407static const unsigned char dtap_mt_detach_req[] = {
408 0x08, 0x05, 0x02, 0x25, 0x0a
409};
410
411/* DTAP - Detach Accept (MT) */
412static const unsigned char dtap_mt_detach_acc[] = {
413 0x08, 0x06
414};
415
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200416/* GPRS-LLC - SAPI: LLGMM, U, XID */
417static const unsigned char llc_u_xid_ul[] = {
418 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
419 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
420};
421
422/* GPRS-LLC - SAPI: LLGMM, U, XID */
423static const unsigned char llc_u_xid_dl[] = {
424 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
425 0xe4, 0xa9, 0x1a, 0x9e
426};
427
428/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
429static const unsigned char llc_ui_ll11_dns_query_ul[] = {
430 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
431 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
432 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
433 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
434 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
435 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
436 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
437 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
438 0x8f, 0x07
439};
440
441/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
442static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
443 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
444 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
445 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
446 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
447 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
448 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
449 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
450 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
451 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
452 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
453 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
454 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
455 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
456 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
457 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
458 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
459 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
460 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
461 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
462 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
463 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
464 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
465 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
466 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
467 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
468 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
469};
470
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200471static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
472 struct sockaddr_in *peer, const unsigned char* data,
473 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200474
475static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
476 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
477{
478 /* GPRS Network Service, PDU type: NS_RESET,
479 */
480 unsigned char msg[12] = {
481 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
482 0x04, 0x82, 0x11, 0x22
483 };
484
485 msg[3] = cause;
486 msg[6] = nsvci / 256;
487 msg[7] = nsvci % 256;
488 msg[10] = nsei / 256;
489 msg[11] = nsei % 256;
490
491 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
492}
493
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200494static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
495 uint16_t nsvci, uint16_t nsei)
496{
497 /* GPRS Network Service, PDU type: NS_RESET_ACK,
498 */
499 unsigned char msg[9] = {
500 0x03, 0x01, 0x82, 0x11, 0x22,
501 0x04, 0x82, 0x11, 0x22
502 };
503
504 msg[3] = nsvci / 256;
505 msg[4] = nsvci % 256;
506 msg[7] = nsei / 256;
507 msg[8] = nsei % 256;
508
509 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
510}
511
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200512static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
513{
514 /* GPRS Network Service, PDU type: NS_ALIVE */
515 unsigned char msg[1] = {
516 0x0a
517 };
518
519 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
520}
521
522static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
523{
524 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
525 unsigned char msg[1] = {
526 0x0b
527 };
528
529 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
530}
531
532static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
533{
534 /* GPRS Network Service, PDU type: NS_UNBLOCK */
535 unsigned char msg[1] = {
536 0x06
537 };
538
539 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
540}
541
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200542static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
543{
544 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
545 unsigned char msg[1] = {
546 0x07
547 };
548
549 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
550}
551
552static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
553 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200554 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
555{
556 /* GPRS Network Service, PDU type: NS_UNITDATA */
557 unsigned char msg[4096] = {
558 0x00, 0x00, 0x00, 0x00
559 };
560
561 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
562
563 msg[2] = nsbvci / 256;
564 msg[3] = nsbvci % 256;
565 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
566
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200567 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200568}
569
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200570static void send_bssgp_ul_unitdata(
571 struct gprs_ns_inst *nsi, const char *text,
572 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
573 struct gprs_ra_id *raid, uint16_t cell_id,
574 const uint8_t *llc_msg, size_t llc_msg_size)
575{
576 /* GPRS Network Service, PDU type: NS_UNITDATA */
577 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
578 unsigned char msg[4096] = {
579 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
580 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
581 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
582 };
583
584 size_t bssgp_msg_size = 23 + llc_msg_size;
585
586 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
587
588 gsm48_construct_ra(msg + 10, raid);
589 msg[1] = (uint8_t)(tlli >> 24);
590 msg[2] = (uint8_t)(tlli >> 16);
591 msg[3] = (uint8_t)(tlli >> 8);
592 msg[4] = (uint8_t)(tlli >> 0);
593 msg[16] = cell_id / 256;
594 msg[17] = cell_id % 256;
595 msg[21] = llc_msg_size / 256;
596 msg[22] = llc_msg_size % 256;
597 memcpy(msg + 23, llc_msg, llc_msg_size);
598
599 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
600 src_addr, nsbvci, msg, bssgp_msg_size);
601}
602
603static void send_bssgp_dl_unitdata(
604 struct gprs_ns_inst *nsi, const char *text,
605 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
606 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
607 const uint8_t *llc_msg, size_t llc_msg_size)
608{
609 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
610 unsigned char msg[4096] = {
611 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
612 0x16, 0x82, 0x02, 0x58,
613 };
614 unsigned char racap_drx[] = {
615 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
616 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
617 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
618 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
619 };
620
621 size_t bssgp_msg_size = 0;
622
623 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
624
625 msg[1] = (uint8_t)(tlli >> 24);
626 msg[2] = (uint8_t)(tlli >> 16);
627 msg[3] = (uint8_t)(tlli >> 8);
628 msg[4] = (uint8_t)(tlli >> 0);
629
630 bssgp_msg_size = 12;
631
632 if (with_racap_drx) {
633 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
634 bssgp_msg_size += sizeof(racap_drx);
635 }
636
637 if (imsi) {
638 OSMO_ASSERT(imsi_size <= 127);
639 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
640 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
641 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
642 bssgp_msg_size += 2 + imsi_size;
643 }
644
645 if ((bssgp_msg_size % 4) != 0) {
646 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
647 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
648 msg[bssgp_msg_size + 1] = 0x80 | abytes;
649 memset(msg + bssgp_msg_size + 2, 0, abytes);
650 bssgp_msg_size += 2 + abytes;
651 }
652
653 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
654 if (llc_msg_size < 128) {
655 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
656 bssgp_msg_size += 2;
657 } else {
658 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
659 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
660 bssgp_msg_size += 3;
661 }
662 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
663 bssgp_msg_size += llc_msg_size;
664
665
666 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
667 src_addr, nsbvci, msg, bssgp_msg_size);
668}
669
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200670static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
671 uint16_t bvci)
672{
673 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
674 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200675 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200676 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200677 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
678 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200679 };
680
681 msg[3] = bvci / 256;
682 msg[4] = bvci % 256;
683
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200684 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
685}
686
687static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
688 struct sockaddr_in *src_addr, uint16_t bvci)
689{
690 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
691 * BSSGP RESET_ACK */
692 static unsigned char msg[5] = {
693 0x23, 0x04, 0x82, 0x00,
694 0x00
695 };
696
697 msg[3] = bvci / 256;
698 msg[4] = bvci % 256;
699
700 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200701}
702
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200703static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
704 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200705 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200706 struct gprs_ra_id *raid)
707{
708 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
709 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200710 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
711 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200712 };
713
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200714 msg[3] = (uint8_t)(tlli >> 24);
715 msg[4] = (uint8_t)(tlli >> 16);
716 msg[5] = (uint8_t)(tlli >> 8);
717 msg[6] = (uint8_t)(tlli >> 0);
718
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200719 gsm48_construct_ra(msg + 9, raid);
720
721 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
722}
723
724static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
725 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200726 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200727 struct gprs_ra_id *raid)
728{
729 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
730 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200731 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
732 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200733 0x81, 0x01
734 };
735
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200736 msg[3] = (uint8_t)(tlli >> 24);
737 msg[4] = (uint8_t)(tlli >> 16);
738 msg[5] = (uint8_t)(tlli >> 8);
739 msg[6] = (uint8_t)(tlli >> 0);
740
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200741 gsm48_construct_ra(msg + 9, raid);
742
743 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
744}
745
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200746static void send_bssgp_llc_discarded(struct gprs_ns_inst *nsi,
747 struct sockaddr_in *src_addr,
748 uint16_t bvci, uint32_t tlli,
749 unsigned n_frames, unsigned n_octets)
750{
751 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
752 unsigned char msg[] = {
753 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
754 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
755 /* n octets */ 0xff, 0xff, 0xff
756 };
757
758 msg[3] = (uint8_t)(tlli >> 24);
759 msg[4] = (uint8_t)(tlli >> 16);
760 msg[5] = (uint8_t)(tlli >> 8);
761 msg[6] = (uint8_t)(tlli >> 0);
762 msg[9] = (uint8_t)(n_frames);
763 msg[12] = (uint8_t)(bvci >> 8);
764 msg[13] = (uint8_t)(bvci >> 0);
765 msg[16] = (uint8_t)(n_octets >> 16);
766 msg[17] = (uint8_t)(n_octets >> 8);
767 msg[18] = (uint8_t)(n_octets >> 0);
768
769 send_ns_unitdata(nsi, "LLC_DISCARDED", src_addr, 0, msg, sizeof(msg));
770}
771
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200772static void send_bssgp_paging(struct gprs_ns_inst *nsi,
773 struct sockaddr_in *src_addr,
774 const uint8_t *imsi, size_t imsi_size,
775 struct gprs_ra_id *raid, uint32_t ptmsi)
776{
777 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
778 unsigned char msg[100] = {
779 0x06,
780 };
781
782 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
783 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
784
785 size_t bssgp_msg_size = 1;
786
787 if (imsi) {
788 OSMO_ASSERT(imsi_size <= 127);
789 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
790 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
791 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
792 bssgp_msg_size += 2 + imsi_size;
793 }
794
795 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
796 bssgp_msg_size += sizeof(drx_ie);
797
798 if (raid) {
799 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
800 msg[bssgp_msg_size+1] = 0x86;
801 gsm48_construct_ra(msg + bssgp_msg_size + 2, raid);
802 bssgp_msg_size += 8;
803 }
804
805 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
806 bssgp_msg_size += sizeof(qos_ie);
807
808 if (ptmsi != GSM_RESERVED_TMSI) {
809 const uint32_t ptmsi_be = htonl(ptmsi);
810 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
811 msg[bssgp_msg_size+1] = 0x84;
812 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
813 bssgp_msg_size += 6;
814 }
815
816 send_ns_unitdata(nsi, "PAGING_PS", src_addr, 0, msg, bssgp_msg_size);
817}
818
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200819static void send_bssgp_flow_control_bvc(struct gprs_ns_inst *nsi,
820 struct sockaddr_in *src_addr,
821 uint16_t bvci, uint8_t tag)
822{
823 /* GPRS Network Service, PDU type: NS_UNITDATA,
824 * BSSGP FLOW_CONTROL_BVC */
825 unsigned char msg[] = {
826 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
827 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
828 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
829 };
830
831 msg[3] = tag;
832
833 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", src_addr, bvci,
834 msg, sizeof(msg));
835}
836
837static void send_bssgp_flow_control_bvc_ack(struct gprs_ns_inst *nsi,
838 struct sockaddr_in *src_addr,
839 uint16_t bvci, uint8_t tag)
840{
841 /* GPRS Network Service, PDU type: NS_UNITDATA,
842 * BSSGP FLOW_CONTROL_BVC_ACK */
843 unsigned char msg[] = {
844 0x27, 0x1e, 0x81, /* Tag */ 0xce
845 };
846
847 msg[3] = tag;
848
849 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", src_addr, bvci,
850 msg, sizeof(msg));
851}
852
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200853static void send_llc_ul_ui(
854 struct gprs_ns_inst *nsi, const char *text,
855 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
856 struct gprs_ra_id *raid, uint16_t cell_id,
857 unsigned sapi, unsigned nu,
858 const uint8_t *msg, size_t msg_size)
859{
860 unsigned char llc_msg[4096] = {
861 0x00, 0xc0, 0x01
862 };
863
864 size_t llc_msg_size = 3 + msg_size + 3;
865 uint8_t e_bit = 0;
866 uint8_t pm_bit = 1;
867 unsigned fcs;
868
869 nu &= 0x01ff;
870
871 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
872
873 llc_msg[0] = (sapi & 0x0f);
874 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
875 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
876
877 memcpy(llc_msg + 3, msg, msg_size);
878
879 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
880 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
881 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
882 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
883
884 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
885 src_addr, nsbvci, tlli, raid, cell_id,
886 llc_msg, llc_msg_size);
887}
888
889static void send_llc_dl_ui(
890 struct gprs_ns_inst *nsi, const char *text,
891 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
892 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
893 unsigned sapi, unsigned nu,
894 const uint8_t *msg, size_t msg_size)
895{
896 /* GPRS Network Service, PDU type: NS_UNITDATA */
897 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
898 unsigned char llc_msg[4096] = {
899 0x00, 0x00, 0x01
900 };
901
902 size_t llc_msg_size = 3 + msg_size + 3;
903 uint8_t e_bit = 0;
904 uint8_t pm_bit = 1;
905 unsigned fcs;
906
907 nu &= 0x01ff;
908
909 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
910
911 llc_msg[0] = 0x40 | (sapi & 0x0f);
912 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
913 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
914
915 memcpy(llc_msg + 3, msg, msg_size);
916
917 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
918 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
919 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
920 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
921
922 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
923 src_addr, nsbvci, tlli,
924 with_racap_drx, imsi, imsi_size,
925 llc_msg, llc_msg_size);
926}
927
928
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200929static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
930 uint16_t nsvci, uint16_t nsei)
931{
932 printf("Setup NS-VC: remote 0x%08x:%d, "
933 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
934 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
935 nsvci, nsvci, nsei, nsei);
936
937 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
938 send_ns_alive(nsi, src_addr);
939 send_ns_unblock(nsi, src_addr);
940 send_ns_alive_ack(nsi, src_addr);
941}
942
943static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
944 uint16_t bvci)
945{
946 printf("Setup BSSGP: remote 0x%08x:%d, "
947 "BVCI 0x%04x(%d)\n\n",
948 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
949 bvci, bvci);
950
951 send_bssgp_reset(nsi, src_addr, bvci);
952}
953
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200954static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer,
955 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200956{
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200957 gprs_ns_nsip_connect(nsi, sgsn_peer, sgsn_nsei, sgsn_nsei+1);
958 send_ns_reset_ack(nsi, sgsn_peer, sgsn_nsei+1, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200959 send_ns_alive_ack(nsi, sgsn_peer);
960 send_ns_unblock_ack(nsi, sgsn_peer);
961 send_ns_alive(nsi, sgsn_peer);
962}
963
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200964static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
965{
966 sgsn_peer->sin_family = AF_INET;
967 sgsn_peer->sin_port = htons(32000);
968 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
969}
970
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200971static void configure_sgsn2_peer(struct sockaddr_in *sgsn_peer)
972{
973 sgsn_peer->sin_family = AF_INET;
974 sgsn_peer->sin_port = htons(32001);
975 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN2_ADDR);
976}
977
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200978static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
979{
980 size_t i;
981
982 for (i = 0; i < size; ++i) {
983 bss_peers[i].sin_family = AF_INET;
984 bss_peers[i].sin_port = htons((i + 1) * 1111);
985 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
986 }
987}
988
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200989int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
990 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
991
992/* override */
993int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
994 struct msgb *msg, uint16_t bvci)
995{
Holger Hans Peter Freytherdaaea0c2015-08-03 09:28:41 +0200996 printf("CALLBACK, event %d, msg length %zu, bvci 0x%04x\n%s\n\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200997 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200998 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200999
1000 switch (event) {
1001 case GPRS_NS_EVT_UNIT_DATA:
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001002 return gbprox_rcvmsg(&gbcfg, msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001003 default:
1004 break;
1005 }
1006 return 0;
1007}
1008
1009/* override */
1010ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
1011 const struct sockaddr *dest_addr, socklen_t addrlen)
1012{
1013 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
1014 const struct sockaddr *, socklen_t);
1015 static sendto_t real_sendto = NULL;
1016 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001017 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001018
1019 if (!real_sendto)
1020 real_sendto = dlsym(RTLD_NEXT, "sendto");
1021
1022 if (dest_host == REMOTE_BSS_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001023 printf("MESSAGE to BSS at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001024 dest_host, dest_port,
1025 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001026 else if (dest_host == REMOTE_SGSN_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001027 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001028 dest_host, dest_port,
1029 len, osmo_hexdump(buf, len));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001030 else if (dest_host == REMOTE_SGSN2_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001031 printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001032 dest_host, dest_port,
1033 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001034 else
1035 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
1036
1037 return len;
1038}
1039
1040/* override */
1041int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
1042{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001043 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
1044 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001045 uint16_t bvci = msgb_bvci(msg);
1046 uint16_t nsei = msgb_nsei(msg);
1047
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001048 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001049
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001050 if (!real_gprs_ns_sendmsg)
1051 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
1052
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001053 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001054 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001055 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001056 bvci, len, __func__);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001057 else if (nsei == SGSN2_NSEI)
1058 printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001059 "msg length %zu (%s)\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001060 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001061 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001062 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001063 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001064 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001065
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001066 if (received_messages) {
1067 struct msgb *msg_copy;
1068 msg_copy = gprs_msgb_copy(msg, "received_messages");
1069 llist_add_tail(&msg_copy->list, received_messages);
1070 }
1071
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001072 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001073}
1074
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001075/* Get the next message from the receive FIFO
1076 *
1077 * \returns a pointer to the message which will be invalidated at the next call
1078 * to expect_msg. Returns NULL, if there is no message left.
1079 */
1080static struct msgb *expect_msg(void)
1081{
1082 static struct msgb *msg = NULL;
1083
1084 msgb_free(msg);
1085 msg = NULL;
1086
1087 if (!received_messages)
1088 return NULL;
1089
1090 if (llist_empty(received_messages))
1091 return NULL;
1092
1093 msg = llist_entry(received_messages->next, struct msgb, list);
1094 llist_del(&msg->list);
1095
1096 return msg;
1097}
1098
1099struct expect_result {
1100 struct msgb *msg;
1101 struct gprs_gb_parse_context parse_ctx;
1102};
1103
1104static struct expect_result *expect_bssgp_msg(
1105 int match_nsei, int match_bvci, int match_pdu_type)
1106{
1107 static struct expect_result result;
1108 static const struct expect_result empty_result = {0,};
1109 static struct msgb *msg;
1110 uint16_t nsei;
1111 int rc;
1112
1113 memcpy(&result, &empty_result, sizeof(result));
1114
1115 msg = expect_msg();
1116 if (!msg)
1117 return NULL;
1118
1119 nsei = msgb_nsei(msg);
1120
1121 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1122 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1123 __func__, match_nsei, nsei);
1124 return NULL;
1125 }
1126
1127 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1128 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1129 __func__, match_bvci, msgb_bvci(msg));
1130 return NULL;
1131 }
1132
1133 result.msg = msg;
1134
1135 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1136 result.parse_ctx.peer_nsei = nsei;
1137
1138 if (!msgb_bssgph(msg)) {
1139 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1140 return NULL;
1141 }
1142
1143 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1144 &result.parse_ctx);
1145
1146 if (!rc) {
1147 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1148 return NULL;
1149 }
1150
1151 if (match_pdu_type != MATCH_ANY &&
1152 match_pdu_type != result.parse_ctx.pdu_type) {
1153 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1154 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1155 return NULL;
1156 }
1157
1158 return &result;
1159}
1160
1161static struct expect_result *expect_llc_msg(
1162 int match_nsei, int match_bvci, int match_sapi, int match_type)
1163{
1164 static struct expect_result *result;
1165
1166 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1167 if (!result)
1168 return NULL;
1169
1170 if (!result->parse_ctx.llc) {
1171 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1172 return NULL;
1173 }
1174
1175 if (match_sapi != MATCH_ANY &&
1176 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1177 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1178 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1179 return NULL;
1180 }
1181
1182 if (match_type != MATCH_ANY &&
1183 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1184 fprintf(stderr,
1185 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1186 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1187 return NULL;
1188 }
1189
1190 return result;
1191}
1192
1193static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1194 int match_type)
1195{
1196 static struct expect_result *result;
1197
1198 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1199 if (!result)
1200 return NULL;
1201
1202 if (!result->parse_ctx.g48_hdr) {
1203 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1204 return NULL;
1205 }
1206
1207 if (match_type != MATCH_ANY &&
1208 match_type != result->parse_ctx.g48_hdr->msg_type) {
1209 fprintf(stderr,
1210 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1211 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1212 return NULL;
1213 }
1214
1215 return result;
1216}
1217
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001218static void dump_rate_ctr_group(FILE *stream, const char *prefix,
1219 struct rate_ctr_group *ctrg)
1220{
1221 unsigned int i;
1222
1223 for (i = 0; i < ctrg->desc->num_ctr; i++) {
1224 struct rate_ctr *ctr = &ctrg->ctr[i];
1225 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
1226 fprintf(stream, " %s%s: %llu%s",
1227 prefix, ctrg->desc->ctr_desc[i].description,
1228 (long long)ctr->current,
1229 "\n");
1230 };
1231}
1232
1233/* Signal handler for signals from NS layer */
1234static int test_signal(unsigned int subsys, unsigned int signal,
1235 void *handler_data, void *signal_data)
1236{
1237 struct ns_signal_data *nssd = signal_data;
1238 int rc;
1239
1240 if (subsys != SS_L_NS)
1241 return 0;
1242
1243 switch (signal) {
1244 case S_NS_RESET:
1245 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
1246 nssd->nsvc->nsvci,
1247 gprs_ns_ll_str(nssd->nsvc));
1248 break;
1249
1250 case S_NS_ALIVE_EXP:
1251 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
1252 nssd->nsvc->nsvci,
1253 gprs_ns_ll_str(nssd->nsvc));
1254 break;
1255
1256 case S_NS_BLOCK:
1257 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
1258 nssd->nsvc->nsvci,
1259 gprs_ns_ll_str(nssd->nsvc));
1260 break;
1261
1262 case S_NS_UNBLOCK:
1263 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
1264 nssd->nsvc->nsvci,
1265 gprs_ns_ll_str(nssd->nsvc));
1266 break;
1267
1268 case S_NS_REPLACED:
1269 printf("==> got signal NS_REPLACED: 0x%04x/%s",
1270 nssd->nsvc->nsvci,
1271 gprs_ns_ll_str(nssd->nsvc));
1272 printf(" -> 0x%04x/%s\n",
1273 nssd->old_nsvc->nsvci,
1274 gprs_ns_ll_str(nssd->old_nsvc));
1275 break;
1276
1277 default:
1278 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
1279 nssd->nsvc->nsvci,
1280 gprs_ns_ll_str(nssd->nsvc));
1281 break;
1282 }
1283 printf("\n");
1284 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
1285 return rc;
1286}
1287
1288static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
1289{
1290 struct msgb *msg;
1291 int ret;
1292 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001293 fprintf(stderr, "message too long: %zu\n", data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001294 return -1;
1295 }
1296
1297 msg = gprs_ns_msgb_alloc();
Neels Hofmeyrc9ac20e2016-04-14 15:21:33 +02001298 OSMO_ASSERT(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001299 memmove(msg->data, data, data_len);
1300 msg->l2h = msg->data;
1301 msgb_put(msg, data_len);
1302
1303 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
1304 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1305 osmo_hexdump(data, data_len));
1306
1307 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
1308
1309 printf("result (%s) = %d\n\n", text, ret);
1310
1311 msgb_free(msg);
1312
1313 return ret;
1314}
1315
1316static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
1317{
1318 struct gprs_nsvc *nsvc;
1319
1320 printf("Current NS-VCIs:\n");
1321 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
1322 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001323 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001324 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001325 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1326 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
1327 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001328 );
1329 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
1330 }
1331 printf("\n");
1332}
1333
1334static void test_gbproxy()
1335{
1336 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1337 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001338 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001339
1340 bssgp_nsi = nsi;
1341 gbcfg.nsi = bssgp_nsi;
1342 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1343
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001344 configure_sgsn_peer(&sgsn_peer);
1345 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001346
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001347 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001348 printf("--- Initialise SGSN ---\n\n");
1349
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001350 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001351 gprs_dump_nsi(nsi);
1352
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001353 printf("--- Initialise BSS 1 ---\n\n");
1354
1355 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1356 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1357 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001358 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001359
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001360 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1361
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001362 printf("--- Initialise BSS 2 ---\n\n");
1363
1364 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
1365 setup_bssgp(nsi, &bss_peer[1], 0x2002);
1366 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001367 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001368
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001369 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
1370
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001371 printf("--- Move BSS 1 to new port ---\n\n");
1372
1373 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
1374 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001375 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001376
1377 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1378
1379 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1380 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001381 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001382
1383 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
1384
1385 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1386 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001387 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001388
1389 printf("--- Move BSS 2 to new port ---\n\n");
1390
1391 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
1392 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001393 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001394
1395 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1396
1397 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
1398 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001399 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001400
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001401 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
1402
1403 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1404 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001405 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001406
1407 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1408
1409 setup_bssgp(nsi, &bss_peer[0], 0x1012);
1410 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001411 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001412
1413 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
1414
1415 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1416
1417 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1418 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001419 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001420
1421 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1422
1423 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1424
1425 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1426 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001427 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001428
1429 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1430
1431 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1432
1433 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1434
1435 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1436
1437 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1438
1439 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1440
1441 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1442
1443 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1444
1445 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1446
1447 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1448
1449 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
1450
1451 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1452
1453 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
1454
1455 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1456
1457 setup_bssgp(nsi, &bss_peer[2], 0x1002);
1458 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001459 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001460
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001461 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001462
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001463 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1464
1465 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1466
1467 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1468
1469 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1470
1471 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1472
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001473 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1474
1475 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
1476
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001477 /* Find peer */
1478 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1479 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1480 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1481 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1482 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1483 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1484
1485
1486 /* Cleanup */
1487 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1488 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1489 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1490 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1491 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1492
1493 dump_peers(stdout, 0, 0, &gbcfg);
1494
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001495 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001496
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001497 gbprox_reset(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001498 gprs_ns_destroy(nsi);
1499 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001500}
1501
1502static void test_gbproxy_ident_changes()
1503{
1504 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1505 struct sockaddr_in bss_peer[1] = {{0},};
1506 struct sockaddr_in sgsn_peer= {0};
1507 uint16_t nsei[2] = {0x1000, 0x2000};
1508 uint16_t nsvci[2] = {0x1001, 0x2001};
1509 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
1510
1511 bssgp_nsi = nsi;
1512 gbcfg.nsi = bssgp_nsi;
1513 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1514
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001515 configure_sgsn_peer(&sgsn_peer);
1516 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001517
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001518 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001519 printf("--- Initialise SGSN ---\n\n");
1520
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001521 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001522 gprs_dump_nsi(nsi);
1523
1524 printf("--- Initialise BSS 1 ---\n\n");
1525
1526 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
1527 gprs_dump_nsi(nsi);
1528
1529 printf("--- Setup BVCI 1 ---\n\n");
1530
1531 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1532 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001533 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001534
1535 printf("--- Setup BVCI 2 ---\n\n");
1536
1537 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
1538 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001539 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001540
1541 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1542
1543 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1544 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1545
1546 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1547
1548 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
1549 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
1550
1551 printf("--- Change NSEI ---\n\n");
1552
1553 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
1554 gprs_dump_nsi(nsi);
1555
1556 printf("--- Setup BVCI 1 ---\n\n");
1557
1558 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1559 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001560 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001561
1562 printf("--- Setup BVCI 3 ---\n\n");
1563
1564 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
1565 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001566 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001567
1568 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1569
1570 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1571 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1572
1573 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1574 " (should fail) ---\n\n");
1575
1576 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001577 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001578 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001579 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001580
1581 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1582
1583 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1584 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1585
1586 printf("--- Change NSVCI ---\n\n");
1587
1588 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
1589 gprs_dump_nsi(nsi);
1590
1591 printf("--- Setup BVCI 1 ---\n\n");
1592
1593 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1594 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001595 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001596
1597 printf("--- Setup BVCI 4 ---\n\n");
1598
1599 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
1600 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001601 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001602
1603 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1604
1605 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1606 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1607
1608 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1609 " (should fail) ---\n\n");
1610
1611 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001612 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001613 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001614 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001615
1616 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1617
1618 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1619 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1620
1621 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
1622
1623 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
1624 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
1625
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001626 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001627 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001628
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001629 gbprox_reset(&gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001630 gprs_ns_destroy(nsi);
1631 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001632}
1633
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001634static void test_gbproxy_ra_patching()
1635{
1636 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1637 struct sockaddr_in bss_peer[1] = {{0},};
1638 struct sockaddr_in sgsn_peer= {0};
1639 struct gprs_ra_id rai_bss =
1640 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1641 struct gprs_ra_id rai_sgsn =
1642 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1643 struct gprs_ra_id rai_unknown =
1644 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001645 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001646 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001647 const uint32_t ptmsi = 0xefe2b700;
1648 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001649 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001650 const uint32_t foreign_tlli2 = 0xbb00beef;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001651 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001652 const char *patch_re = "^9898|^121314";
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001653 struct gbproxy_link_info *link_info;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001654 struct gbproxy_peer *peer;
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001655 LLIST_HEAD(rcv_list);
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001656 struct expect_result *expect_res;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001657
1658 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001659
1660 bssgp_nsi = nsi;
1661 gbcfg.nsi = bssgp_nsi;
1662 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Jacob Erlbeck67a44452014-05-19 10:14:58 +02001663 gbcfg.core_mcc = 123;
1664 gbcfg.core_mnc = 456;
Jacob Erlbeck73685282014-05-23 20:48:07 +02001665 gbcfg.core_apn = talloc_zero_size(NULL, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001666 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001667 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001668
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001669 configure_sgsn_peer(&sgsn_peer);
1670 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001671
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001672 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING],
1673 patch_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001674 fprintf(stderr, "Failed to compile RE '%s': %s\n",
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001675 patch_re, err_msg);
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001676 exit(1);
1677 }
1678
1679
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001680 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001681 printf("--- Initialise SGSN ---\n\n");
1682
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001683 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001684 gprs_dump_nsi(nsi);
1685
1686 printf("--- Initialise BSS 1 ---\n\n");
1687
1688 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001689
1690 received_messages = &rcv_list;
1691
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001692 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1693 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001694 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001695
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001696 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001697 OSMO_ASSERT(peer != NULL);
1698
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001699 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_BVC_RESET));
1700
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001701 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1702
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001703 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_BVC_RESET_ACK));
1704
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001705 send_bssgp_suspend(nsi, &bss_peer[0], 0xccd1758b, &rai_bss);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001706
1707 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_SUSPEND));
1708
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001709 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001710
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001711 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_SUSPEND_ACK));
1712
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001713 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001714 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001715
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001716 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1717 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1718
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001719 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1720
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001721 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1722 foreign_tlli, &rai_bss, cell_id,
1723 GPRS_SAPI_GMM, 0,
1724 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001725
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001726 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001727 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001728
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001729 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1730 foreign_tlli, 0, NULL, 0,
1731 GPRS_SAPI_GMM, 0,
1732 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001733
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001734 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
1735
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001736 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1737 foreign_tlli, &rai_bss, cell_id,
1738 GPRS_SAPI_GMM, 3,
1739 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001740
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001741 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
1742
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001743 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1744 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1745
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001746 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1747 foreign_tlli, 1, imsi, sizeof(imsi),
1748 GPRS_SAPI_GMM, 1,
1749 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001750
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001751 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
1752
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001753 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1754
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001755 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1756 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1757 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1758
1759 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1760 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1761 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1762
1763 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1764 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1765 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1766
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001767 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1768 OSMO_ASSERT(link_info);
1769 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1770 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1771 OSMO_ASSERT(!link_info->tlli.bss_validated);
1772 OSMO_ASSERT(!link_info->tlli.net_validated);
1773 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1774 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1775 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1776 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001777
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001778 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1779 local_tlli, &rai_bss, cell_id,
1780 GPRS_SAPI_GMM, 4,
1781 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001782
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001783 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
1784
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001785 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1786
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001787 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1788 OSMO_ASSERT(link_info);
1789 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1790 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1791 OSMO_ASSERT(link_info->tlli.bss_validated);
1792 OSMO_ASSERT(!link_info->tlli.net_validated);
1793 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1794 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1795 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1796 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001797
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001798 /* Replace APN (1) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001799 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1800 local_tlli, &rai_bss, cell_id,
1801 GPRS_SAPI_GMM, 3,
1802 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001803
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001804 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1805
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001806 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1807
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001808 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1809 OSMO_ASSERT(link_info);
1810 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1811 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1812 OSMO_ASSERT(link_info->tlli.bss_validated);
1813 OSMO_ASSERT(!link_info->tlli.net_validated);
1814 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1815 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1816 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1817 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001818
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001819 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1820 local_tlli, 1, imsi, sizeof(imsi),
1821 GPRS_SAPI_GMM, 2,
1822 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001823
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001824 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
1825
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001826 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1827
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001828 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1829 OSMO_ASSERT(link_info);
1830 OSMO_ASSERT(link_info->tlli.assigned == 0);
1831 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1832 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1833 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001834
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001835 /* Replace APN (2) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001836 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1837 local_tlli, &rai_bss, cell_id,
1838 GPRS_SAPI_GMM, 3,
1839 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001840
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001841 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1842 OSMO_ASSERT(expect_res != NULL);
1843 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == gbcfg.core_apn_size + 2);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001844
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001845 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1846
Jacob Erlbeck73685282014-05-23 20:48:07 +02001847 gbcfg.core_apn[0] = 0;
1848 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001849
1850 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001851 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1852 local_tlli, &rai_bss, cell_id,
1853 GPRS_SAPI_GMM, 3,
1854 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001855
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001856 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1857 OSMO_ASSERT(expect_res != NULL);
1858 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001859
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001860 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1861
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001862 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001863
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001864 /* Detach */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001865 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1866 local_tlli, &rai_bss, cell_id,
1867 GPRS_SAPI_GMM, 6,
1868 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001869
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001870 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1871
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001872 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1873 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1874
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001875 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1876 local_tlli, 1, imsi, sizeof(imsi),
1877 GPRS_SAPI_GMM, 5,
1878 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001879
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001880 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
1881
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001882 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001883
1884 printf("--- RA update ---\n\n");
1885
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001886 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
1887 foreign_tlli, &rai_bss, 0x7080,
1888 GPRS_SAPI_GMM, 5,
1889 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001890
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001891 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
1892
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001893 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1894
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001895 send_llc_dl_ui(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
1896 foreign_tlli, 1, imsi, sizeof(imsi),
1897 GPRS_SAPI_GMM, 6,
1898 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001899
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001900 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_ACK));
1901
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001902 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1903
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001904 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001905 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1906 local_tlli, &rai_bss, cell_id,
1907 GPRS_SAPI_GMM, 3,
1908 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001909
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001910 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1911 OSMO_ASSERT(expect_res != NULL);
1912 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001913
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001914 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1915
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001916 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001917
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001918 /* Detach (power off -> no Detach Accept) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001919 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", &bss_peer[0], 0x1002,
1920 local_tlli, &rai_bss, cell_id,
1921 GPRS_SAPI_GMM, 6,
1922 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001923
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001924 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1925
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001926 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1927
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001928 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001929 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001930
1931 printf("--- Bad cases ---\n\n");
1932
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001933 /* The RAI in the Attach Request message differs from the RAI in the
1934 * BSSGP message, only patch the latter */
1935
1936 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", &bss_peer[0], 0x1002,
1937 foreign_tlli2, &rai_bss, cell_id,
1938 GPRS_SAPI_GMM, 0,
1939 dtap_attach_req2, sizeof(dtap_attach_req2));
1940
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001941 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
1942
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001943 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1944
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001945 printf("TLLI is already detached, shouldn't patch\n");
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001946 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", &bss_peer[0], 0x1002,
1947 local_tlli, &rai_bss, cell_id,
1948 GPRS_SAPI_GMM, 3,
1949 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001950
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001951 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1952
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001953 printf("Invalid RAI, shouldn't patch\n");
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001954 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001955
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001956 /* TODO: The following breaks with the current libosmocore, enable it
1957 * again (and remove the plain expect_msg), when the msgb_bssgph patch
1958 * is integrated */
1959 /* OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_STATUS)); */
1960 OSMO_ASSERT(expect_msg());
1961
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001962 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001963 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001964
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001965 OSMO_ASSERT(!expect_msg());
1966 received_messages = NULL;
1967
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02001968 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING]);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001969 gbprox_reset(&gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001970 gprs_ns_destroy(nsi);
1971 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001972}
1973
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001974static void test_gbproxy_ptmsi_assignment()
1975{
1976 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1977 struct sockaddr_in bss_peer[1] = {{0},};
1978 struct sockaddr_in sgsn_peer= {0};
1979 struct gprs_ra_id rai_bss =
1980 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1981 struct gprs_ra_id rai_unknown =
1982 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1983 uint16_t cell_id = 0x1234;
1984
1985 const uint32_t ptmsi = 0xefe2b700;
1986 const uint32_t local_tlli = 0xefe2b700;
1987
1988 const uint32_t foreign_tlli1 = 0x8000dead;
1989 const uint32_t foreign_tlli2 = 0x8000beef;
1990
1991 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
1992 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
1993
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001994 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001995 struct gbproxy_peer *peer;
1996 unsigned bss_nu = 0;
1997 unsigned sgsn_nu = 0;
1998
1999 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
2000
2001 bssgp_nsi = nsi;
2002 gbcfg.nsi = bssgp_nsi;
2003 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2004 gbcfg.core_mcc = 0;
2005 gbcfg.core_mnc = 0;
2006 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2007 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2008 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002009
2010 configure_sgsn_peer(&sgsn_peer);
2011 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2012
2013 printf("=== %s ===\n", __func__);
2014 printf("--- Initialise SGSN ---\n\n");
2015
2016 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2017
2018 printf("--- Initialise BSS 1 ---\n\n");
2019
2020 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2021 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2022
2023 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2024 OSMO_ASSERT(peer != NULL);
2025
2026 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2027
2028 gprs_dump_nsi(nsi);
2029 dump_global(stdout, 0);
2030 dump_peers(stdout, 0, 0, &gbcfg);
2031
2032 printf("--- Establish first LLC connection ---\n\n");
2033
2034 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2035 foreign_tlli1, &rai_unknown, cell_id,
2036 GPRS_SAPI_GMM, bss_nu++,
2037 dtap_attach_req, sizeof(dtap_attach_req));
2038
2039 dump_peers(stdout, 0, 0, &gbcfg);
2040
2041 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2042 foreign_tlli1, 0, NULL, 0,
2043 GPRS_SAPI_GMM, sgsn_nu++,
2044 dtap_identity_req, sizeof(dtap_identity_req));
2045
2046 dump_peers(stdout, 0, 0, &gbcfg);
2047
2048 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2049 foreign_tlli1, &rai_bss, cell_id,
2050 GPRS_SAPI_GMM, bss_nu++,
2051 dtap_identity_resp, sizeof(dtap_identity_resp));
2052
2053 dump_peers(stdout, 0, 0, &gbcfg);
2054
2055 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2056 foreign_tlli1, 1, imsi1, sizeof(imsi1),
2057 GPRS_SAPI_GMM, sgsn_nu++,
2058 dtap_attach_acc, sizeof(dtap_attach_acc));
2059
2060 dump_peers(stdout, 0, 0, &gbcfg);
2061
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002062 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
2063 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2064 OSMO_ASSERT(link_info);
2065 OSMO_ASSERT(link_info == link_info2);
2066 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2067 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2068 OSMO_ASSERT(!link_info->tlli.bss_validated);
2069 OSMO_ASSERT(!link_info->tlli.net_validated);
2070 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002071
2072 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2073 local_tlli, &rai_bss, cell_id,
2074 GPRS_SAPI_GMM, bss_nu++,
2075 dtap_attach_complete, sizeof(dtap_attach_complete));
2076
2077 dump_peers(stdout, 0, 0, &gbcfg);
2078
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002079 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2080 OSMO_ASSERT(link_info);
2081 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2082 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2083 OSMO_ASSERT(link_info->tlli.bss_validated);
2084 OSMO_ASSERT(!link_info->tlli.net_validated);
2085 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002086
2087
2088 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2089 local_tlli, 1, imsi1, sizeof(imsi1),
2090 GPRS_SAPI_GMM, sgsn_nu++,
2091 dtap_gmm_information, sizeof(dtap_gmm_information));
2092
2093 dump_peers(stdout, 0, 0, &gbcfg);
2094
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002095 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
2096 OSMO_ASSERT(link_info);
2097 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2098 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002099
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002100 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2101 OSMO_ASSERT(link_info == link_info2);
2102 OSMO_ASSERT(link_info->tlli.assigned == 0);
2103 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2104 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002105
2106 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
2107
2108 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2109 foreign_tlli2, &rai_unknown, cell_id,
2110 GPRS_SAPI_GMM, bss_nu++,
2111 dtap_attach_req, sizeof(dtap_attach_req));
2112
2113 dump_peers(stdout, 0, 0, &gbcfg);
2114
2115 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2116 foreign_tlli2, 0, NULL, 0,
2117 GPRS_SAPI_GMM, sgsn_nu++,
2118 dtap_identity_req, sizeof(dtap_identity_req));
2119
2120 dump_peers(stdout, 0, 0, &gbcfg);
2121
2122 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2123 foreign_tlli2, &rai_bss, cell_id,
2124 GPRS_SAPI_GMM, bss_nu++,
2125 dtap_identity2_resp, sizeof(dtap_identity2_resp));
2126
2127 dump_peers(stdout, 0, 0, &gbcfg);
2128
2129 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2130 foreign_tlli2, 1, imsi2, sizeof(imsi2),
2131 GPRS_SAPI_GMM, sgsn_nu++,
2132 dtap_attach_acc, sizeof(dtap_attach_acc));
2133
2134 dump_peers(stdout, 0, 0, &gbcfg);
2135
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002136 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
2137 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2138 OSMO_ASSERT(link_info);
2139 OSMO_ASSERT(link_info == link_info2);
2140 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2141 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2142 OSMO_ASSERT(!link_info->tlli.bss_validated);
2143 OSMO_ASSERT(!link_info->tlli.net_validated);
2144 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002145
2146 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2147 local_tlli, &rai_bss, cell_id,
2148 GPRS_SAPI_GMM, bss_nu++,
2149 dtap_attach_complete, sizeof(dtap_attach_complete));
2150
2151 dump_peers(stdout, 0, 0, &gbcfg);
2152
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002153 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2154 OSMO_ASSERT(link_info);
2155 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2156 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2157 OSMO_ASSERT(link_info->tlli.bss_validated);
2158 OSMO_ASSERT(!link_info->tlli.net_validated);
2159 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002160
2161 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2162 local_tlli, 1, imsi2, sizeof(imsi2),
2163 GPRS_SAPI_GMM, sgsn_nu++,
2164 dtap_gmm_information, sizeof(dtap_gmm_information));
2165
2166 dump_peers(stdout, 0, 0, &gbcfg);
2167
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002168 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
2169 OSMO_ASSERT(link_info);
2170 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2171 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002172
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002173 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2174 OSMO_ASSERT(link_info == link_info2);
2175 OSMO_ASSERT(link_info->tlli.assigned == 0);
2176 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2177 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002178
2179 dump_global(stdout, 0);
2180
2181 gbprox_reset(&gbcfg);
2182 gprs_ns_destroy(nsi);
2183 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002184
2185 cleanup_test();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002186}
2187
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002188static void test_gbproxy_ptmsi_patching()
2189{
2190 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2191 struct sockaddr_in bss_peer[1] = {{0},};
2192 struct sockaddr_in sgsn_peer= {0};
2193 struct gprs_ra_id rai_bss =
2194 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2195 struct gprs_ra_id rai_sgsn =
2196 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002197 struct gprs_ra_id rai_wrong_mcc_sgsn =
2198 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002199 struct gprs_ra_id rai_unknown =
2200 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2201 uint16_t cell_id = 0x1234;
2202
2203 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002204 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2205 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002206 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002207 const uint32_t local_sgsn_tlli2 = 0xe0987654;
2208 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Daniel Willmann537d4802015-10-12 19:36:35 +02002209 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002210 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002211
Daniel Willmann537d4802015-10-12 19:36:35 +02002212 const uint32_t bss_ptmsi = 0xc0dead01;
2213 const uint32_t bss_ptmsi2 = 0xc0dead02;
2214 const uint32_t bss_ptmsi3 = 0xc0dead03;
2215 const uint32_t local_bss_tlli = 0xc0dead01;
2216 const uint32_t local_bss_tlli2 = 0xc0dead02;
2217 const uint32_t local_bss_tlli3 = 0xc0dead03;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002218 const uint32_t foreign_bss_tlli = 0x8000dead;
2219
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002220
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002221 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002222 struct gbproxy_link_info *link_info;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002223 struct gbproxy_peer *peer;
2224 unsigned bss_nu = 0;
2225 unsigned sgsn_nu = 0;
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002226 int old_ctr;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002227
2228 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002229 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2230 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
2231 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2232 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
2233 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002234
2235 bssgp_nsi = nsi;
2236 gbcfg.nsi = bssgp_nsi;
2237 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2238 gbcfg.core_mcc = 123;
2239 gbcfg.core_mnc = 456;
2240 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2241 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2242 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002243
2244 configure_sgsn_peer(&sgsn_peer);
2245 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2246
2247 printf("=== %s ===\n", __func__);
2248 printf("--- Initialise SGSN ---\n\n");
2249
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002250 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002251
2252 printf("--- Initialise BSS 1 ---\n\n");
2253
2254 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2255 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2256
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02002257 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002258 OSMO_ASSERT(peer != NULL);
2259
2260 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2261
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002262 gprs_dump_nsi(nsi);
2263 dump_global(stdout, 0);
2264 dump_peers(stdout, 0, 0, &gbcfg);
2265
2266 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2267
2268 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2269 foreign_bss_tlli, &rai_unknown, cell_id,
2270 GPRS_SAPI_GMM, bss_nu++,
2271 dtap_attach_req, sizeof(dtap_attach_req));
2272
2273 dump_peers(stdout, 0, 0, &gbcfg);
2274
2275 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2276 random_sgsn_tlli, 0, NULL, 0,
2277 GPRS_SAPI_GMM, sgsn_nu++,
2278 dtap_identity_req, sizeof(dtap_identity_req));
2279
2280 dump_peers(stdout, 0, 0, &gbcfg);
2281
2282 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2283 foreign_bss_tlli, &rai_bss, cell_id,
2284 GPRS_SAPI_GMM, bss_nu++,
2285 dtap_identity_resp, sizeof(dtap_identity_resp));
2286
2287 dump_peers(stdout, 0, 0, &gbcfg);
2288
2289 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2290 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2291 GPRS_SAPI_GMM, sgsn_nu++,
2292 dtap_attach_acc, sizeof(dtap_attach_acc));
2293
2294 dump_peers(stdout, 0, 0, &gbcfg);
2295
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002296 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2297 OSMO_ASSERT(link_info);
2298 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2299 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2300 OSMO_ASSERT(!link_info->tlli.bss_validated);
2301 OSMO_ASSERT(!link_info->tlli.net_validated);
2302 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2303 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2304 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2305 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2306 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2307 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002308
2309 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2310 local_bss_tlli, &rai_bss, cell_id,
2311 GPRS_SAPI_GMM, bss_nu++,
2312 dtap_attach_complete, sizeof(dtap_attach_complete));
2313
2314 dump_peers(stdout, 0, 0, &gbcfg);
2315
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002316 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2317 OSMO_ASSERT(link_info);
2318 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2319 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2320 OSMO_ASSERT(link_info->tlli.bss_validated);
2321 OSMO_ASSERT(!link_info->tlli.net_validated);
2322 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2323 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2324 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2325 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002326
2327 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2328 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2329 GPRS_SAPI_GMM, sgsn_nu++,
2330 dtap_gmm_information, sizeof(dtap_gmm_information));
2331
2332 dump_peers(stdout, 0, 0, &gbcfg);
2333
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002334 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2335 OSMO_ASSERT(link_info);
2336 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2337 OSMO_ASSERT(link_info->tlli.assigned == 0);
2338 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2339 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002340
Jacob Erlbeck82add782014-09-05 18:08:12 +02002341 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
2342 local_bss_tlli, &rai_bss, cell_id,
2343 GPRS_SAPI_GMM, bss_nu++,
2344 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2345
2346 dump_peers(stdout, 0, 0, &gbcfg);
2347
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002348 /* Non-DTAP */
2349 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2350 local_bss_tlli, &rai_bss, cell_id,
2351 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2352
2353 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2354 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2355 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2356
2357 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2358 local_bss_tlli, &rai_bss, cell_id,
2359 llc_ui_ll11_dns_query_ul,
2360 sizeof(llc_ui_ll11_dns_query_ul));
2361
2362 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2363 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2364 llc_ui_ll11_dns_resp_dl,
2365 sizeof(llc_ui_ll11_dns_resp_dl));
2366
2367 dump_peers(stdout, 0, 0, &gbcfg);
2368
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002369 /* Repeated RA Update Requests */
2370 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", &bss_peer[0], 0x1002,
2371 local_bss_tlli, &rai_bss, 0x7080,
2372 GPRS_SAPI_GMM, bss_nu++,
2373 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2374
2375 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", &sgsn_peer, 0x1002,
2376 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2377 GPRS_SAPI_GMM, sgsn_nu++,
2378 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2379
2380 dump_peers(stdout, 0, 0, &gbcfg);
2381
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002382 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2383 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2384 OSMO_ASSERT(link_info);
2385 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2386 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2387 OSMO_ASSERT(!link_info->tlli.bss_validated);
2388 OSMO_ASSERT(!link_info->tlli.net_validated);
2389 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2390 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2391 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2392 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2393 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2394 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002395
2396 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", &bss_peer[0], 0x1002,
2397 local_bss_tlli2, &rai_bss, 0x7080,
2398 GPRS_SAPI_GMM, bss_nu++,
2399 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2400
2401 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", &sgsn_peer, 0x1002,
2402 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2403 GPRS_SAPI_GMM, sgsn_nu++,
2404 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2405
2406 dump_peers(stdout, 0, 0, &gbcfg);
2407
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002408 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2409 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI) != NULL);
2410 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2411 OSMO_ASSERT(link_info);
2412 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2413 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2414 OSMO_ASSERT(!link_info->tlli.bss_validated);
2415 OSMO_ASSERT(!link_info->tlli.net_validated);
2416 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2417 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2418 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2419 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2420 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2421 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002422
2423 send_llc_ul_ui(nsi, "RA UPD COMPLETE", &bss_peer[0], 0x1002,
2424 local_bss_tlli3, &rai_bss, 0x7080,
2425 GPRS_SAPI_GMM, bss_nu++,
2426 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2427
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002428 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002429
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002430 OSMO_ASSERT(link_info);
2431 OSMO_ASSERT(link_info->tlli.bss_validated);
2432 OSMO_ASSERT(!link_info->tlli.net_validated);
2433 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2434 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002435
2436 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2437 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2438 GPRS_SAPI_GMM, sgsn_nu++,
2439 dtap_gmm_information, sizeof(dtap_gmm_information));
2440
2441 dump_peers(stdout, 0, 0, &gbcfg);
2442
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002443 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2444 OSMO_ASSERT(link_info);
2445 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2446 OSMO_ASSERT(link_info->tlli.assigned == 0);
2447 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2448 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002449
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002450 /* Other messages */
2451 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002452 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002453
2454 dump_peers(stdout, 0, 0, &gbcfg);
2455
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002456 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002457
2458 dump_peers(stdout, 0, 0, &gbcfg);
2459
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002460 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002461
2462 dump_peers(stdout, 0, 0, &gbcfg);
2463
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002464 old_ctr = peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current;
2465
2466 send_bssgp_paging(nsi, &sgsn_peer, imsi, sizeof(imsi), &rai_bss, sgsn_ptmsi3);
2467
2468 dump_peers(stdout, 0, 0, &gbcfg);
2469
2470 OSMO_ASSERT(old_ctr + 1 ==
2471 peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current);
2472
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002473 /* Bad case: Invalid BVCI */
2474 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002475 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002476 dump_global(stdout, 0);
2477
2478 /* Bad case: Invalid RAI */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002479 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002480
2481 dump_global(stdout, 0);
2482
2483 /* Bad case: Invalid MCC (LAC ok) */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002484 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002485 &rai_wrong_mcc_sgsn);
2486
2487 dump_global(stdout, 0);
2488
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002489 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
2490 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2491 unknown_sgsn_tlli, 1, NULL, 0,
2492 GPRS_SAPI_GMM, 2,
2493 dtap_gmm_information, sizeof(dtap_gmm_information));
2494
2495 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
2496 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2497 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2498 GPRS_SAPI_GMM, 3,
2499 dtap_gmm_information, sizeof(dtap_gmm_information));
2500
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002501 /* Detach */
2502 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002503 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002504 GPRS_SAPI_GMM, bss_nu++,
2505 dtap_detach_req, sizeof(dtap_detach_req));
2506
2507 dump_peers(stdout, 0, 0, &gbcfg);
2508
2509 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002510 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002511 GPRS_SAPI_GMM, sgsn_nu++,
2512 dtap_detach_acc, sizeof(dtap_detach_acc));
2513
2514 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002515
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002516 dump_global(stdout, 0);
2517
2518 gbprox_reset(&gbcfg);
2519 gprs_ns_destroy(nsi);
2520 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002521
2522 cleanup_test();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002523}
2524
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002525static void test_gbproxy_ptmsi_patching_bad_cases()
2526{
2527 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2528 struct sockaddr_in bss_peer[1] = {{0},};
2529 struct sockaddr_in sgsn_peer= {0};
2530 struct gprs_ra_id rai_bss =
2531 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2532 struct gprs_ra_id rai_unknown =
2533 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2534 uint16_t cell_id = 0x1234;
2535
2536 const uint32_t sgsn_ptmsi = 0xefe2b700;
2537 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002538 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002539
Daniel Willmann537d4802015-10-12 19:36:35 +02002540 const uint32_t bss_ptmsi = 0xc0dead01;
2541 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002542 const uint32_t foreign_bss_tlli = 0x8000dead;
2543
2544
2545 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
2546 struct gbproxy_link_info *link_info;
2547 struct gbproxy_peer *peer;
2548 unsigned bss_nu = 0;
2549 unsigned sgsn_nu = 0;
2550
2551 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2552 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2553
2554 bssgp_nsi = nsi;
2555 gbcfg.nsi = bssgp_nsi;
2556 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2557 gbcfg.core_mcc = 123;
2558 gbcfg.core_mnc = 456;
2559 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2560 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2561 gbcfg.patch_ptmsi = 1;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002562
2563 configure_sgsn_peer(&sgsn_peer);
2564 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2565
2566 printf("=== %s ===\n", __func__);
2567 printf("--- Initialise SGSN ---\n\n");
2568
2569 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2570
2571 printf("--- Initialise BSS 1 ---\n\n");
2572
2573 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2574 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2575
2576 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2577 OSMO_ASSERT(peer != NULL);
2578
2579 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2580
2581 gprs_dump_nsi(nsi);
2582 dump_global(stdout, 0);
2583 dump_peers(stdout, 0, 0, &gbcfg);
2584
2585 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2586
2587 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2588 foreign_bss_tlli, &rai_unknown, cell_id,
2589 GPRS_SAPI_GMM, bss_nu++,
2590 dtap_attach_req, sizeof(dtap_attach_req));
2591
2592 dump_peers(stdout, 0, 0, &gbcfg);
2593
2594 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2595 random_sgsn_tlli, 0, NULL, 0,
2596 GPRS_SAPI_GMM, sgsn_nu++,
2597 dtap_identity_req, sizeof(dtap_identity_req));
2598
2599 dump_peers(stdout, 0, 0, &gbcfg);
2600
2601 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2602 foreign_bss_tlli, &rai_bss, cell_id,
2603 GPRS_SAPI_GMM, bss_nu++,
2604 dtap_identity_resp, sizeof(dtap_identity_resp));
2605
2606 dump_peers(stdout, 0, 0, &gbcfg);
2607
2608 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2609 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2610 GPRS_SAPI_GMM, sgsn_nu++,
2611 dtap_attach_acc, sizeof(dtap_attach_acc));
2612
2613 dump_peers(stdout, 0, 0, &gbcfg);
2614
2615 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2616 OSMO_ASSERT(link_info);
2617 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2618 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2619 OSMO_ASSERT(!link_info->tlli.bss_validated);
2620 OSMO_ASSERT(!link_info->tlli.net_validated);
2621 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2622 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2623 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2624 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2625 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2626 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2627
2628 send_llc_dl_ui(nsi, "ATTACH ACCEPT (duplicated)", &sgsn_peer, 0x1002,
2629 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2630 GPRS_SAPI_GMM, sgsn_nu++,
2631 dtap_attach_acc, sizeof(dtap_attach_acc));
2632
2633 dump_peers(stdout, 0, 0, &gbcfg);
2634
2635 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2636 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002637 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002638 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2639 OSMO_ASSERT(!link_info->tlli.bss_validated);
2640 OSMO_ASSERT(!link_info->tlli.net_validated);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002641 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002642 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2643 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2644 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2645 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2646 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2647
2648 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2649 local_bss_tlli, &rai_bss, cell_id,
2650 GPRS_SAPI_GMM, bss_nu++,
2651 dtap_attach_complete, sizeof(dtap_attach_complete));
2652
2653 dump_peers(stdout, 0, 0, &gbcfg);
2654
2655 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2656 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002657 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002658 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002659 OSMO_ASSERT(link_info->tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002660 OSMO_ASSERT(!link_info->tlli.net_validated);
2661 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2662 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002663 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002664 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2665
2666 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2667 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2668 GPRS_SAPI_GMM, sgsn_nu++,
2669 dtap_gmm_information, sizeof(dtap_gmm_information));
2670
2671 dump_peers(stdout, 0, 0, &gbcfg);
2672
2673 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2674 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002675 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2676 OSMO_ASSERT(link_info->tlli.assigned == 0);
2677 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2678 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002679
2680 /* Detach */
2681 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2682 local_bss_tlli, &rai_bss, cell_id,
2683 GPRS_SAPI_GMM, bss_nu++,
2684 dtap_detach_req, sizeof(dtap_detach_req));
2685
2686 dump_peers(stdout, 0, 0, &gbcfg);
2687
2688 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2689 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2690 GPRS_SAPI_GMM, sgsn_nu++,
2691 dtap_detach_acc, sizeof(dtap_detach_acc));
2692
2693 dump_peers(stdout, 0, 0, &gbcfg);
2694
2695 dump_global(stdout, 0);
2696
2697 gbprox_reset(&gbcfg);
2698 gprs_ns_destroy(nsi);
2699 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002700
2701 cleanup_test();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002702}
2703
2704
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002705static void test_gbproxy_imsi_acquisition()
2706{
2707 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2708 struct sockaddr_in bss_peer[1] = {{0},};
2709 struct sockaddr_in sgsn_peer= {0};
2710 struct gprs_ra_id rai_bss =
2711 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2712 struct gprs_ra_id rai_sgsn =
2713 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2714 struct gprs_ra_id rai_wrong_mcc_sgsn =
2715 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2716 struct gprs_ra_id rai_unknown =
2717 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2718 uint16_t cell_id = 0x1234;
2719
2720 const uint32_t sgsn_ptmsi = 0xefe2b700;
2721 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002722 const uint32_t random_sgsn_tlli = 0x78dead00;
2723 const uint32_t random_sgsn_tlli2 = 0x78dead02;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002724
Daniel Willmann537d4802015-10-12 19:36:35 +02002725 const uint32_t bss_ptmsi = 0xc0dead01;
2726 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002727 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002728 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002729
2730 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002731 struct gbproxy_link_info *link_info;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002732 struct gbproxy_peer *peer;
2733 unsigned bss_nu = 0;
2734 unsigned sgsn_nu = 0;
2735
2736 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2737
2738 bssgp_nsi = nsi;
2739 gbcfg.nsi = bssgp_nsi;
2740 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2741 gbcfg.core_mcc = 123;
2742 gbcfg.core_mnc = 456;
2743 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2744 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2745 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002746 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002747
2748 configure_sgsn_peer(&sgsn_peer);
2749 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2750
2751 printf("=== %s ===\n", __func__);
2752 printf("--- Initialise SGSN ---\n\n");
2753
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002754 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002755
2756 printf("--- Initialise BSS 1 ---\n\n");
2757
2758 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2759 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2760
2761 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2762 OSMO_ASSERT(peer != NULL);
2763
2764 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2765
2766 gprs_dump_nsi(nsi);
2767 dump_global(stdout, 0);
2768 dump_peers(stdout, 0, 0, &gbcfg);
2769
2770 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2771
2772 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002773 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002774 GPRS_SAPI_GMM, bss_nu++,
2775 dtap_attach_req, sizeof(dtap_attach_req));
2776
2777 dump_peers(stdout, 0, 0, &gbcfg);
2778
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002779 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2780 foreign_bss_tlli, &rai_bss, cell_id,
2781 GPRS_SAPI_GMM, bss_nu++,
2782 dtap_identity_resp, sizeof(dtap_identity_resp));
2783
2784 dump_peers(stdout, 0, 0, &gbcfg);
2785
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002786 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2787 random_sgsn_tlli, 0, NULL, 0,
2788 GPRS_SAPI_GMM, sgsn_nu++,
2789 dtap_identity_req, sizeof(dtap_identity_req));
2790
2791 dump_peers(stdout, 0, 0, &gbcfg);
2792
2793 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2794 foreign_bss_tlli, &rai_bss, cell_id,
2795 GPRS_SAPI_GMM, bss_nu++,
2796 dtap_identity_resp, sizeof(dtap_identity_resp));
2797
2798 dump_peers(stdout, 0, 0, &gbcfg);
2799
2800 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2801 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2802 GPRS_SAPI_GMM, sgsn_nu++,
2803 dtap_attach_acc, sizeof(dtap_attach_acc));
2804
2805 dump_peers(stdout, 0, 0, &gbcfg);
2806
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002807 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2808 OSMO_ASSERT(link_info);
2809 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2810 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2811 OSMO_ASSERT(!link_info->tlli.bss_validated);
2812 OSMO_ASSERT(!link_info->tlli.net_validated);
2813 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2814 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2815 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2816 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2817 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2818 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002819
2820 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2821 local_bss_tlli, &rai_bss, cell_id,
2822 GPRS_SAPI_GMM, bss_nu++,
2823 dtap_attach_complete, sizeof(dtap_attach_complete));
2824
2825 dump_peers(stdout, 0, 0, &gbcfg);
2826
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002827 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2828 OSMO_ASSERT(link_info);
2829 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2830 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2831 OSMO_ASSERT(link_info->tlli.bss_validated);
2832 OSMO_ASSERT(!link_info->tlli.net_validated);
2833 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2834 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2835 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2836 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002837
2838 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2839 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2840 GPRS_SAPI_GMM, sgsn_nu++,
2841 dtap_gmm_information, sizeof(dtap_gmm_information));
2842
2843 dump_peers(stdout, 0, 0, &gbcfg);
2844
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002845 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2846 OSMO_ASSERT(link_info);
2847 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2848 OSMO_ASSERT(link_info->tlli.assigned == 0);
2849 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2850 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002851
2852 /* Non-DTAP */
2853 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2854 local_bss_tlli, &rai_bss, cell_id,
2855 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2856
2857 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2858 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2859 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2860
2861 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2862 local_bss_tlli, &rai_bss, cell_id,
2863 llc_ui_ll11_dns_query_ul,
2864 sizeof(llc_ui_ll11_dns_query_ul));
2865
2866 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2867 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2868 llc_ui_ll11_dns_resp_dl,
2869 sizeof(llc_ui_ll11_dns_resp_dl));
2870
2871 dump_peers(stdout, 0, 0, &gbcfg);
2872
2873 /* Other messages */
2874 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2875 local_bss_tlli, 1, 12);
2876
2877 dump_peers(stdout, 0, 0, &gbcfg);
2878
2879 send_bssgp_llc_discarded(nsi, &sgsn_peer, 0x1002,
2880 local_sgsn_tlli, 1, 12);
2881
2882 dump_peers(stdout, 0, 0, &gbcfg);
2883
2884 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2885
2886 dump_peers(stdout, 0, 0, &gbcfg);
2887
2888 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_sgsn);
2889
2890 dump_peers(stdout, 0, 0, &gbcfg);
2891
2892 /* Bad case: Invalid BVCI */
2893 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
2894 local_bss_tlli, 1, 12);
2895 dump_global(stdout, 0);
2896
2897 /* Bad case: Invalid RAI */
2898 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_unknown);
2899
2900 dump_global(stdout, 0);
2901
2902 /* Bad case: Invalid MCC (LAC ok) */
2903 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli,
2904 &rai_wrong_mcc_sgsn);
2905
2906 dump_global(stdout, 0);
2907
2908 /* Detach */
2909 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2910 local_bss_tlli, &rai_bss, cell_id,
2911 GPRS_SAPI_GMM, bss_nu++,
2912 dtap_detach_req, sizeof(dtap_detach_req));
2913
2914 dump_peers(stdout, 0, 0, &gbcfg);
2915
2916 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2917 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2918 GPRS_SAPI_GMM, sgsn_nu++,
2919 dtap_detach_acc, sizeof(dtap_detach_acc));
2920
2921 dump_peers(stdout, 0, 0, &gbcfg);
2922
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002923 /* RA Update request */
2924
2925 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2926 foreign_bss_tlli, &rai_unknown, 0x7080,
2927 GPRS_SAPI_GMM, bss_nu++,
2928 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2929
2930 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2931 foreign_bss_tlli, &rai_bss, cell_id,
2932 GPRS_SAPI_GMM, bss_nu++,
2933 dtap_identity_resp, sizeof(dtap_identity_resp));
2934
2935 dump_peers(stdout, 0, 0, &gbcfg);
2936
2937 send_llc_dl_ui(nsi, "RA UDP ACC", &sgsn_peer, 0x1002,
2938 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2939 GPRS_SAPI_GMM, sgsn_nu++,
2940 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2941
2942 dump_peers(stdout, 0, 0, &gbcfg);
2943
2944 /* Detach */
2945
2946 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2947 local_bss_tlli, &rai_bss, cell_id,
2948 GPRS_SAPI_GMM, bss_nu++,
2949 dtap_detach_req, sizeof(dtap_detach_req));
2950
2951 dump_peers(stdout, 0, 0, &gbcfg);
2952
2953 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2954 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2955 GPRS_SAPI_GMM, sgsn_nu++,
2956 dtap_detach_acc, sizeof(dtap_detach_acc));
2957
2958 dump_peers(stdout, 0, 0, &gbcfg);
2959
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002960 /* Special case: Repeated Attach Requests */
2961
2962 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2963 foreign_bss_tlli, &rai_unknown, cell_id,
2964 GPRS_SAPI_GMM, bss_nu++,
2965 dtap_attach_req, sizeof(dtap_attach_req));
2966
2967 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2968 foreign_bss_tlli, &rai_unknown, cell_id,
2969 GPRS_SAPI_GMM, bss_nu++,
2970 dtap_attach_req, sizeof(dtap_attach_req));
2971
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002972 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2973 foreign_bss_tlli, &rai_bss, cell_id,
2974 GPRS_SAPI_GMM, bss_nu++,
2975 dtap_detach_req, sizeof(dtap_detach_req));
2976
2977 dump_peers(stdout, 0, 0, &gbcfg);
2978
2979 /* Special case: Detach from an unknown TLLI */
2980
2981 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", &bss_peer[0], 0x1002,
2982 other_bss_tlli, &rai_bss, cell_id,
2983 GPRS_SAPI_GMM, bss_nu++,
2984 dtap_detach_req, sizeof(dtap_detach_req));
2985
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002986 dump_peers(stdout, 0, 0, &gbcfg);
2987
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002988 /* Special case: Repeated RA Update Requests */
2989
2990 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2991 foreign_bss_tlli, &rai_unknown, 0x7080,
2992 GPRS_SAPI_GMM, bss_nu++,
2993 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2994
2995 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2996 foreign_bss_tlli, &rai_unknown, 0x7080,
2997 GPRS_SAPI_GMM, bss_nu++,
2998 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2999
3000 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3001 foreign_bss_tlli, &rai_bss, cell_id,
3002 GPRS_SAPI_GMM, bss_nu++,
3003 dtap_detach_req, sizeof(dtap_detach_req));
3004
3005 dump_peers(stdout, 0, 0, &gbcfg);
3006
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02003007 dump_global(stdout, 0);
3008
3009 gbprox_reset(&gbcfg);
3010 gprs_ns_destroy(nsi);
3011 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003012
3013 cleanup_test();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02003014}
3015
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003016static void test_gbproxy_secondary_sgsn()
3017{
3018 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
3019 struct sockaddr_in bss_peer[1] = {{0},};
3020 struct sockaddr_in sgsn_peer[2]= {{0},};
3021 struct gprs_ra_id rai_bss =
3022 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3023 struct gprs_ra_id rai_sgsn =
3024 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
3025 struct gprs_ra_id rai_unknown =
3026 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
3027 uint16_t cell_id = 0x1234;
3028
3029 const uint32_t sgsn_ptmsi = 0xefe2b700;
3030 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02003031 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003032
Daniel Willmann537d4802015-10-12 19:36:35 +02003033 const uint32_t bss_ptmsi = 0xc0dead01;
3034 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003035 const uint32_t foreign_bss_tlli = 0x8000dead;
3036
3037 const uint32_t sgsn_ptmsi2 = 0xe0987654;
3038 const uint32_t local_sgsn_tlli2 = 0xe0987654;
Daniel Willmann537d4802015-10-12 19:36:35 +02003039 const uint32_t random_sgsn_tlli2 = 0x78dead02;
3040 const uint32_t bss_ptmsi2 = 0xc0dead03;
3041 const uint32_t local_bss_tlli2 = 0xc0dead03;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003042 const uint32_t foreign_bss_tlli2 = 0x8000beef;
3043
Daniel Willmann537d4802015-10-12 19:36:35 +02003044 const uint32_t random_sgsn_tlli3 = 0x78dead04;
3045 const uint32_t bss_ptmsi3 = 0xc0dead05;
3046 const uint32_t local_bss_tlli3 = 0xc0dead05;
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003047 const uint32_t foreign_bss_tlli3 = 0x8000feed;
3048
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003049 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
3050 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003051 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0x28};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003052 struct gbproxy_link_info *link_info;
3053 struct gbproxy_link_info *other_info;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003054 struct gbproxy_peer *peer;
3055 unsigned bss_nu = 0;
3056 unsigned sgsn_nu = 0;
3057
3058 const char *err_msg = NULL;
3059 const char *filter_re = "999999";
3060
3061 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
3062 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
3063
3064 bssgp_nsi = nsi;
3065 gbcfg.nsi = bssgp_nsi;
3066 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3067 gbcfg.core_mcc = 123;
3068 gbcfg.core_mnc = 456;
3069 gbcfg.core_apn = talloc_zero_size(NULL, 100);
3070 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
3071 gbcfg.patch_ptmsi = 1;
3072 gbcfg.acquire_imsi = 1;
Daniel Willmann537d4802015-10-12 19:36:35 +02003073
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003074 gbcfg.route_to_sgsn2 = 1;
3075 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
3076
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003077 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING],
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02003078 filter_re, &err_msg) != 0) {
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003079 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
3080 err_msg);
3081 OSMO_ASSERT(err_msg == NULL);
3082 }
3083
3084 configure_sgsn_peer(&sgsn_peer[0]);
3085 configure_sgsn2_peer(&sgsn_peer[1]);
3086 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3087
3088 printf("=== %s ===\n", __func__);
3089 printf("--- Initialise SGSN 1 ---\n\n");
3090
3091 connect_sgsn(nsi, &sgsn_peer[0], SGSN_NSEI);
3092
3093 printf("--- Initialise SGSN 2 ---\n\n");
3094
3095 connect_sgsn(nsi, &sgsn_peer[1], SGSN2_NSEI);
3096
3097 printf("--- Initialise BSS 1 ---\n\n");
3098
3099 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3100 setup_bssgp(nsi, &bss_peer[0], 0x0);
3101 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x0);
3102 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3103 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x1002);
3104 send_bssgp_reset_ack(nsi, &sgsn_peer[1], 0x1002);
3105
3106 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3107 OSMO_ASSERT(peer != NULL);
3108
3109 gprs_dump_nsi(nsi);
3110 dump_global(stdout, 0);
3111 dump_peers(stdout, 0, 0, &gbcfg);
3112
3113 printf("--- Flow control ---\n\n");
3114
3115 send_bssgp_flow_control_bvc(nsi, &bss_peer[0], 0x1002, 1);
3116 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[0], 0x1002, 1);
3117 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[1], 0x1002, 1);
3118
3119 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
3120
3121 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3122 foreign_bss_tlli, &rai_unknown, cell_id,
3123 GPRS_SAPI_GMM, bss_nu++,
3124 dtap_attach_req, sizeof(dtap_attach_req));
3125
3126 dump_peers(stdout, 0, 0, &gbcfg);
3127
3128 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3129 foreign_bss_tlli, &rai_bss, cell_id,
3130 GPRS_SAPI_GMM, bss_nu++,
3131 dtap_identity_resp, sizeof(dtap_identity_resp));
3132
3133 dump_peers(stdout, 0, 0, &gbcfg);
3134
3135 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[0], 0x1002,
3136 random_sgsn_tlli, 0, NULL, 0,
3137 GPRS_SAPI_GMM, sgsn_nu++,
3138 dtap_identity_req, sizeof(dtap_identity_req));
3139
3140 dump_peers(stdout, 0, 0, &gbcfg);
3141
3142 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3143 foreign_bss_tlli, &rai_bss, cell_id,
3144 GPRS_SAPI_GMM, bss_nu++,
3145 dtap_identity_resp, sizeof(dtap_identity_resp));
3146
3147 dump_peers(stdout, 0, 0, &gbcfg);
3148
3149 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[0], 0x1002,
3150 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3151 GPRS_SAPI_GMM, sgsn_nu++,
3152 dtap_attach_acc, sizeof(dtap_attach_acc));
3153
3154 dump_peers(stdout, 0, 0, &gbcfg);
3155
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003156 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3157 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
3158 OSMO_ASSERT(link_info);
3159 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3160 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3161 OSMO_ASSERT(!link_info->tlli.bss_validated);
3162 OSMO_ASSERT(!link_info->tlli.net_validated);
3163 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
3164 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3165 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3166 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3167 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3168 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003169
3170 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3171 local_bss_tlli, &rai_bss, cell_id,
3172 GPRS_SAPI_GMM, bss_nu++,
3173 dtap_attach_complete, sizeof(dtap_attach_complete));
3174
3175 dump_peers(stdout, 0, 0, &gbcfg);
3176
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003177 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3178 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3179 OSMO_ASSERT(link_info);
3180 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3181 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3182 OSMO_ASSERT(link_info->tlli.bss_validated);
3183 OSMO_ASSERT(!link_info->tlli.net_validated);
3184 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3185 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3186 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3187 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003188
3189 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[0], 0x1002,
3190 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3191 GPRS_SAPI_GMM, sgsn_nu++,
3192 dtap_gmm_information, sizeof(dtap_gmm_information));
3193
3194 dump_peers(stdout, 0, 0, &gbcfg);
3195
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003196 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3197 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3198 OSMO_ASSERT(link_info);
3199 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
3200 OSMO_ASSERT(link_info->tlli.assigned == 0);
3201 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3202 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003203
3204 /* Non-DTAP */
3205 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3206 local_bss_tlli, &rai_bss, cell_id,
3207 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3208
3209 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[0], 0x1002,
3210 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3211 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3212
3213 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3214 local_bss_tlli, &rai_bss, cell_id,
3215 llc_ui_ll11_dns_query_ul,
3216 sizeof(llc_ui_ll11_dns_query_ul));
3217
3218 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[0], 0x1002,
3219 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3220 llc_ui_ll11_dns_resp_dl,
3221 sizeof(llc_ui_ll11_dns_resp_dl));
3222
3223 dump_peers(stdout, 0, 0, &gbcfg);
3224
3225 /* Other messages */
3226 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3227 local_bss_tlli, 1, 12);
3228
3229 dump_peers(stdout, 0, 0, &gbcfg);
3230
3231 send_bssgp_llc_discarded(nsi, &sgsn_peer[0], 0x1002,
3232 local_sgsn_tlli, 1, 12);
3233
3234 dump_peers(stdout, 0, 0, &gbcfg);
3235
3236 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
3237
3238 dump_peers(stdout, 0, 0, &gbcfg);
3239
3240 send_bssgp_suspend_ack(nsi, &sgsn_peer[0], local_sgsn_tlli, &rai_sgsn);
3241
3242 dump_peers(stdout, 0, 0, &gbcfg);
3243
3244 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
3245
3246 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3247 foreign_bss_tlli2, &rai_unknown, cell_id,
3248 GPRS_SAPI_GMM, bss_nu++,
3249 dtap_attach_req, sizeof(dtap_attach_req));
3250
3251 dump_peers(stdout, 0, 0, &gbcfg);
3252
3253 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3254 foreign_bss_tlli2, &rai_bss, cell_id,
3255 GPRS_SAPI_GMM, bss_nu++,
3256 dtap_identity2_resp, sizeof(dtap_identity2_resp));
3257
3258 dump_peers(stdout, 0, 0, &gbcfg);
3259
3260 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3261 random_sgsn_tlli2, 0, NULL, 0,
3262 GPRS_SAPI_GMM, sgsn_nu++,
3263 dtap_identity_req, sizeof(dtap_identity_req));
3264
3265 dump_peers(stdout, 0, 0, &gbcfg);
3266
3267 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3268 foreign_bss_tlli2, &rai_bss, cell_id,
3269 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02003270 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003271
3272 dump_peers(stdout, 0, 0, &gbcfg);
3273
3274 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[1], 0x1002,
3275 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3276 GPRS_SAPI_GMM, sgsn_nu++,
3277 dtap_attach_acc2, sizeof(dtap_attach_acc2));
3278
3279 dump_peers(stdout, 0, 0, &gbcfg);
3280
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003281 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
3282 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
3283 OSMO_ASSERT(link_info);
3284 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3285 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3286 OSMO_ASSERT(!link_info->tlli.bss_validated);
3287 OSMO_ASSERT(!link_info->tlli.net_validated);
3288 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
3289 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3290 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3291 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3292 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3293 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003294
3295 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3296 local_bss_tlli2, &rai_bss, cell_id,
3297 GPRS_SAPI_GMM, bss_nu++,
3298 dtap_attach_complete, sizeof(dtap_attach_complete));
3299
3300 dump_peers(stdout, 0, 0, &gbcfg);
3301
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003302 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3303 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3304 OSMO_ASSERT(link_info);
3305 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3306 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3307 OSMO_ASSERT(link_info->tlli.bss_validated);
3308 OSMO_ASSERT(!link_info->tlli.net_validated);
3309 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3310 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3311 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3312 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003313
3314 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3315 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3316 GPRS_SAPI_GMM, sgsn_nu++,
3317 dtap_gmm_information, sizeof(dtap_gmm_information));
3318
3319 dump_peers(stdout, 0, 0, &gbcfg);
3320
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003321 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3322 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3323 OSMO_ASSERT(link_info);
3324 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
3325 OSMO_ASSERT(link_info->tlli.assigned == 0);
3326 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
3327 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003328
3329 /* Non-DTAP */
3330 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3331 local_bss_tlli2, &rai_bss, cell_id,
3332 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3333
3334 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[1], 0x1002,
3335 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3336 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3337
3338 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3339 local_bss_tlli2, &rai_bss, cell_id,
3340 llc_ui_ll11_dns_query_ul,
3341 sizeof(llc_ui_ll11_dns_query_ul));
3342
3343 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[1], 0x1002,
3344 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3345 llc_ui_ll11_dns_resp_dl,
3346 sizeof(llc_ui_ll11_dns_resp_dl));
3347
3348 dump_peers(stdout, 0, 0, &gbcfg);
3349
3350 /* Other messages */
3351 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3352 local_bss_tlli2, 1, 12);
3353
3354 dump_peers(stdout, 0, 0, &gbcfg);
3355
3356 send_bssgp_llc_discarded(nsi, &sgsn_peer[1], 0x1002,
3357 local_sgsn_tlli2, 1, 12);
3358
3359 dump_peers(stdout, 0, 0, &gbcfg);
3360
3361 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli2, &rai_bss);
3362
3363 dump_peers(stdout, 0, 0, &gbcfg);
3364
3365 send_bssgp_suspend_ack(nsi, &sgsn_peer[1], local_sgsn_tlli2, &rai_sgsn);
3366
3367 dump_peers(stdout, 0, 0, &gbcfg);
3368
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003369 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
3370
3371 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3372 foreign_bss_tlli3, &rai_unknown, cell_id,
3373 GPRS_SAPI_GMM, bss_nu++,
3374 dtap_attach_req, sizeof(dtap_attach_req));
3375
3376 dump_peers(stdout, 0, 0, &gbcfg);
3377
3378 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3379 foreign_bss_tlli3, &rai_bss, cell_id,
3380 GPRS_SAPI_GMM, bss_nu++,
3381 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3382
3383 dump_peers(stdout, 0, 0, &gbcfg);
3384
3385 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3386 random_sgsn_tlli3, 0, NULL, 0,
3387 GPRS_SAPI_GMM, sgsn_nu++,
3388 dtap_identity_req, sizeof(dtap_identity_req));
3389
3390 dump_peers(stdout, 0, 0, &gbcfg);
3391
3392 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3393 foreign_bss_tlli3, &rai_bss, cell_id,
3394 GPRS_SAPI_GMM, bss_nu++,
3395 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3396
3397 dump_peers(stdout, 0, 0, &gbcfg);
3398
3399 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", &sgsn_peer[1], 0x1002,
3400 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
3401 GPRS_SAPI_GMM, sgsn_nu++,
3402 dtap_attach_acc, sizeof(dtap_attach_acc));
3403
3404 dump_peers(stdout, 0, 0, &gbcfg);
3405
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003406 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
3407 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
3408 OSMO_ASSERT(link_info);
3409 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3410 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3411 OSMO_ASSERT(!link_info->tlli.bss_validated);
3412 OSMO_ASSERT(!link_info->tlli.net_validated);
3413 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
3414 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3415 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3416 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3417 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3418 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003419
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003420 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3421 local_bss_tlli3, &rai_bss, cell_id,
3422 GPRS_SAPI_GMM, bss_nu++,
3423 dtap_attach_complete, sizeof(dtap_attach_complete));
3424
3425 dump_peers(stdout, 0, 0, &gbcfg);
3426
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003427 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003428 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003429 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3430 OSMO_ASSERT(link_info);
3431 OSMO_ASSERT(link_info != other_info);
3432 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3433 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3434 OSMO_ASSERT(link_info->tlli.bss_validated);
3435 OSMO_ASSERT(!link_info->tlli.net_validated);
3436 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3437 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3438 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3439 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003440
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003441 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3442 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3443 GPRS_SAPI_GMM, sgsn_nu++,
3444 dtap_gmm_information, sizeof(dtap_gmm_information));
3445
3446 dump_peers(stdout, 0, 0, &gbcfg);
3447
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003448 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003449 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003450 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3451 OSMO_ASSERT(link_info);
3452 OSMO_ASSERT(link_info != other_info);
3453 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
3454 OSMO_ASSERT(link_info->tlli.assigned == 0);
3455 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3456 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003457
3458
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003459 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
3460
3461 /* Detach */
3462 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3463 local_bss_tlli, &rai_bss, cell_id,
3464 GPRS_SAPI_GMM, bss_nu++,
3465 dtap_detach_req, sizeof(dtap_detach_req));
3466
3467 dump_peers(stdout, 0, 0, &gbcfg);
3468
3469 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[0], 0x1002,
3470 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3471 GPRS_SAPI_GMM, sgsn_nu++,
3472 dtap_detach_acc, sizeof(dtap_detach_acc));
3473
3474 dump_peers(stdout, 0, 0, &gbcfg);
3475
3476 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
3477
3478 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3479 local_bss_tlli2, &rai_bss, cell_id,
3480 GPRS_SAPI_GMM, bss_nu++,
3481 dtap_detach_req, sizeof(dtap_detach_req));
3482
3483 dump_peers(stdout, 0, 0, &gbcfg);
3484
3485 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3486 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3487 GPRS_SAPI_GMM, sgsn_nu++,
3488 dtap_detach_acc, sizeof(dtap_detach_acc));
3489
3490 dump_peers(stdout, 0, 0, &gbcfg);
3491
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003492 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
3493
3494 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3495 local_bss_tlli3, &rai_bss, cell_id,
3496 GPRS_SAPI_GMM, bss_nu++,
3497 dtap_detach_req, sizeof(dtap_detach_req));
3498
3499 dump_peers(stdout, 0, 0, &gbcfg);
3500
3501 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3502 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3503 GPRS_SAPI_GMM, sgsn_nu++,
3504 dtap_detach_acc, sizeof(dtap_detach_acc));
3505
3506 dump_peers(stdout, 0, 0, &gbcfg);
3507
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003508 dump_global(stdout, 0);
3509
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003510 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING]);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003511 gbprox_reset(&gbcfg);
3512 gprs_ns_destroy(nsi);
3513 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003514
3515 cleanup_test();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003516}
3517
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003518static void test_gbproxy_keep_info()
3519{
3520 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
3521 struct sockaddr_in bss_peer[1] = {{0},};
3522 struct sockaddr_in sgsn_peer= {0};
3523 struct gprs_ra_id rai_bss =
3524 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3525 uint16_t cell_id = 0x1234;
3526
3527 const uint32_t ptmsi = 0xefe2b700;
3528 const uint32_t local_tlli = 0xefe2b700;
3529 const uint32_t foreign_tlli = 0xafe2b700;
3530
3531 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003532 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003533 struct gbproxy_peer *peer;
3534 unsigned bss_nu = 0;
3535 unsigned sgsn_nu = 0;
3536
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003537 LLIST_HEAD(rcv_list);
3538
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003539 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3540
3541 bssgp_nsi = nsi;
3542 gbcfg.nsi = bssgp_nsi;
3543 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3544 gbcfg.patch_ptmsi = 0;
3545 gbcfg.acquire_imsi = 1;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003546 gbcfg.core_mcc = 0;
3547 gbcfg.core_mnc = 0;
3548 gbcfg.core_apn = NULL;
3549 gbcfg.core_apn_size = 0;
3550 gbcfg.route_to_sgsn2 = 0;
3551 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003552 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003553
3554 configure_sgsn_peer(&sgsn_peer);
3555 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3556
3557 printf("=== %s ===\n", __func__);
3558 printf("--- Initialise SGSN ---\n\n");
3559
3560 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
3561
3562 printf("--- Initialise BSS 1 ---\n\n");
3563
3564 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3565 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3566
3567 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3568 OSMO_ASSERT(peer != NULL);
3569
3570 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
3571
3572 gprs_dump_nsi(nsi);
3573 dump_global(stdout, 0);
3574 dump_peers(stdout, 0, 0, &gbcfg);
3575
3576 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3577
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003578 received_messages = &rcv_list;
3579
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003580 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3581 foreign_tlli, &rai_bss, cell_id,
3582 GPRS_SAPI_GMM, bss_nu++,
3583 dtap_attach_req, sizeof(dtap_attach_req));
3584
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003585 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3586
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003587 dump_peers(stdout, 0, 0, &gbcfg);
3588
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003589 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3590 OSMO_ASSERT(link_info);
3591 OSMO_ASSERT(link_info->imsi_len == 0);
3592 OSMO_ASSERT(!link_info->is_deregistered);
3593 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003594
3595 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3596 foreign_tlli, &rai_bss, cell_id,
3597 GPRS_SAPI_GMM, bss_nu++,
3598 dtap_identity_resp, sizeof(dtap_identity_resp));
3599
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003600 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3601
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003602 dump_peers(stdout, 0, 0, &gbcfg);
3603
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003604 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3605 OSMO_ASSERT(link_info);
3606 OSMO_ASSERT(link_info->imsi_len > 0);
3607 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003608 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003609
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003610 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
3611 foreign_tlli, 0, NULL, 0,
3612 GPRS_SAPI_GMM, sgsn_nu++,
3613 dtap_identity_req, sizeof(dtap_identity_req));
3614
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003615 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3616
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003617 dump_peers(stdout, 0, 0, &gbcfg);
3618
3619 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3620 foreign_tlli, &rai_bss, cell_id,
3621 GPRS_SAPI_GMM, bss_nu++,
3622 dtap_identity_resp, sizeof(dtap_identity_resp));
3623
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003624 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
3625
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003626 dump_peers(stdout, 0, 0, &gbcfg);
3627
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003628 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3629 OSMO_ASSERT(link_info);
3630 OSMO_ASSERT(link_info->imsi_len > 0);
3631 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003632
3633 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3634 foreign_tlli, 1, imsi, sizeof(imsi),
3635 GPRS_SAPI_GMM, sgsn_nu++,
3636 dtap_attach_acc, sizeof(dtap_attach_acc));
3637
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003638 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3639
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003640 dump_peers(stdout, 0, 0, &gbcfg);
3641
3642 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3643 local_tlli, &rai_bss, cell_id,
3644 GPRS_SAPI_GMM, bss_nu++,
3645 dtap_attach_complete, sizeof(dtap_attach_complete));
3646
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003647 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3648
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003649 dump_peers(stdout, 0, 0, &gbcfg);
3650
3651 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
3652 local_tlli, 1, imsi, sizeof(imsi),
3653 GPRS_SAPI_GMM, sgsn_nu++,
3654 dtap_gmm_information, sizeof(dtap_gmm_information));
3655
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003656 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3657
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003658 dump_peers(stdout, 0, 0, &gbcfg);
3659
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003660 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3661 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003662
3663 /* Detach (MO) */
3664 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3665 local_tlli, &rai_bss, cell_id,
3666 GPRS_SAPI_GMM, bss_nu++,
3667 dtap_detach_req, sizeof(dtap_detach_req));
3668
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003669 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3670
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003671 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3672 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003673
3674 dump_peers(stdout, 0, 0, &gbcfg);
3675
3676 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3677 local_tlli, 1, imsi, sizeof(imsi),
3678 GPRS_SAPI_GMM, sgsn_nu++,
3679 dtap_detach_acc, sizeof(dtap_detach_acc));
3680
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003681 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3682
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003683 dump_peers(stdout, 0, 0, &gbcfg);
3684
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003685 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3686 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3687 OSMO_ASSERT(link_info);
3688 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003689
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003690 OSMO_ASSERT(!expect_msg());
3691
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003692 /* Re-Attach */
3693 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3694 foreign_tlli, &rai_bss, cell_id,
3695 GPRS_SAPI_GMM, bss_nu++,
3696 dtap_attach_req3, sizeof(dtap_attach_req3));
3697
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003698 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3699
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003700 dump_peers(stdout, 0, 0, &gbcfg);
3701
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003702 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3703 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3704 OSMO_ASSERT(link_info);
3705 OSMO_ASSERT(link_info == link_info2);
3706 OSMO_ASSERT(link_info->imsi_len != 0);
3707 OSMO_ASSERT(!link_info->is_deregistered);
3708 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003709 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003710
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003711 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3712 foreign_tlli, 1, imsi, sizeof(imsi),
3713 GPRS_SAPI_GMM, sgsn_nu++,
3714 dtap_attach_acc, sizeof(dtap_attach_acc));
3715
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003716 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3717
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003718 dump_peers(stdout, 0, 0, &gbcfg);
3719
3720 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3721 local_tlli, &rai_bss, cell_id,
3722 GPRS_SAPI_GMM, bss_nu++,
3723 dtap_attach_complete, sizeof(dtap_attach_complete));
3724
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003725 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3726
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003727 dump_peers(stdout, 0, 0, &gbcfg);
3728
3729 /* Detach (MT) */
3730 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
3731 local_tlli, 1, imsi, sizeof(imsi),
3732 GPRS_SAPI_GMM, sgsn_nu++,
3733 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3734
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003735 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3736
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003737 dump_peers(stdout, 0, 0, &gbcfg);
3738
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003739 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3740 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003741
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003742 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003743 local_tlli, &rai_bss, cell_id,
3744 GPRS_SAPI_GMM, bss_nu++,
3745 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3746
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003747 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3748 OSMO_ASSERT(!expect_msg());
3749
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003750 dump_peers(stdout, 0, 0, &gbcfg);
3751
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003752 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3753 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3754 OSMO_ASSERT(link_info);
3755 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003756
3757 /* Re-Attach */
3758 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3759 foreign_tlli, &rai_bss, cell_id,
3760 GPRS_SAPI_GMM, bss_nu++,
3761 dtap_attach_req3, sizeof(dtap_attach_req3));
3762
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003763 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3764
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003765 dump_peers(stdout, 0, 0, &gbcfg);
3766
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003767 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3768 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3769 OSMO_ASSERT(link_info);
3770 OSMO_ASSERT(link_info == link_info2);
3771 OSMO_ASSERT(link_info->imsi_len != 0);
3772 OSMO_ASSERT(!link_info->is_deregistered);
3773 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003774
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003775 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3776 foreign_tlli, 1, imsi, sizeof(imsi),
3777 GPRS_SAPI_GMM, sgsn_nu++,
3778 dtap_attach_acc, sizeof(dtap_attach_acc));
3779
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003780 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3781
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003782 dump_peers(stdout, 0, 0, &gbcfg);
3783
3784 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3785 local_tlli, &rai_bss, cell_id,
3786 GPRS_SAPI_GMM, bss_nu++,
3787 dtap_attach_complete, sizeof(dtap_attach_complete));
3788
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003789 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3790
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003791 dump_peers(stdout, 0, 0, &gbcfg);
3792
3793 /* Detach (MT) */
3794 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3795 local_tlli, 1, imsi, sizeof(imsi),
3796 GPRS_SAPI_GMM, sgsn_nu++,
3797 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3798
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003799 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3800
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003801 dump_peers(stdout, 0, 0, &gbcfg);
3802
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003803 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3804 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003805
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003806 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003807 local_tlli, &rai_bss, cell_id,
3808 GPRS_SAPI_GMM, bss_nu++,
3809 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3810
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003811 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3812 OSMO_ASSERT(!expect_msg());
3813
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003814 dump_peers(stdout, 0, 0, &gbcfg);
3815
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003816 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3817 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3818 OSMO_ASSERT(link_info);
3819 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003820
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003821 /* Re-Attach with IMSI */
3822 send_llc_ul_ui(nsi, "ATTACH REQUEST (IMSI)", &bss_peer[0], 0x1002,
3823 foreign_tlli, &rai_bss, cell_id,
3824 GPRS_SAPI_GMM, bss_nu++,
3825 dtap_attach_req4, sizeof(dtap_attach_req4));
3826
3827 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3828
3829 dump_peers(stdout, 0, 0, &gbcfg);
3830
3831 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3832 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3833 OSMO_ASSERT(link_info);
3834 OSMO_ASSERT(link_info == link_info2);
3835 OSMO_ASSERT(link_info->imsi_len != 0);
3836 OSMO_ASSERT(!link_info->is_deregistered);
3837 OSMO_ASSERT(!link_info->imsi_acq_pending);
3838 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
3839
3840 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3841 foreign_tlli, 1, imsi, sizeof(imsi),
3842 GPRS_SAPI_GMM, sgsn_nu++,
3843 dtap_attach_acc, sizeof(dtap_attach_acc));
3844
3845 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3846
3847 dump_peers(stdout, 0, 0, &gbcfg);
3848
3849 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3850 local_tlli, &rai_bss, cell_id,
3851 GPRS_SAPI_GMM, bss_nu++,
3852 dtap_attach_complete, sizeof(dtap_attach_complete));
3853
3854 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3855
3856 dump_peers(stdout, 0, 0, &gbcfg);
3857
3858 /* Detach (MT) */
3859 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3860 local_tlli, 1, imsi, sizeof(imsi),
3861 GPRS_SAPI_GMM, sgsn_nu++,
3862 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3863
3864 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3865
3866 dump_peers(stdout, 0, 0, &gbcfg);
3867
3868 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3869 OSMO_ASSERT(link_info);
3870
3871 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
3872 local_tlli, &rai_bss, cell_id,
3873 GPRS_SAPI_GMM, bss_nu++,
3874 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3875
3876 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3877 OSMO_ASSERT(!expect_msg());
3878
3879 dump_peers(stdout, 0, 0, &gbcfg);
3880
3881 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3882 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3883 OSMO_ASSERT(link_info);
3884 OSMO_ASSERT(link_info->is_deregistered);
3885
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003886 /* Re-Attach */
3887 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3888 foreign_tlli, &rai_bss, cell_id,
3889 GPRS_SAPI_GMM, bss_nu++,
3890 dtap_attach_req3, sizeof(dtap_attach_req3));
3891
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003892 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3893
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003894 dump_peers(stdout, 0, 0, &gbcfg);
3895
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003896 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3897 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3898 OSMO_ASSERT(link_info);
3899 OSMO_ASSERT(link_info == link_info2);
3900 OSMO_ASSERT(link_info->imsi_len != 0);
3901 OSMO_ASSERT(!link_info->is_deregistered);
3902 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003903
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003904 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3905 foreign_tlli, 1, imsi, sizeof(imsi),
3906 GPRS_SAPI_GMM, sgsn_nu++,
3907 dtap_attach_acc, sizeof(dtap_attach_acc));
3908
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003909 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3910
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003911 dump_peers(stdout, 0, 0, &gbcfg);
3912
3913 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3914 local_tlli, &rai_bss, cell_id,
3915 GPRS_SAPI_GMM, bss_nu++,
3916 dtap_attach_complete, sizeof(dtap_attach_complete));
3917
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003918 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3919
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003920 dump_peers(stdout, 0, 0, &gbcfg);
3921
3922 /* RA update procedure (reject -> Detach) */
3923 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3924 local_tlli, &rai_bss, 0x7080,
3925 GPRS_SAPI_GMM, bss_nu++,
3926 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3927
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003928 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
3929
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003930 send_llc_dl_ui(nsi, "RA UDP REJ", &sgsn_peer, 0x1002,
3931 local_tlli, 1, imsi, sizeof(imsi),
3932 GPRS_SAPI_GMM, sgsn_nu++,
3933 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3934
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003935 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
3936 OSMO_ASSERT(!expect_msg());
3937
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003938 dump_peers(stdout, 0, 0, &gbcfg);
3939
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003940 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3941 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3942 OSMO_ASSERT(link_info);
3943 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003944
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003945 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
3946 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3947 foreign_tlli, &rai_bss, cell_id,
3948 GPRS_SAPI_GMM, bss_nu++,
3949 dtap_attach_req, sizeof(dtap_attach_req));
3950
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003951 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3952
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003953 dump_peers(stdout, 0, 0, &gbcfg);
3954
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003955 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3956 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3957 OSMO_ASSERT(link_info);
3958 OSMO_ASSERT(link_info != link_info2);
3959 OSMO_ASSERT(link_info->imsi_len == 0);
3960 OSMO_ASSERT(!link_info->is_deregistered);
3961 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003962
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003963 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3964 foreign_tlli, &rai_bss, cell_id,
3965 GPRS_SAPI_GMM, bss_nu++,
3966 dtap_identity_resp, sizeof(dtap_identity_resp));
3967
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003968 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3969
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003970 dump_peers(stdout, 0, 0, &gbcfg);
3971
3972 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3973 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3974 OSMO_ASSERT(link_info);
3975 OSMO_ASSERT(link_info == link_info2);
3976 OSMO_ASSERT(link_info->imsi_len != 0);
3977 OSMO_ASSERT(!link_info->is_deregistered);
3978 OSMO_ASSERT(!link_info->imsi_acq_pending);
3979
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003980 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3981 foreign_tlli, 1, imsi, sizeof(imsi),
3982 GPRS_SAPI_GMM, sgsn_nu++,
3983 dtap_attach_acc, sizeof(dtap_attach_acc));
3984
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003985 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3986
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003987 dump_peers(stdout, 0, 0, &gbcfg);
3988
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003989 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3990 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3991 OSMO_ASSERT(link_info);
3992 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeckea71b482014-09-22 09:28:27 +02003993 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003994
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003995 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3996 local_tlli, &rai_bss, cell_id,
3997 GPRS_SAPI_GMM, bss_nu++,
3998 dtap_attach_complete, sizeof(dtap_attach_complete));
3999
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004000 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4001
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004002 dump_peers(stdout, 0, 0, &gbcfg);
4003
4004 /* Detach (MT) */
4005 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4006 local_tlli, 1, imsi, sizeof(imsi),
4007 GPRS_SAPI_GMM, sgsn_nu++,
4008 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4009
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004010 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4011
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004012 dump_peers(stdout, 0, 0, &gbcfg);
4013
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004014 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4015 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004016
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004017 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004018 local_tlli, &rai_bss, cell_id,
4019 GPRS_SAPI_GMM, bss_nu++,
4020 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4021
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004022 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4023
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004024 dump_peers(stdout, 0, 0, &gbcfg);
4025
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004026 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4027 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4028 OSMO_ASSERT(link_info);
4029 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02004030
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004031 OSMO_ASSERT(!expect_msg());
4032
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004033 /* Bad case: Re-Attach with local TLLI */
4034 send_llc_ul_ui(nsi, "ATTACH REQUEST (local TLLI)", &bss_peer[0], 0x1002,
4035 local_tlli, &rai_bss, cell_id,
4036 GPRS_SAPI_GMM, bss_nu++,
4037 dtap_attach_req3, sizeof(dtap_attach_req3));
4038
4039 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4040
4041 dump_peers(stdout, 0, 0, &gbcfg);
4042
4043 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4044 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4045 OSMO_ASSERT(link_info);
4046 OSMO_ASSERT(link_info == link_info2);
4047 OSMO_ASSERT(link_info->imsi_len != 0);
4048 OSMO_ASSERT(!link_info->is_deregistered);
4049 OSMO_ASSERT(!link_info->imsi_acq_pending);
4050 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
4051
4052 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4053 local_tlli, 1, imsi, sizeof(imsi),
4054 GPRS_SAPI_GMM, sgsn_nu++,
4055 dtap_attach_acc, sizeof(dtap_attach_acc));
4056
4057 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4058
4059 dump_peers(stdout, 0, 0, &gbcfg);
4060
4061 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4062 local_tlli, &rai_bss, cell_id,
4063 GPRS_SAPI_GMM, bss_nu++,
4064 dtap_attach_complete, sizeof(dtap_attach_complete));
4065
4066 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4067
4068 dump_peers(stdout, 0, 0, &gbcfg);
4069
4070 /* Detach (MT) */
4071 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
4072 local_tlli, 1, imsi, sizeof(imsi),
4073 GPRS_SAPI_GMM, sgsn_nu++,
4074 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
4075
4076 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4077
4078 dump_peers(stdout, 0, 0, &gbcfg);
4079
4080 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4081 OSMO_ASSERT(link_info);
4082
4083 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4084 local_tlli, &rai_bss, cell_id,
4085 GPRS_SAPI_GMM, bss_nu++,
4086 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4087
4088 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4089 OSMO_ASSERT(!expect_msg());
4090
4091 dump_peers(stdout, 0, 0, &gbcfg);
4092
4093 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4094 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4095 OSMO_ASSERT(link_info);
4096 OSMO_ASSERT(link_info->is_deregistered);
4097
4098 /* Bad case: Unexpected Re-Attach with IMSI after completed attachment
4099 * procedure */
4100 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4101 foreign_tlli, &rai_bss, cell_id,
4102 GPRS_SAPI_GMM, bss_nu++,
4103 dtap_attach_req3, sizeof(dtap_attach_req3));
4104
4105 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4106
4107 dump_peers(stdout, 0, 0, &gbcfg);
4108
4109 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4110 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4111 OSMO_ASSERT(link_info);
4112 OSMO_ASSERT(link_info == link_info2);
4113 OSMO_ASSERT(link_info->imsi_len != 0);
4114 OSMO_ASSERT(!link_info->is_deregistered);
4115 OSMO_ASSERT(!link_info->imsi_acq_pending);
4116
4117 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4118 foreign_tlli, 1, imsi, sizeof(imsi),
4119 GPRS_SAPI_GMM, sgsn_nu++,
4120 dtap_attach_acc, sizeof(dtap_attach_acc));
4121
4122 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4123
4124 dump_peers(stdout, 0, 0, &gbcfg);
4125
4126 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4127 local_tlli, &rai_bss, cell_id,
4128 GPRS_SAPI_GMM, bss_nu++,
4129 dtap_attach_complete, sizeof(dtap_attach_complete));
4130
4131 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4132
4133 dump_peers(stdout, 0, 0, &gbcfg);
4134
4135 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4136 local_tlli, 1, imsi, sizeof(imsi),
4137 GPRS_SAPI_GMM, sgsn_nu++,
4138 dtap_gmm_information, sizeof(dtap_gmm_information));
4139
4140 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4141
4142 dump_peers(stdout, 0, 0, &gbcfg);
4143
4144 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected, IMSI)",
4145 &bss_peer[0], 0x1002,
4146 foreign_tlli, &rai_bss, cell_id,
4147 GPRS_SAPI_GMM, bss_nu++,
4148 dtap_attach_req4, sizeof(dtap_attach_req4));
4149
4150 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4151
4152 dump_peers(stdout, 0, 0, &gbcfg);
4153
4154 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4155 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004156 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004157 OSMO_ASSERT(link_info == link_info2);
4158 OSMO_ASSERT(link_info->imsi_len != 0);
4159 OSMO_ASSERT(!link_info->is_deregistered);
4160 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004161 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004162 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4163
4164 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4165 foreign_tlli, 1, imsi, sizeof(imsi),
4166 GPRS_SAPI_GMM, sgsn_nu++,
4167 dtap_attach_acc, sizeof(dtap_attach_acc));
4168
4169 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4170
4171 dump_peers(stdout, 0, 0, &gbcfg);
4172
4173 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4174 local_tlli, &rai_bss, cell_id,
4175 GPRS_SAPI_GMM, bss_nu++,
4176 dtap_attach_complete, sizeof(dtap_attach_complete));
4177
4178 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4179
4180 dump_peers(stdout, 0, 0, &gbcfg);
4181
4182 /* Detach (MT) */
4183 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4184 local_tlli, 1, imsi, sizeof(imsi),
4185 GPRS_SAPI_GMM, sgsn_nu++,
4186 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4187
4188 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4189
4190 dump_peers(stdout, 0, 0, &gbcfg);
4191
4192 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4193 OSMO_ASSERT(link_info);
4194
4195 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4196 local_tlli, &rai_bss, cell_id,
4197 GPRS_SAPI_GMM, bss_nu++,
4198 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4199
4200 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4201 OSMO_ASSERT(!expect_msg());
4202
4203 dump_peers(stdout, 0, 0, &gbcfg);
4204
4205 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4206 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4207 OSMO_ASSERT(link_info);
4208 OSMO_ASSERT(link_info->is_deregistered);
4209
4210 /* Bad case: Unexpected Re-Attach with P-TMSI after completed attachment
4211 * procedure */
4212 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4213 foreign_tlli, &rai_bss, cell_id,
4214 GPRS_SAPI_GMM, bss_nu++,
4215 dtap_attach_req3, sizeof(dtap_attach_req3));
4216
4217 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4218
4219 dump_peers(stdout, 0, 0, &gbcfg);
4220
4221 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4222 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4223 OSMO_ASSERT(link_info);
4224 OSMO_ASSERT(link_info == link_info2);
4225 OSMO_ASSERT(link_info->imsi_len != 0);
4226 OSMO_ASSERT(!link_info->is_deregistered);
4227 OSMO_ASSERT(!link_info->imsi_acq_pending);
4228
4229 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4230 foreign_tlli, 1, imsi, sizeof(imsi),
4231 GPRS_SAPI_GMM, sgsn_nu++,
4232 dtap_attach_acc, sizeof(dtap_attach_acc));
4233
4234 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4235
4236 dump_peers(stdout, 0, 0, &gbcfg);
4237
4238 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4239 local_tlli, &rai_bss, cell_id,
4240 GPRS_SAPI_GMM, bss_nu++,
4241 dtap_attach_complete, sizeof(dtap_attach_complete));
4242
4243 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4244
4245 dump_peers(stdout, 0, 0, &gbcfg);
4246
4247 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4248 local_tlli, 1, imsi, sizeof(imsi),
4249 GPRS_SAPI_GMM, sgsn_nu++,
4250 dtap_gmm_information, sizeof(dtap_gmm_information));
4251
4252 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4253
4254 dump_peers(stdout, 0, 0, &gbcfg);
4255
4256 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected)", &bss_peer[0], 0x1002,
4257 foreign_tlli, &rai_bss, cell_id,
4258 GPRS_SAPI_GMM, bss_nu++,
4259 dtap_attach_req3, sizeof(dtap_attach_req3));
4260
4261 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4262
4263 dump_peers(stdout, 0, 0, &gbcfg);
4264
4265 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4266 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004267 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004268 OSMO_ASSERT(link_info == link_info2);
4269 OSMO_ASSERT(link_info->imsi_len != 0);
4270 OSMO_ASSERT(!link_info->is_deregistered);
4271 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004272 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004273 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4274
4275 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4276 foreign_tlli, 1, imsi, sizeof(imsi),
4277 GPRS_SAPI_GMM, sgsn_nu++,
4278 dtap_attach_acc, sizeof(dtap_attach_acc));
4279
4280 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4281
4282 dump_peers(stdout, 0, 0, &gbcfg);
4283
4284 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4285 local_tlli, &rai_bss, cell_id,
4286 GPRS_SAPI_GMM, bss_nu++,
4287 dtap_attach_complete, sizeof(dtap_attach_complete));
4288
4289 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4290
4291 dump_peers(stdout, 0, 0, &gbcfg);
4292
4293 /* Detach (MT) */
4294 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4295 local_tlli, 1, imsi, sizeof(imsi),
4296 GPRS_SAPI_GMM, sgsn_nu++,
4297 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4298
4299 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4300
4301 dump_peers(stdout, 0, 0, &gbcfg);
4302
4303 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4304 OSMO_ASSERT(link_info);
4305
4306 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4307 local_tlli, &rai_bss, cell_id,
4308 GPRS_SAPI_GMM, bss_nu++,
4309 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4310
4311 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4312 OSMO_ASSERT(!expect_msg());
4313
4314 dump_peers(stdout, 0, 0, &gbcfg);
4315
4316 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4317 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4318 OSMO_ASSERT(link_info);
4319 OSMO_ASSERT(link_info->is_deregistered);
4320
4321
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004322 /* Attach rejected */
4323
4324 gbproxy_delete_link_infos(peer);
4325
4326 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4327 foreign_tlli, &rai_bss, cell_id,
4328 GPRS_SAPI_GMM, bss_nu++,
4329 dtap_attach_req, sizeof(dtap_attach_req));
4330
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004331 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4332
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004333 dump_peers(stdout, 0, 0, &gbcfg);
4334
4335 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4336 OSMO_ASSERT(link_info);
4337 OSMO_ASSERT(link_info->imsi_len == 0);
4338 OSMO_ASSERT(!link_info->is_deregistered);
4339 OSMO_ASSERT(link_info->imsi_acq_pending);
4340
4341 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4342 foreign_tlli, &rai_bss, cell_id,
4343 GPRS_SAPI_GMM, bss_nu++,
4344 dtap_identity_resp, sizeof(dtap_identity_resp));
4345
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004346 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4347
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004348 dump_peers(stdout, 0, 0, &gbcfg);
4349
4350 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4351 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4352 OSMO_ASSERT(link_info);
4353 OSMO_ASSERT(link_info == link_info2);
4354 OSMO_ASSERT(link_info->imsi_len != 0);
4355 OSMO_ASSERT(!link_info->is_deregistered);
4356 OSMO_ASSERT(!link_info->imsi_acq_pending);
4357
4358 send_llc_dl_ui(nsi, "ATTACH REJECT", &sgsn_peer, 0x1002,
4359 foreign_tlli, 1, imsi, sizeof(imsi),
4360 GPRS_SAPI_GMM, sgsn_nu++,
4361 dtap_attach_rej7, sizeof(dtap_attach_rej7));
4362
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004363 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
4364
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004365 dump_peers(stdout, 0, 0, &gbcfg);
4366
Jacob Erlbeck9c65c812014-09-22 10:42:05 +02004367 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4368
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004369 OSMO_ASSERT(!expect_msg());
4370
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004371 /* Attach (incomplete) and Detach (MO) */
4372
4373 gbproxy_delete_link_infos(peer);
4374
4375 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4376 foreign_tlli, &rai_bss, cell_id,
4377 GPRS_SAPI_GMM, bss_nu++,
4378 dtap_attach_req, sizeof(dtap_attach_req));
4379
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004380 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4381
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004382 dump_peers(stdout, 0, 0, &gbcfg);
4383
4384 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4385 OSMO_ASSERT(link_info);
4386 OSMO_ASSERT(link_info->imsi_len == 0);
4387 OSMO_ASSERT(!link_info->is_deregistered);
4388 OSMO_ASSERT(link_info->imsi_acq_pending);
4389
4390 send_llc_ul_ui(nsi, "DETACH REQ (MO)", &bss_peer[0], 0x1002,
4391 foreign_tlli, &rai_bss, cell_id,
4392 GPRS_SAPI_GMM, bss_nu++,
4393 dtap_detach_req, sizeof(dtap_detach_req));
4394
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004395 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4396
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004397 dump_peers(stdout, 0, 0, &gbcfg);
4398
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004399 OSMO_ASSERT(!expect_msg());
4400
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004401 /* Attach (incomplete) and Detach (MT) */
4402
4403 gbproxy_delete_link_infos(peer);
4404
4405 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4406 foreign_tlli, &rai_bss, cell_id,
4407 GPRS_SAPI_GMM, bss_nu++,
4408 dtap_attach_req, sizeof(dtap_attach_req));
4409
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004410 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4411
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004412 dump_peers(stdout, 0, 0, &gbcfg);
4413
4414 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4415 OSMO_ASSERT(link_info);
4416 OSMO_ASSERT(link_info->imsi_len == 0);
4417 OSMO_ASSERT(!link_info->is_deregistered);
4418 OSMO_ASSERT(link_info->imsi_acq_pending);
4419
4420 send_llc_dl_ui(nsi, "DETACH REQ (MT)", &sgsn_peer, 0x1002,
4421 foreign_tlli, 1, imsi, sizeof(imsi),
4422 GPRS_SAPI_GMM, sgsn_nu++,
4423 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4424
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004425 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4426
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004427 dump_peers(stdout, 0, 0, &gbcfg);
4428
4429 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4430 OSMO_ASSERT(link_info);
4431
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004432 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004433 foreign_tlli, &rai_bss, cell_id,
4434 GPRS_SAPI_GMM, bss_nu++,
4435 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4436
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004437 /* TODO: The stored messaged should be cleaned when receiving a Detach
4438 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
4439 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4440 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4441
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004442 dump_peers(stdout, 0, 0, &gbcfg);
4443
4444 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4445 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4446 OSMO_ASSERT(link_info);
4447 OSMO_ASSERT(link_info->is_deregistered);
4448
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004449 OSMO_ASSERT(!expect_msg());
4450 received_messages = NULL;
4451
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004452 dump_global(stdout, 0);
4453
4454 gbprox_reset(&gbcfg);
4455 gprs_ns_destroy(nsi);
4456 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004457
4458 cleanup_test();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004459}
4460
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004461struct gbproxy_link_info *register_tlli(
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004462 struct gbproxy_peer *peer, uint32_t tlli,
4463 const uint8_t *imsi, size_t imsi_len, time_t now)
4464{
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004465 struct gbproxy_link_info *link_info;
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004466 int imsi_matches = -1;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004467 int tlli_already_known = 0;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004468 struct gbproxy_config *cfg = peer->cfg;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004469
4470 /* Check, whether the IMSI matches */
4471 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004472 imsi_matches = gbproxy_check_imsi(
4473 &cfg->matches[GBPROX_MATCH_PATCHING], imsi, imsi_len);
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004474 if (imsi_matches < 0)
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004475 return NULL;
4476 }
4477
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004478 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004479
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004480 if (!link_info) {
4481 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004482
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004483 if (link_info) {
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004484 /* TLLI has changed somehow, adjust it */
4485 LOGP(DGPRS, LOGL_INFO,
4486 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004487 link_info->tlli.current, tlli);
4488 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004489 }
4490 }
4491
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004492 if (!link_info) {
4493 link_info = gbproxy_link_info_alloc(peer);
4494 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004495 } else {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004496 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004497 tlli_already_known = 1;
4498 }
4499
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004500 OSMO_ASSERT(link_info != NULL);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004501
4502 if (!tlli_already_known)
4503 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
4504
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004505 gbproxy_attach_link_info(peer, now, link_info);
4506 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004507
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004508 if (imsi_matches >= 0)
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004509 link_info->is_matching[GBPROX_MATCH_PATCHING] = imsi_matches;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004510
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004511 return link_info;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004512}
4513
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004514static void test_gbproxy_tlli_expire(void)
4515{
4516 struct gbproxy_config cfg = {0};
4517 struct gbproxy_peer *peer;
4518 const char *err_msg = NULL;
4519 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0x26 };
4520 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0x29 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004521 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004522 const uint32_t tlli1 = 1234 | 0xc0000000;
4523 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004524 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004525 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004526 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004527
4528 printf("Test TLLI info expiry\n\n");
4529
4530 gbproxy_init_config(&cfg);
4531
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004532 if (gbproxy_set_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING],
4533 filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004534 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
4535 err_msg);
4536 OSMO_ASSERT(err_msg == NULL);
4537 }
4538
4539 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004540 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004541
4542 printf("Test TLLI replacement:\n");
4543
4544 cfg.tlli_max_len = 0;
4545 cfg.tlli_max_age = 0;
4546 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004547 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004548
4549 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004550 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004551 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004552 OSMO_ASSERT(link_info);
4553 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004554 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004555
4556 /* replace the old entry */
4557 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004558 link_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004559 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004560 OSMO_ASSERT(link_info);
4561 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004562 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004563
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004564 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004565
4566 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004567 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4568 OSMO_ASSERT(link_info);
4569 OSMO_ASSERT(link_info->tlli.current == tlli2);
4570 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4571 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004572
4573 printf("\n");
4574
4575 gbproxy_peer_free(peer);
4576 }
4577
4578 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004579 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004580
4581 printf("Test IMSI replacement:\n");
4582
4583 cfg.tlli_max_len = 0;
4584 cfg.tlli_max_age = 0;
4585 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004586 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004587
4588 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004589 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004590 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004591 OSMO_ASSERT(link_info);
4592 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004593 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004594
4595 /* try to replace the old entry */
4596 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004597 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004598 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004599 OSMO_ASSERT(link_info);
4600 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004601 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004602
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004603 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004604
4605 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004606 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4607 OSMO_ASSERT(!link_info);
4608 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4609 OSMO_ASSERT(link_info);
4610 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004611
4612 printf("\n");
4613
4614 gbproxy_peer_free(peer);
4615 }
4616
4617 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004618 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004619 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004620
4621 printf("Test TLLI expiry, max_len == 1:\n");
4622
4623 cfg.tlli_max_len = 1;
4624 cfg.tlli_max_age = 0;
4625 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004626 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004627
4628 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004629 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004630 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004631
4632 /* replace the old entry */
4633 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004634 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004635 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004636
Jacob Erlbeck51fde082014-09-19 16:40:21 +02004637 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004638 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004639 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004640
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004641 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004642
4643 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004644 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4645 OSMO_ASSERT(!link_info);
4646 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4647 OSMO_ASSERT(link_info);
4648 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004649
4650 printf("\n");
4651
4652 gbproxy_peer_free(peer);
4653 }
4654
4655 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004656 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004657 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004658
4659 printf("Test TLLI expiry, max_age == 1:\n");
4660
4661 cfg.tlli_max_len = 0;
4662 cfg.tlli_max_age = 1;
4663 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004664 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004665
4666 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004667 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004668 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004669
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004670 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004671 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004672 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004673 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004674
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004675 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004676 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004677 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004678
4679 dump_peers(stdout, 2, now + 2, &cfg);
4680
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004681 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004682 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4683 OSMO_ASSERT(!link_info);
4684 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4685 OSMO_ASSERT(link_info);
4686 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004687
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004688 printf("\n");
4689
4690 gbproxy_peer_free(peer);
4691 }
4692
4693 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004694 struct gbproxy_link_info *link_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004695 int num_removed;
4696
4697 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
4698
4699 cfg.tlli_max_len = 0;
4700 cfg.tlli_max_age = 1;
4701 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004702 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004703
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004704 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004705 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004706 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004707
4708 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004709 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004710 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004711 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004712
4713 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004714 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004715 now + 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004716 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004717
4718 dump_peers(stdout, 2, now + 2, &cfg);
4719
4720 printf(" Remove stale TLLIs\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004721 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004722 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004723 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004724
4725 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004726
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004727 /* verify that tlli3 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004728 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4729 OSMO_ASSERT(!link_info);
4730 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4731 OSMO_ASSERT(!link_info);
4732 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
4733 OSMO_ASSERT(link_info);
4734 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004735
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004736 printf("\n");
4737
4738 gbproxy_peer_free(peer);
4739 }
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004740 gbproxy_clear_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING]);
4741 gbprox_reset(&cfg);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004742
4743 cleanup_test();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004744}
4745
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004746static void test_gbproxy_imsi_matching(void)
4747{
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004748 const char *err_msg = NULL;
4749 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4750 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4751 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4752 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4753 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4754 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4755 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4756 const char *filter_re1 = ".*";
4757 const char *filter_re2 = "^1234";
4758 const char *filter_re3 = "^4321";
4759 const char *filter_re4_bad = "^12[";
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004760 struct gbproxy_match match = {0,};
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004761
4762 printf("=== Test IMSI/TMSI matching ===\n\n");
4763
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004764 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004765
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004766 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re1, &err_msg) == 0);
4767 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004768
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004769 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4770 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004771
4772 err_msg = NULL;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004773 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004774 OSMO_ASSERT(err_msg != NULL);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004775 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004776
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004777 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4778 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004779
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004780 OSMO_ASSERT(gbproxy_set_patch_filter(&match, NULL, &err_msg) == 0);
4781 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004782
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004783 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4784 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004785
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004786 gbproxy_clear_patch_filter(&match);
4787 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004788
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004789 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4790 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004791
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004792 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 1);
4793 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004794 /* imsi3_bad contains 0xE and 0xF digits, but the conversion function
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004795 * doesn't complain, so gbproxy_check_imsi() doesn't return -1 in this
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004796 * case. */
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004797 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4798 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4799 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4800 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4801 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004802
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004803 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re3, &err_msg) == 0);
4804 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004805
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004806 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 0);
4807 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 0);
4808 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4809 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4810 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4811 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4812 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004813
4814 /* TODO: Check correct length but wrong type with is_mi_tmsi */
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004815
4816 gbproxy_clear_patch_filter(&match);
4817 OSMO_ASSERT(match.enable == 0);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004818
4819 cleanup_test();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004820}
4821
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004822static void test_gbproxy_stored_messages()
4823{
4824 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
4825 struct sockaddr_in bss_peer[1] = {{0},};
4826 struct sockaddr_in sgsn_peer= {0};
4827 struct gprs_ra_id rai_bss =
4828 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
4829 struct gprs_ra_id rai_unknown =
4830 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
4831 uint16_t cell_id = 0x1234;
4832
4833 const uint32_t ptmsi = 0xefe2b700;
4834 const uint32_t local_tlli = 0xefe2b700;
4835
4836 const uint32_t foreign_tlli1 = 0x8000dead;
4837
4838 struct gbproxy_peer *peer;
4839 unsigned bss_nu = 0;
4840 unsigned sgsn_nu = 0;
4841
4842 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
4843
4844 bssgp_nsi = nsi;
4845 gbcfg.nsi = bssgp_nsi;
4846 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
4847 gbcfg.core_mcc = 0;
4848 gbcfg.core_mnc = 0;
4849 gbcfg.core_apn = talloc_zero_size(NULL, 100);
4850 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
4851 gbcfg.patch_ptmsi = 0;
4852 gbcfg.acquire_imsi = 1;
4853 gbcfg.keep_link_infos = 0;
4854
4855 configure_sgsn_peer(&sgsn_peer);
4856 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
4857
4858 printf("=== %s ===\n", __func__);
4859 printf("--- Initialise SGSN ---\n\n");
4860
4861 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
4862
4863 printf("--- Initialise BSS 1 ---\n\n");
4864
4865 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
4866 setup_bssgp(nsi, &bss_peer[0], 0x1002);
4867
4868 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
4869 OSMO_ASSERT(peer != NULL);
4870
4871 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
4872
4873 gprs_dump_nsi(nsi);
4874 dump_global(stdout, 0);
4875 dump_peers(stdout, 0, 0, &gbcfg);
4876
4877 printf("--- Establish first LLC connection ---\n\n");
4878
4879 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4880 foreign_tlli1, &rai_unknown, cell_id,
4881 GPRS_SAPI_GMM, bss_nu++,
4882 dtap_attach_req, sizeof(dtap_attach_req));
4883
4884 dump_peers(stdout, 0, 0, &gbcfg);
4885
4886 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
4887 foreign_tlli1, 0, NULL, 0,
4888 GPRS_SAPI_GMM, sgsn_nu++,
4889 dtap_identity_req, sizeof(dtap_identity_req));
4890
4891 dump_peers(stdout, 0, 0, &gbcfg);
4892
4893 send_llc_ul_ui(nsi, "DETACH ACCEPT", &bss_peer[0], 0x1002,
4894 foreign_tlli1, &rai_bss, cell_id,
4895 GPRS_SAPI_GMM, bss_nu++,
4896 dtap_detach_acc, sizeof(dtap_detach_acc));
4897
4898 dump_peers(stdout, 0, 0, &gbcfg);
4899
4900 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4901 foreign_tlli1, &rai_bss, cell_id,
4902 GPRS_SAPI_GMM, bss_nu++,
4903 dtap_identity_resp, sizeof(dtap_identity_resp));
4904
4905 dump_peers(stdout, 0, 0, &gbcfg);
4906
4907 dump_global(stdout, 0);
4908
4909 gbprox_reset(&gbcfg);
4910 gprs_ns_destroy(nsi);
4911 nsi = NULL;
4912
4913 cleanup_test();
4914}
4915
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004916static struct log_info_cat gprs_categories[] = {
4917 [DGPRS] = {
4918 .name = "DGPRS",
4919 .description = "GPRS Packet Service",
4920 .enabled = 1, .loglevel = LOGL_DEBUG,
4921 },
4922 [DNS] = {
4923 .name = "DNS",
4924 .description = "GPRS Network Service (NS)",
4925 .enabled = 1, .loglevel = LOGL_INFO,
4926 },
4927 [DBSSGP] = {
4928 .name = "DBSSGP",
4929 .description = "GPRS BSS Gateway Protocol (BSSGP)",
4930 .enabled = 1, .loglevel = LOGL_DEBUG,
4931 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004932};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004933
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004934static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004935 .cat = gprs_categories,
4936 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004937};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004938
4939int main(int argc, char **argv)
4940{
Neels Hofmeyr4c2d4ab2016-09-16 02:31:17 +02004941 msgb_talloc_ctx_init(NULL, 0);
4942
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004943 osmo_init_logging(&info);
4944 log_set_use_color(osmo_stderr_target, 0);
4945 log_set_print_filename(osmo_stderr_target, 0);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02004946 osmo_signal_register_handler(SS_L_NS, &test_signal, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004947
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004948 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004949 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
4950 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004951
4952 rate_ctr_init(NULL);
4953
4954 setlinebuf(stdout);
4955
4956 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02004957 gbproxy_init_config(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004958 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004959 test_gbproxy_ident_changes();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004960 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02004961 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02004962 test_gbproxy_ra_patching();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02004963 test_gbproxy_ptmsi_patching();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02004964 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02004965 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02004966 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004967 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004968 test_gbproxy_tlli_expire();
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004969 test_gbproxy_stored_messages();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004970 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004971
4972 exit(EXIT_SUCCESS);
4973}