blob: 3ebdccbaa58e41882355b3df943e4080b3d67851 [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
40#define REMOTE_BSS_ADDR 0x01020304
41#define REMOTE_SGSN_ADDR 0x05060708
42
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020043#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020044
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +020045#define REMOTE_SGSN2_ADDR 0x15161718
46#define SGSN2_NSEI 0x0102
47
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020048#define MATCH_ANY (-1)
49
Neels Hofmeyree6cfdc2017-07-13 02:03:50 +020050void *tall_bsc_ctx;
51
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020052struct gbproxy_config gbcfg = {0};
53
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020054struct llist_head *received_messages = NULL;
55
Max3b6332f2017-11-01 13:28:38 +010056/* override, requires '-Wl,--wrap=osmo_get_rand_id' */
57int __real_osmo_get_rand_id(uint8_t *data, size_t len);
58int mock_osmo_get_rand_id(uint8_t *data, size_t len);
59int (*osmo_get_rand_id_cb)(uint8_t *, size_t) =
60 &mock_osmo_get_rand_id;
Daniel Willmann537d4802015-10-12 19:36:35 +020061
Max3b6332f2017-11-01 13:28:38 +010062int __wrap_osmo_get_rand_id(uint8_t *buf, size_t num)
Daniel Willmann537d4802015-10-12 19:36:35 +020063{
Max3b6332f2017-11-01 13:28:38 +010064 return (*osmo_get_rand_id_cb)(buf, num);
Daniel Willmann537d4802015-10-12 19:36:35 +020065}
66
67static int rand_seq_num = 0;
Max3b6332f2017-11-01 13:28:38 +010068int mock_osmo_get_rand_id(uint8_t *buf, size_t num)
Daniel Willmann537d4802015-10-12 19:36:35 +020069{
70 uint32_t val;
71
72 OSMO_ASSERT(num == sizeof(val));
Daniel Willmann537d4802015-10-12 19:36:35 +020073
74 val = 0x00dead00 + rand_seq_num;
75
76 rand_seq_num++;
77
78 memcpy(buf, &val, num);
79
80 return 1;
81}
82
Daniel Willmannd1554ec2015-10-12 19:36:34 +020083static void cleanup_test()
84{
Daniel Willmann537d4802015-10-12 19:36:35 +020085 rand_seq_num = 0;
Daniel Willmannd1554ec2015-10-12 19:36:34 +020086}
87
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020088static int dump_global(FILE *stream, int indent)
89{
90 unsigned int i;
91 const struct rate_ctr_group_desc *desc;
92 int rc;
93
94 rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
95 if (rc < 0)
96 return rc;
97
98 desc = gbcfg.ctrg->desc;
99
100 for (i = 0; i < desc->num_ctr; i++) {
101 struct rate_ctr *ctr = &gbcfg.ctrg->ctr[i];
102 if (ctr->current) {
103 rc = fprintf(stream, "%*s %s: %llu\n",
104 indent, "",
105 desc->ctr_desc[i].description,
106 (long long)ctr->current);
107
108 if (rc < 0)
109 return rc;
110 }
111 }
112
113 return 0;
114}
115
Jacob Erlbeck7b821d02014-08-08 08:37:37 +0200116static int dump_peers(FILE *stream, int indent, time_t now,
117 struct gbproxy_config *cfg)
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200118{
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200119 struct gbproxy_peer *peer;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200120 struct gprs_ra_id raid;
121 unsigned int i;
122 const struct rate_ctr_group_desc *desc;
123 int rc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200124
125 rc = fprintf(stream, "%*sPeers:\n", indent, "");
126 if (rc < 0)
127 return rc;
128
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +0200129 llist_for_each_entry(peer, &cfg->bts_peers, list) {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200130 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200131 struct gbproxy_patch_state *state = &peer->patch_state;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200132 gsm48_parse_ra(&raid, peer->ra);
133
134 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, "
135 "RAI %u-%u-%u-%u\n",
136 indent, "",
137 peer->nsei, peer->bvci,
138 peer->blocked ? "" : "not ",
139 raid.mcc, raid.mnc, raid.lac, raid.rac);
140
141 if (rc < 0)
142 return rc;
143
144 desc = peer->ctrg->desc;
145
146 for (i = 0; i < desc->num_ctr; i++) {
147 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
148 if (ctr->current) {
149 rc = fprintf(stream, "%*s %s: %llu\n",
150 indent, "",
151 desc->ctr_desc[i].description,
152 (long long)ctr->current);
153
154 if (rc < 0)
155 return rc;
156 }
157 }
158
159 fprintf(stream, "%*s TLLI-Cache: %d\n",
Jacob Erlbeckf8562e32014-09-19 16:03:07 +0200160 indent, "", state->logical_link_count);
161 llist_for_each_entry(link_info, &state->logical_links, list) {
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200162 char mi_buf[200];
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200163 time_t age = now ? now - link_info->timestamp : 0;
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200164 int stored_msgs = 0;
165 struct llist_head *iter;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200166 enum gbproxy_match_id match_id;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200167 llist_for_each(iter, &link_info->stored_msgs)
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200168 stored_msgs++;
169
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200170 if (link_info->imsi_len > 0) {
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200171 snprintf(mi_buf, sizeof(mi_buf), "(invalid)");
172 gsm48_mi_to_string(mi_buf, sizeof(mi_buf),
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200173 link_info->imsi,
174 link_info->imsi_len);
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200175 } else {
176 snprintf(mi_buf, sizeof(mi_buf), "(none)");
177 }
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200178 fprintf(stream, "%*s TLLI %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200179 indent, "", link_info->tlli.current);
180 if (link_info->tlli.assigned)
181 fprintf(stream, "/%08x", link_info->tlli.assigned);
182 if (link_info->sgsn_tlli.current) {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200183 fprintf(stream, " -> %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200184 link_info->sgsn_tlli.current);
185 if (link_info->sgsn_tlli.assigned)
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200186 fprintf(stream, "/%08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200187 link_info->sgsn_tlli.assigned);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200188 }
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200189 fprintf(stream, ", IMSI %s, AGE %d",
190 mi_buf, (int)age);
191
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200192 if (stored_msgs)
193 fprintf(stream, ", STORED %d", stored_msgs);
194
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200195 for (match_id = 0; match_id < ARRAY_SIZE(cfg->matches);
196 ++match_id) {
197 if (cfg->matches[match_id].enable &&
198 link_info->is_matching[match_id]) {
199 fprintf(stream, ", IMSI matches");
200 break;
201 }
202 }
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200203
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200204 if (link_info->imsi_acq_pending)
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200205 fprintf(stream, ", IMSI acquisition in progress");
206
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200207 if (cfg->route_to_sgsn2)
208 fprintf(stream, ", SGSN NSEI %d",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200209 link_info->sgsn_nsei);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200210
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200211 if (link_info->is_deregistered)
Jacob Erlbeck7430da62014-09-12 15:09:56 +0200212 fprintf(stream, ", DE-REGISTERED");
213
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200214 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200215 if (rc < 0)
216 return rc;
217 }
218 }
219
220 return 0;
221}
222
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200223const uint8_t *convert_ra(struct gprs_ra_id *raid)
224{
225 static uint8_t buf[6];
226 gsm48_construct_ra(buf, raid);
227 return buf;
228}
229
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200230/* DTAP - Attach Request */
231static const unsigned char dtap_attach_req[] = {
232 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
233 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
234 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
235 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
236 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
237 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200238};
239
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200240/* DTAP - Attach Request (invalid RAI) */
241static const unsigned char dtap_attach_req2[] = {
242 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
243 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
244 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
245 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
246 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
247 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
248};
249
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200250/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
251static const unsigned char dtap_attach_req3[] = {
252 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
253 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
254 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
255 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
256 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
257 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
258};
259
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100260/* DTAP - Attach Request (IMSI 12131415161718) */
261static const unsigned char dtap_attach_req4[] = {
262 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
263 0x08, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
264 0x18, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19,
265 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00,
266 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60,
267 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80,
268 0x00,
269};
270
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200271/* DTAP - Identity Request */
272static const unsigned char dtap_identity_req[] = {
273 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200274};
275
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200276/* DTAP - Identity Response */
277static const unsigned char dtap_identity_resp[] = {
278 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
279 0x16, 0x17, 0x18
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200280};
281
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200282/* DTAP - Identity Response, IMSI 2 */
283static const unsigned char dtap_identity2_resp[] = {
284 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
285 0x16, 0x17, 0x18
286};
287
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200288/* DTAP - Identity Response, IMSI 3 */
289static const unsigned char dtap_identity3_resp[] = {
290 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
291 0x26, 0x27, 0x28
292};
293
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200294/* DTAP - Attach Accept */
295static const unsigned char dtap_attach_acc[] = {
296 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
297 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
298 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200299};
300
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200301/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200302static const unsigned char dtap_attach_acc2[] = {
303 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
304 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
305 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
306};
307
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200308/* DTAP - Attach Complete */
309static const unsigned char dtap_attach_complete[] = {
310 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200311};
312
Jacob Erlbeck2bf32612014-09-22 11:26:58 +0200313/* DTAP - Attach Reject (GPRS services not allowed) */
314static const unsigned char dtap_attach_rej7[] = {
315 0x08, 0x04, 0x07
316};
317
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200318/* DTAP - GMM Information */
319static const unsigned char dtap_gmm_information[] = {
320 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200321};
322
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200323/* DTAP - Routing Area Update Request */
324static const unsigned char dtap_ra_upd_req[] = {
325 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
326 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
327 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
328 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
329 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
330 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
331 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200332};
333
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200334/* DTAP - Routing Area Update Accept */
335static const unsigned char dtap_ra_upd_acc[] = {
336 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
337 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
338 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200339};
340
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200341/* DTAP - Routing Area Update Accept, P-TMSI 2 */
342static const unsigned char dtap_ra_upd_acc2[] = {
343 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
344 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
345 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
346};
347
348/* DTAP - Routing Area Update Accept, P-TMSI 3 */
349static const unsigned char dtap_ra_upd_acc3[] = {
350 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
351 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
352 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
353};
354
355/* DTAP - Routing Area Update Complete */
356static const unsigned char dtap_ra_upd_complete[] = {
357 0x08, 0x0a
358};
359
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200360/* DTAP - Routing Area Update Reject */
361/* cause = 10 ("Implicitly detached"), force_standby = 0 */
362static const unsigned char dtap_ra_upd_rej[] = {
363 0x08, 0x0b, 0x0a, 0x00,
364};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200365
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200366/* DTAP - Activate PDP Context Request */
367static const unsigned char dtap_act_pdp_ctx_req[] = {
368 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200369 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
370 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
371 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
372 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
373 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200374 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200375};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200376
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200377/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200378/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200379static const unsigned char dtap_detach_po_req[] = {
380 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
381 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200382};
383
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200384/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200385/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200386static const unsigned char dtap_detach_req[] = {
387 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
388 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200389};
390
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200391/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200392static const unsigned char dtap_detach_acc[] = {
393 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200394};
395
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200396/* DTAP - Detach Request (MT) */
397/* normal detach, reattach required, implicitly detached */
398static const unsigned char dtap_mt_detach_rea_req[] = {
399 0x08, 0x05, 0x01, 0x25, 0x0a
400};
401
402/* DTAP - Detach Request (MT) */
403/* normal detach, reattach not required, implicitly detached */
404static const unsigned char dtap_mt_detach_req[] = {
405 0x08, 0x05, 0x02, 0x25, 0x0a
406};
407
408/* DTAP - Detach Accept (MT) */
409static const unsigned char dtap_mt_detach_acc[] = {
410 0x08, 0x06
411};
412
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200413/* GPRS-LLC - SAPI: LLGMM, U, XID */
414static const unsigned char llc_u_xid_ul[] = {
415 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
416 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
417};
418
419/* GPRS-LLC - SAPI: LLGMM, U, XID */
420static const unsigned char llc_u_xid_dl[] = {
421 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
422 0xe4, 0xa9, 0x1a, 0x9e
423};
424
425/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
426static const unsigned char llc_ui_ll11_dns_query_ul[] = {
427 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
428 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
429 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
430 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
431 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
432 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
433 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
434 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
435 0x8f, 0x07
436};
437
438/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
439static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
440 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
441 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
442 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
443 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
444 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
445 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
446 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
447 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
448 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
449 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
450 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
451 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
452 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
453 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
454 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
455 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
456 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
457 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
458 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
459 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
460 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
461 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
462 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
463 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
464 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
465 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
466};
467
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200468static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
469 struct sockaddr_in *peer, const unsigned char* data,
470 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200471
472static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
473 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
474{
475 /* GPRS Network Service, PDU type: NS_RESET,
476 */
477 unsigned char msg[12] = {
478 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
479 0x04, 0x82, 0x11, 0x22
480 };
481
482 msg[3] = cause;
483 msg[6] = nsvci / 256;
484 msg[7] = nsvci % 256;
485 msg[10] = nsei / 256;
486 msg[11] = nsei % 256;
487
488 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
489}
490
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200491static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
492 uint16_t nsvci, uint16_t nsei)
493{
494 /* GPRS Network Service, PDU type: NS_RESET_ACK,
495 */
496 unsigned char msg[9] = {
497 0x03, 0x01, 0x82, 0x11, 0x22,
498 0x04, 0x82, 0x11, 0x22
499 };
500
501 msg[3] = nsvci / 256;
502 msg[4] = nsvci % 256;
503 msg[7] = nsei / 256;
504 msg[8] = nsei % 256;
505
506 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
507}
508
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200509static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
510{
511 /* GPRS Network Service, PDU type: NS_ALIVE */
512 unsigned char msg[1] = {
513 0x0a
514 };
515
516 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
517}
518
519static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
520{
521 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
522 unsigned char msg[1] = {
523 0x0b
524 };
525
526 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
527}
528
529static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
530{
531 /* GPRS Network Service, PDU type: NS_UNBLOCK */
532 unsigned char msg[1] = {
533 0x06
534 };
535
536 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
537}
538
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200539static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
540{
541 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
542 unsigned char msg[1] = {
543 0x07
544 };
545
546 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
547}
548
549static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
550 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200551 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
552{
553 /* GPRS Network Service, PDU type: NS_UNITDATA */
554 unsigned char msg[4096] = {
555 0x00, 0x00, 0x00, 0x00
556 };
557
558 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
559
560 msg[2] = nsbvci / 256;
561 msg[3] = nsbvci % 256;
562 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
563
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200564 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200565}
566
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200567static void send_bssgp_ul_unitdata(
568 struct gprs_ns_inst *nsi, const char *text,
569 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
570 struct gprs_ra_id *raid, uint16_t cell_id,
571 const uint8_t *llc_msg, size_t llc_msg_size)
572{
573 /* GPRS Network Service, PDU type: NS_UNITDATA */
574 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
575 unsigned char msg[4096] = {
576 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
577 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
578 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
579 };
580
581 size_t bssgp_msg_size = 23 + llc_msg_size;
582
583 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
584
585 gsm48_construct_ra(msg + 10, raid);
586 msg[1] = (uint8_t)(tlli >> 24);
587 msg[2] = (uint8_t)(tlli >> 16);
588 msg[3] = (uint8_t)(tlli >> 8);
589 msg[4] = (uint8_t)(tlli >> 0);
590 msg[16] = cell_id / 256;
591 msg[17] = cell_id % 256;
592 msg[21] = llc_msg_size / 256;
593 msg[22] = llc_msg_size % 256;
594 memcpy(msg + 23, llc_msg, llc_msg_size);
595
596 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
597 src_addr, nsbvci, msg, bssgp_msg_size);
598}
599
600static void send_bssgp_dl_unitdata(
601 struct gprs_ns_inst *nsi, const char *text,
602 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
603 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
604 const uint8_t *llc_msg, size_t llc_msg_size)
605{
606 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
607 unsigned char msg[4096] = {
608 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
609 0x16, 0x82, 0x02, 0x58,
610 };
611 unsigned char racap_drx[] = {
612 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
613 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
614 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
615 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
616 };
617
618 size_t bssgp_msg_size = 0;
619
620 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
621
622 msg[1] = (uint8_t)(tlli >> 24);
623 msg[2] = (uint8_t)(tlli >> 16);
624 msg[3] = (uint8_t)(tlli >> 8);
625 msg[4] = (uint8_t)(tlli >> 0);
626
627 bssgp_msg_size = 12;
628
629 if (with_racap_drx) {
630 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
631 bssgp_msg_size += sizeof(racap_drx);
632 }
633
634 if (imsi) {
635 OSMO_ASSERT(imsi_size <= 127);
636 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
637 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
638 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
639 bssgp_msg_size += 2 + imsi_size;
640 }
641
642 if ((bssgp_msg_size % 4) != 0) {
643 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
644 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
645 msg[bssgp_msg_size + 1] = 0x80 | abytes;
646 memset(msg + bssgp_msg_size + 2, 0, abytes);
647 bssgp_msg_size += 2 + abytes;
648 }
649
650 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
651 if (llc_msg_size < 128) {
652 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
653 bssgp_msg_size += 2;
654 } else {
655 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
656 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
657 bssgp_msg_size += 3;
658 }
659 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
660 bssgp_msg_size += llc_msg_size;
661
662
663 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
664 src_addr, nsbvci, msg, bssgp_msg_size);
665}
666
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200667static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
668 uint16_t bvci)
669{
670 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
671 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200672 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200673 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200674 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
675 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200676 };
677
678 msg[3] = bvci / 256;
679 msg[4] = bvci % 256;
680
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200681 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
682}
683
684static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
685 struct sockaddr_in *src_addr, uint16_t bvci)
686{
687 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
688 * BSSGP RESET_ACK */
689 static unsigned char msg[5] = {
690 0x23, 0x04, 0x82, 0x00,
691 0x00
692 };
693
694 msg[3] = bvci / 256;
695 msg[4] = bvci % 256;
696
697 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200698}
699
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200700static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
701 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200702 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200703 struct gprs_ra_id *raid)
704{
705 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
706 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200707 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
708 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200709 };
710
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200711 msg[3] = (uint8_t)(tlli >> 24);
712 msg[4] = (uint8_t)(tlli >> 16);
713 msg[5] = (uint8_t)(tlli >> 8);
714 msg[6] = (uint8_t)(tlli >> 0);
715
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200716 gsm48_construct_ra(msg + 9, raid);
717
718 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
719}
720
721static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
722 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200723 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200724 struct gprs_ra_id *raid)
725{
726 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
727 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200728 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
729 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200730 0x81, 0x01
731 };
732
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200733 msg[3] = (uint8_t)(tlli >> 24);
734 msg[4] = (uint8_t)(tlli >> 16);
735 msg[5] = (uint8_t)(tlli >> 8);
736 msg[6] = (uint8_t)(tlli >> 0);
737
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200738 gsm48_construct_ra(msg + 9, raid);
739
740 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
741}
742
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200743static void send_bssgp_llc_discarded(struct gprs_ns_inst *nsi,
744 struct sockaddr_in *src_addr,
745 uint16_t bvci, uint32_t tlli,
746 unsigned n_frames, unsigned n_octets)
747{
748 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
749 unsigned char msg[] = {
750 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
751 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
752 /* n octets */ 0xff, 0xff, 0xff
753 };
754
755 msg[3] = (uint8_t)(tlli >> 24);
756 msg[4] = (uint8_t)(tlli >> 16);
757 msg[5] = (uint8_t)(tlli >> 8);
758 msg[6] = (uint8_t)(tlli >> 0);
759 msg[9] = (uint8_t)(n_frames);
760 msg[12] = (uint8_t)(bvci >> 8);
761 msg[13] = (uint8_t)(bvci >> 0);
762 msg[16] = (uint8_t)(n_octets >> 16);
763 msg[17] = (uint8_t)(n_octets >> 8);
764 msg[18] = (uint8_t)(n_octets >> 0);
765
766 send_ns_unitdata(nsi, "LLC_DISCARDED", src_addr, 0, msg, sizeof(msg));
767}
768
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200769static void send_bssgp_paging(struct gprs_ns_inst *nsi,
770 struct sockaddr_in *src_addr,
771 const uint8_t *imsi, size_t imsi_size,
772 struct gprs_ra_id *raid, uint32_t ptmsi)
773{
774 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
775 unsigned char msg[100] = {
776 0x06,
777 };
778
779 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
780 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
781
782 size_t bssgp_msg_size = 1;
783
784 if (imsi) {
785 OSMO_ASSERT(imsi_size <= 127);
786 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
787 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
788 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
789 bssgp_msg_size += 2 + imsi_size;
790 }
791
792 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
793 bssgp_msg_size += sizeof(drx_ie);
794
795 if (raid) {
796 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
797 msg[bssgp_msg_size+1] = 0x86;
798 gsm48_construct_ra(msg + bssgp_msg_size + 2, raid);
799 bssgp_msg_size += 8;
800 }
801
802 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
803 bssgp_msg_size += sizeof(qos_ie);
804
805 if (ptmsi != GSM_RESERVED_TMSI) {
806 const uint32_t ptmsi_be = htonl(ptmsi);
807 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
808 msg[bssgp_msg_size+1] = 0x84;
809 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
810 bssgp_msg_size += 6;
811 }
812
813 send_ns_unitdata(nsi, "PAGING_PS", src_addr, 0, msg, bssgp_msg_size);
814}
815
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200816static void send_bssgp_flow_control_bvc(struct gprs_ns_inst *nsi,
817 struct sockaddr_in *src_addr,
818 uint16_t bvci, uint8_t tag)
819{
820 /* GPRS Network Service, PDU type: NS_UNITDATA,
821 * BSSGP FLOW_CONTROL_BVC */
822 unsigned char msg[] = {
823 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
824 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
825 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
826 };
827
828 msg[3] = tag;
829
830 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", src_addr, bvci,
831 msg, sizeof(msg));
832}
833
834static void send_bssgp_flow_control_bvc_ack(struct gprs_ns_inst *nsi,
835 struct sockaddr_in *src_addr,
836 uint16_t bvci, uint8_t tag)
837{
838 /* GPRS Network Service, PDU type: NS_UNITDATA,
839 * BSSGP FLOW_CONTROL_BVC_ACK */
840 unsigned char msg[] = {
841 0x27, 0x1e, 0x81, /* Tag */ 0xce
842 };
843
844 msg[3] = tag;
845
846 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", src_addr, bvci,
847 msg, sizeof(msg));
848}
849
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200850static void send_llc_ul_ui(
851 struct gprs_ns_inst *nsi, const char *text,
852 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
853 struct gprs_ra_id *raid, uint16_t cell_id,
854 unsigned sapi, unsigned nu,
855 const uint8_t *msg, size_t msg_size)
856{
857 unsigned char llc_msg[4096] = {
858 0x00, 0xc0, 0x01
859 };
860
861 size_t llc_msg_size = 3 + msg_size + 3;
862 uint8_t e_bit = 0;
863 uint8_t pm_bit = 1;
864 unsigned fcs;
865
866 nu &= 0x01ff;
867
868 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
869
870 llc_msg[0] = (sapi & 0x0f);
871 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
872 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
873
874 memcpy(llc_msg + 3, msg, msg_size);
875
876 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
877 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
878 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
879 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
880
881 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
882 src_addr, nsbvci, tlli, raid, cell_id,
883 llc_msg, llc_msg_size);
884}
885
886static void send_llc_dl_ui(
887 struct gprs_ns_inst *nsi, const char *text,
888 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
889 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
890 unsigned sapi, unsigned nu,
891 const uint8_t *msg, size_t msg_size)
892{
893 /* GPRS Network Service, PDU type: NS_UNITDATA */
894 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
895 unsigned char llc_msg[4096] = {
896 0x00, 0x00, 0x01
897 };
898
899 size_t llc_msg_size = 3 + msg_size + 3;
900 uint8_t e_bit = 0;
901 uint8_t pm_bit = 1;
902 unsigned fcs;
903
904 nu &= 0x01ff;
905
906 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
907
908 llc_msg[0] = 0x40 | (sapi & 0x0f);
909 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
910 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
911
912 memcpy(llc_msg + 3, msg, msg_size);
913
914 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
915 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
916 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
917 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
918
919 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
920 src_addr, nsbvci, tlli,
921 with_racap_drx, imsi, imsi_size,
922 llc_msg, llc_msg_size);
923}
924
925
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200926static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
927 uint16_t nsvci, uint16_t nsei)
928{
929 printf("Setup NS-VC: remote 0x%08x:%d, "
930 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
931 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
932 nsvci, nsvci, nsei, nsei);
933
934 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
935 send_ns_alive(nsi, src_addr);
936 send_ns_unblock(nsi, src_addr);
937 send_ns_alive_ack(nsi, src_addr);
938}
939
940static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
941 uint16_t bvci)
942{
943 printf("Setup BSSGP: remote 0x%08x:%d, "
944 "BVCI 0x%04x(%d)\n\n",
945 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
946 bvci, bvci);
947
948 send_bssgp_reset(nsi, src_addr, bvci);
949}
950
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200951static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer,
952 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200953{
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200954 gprs_ns_nsip_connect(nsi, sgsn_peer, sgsn_nsei, sgsn_nsei+1);
955 send_ns_reset_ack(nsi, sgsn_peer, sgsn_nsei+1, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200956 send_ns_alive_ack(nsi, sgsn_peer);
957 send_ns_unblock_ack(nsi, sgsn_peer);
958 send_ns_alive(nsi, sgsn_peer);
959}
960
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200961static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
962{
963 sgsn_peer->sin_family = AF_INET;
964 sgsn_peer->sin_port = htons(32000);
965 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
966}
967
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200968static void configure_sgsn2_peer(struct sockaddr_in *sgsn_peer)
969{
970 sgsn_peer->sin_family = AF_INET;
971 sgsn_peer->sin_port = htons(32001);
972 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN2_ADDR);
973}
974
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200975static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
976{
977 size_t i;
978
979 for (i = 0; i < size; ++i) {
980 bss_peers[i].sin_family = AF_INET;
981 bss_peers[i].sin_port = htons((i + 1) * 1111);
982 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
983 }
984}
985
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200986int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
987 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
988
989/* override */
990int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
991 struct msgb *msg, uint16_t bvci)
992{
Holger Hans Peter Freytherdaaea0c2015-08-03 09:28:41 +0200993 printf("CALLBACK, event %d, msg length %zu, bvci 0x%04x\n%s\n\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200994 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200995 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200996
997 switch (event) {
998 case GPRS_NS_EVT_UNIT_DATA:
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +0200999 return gbprox_rcvmsg(&gbcfg, msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001000 default:
1001 break;
1002 }
1003 return 0;
1004}
1005
1006/* override */
1007ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
1008 const struct sockaddr *dest_addr, socklen_t addrlen)
1009{
1010 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
1011 const struct sockaddr *, socklen_t);
1012 static sendto_t real_sendto = NULL;
1013 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001014 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001015
1016 if (!real_sendto)
1017 real_sendto = dlsym(RTLD_NEXT, "sendto");
1018
1019 if (dest_host == REMOTE_BSS_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001020 printf("MESSAGE to BSS at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001021 dest_host, dest_port,
1022 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001023 else if (dest_host == REMOTE_SGSN_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001024 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001025 dest_host, dest_port,
1026 len, osmo_hexdump(buf, len));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001027 else if (dest_host == REMOTE_SGSN2_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001028 printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001029 dest_host, dest_port,
1030 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001031 else
1032 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
1033
1034 return len;
1035}
1036
1037/* override */
1038int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
1039{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001040 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
1041 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001042 uint16_t bvci = msgb_bvci(msg);
1043 uint16_t nsei = msgb_nsei(msg);
1044
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001045 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001046
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001047 if (!real_gprs_ns_sendmsg)
1048 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
1049
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001050 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001051 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001052 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001053 bvci, len, __func__);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001054 else if (nsei == SGSN2_NSEI)
1055 printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001056 "msg length %zu (%s)\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001057 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001058 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001059 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001060 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001061 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001062
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001063 if (received_messages) {
1064 struct msgb *msg_copy;
1065 msg_copy = gprs_msgb_copy(msg, "received_messages");
1066 llist_add_tail(&msg_copy->list, received_messages);
1067 }
1068
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001069 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001070}
1071
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001072/* Get the next message from the receive FIFO
1073 *
1074 * \returns a pointer to the message which will be invalidated at the next call
1075 * to expect_msg. Returns NULL, if there is no message left.
1076 */
1077static struct msgb *expect_msg(void)
1078{
1079 static struct msgb *msg = NULL;
1080
1081 msgb_free(msg);
1082 msg = NULL;
1083
1084 if (!received_messages)
1085 return NULL;
1086
1087 if (llist_empty(received_messages))
1088 return NULL;
1089
1090 msg = llist_entry(received_messages->next, struct msgb, list);
1091 llist_del(&msg->list);
1092
1093 return msg;
1094}
1095
1096struct expect_result {
1097 struct msgb *msg;
1098 struct gprs_gb_parse_context parse_ctx;
1099};
1100
1101static struct expect_result *expect_bssgp_msg(
1102 int match_nsei, int match_bvci, int match_pdu_type)
1103{
1104 static struct expect_result result;
1105 static const struct expect_result empty_result = {0,};
1106 static struct msgb *msg;
1107 uint16_t nsei;
1108 int rc;
1109
1110 memcpy(&result, &empty_result, sizeof(result));
1111
1112 msg = expect_msg();
1113 if (!msg)
1114 return NULL;
1115
1116 nsei = msgb_nsei(msg);
1117
1118 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1119 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1120 __func__, match_nsei, nsei);
1121 return NULL;
1122 }
1123
1124 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1125 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1126 __func__, match_bvci, msgb_bvci(msg));
1127 return NULL;
1128 }
1129
1130 result.msg = msg;
1131
1132 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1133 result.parse_ctx.peer_nsei = nsei;
1134
1135 if (!msgb_bssgph(msg)) {
1136 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1137 return NULL;
1138 }
1139
1140 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1141 &result.parse_ctx);
1142
1143 if (!rc) {
1144 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1145 return NULL;
1146 }
1147
1148 if (match_pdu_type != MATCH_ANY &&
1149 match_pdu_type != result.parse_ctx.pdu_type) {
1150 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1151 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1152 return NULL;
1153 }
1154
1155 return &result;
1156}
1157
1158static struct expect_result *expect_llc_msg(
1159 int match_nsei, int match_bvci, int match_sapi, int match_type)
1160{
1161 static struct expect_result *result;
1162
1163 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1164 if (!result)
1165 return NULL;
1166
1167 if (!result->parse_ctx.llc) {
1168 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1169 return NULL;
1170 }
1171
1172 if (match_sapi != MATCH_ANY &&
1173 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1174 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1175 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1176 return NULL;
1177 }
1178
1179 if (match_type != MATCH_ANY &&
1180 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1181 fprintf(stderr,
1182 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1183 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1184 return NULL;
1185 }
1186
1187 return result;
1188}
1189
1190static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1191 int match_type)
1192{
1193 static struct expect_result *result;
1194
1195 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1196 if (!result)
1197 return NULL;
1198
1199 if (!result->parse_ctx.g48_hdr) {
1200 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1201 return NULL;
1202 }
1203
1204 if (match_type != MATCH_ANY &&
1205 match_type != result->parse_ctx.g48_hdr->msg_type) {
1206 fprintf(stderr,
1207 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1208 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1209 return NULL;
1210 }
1211
1212 return result;
1213}
1214
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001215static void dump_rate_ctr_group(FILE *stream, const char *prefix,
1216 struct rate_ctr_group *ctrg)
1217{
1218 unsigned int i;
1219
1220 for (i = 0; i < ctrg->desc->num_ctr; i++) {
1221 struct rate_ctr *ctr = &ctrg->ctr[i];
1222 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
1223 fprintf(stream, " %s%s: %llu%s",
1224 prefix, ctrg->desc->ctr_desc[i].description,
1225 (long long)ctr->current,
1226 "\n");
1227 };
1228}
1229
1230/* Signal handler for signals from NS layer */
1231static int test_signal(unsigned int subsys, unsigned int signal,
1232 void *handler_data, void *signal_data)
1233{
1234 struct ns_signal_data *nssd = signal_data;
1235 int rc;
1236
1237 if (subsys != SS_L_NS)
1238 return 0;
1239
1240 switch (signal) {
1241 case S_NS_RESET:
1242 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
1243 nssd->nsvc->nsvci,
1244 gprs_ns_ll_str(nssd->nsvc));
1245 break;
1246
1247 case S_NS_ALIVE_EXP:
1248 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
1249 nssd->nsvc->nsvci,
1250 gprs_ns_ll_str(nssd->nsvc));
1251 break;
1252
1253 case S_NS_BLOCK:
1254 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
1255 nssd->nsvc->nsvci,
1256 gprs_ns_ll_str(nssd->nsvc));
1257 break;
1258
1259 case S_NS_UNBLOCK:
1260 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
1261 nssd->nsvc->nsvci,
1262 gprs_ns_ll_str(nssd->nsvc));
1263 break;
1264
1265 case S_NS_REPLACED:
1266 printf("==> got signal NS_REPLACED: 0x%04x/%s",
1267 nssd->nsvc->nsvci,
1268 gprs_ns_ll_str(nssd->nsvc));
1269 printf(" -> 0x%04x/%s\n",
1270 nssd->old_nsvc->nsvci,
1271 gprs_ns_ll_str(nssd->old_nsvc));
1272 break;
1273
1274 default:
1275 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
1276 nssd->nsvc->nsvci,
1277 gprs_ns_ll_str(nssd->nsvc));
1278 break;
1279 }
1280 printf("\n");
1281 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
1282 return rc;
1283}
1284
1285static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
1286{
1287 struct msgb *msg;
1288 int ret;
1289 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001290 fprintf(stderr, "message too long: %zu\n", data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001291 return -1;
1292 }
1293
1294 msg = gprs_ns_msgb_alloc();
Neels Hofmeyrc9ac20e2016-04-14 15:21:33 +02001295 OSMO_ASSERT(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001296 memmove(msg->data, data, data_len);
1297 msg->l2h = msg->data;
1298 msgb_put(msg, data_len);
1299
1300 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
1301 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1302 osmo_hexdump(data, data_len));
1303
1304 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
1305
1306 printf("result (%s) = %d\n\n", text, ret);
1307
1308 msgb_free(msg);
1309
1310 return ret;
1311}
1312
1313static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
1314{
1315 struct gprs_nsvc *nsvc;
1316
1317 printf("Current NS-VCIs:\n");
1318 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
1319 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001320 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001321 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001322 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1323 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
1324 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001325 );
1326 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
1327 }
1328 printf("\n");
1329}
1330
1331static void test_gbproxy()
1332{
1333 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1334 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001335 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001336
1337 bssgp_nsi = nsi;
1338 gbcfg.nsi = bssgp_nsi;
1339 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1340
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001341 configure_sgsn_peer(&sgsn_peer);
1342 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001343
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001344 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001345 printf("--- Initialise SGSN ---\n\n");
1346
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001347 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001348 gprs_dump_nsi(nsi);
1349
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001350 printf("--- Initialise BSS 1 ---\n\n");
1351
1352 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1353 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1354 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001355 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001356
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001357 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1358
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001359 printf("--- Initialise BSS 2 ---\n\n");
1360
1361 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
1362 setup_bssgp(nsi, &bss_peer[1], 0x2002);
1363 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001364 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001365
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001366 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
1367
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001368 printf("--- Move BSS 1 to new port ---\n\n");
1369
1370 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
1371 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001372 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001373
1374 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1375
1376 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1377 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001378 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001379
1380 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
1381
1382 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1383 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001384 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001385
1386 printf("--- Move BSS 2 to new port ---\n\n");
1387
1388 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
1389 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001390 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001391
1392 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1393
1394 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
1395 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001396 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001397
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001398 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
1399
1400 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1401 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001402 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001403
1404 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1405
1406 setup_bssgp(nsi, &bss_peer[0], 0x1012);
1407 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001408 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001409
1410 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
1411
1412 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1413
1414 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1415 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001416 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001417
1418 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1419
1420 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1421
1422 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1423 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001424 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001425
1426 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1427
1428 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1429
1430 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1431
1432 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1433
1434 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1435
1436 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1437
1438 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1439
1440 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1441
1442 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1443
1444 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1445
1446 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
1447
1448 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1449
1450 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
1451
1452 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1453
1454 setup_bssgp(nsi, &bss_peer[2], 0x1002);
1455 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001456 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001457
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001458 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001459
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001460 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1461
1462 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1463
1464 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1465
1466 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1467
1468 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1469
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001470 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1471
1472 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
1473
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001474 /* Find peer */
1475 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1476 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1477 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1478 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1479 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1480 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1481
1482
1483 /* Cleanup */
1484 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1485 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1486 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1487 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1488 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1489
1490 dump_peers(stdout, 0, 0, &gbcfg);
1491
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001492 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001493
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001494 gbprox_reset(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001495 gprs_ns_destroy(nsi);
1496 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001497}
1498
1499static void test_gbproxy_ident_changes()
1500{
1501 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1502 struct sockaddr_in bss_peer[1] = {{0},};
1503 struct sockaddr_in sgsn_peer= {0};
1504 uint16_t nsei[2] = {0x1000, 0x2000};
1505 uint16_t nsvci[2] = {0x1001, 0x2001};
1506 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
1507
1508 bssgp_nsi = nsi;
1509 gbcfg.nsi = bssgp_nsi;
1510 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1511
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001512 configure_sgsn_peer(&sgsn_peer);
1513 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001514
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001515 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001516 printf("--- Initialise SGSN ---\n\n");
1517
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001518 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001519 gprs_dump_nsi(nsi);
1520
1521 printf("--- Initialise BSS 1 ---\n\n");
1522
1523 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
1524 gprs_dump_nsi(nsi);
1525
1526 printf("--- Setup BVCI 1 ---\n\n");
1527
1528 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1529 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001530 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001531
1532 printf("--- Setup BVCI 2 ---\n\n");
1533
1534 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
1535 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001536 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001537
1538 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1539
1540 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1541 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1542
1543 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1544
1545 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
1546 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
1547
1548 printf("--- Change NSEI ---\n\n");
1549
1550 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
1551 gprs_dump_nsi(nsi);
1552
1553 printf("--- Setup BVCI 1 ---\n\n");
1554
1555 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1556 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001557 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001558
1559 printf("--- Setup BVCI 3 ---\n\n");
1560
1561 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
1562 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001563 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001564
1565 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1566
1567 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1568 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1569
1570 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1571 " (should fail) ---\n\n");
1572
1573 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001574 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001575 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001576 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001577
1578 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1579
1580 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1581 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1582
1583 printf("--- Change NSVCI ---\n\n");
1584
1585 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
1586 gprs_dump_nsi(nsi);
1587
1588 printf("--- Setup BVCI 1 ---\n\n");
1589
1590 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1591 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001592 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001593
1594 printf("--- Setup BVCI 4 ---\n\n");
1595
1596 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
1597 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001598 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001599
1600 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1601
1602 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1603 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1604
1605 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1606 " (should fail) ---\n\n");
1607
1608 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001609 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001610 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001611 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001612
1613 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1614
1615 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1616 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1617
1618 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
1619
1620 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
1621 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
1622
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001623 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001624 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001625
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001626 gbprox_reset(&gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001627 gprs_ns_destroy(nsi);
1628 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001629}
1630
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001631static void test_gbproxy_ra_patching()
1632{
1633 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1634 struct sockaddr_in bss_peer[1] = {{0},};
1635 struct sockaddr_in sgsn_peer= {0};
1636 struct gprs_ra_id rai_bss =
1637 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1638 struct gprs_ra_id rai_sgsn =
1639 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1640 struct gprs_ra_id rai_unknown =
1641 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001642 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001643 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001644 const uint32_t ptmsi = 0xefe2b700;
1645 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001646 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001647 const uint32_t foreign_tlli2 = 0xbb00beef;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001648 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001649 const char *patch_re = "^9898|^121314";
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001650 struct gbproxy_link_info *link_info;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001651 struct gbproxy_peer *peer;
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001652 LLIST_HEAD(rcv_list);
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001653 struct expect_result *expect_res;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001654
1655 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001656
1657 bssgp_nsi = nsi;
1658 gbcfg.nsi = bssgp_nsi;
1659 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Jacob Erlbeck67a44452014-05-19 10:14:58 +02001660 gbcfg.core_mcc = 123;
1661 gbcfg.core_mnc = 456;
Jacob Erlbeck73685282014-05-23 20:48:07 +02001662 gbcfg.core_apn = talloc_zero_size(NULL, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001663 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001664 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001665
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001666 configure_sgsn_peer(&sgsn_peer);
1667 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001668
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001669 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING],
1670 patch_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001671 fprintf(stderr, "Failed to compile RE '%s': %s\n",
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001672 patch_re, err_msg);
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001673 exit(1);
1674 }
1675
1676
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001677 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001678 printf("--- Initialise SGSN ---\n\n");
1679
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001680 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001681 gprs_dump_nsi(nsi);
1682
1683 printf("--- Initialise BSS 1 ---\n\n");
1684
1685 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001686
1687 received_messages = &rcv_list;
1688
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001689 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1690 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001691 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001692
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001693 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001694 OSMO_ASSERT(peer != NULL);
1695
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001696 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_BVC_RESET));
1697
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001698 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1699
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001700 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_BVC_RESET_ACK));
1701
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001702 send_bssgp_suspend(nsi, &bss_peer[0], 0xccd1758b, &rai_bss);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001703
1704 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_SUSPEND));
1705
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001706 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001707
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001708 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_SUSPEND_ACK));
1709
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001710 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001711 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001712
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001713 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1714 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1715
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001716 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1717
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001718 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1719 foreign_tlli, &rai_bss, cell_id,
1720 GPRS_SAPI_GMM, 0,
1721 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001722
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001723 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001724 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001725
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001726 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1727 foreign_tlli, 0, NULL, 0,
1728 GPRS_SAPI_GMM, 0,
1729 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001730
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001731 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
1732
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001733 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1734 foreign_tlli, &rai_bss, cell_id,
1735 GPRS_SAPI_GMM, 3,
1736 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001737
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001738 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
1739
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001740 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1741 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1742
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001743 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1744 foreign_tlli, 1, imsi, sizeof(imsi),
1745 GPRS_SAPI_GMM, 1,
1746 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001747
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001748 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
1749
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001750 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1751
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001752 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1753 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1754 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1755
1756 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1757 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1758 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1759
1760 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1761 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1762 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1763
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001764 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1765 OSMO_ASSERT(link_info);
1766 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1767 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1768 OSMO_ASSERT(!link_info->tlli.bss_validated);
1769 OSMO_ASSERT(!link_info->tlli.net_validated);
1770 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1771 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1772 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1773 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001774
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001775 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1776 local_tlli, &rai_bss, cell_id,
1777 GPRS_SAPI_GMM, 4,
1778 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001779
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001780 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
1781
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001782 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1783
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001784 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1785 OSMO_ASSERT(link_info);
1786 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1787 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1788 OSMO_ASSERT(link_info->tlli.bss_validated);
1789 OSMO_ASSERT(!link_info->tlli.net_validated);
1790 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1791 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1792 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1793 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001794
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001795 /* Replace APN (1) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001796 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1797 local_tlli, &rai_bss, cell_id,
1798 GPRS_SAPI_GMM, 3,
1799 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001800
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001801 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1802
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001803 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1804
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001805 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1806 OSMO_ASSERT(link_info);
1807 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1808 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1809 OSMO_ASSERT(link_info->tlli.bss_validated);
1810 OSMO_ASSERT(!link_info->tlli.net_validated);
1811 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1812 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1813 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1814 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001815
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001816 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1817 local_tlli, 1, imsi, sizeof(imsi),
1818 GPRS_SAPI_GMM, 2,
1819 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001820
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001821 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
1822
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001823 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1824
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001825 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1826 OSMO_ASSERT(link_info);
1827 OSMO_ASSERT(link_info->tlli.assigned == 0);
1828 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1829 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1830 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001831
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001832 /* Replace APN (2) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001833 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1834 local_tlli, &rai_bss, cell_id,
1835 GPRS_SAPI_GMM, 3,
1836 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001837
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001838 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1839 OSMO_ASSERT(expect_res != NULL);
1840 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == gbcfg.core_apn_size + 2);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001841
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001842 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1843
Jacob Erlbeck73685282014-05-23 20:48:07 +02001844 gbcfg.core_apn[0] = 0;
1845 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001846
1847 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001848 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1849 local_tlli, &rai_bss, cell_id,
1850 GPRS_SAPI_GMM, 3,
1851 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001852
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001853 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1854 OSMO_ASSERT(expect_res != NULL);
1855 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001856
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001857 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1858
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001859 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001860
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001861 /* Detach */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001862 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1863 local_tlli, &rai_bss, cell_id,
1864 GPRS_SAPI_GMM, 6,
1865 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001866
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001867 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1868
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001869 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1870 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1871
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001872 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1873 local_tlli, 1, imsi, sizeof(imsi),
1874 GPRS_SAPI_GMM, 5,
1875 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001876
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001877 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
1878
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001879 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001880
1881 printf("--- RA update ---\n\n");
1882
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001883 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
1884 foreign_tlli, &rai_bss, 0x7080,
1885 GPRS_SAPI_GMM, 5,
1886 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001887
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001888 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
1889
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001890 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1891
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001892 send_llc_dl_ui(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
1893 foreign_tlli, 1, imsi, sizeof(imsi),
1894 GPRS_SAPI_GMM, 6,
1895 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001896
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001897 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_ACK));
1898
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001899 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1900
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001901 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001902 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1903 local_tlli, &rai_bss, cell_id,
1904 GPRS_SAPI_GMM, 3,
1905 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001906
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001907 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1908 OSMO_ASSERT(expect_res != NULL);
1909 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001910
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001911 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1912
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001913 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001914
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001915 /* Detach (power off -> no Detach Accept) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001916 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", &bss_peer[0], 0x1002,
1917 local_tlli, &rai_bss, cell_id,
1918 GPRS_SAPI_GMM, 6,
1919 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001920
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001921 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1922
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001923 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1924
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001925 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001926 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001927
1928 printf("--- Bad cases ---\n\n");
1929
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001930 /* The RAI in the Attach Request message differs from the RAI in the
1931 * BSSGP message, only patch the latter */
1932
1933 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", &bss_peer[0], 0x1002,
1934 foreign_tlli2, &rai_bss, cell_id,
1935 GPRS_SAPI_GMM, 0,
1936 dtap_attach_req2, sizeof(dtap_attach_req2));
1937
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001938 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
1939
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001940 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1941
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001942 printf("TLLI is already detached, shouldn't patch\n");
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001943 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", &bss_peer[0], 0x1002,
1944 local_tlli, &rai_bss, cell_id,
1945 GPRS_SAPI_GMM, 3,
1946 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001947
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001948 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1949
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001950 printf("Invalid RAI, shouldn't patch\n");
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001951 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001952
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001953 /* TODO: The following breaks with the current libosmocore, enable it
1954 * again (and remove the plain expect_msg), when the msgb_bssgph patch
1955 * is integrated */
1956 /* OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_STATUS)); */
1957 OSMO_ASSERT(expect_msg());
1958
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001959 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001960 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001961
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001962 OSMO_ASSERT(!expect_msg());
1963 received_messages = NULL;
1964
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02001965 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING]);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001966 gbprox_reset(&gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001967 gprs_ns_destroy(nsi);
1968 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001969}
1970
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001971static void test_gbproxy_ptmsi_assignment()
1972{
1973 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1974 struct sockaddr_in bss_peer[1] = {{0},};
1975 struct sockaddr_in sgsn_peer= {0};
1976 struct gprs_ra_id rai_bss =
1977 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1978 struct gprs_ra_id rai_unknown =
1979 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1980 uint16_t cell_id = 0x1234;
1981
1982 const uint32_t ptmsi = 0xefe2b700;
1983 const uint32_t local_tlli = 0xefe2b700;
1984
1985 const uint32_t foreign_tlli1 = 0x8000dead;
1986 const uint32_t foreign_tlli2 = 0x8000beef;
1987
1988 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
1989 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
1990
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001991 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001992 struct gbproxy_peer *peer;
1993 unsigned bss_nu = 0;
1994 unsigned sgsn_nu = 0;
1995
1996 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
1997
1998 bssgp_nsi = nsi;
1999 gbcfg.nsi = bssgp_nsi;
2000 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2001 gbcfg.core_mcc = 0;
2002 gbcfg.core_mnc = 0;
2003 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2004 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2005 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002006
2007 configure_sgsn_peer(&sgsn_peer);
2008 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2009
2010 printf("=== %s ===\n", __func__);
2011 printf("--- Initialise SGSN ---\n\n");
2012
2013 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2014
2015 printf("--- Initialise BSS 1 ---\n\n");
2016
2017 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2018 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2019
2020 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2021 OSMO_ASSERT(peer != NULL);
2022
2023 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2024
2025 gprs_dump_nsi(nsi);
2026 dump_global(stdout, 0);
2027 dump_peers(stdout, 0, 0, &gbcfg);
2028
2029 printf("--- Establish first LLC connection ---\n\n");
2030
2031 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2032 foreign_tlli1, &rai_unknown, cell_id,
2033 GPRS_SAPI_GMM, bss_nu++,
2034 dtap_attach_req, sizeof(dtap_attach_req));
2035
2036 dump_peers(stdout, 0, 0, &gbcfg);
2037
2038 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2039 foreign_tlli1, 0, NULL, 0,
2040 GPRS_SAPI_GMM, sgsn_nu++,
2041 dtap_identity_req, sizeof(dtap_identity_req));
2042
2043 dump_peers(stdout, 0, 0, &gbcfg);
2044
2045 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2046 foreign_tlli1, &rai_bss, cell_id,
2047 GPRS_SAPI_GMM, bss_nu++,
2048 dtap_identity_resp, sizeof(dtap_identity_resp));
2049
2050 dump_peers(stdout, 0, 0, &gbcfg);
2051
2052 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2053 foreign_tlli1, 1, imsi1, sizeof(imsi1),
2054 GPRS_SAPI_GMM, sgsn_nu++,
2055 dtap_attach_acc, sizeof(dtap_attach_acc));
2056
2057 dump_peers(stdout, 0, 0, &gbcfg);
2058
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002059 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
2060 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2061 OSMO_ASSERT(link_info);
2062 OSMO_ASSERT(link_info == link_info2);
2063 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2064 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2065 OSMO_ASSERT(!link_info->tlli.bss_validated);
2066 OSMO_ASSERT(!link_info->tlli.net_validated);
2067 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002068
2069 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2070 local_tlli, &rai_bss, cell_id,
2071 GPRS_SAPI_GMM, bss_nu++,
2072 dtap_attach_complete, sizeof(dtap_attach_complete));
2073
2074 dump_peers(stdout, 0, 0, &gbcfg);
2075
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002076 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2077 OSMO_ASSERT(link_info);
2078 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2079 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2080 OSMO_ASSERT(link_info->tlli.bss_validated);
2081 OSMO_ASSERT(!link_info->tlli.net_validated);
2082 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002083
2084
2085 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2086 local_tlli, 1, imsi1, sizeof(imsi1),
2087 GPRS_SAPI_GMM, sgsn_nu++,
2088 dtap_gmm_information, sizeof(dtap_gmm_information));
2089
2090 dump_peers(stdout, 0, 0, &gbcfg);
2091
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002092 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
2093 OSMO_ASSERT(link_info);
2094 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2095 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002096
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002097 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2098 OSMO_ASSERT(link_info == link_info2);
2099 OSMO_ASSERT(link_info->tlli.assigned == 0);
2100 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2101 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002102
2103 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
2104
2105 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2106 foreign_tlli2, &rai_unknown, cell_id,
2107 GPRS_SAPI_GMM, bss_nu++,
2108 dtap_attach_req, sizeof(dtap_attach_req));
2109
2110 dump_peers(stdout, 0, 0, &gbcfg);
2111
2112 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2113 foreign_tlli2, 0, NULL, 0,
2114 GPRS_SAPI_GMM, sgsn_nu++,
2115 dtap_identity_req, sizeof(dtap_identity_req));
2116
2117 dump_peers(stdout, 0, 0, &gbcfg);
2118
2119 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2120 foreign_tlli2, &rai_bss, cell_id,
2121 GPRS_SAPI_GMM, bss_nu++,
2122 dtap_identity2_resp, sizeof(dtap_identity2_resp));
2123
2124 dump_peers(stdout, 0, 0, &gbcfg);
2125
2126 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2127 foreign_tlli2, 1, imsi2, sizeof(imsi2),
2128 GPRS_SAPI_GMM, sgsn_nu++,
2129 dtap_attach_acc, sizeof(dtap_attach_acc));
2130
2131 dump_peers(stdout, 0, 0, &gbcfg);
2132
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002133 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
2134 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2135 OSMO_ASSERT(link_info);
2136 OSMO_ASSERT(link_info == link_info2);
2137 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2138 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2139 OSMO_ASSERT(!link_info->tlli.bss_validated);
2140 OSMO_ASSERT(!link_info->tlli.net_validated);
2141 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002142
2143 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2144 local_tlli, &rai_bss, cell_id,
2145 GPRS_SAPI_GMM, bss_nu++,
2146 dtap_attach_complete, sizeof(dtap_attach_complete));
2147
2148 dump_peers(stdout, 0, 0, &gbcfg);
2149
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002150 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2151 OSMO_ASSERT(link_info);
2152 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2153 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2154 OSMO_ASSERT(link_info->tlli.bss_validated);
2155 OSMO_ASSERT(!link_info->tlli.net_validated);
2156 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002157
2158 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2159 local_tlli, 1, imsi2, sizeof(imsi2),
2160 GPRS_SAPI_GMM, sgsn_nu++,
2161 dtap_gmm_information, sizeof(dtap_gmm_information));
2162
2163 dump_peers(stdout, 0, 0, &gbcfg);
2164
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002165 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
2166 OSMO_ASSERT(link_info);
2167 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2168 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002169
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002170 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2171 OSMO_ASSERT(link_info == link_info2);
2172 OSMO_ASSERT(link_info->tlli.assigned == 0);
2173 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2174 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002175
2176 dump_global(stdout, 0);
2177
2178 gbprox_reset(&gbcfg);
2179 gprs_ns_destroy(nsi);
2180 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002181
2182 cleanup_test();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002183}
2184
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002185static void test_gbproxy_ptmsi_patching()
2186{
2187 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2188 struct sockaddr_in bss_peer[1] = {{0},};
2189 struct sockaddr_in sgsn_peer= {0};
2190 struct gprs_ra_id rai_bss =
2191 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2192 struct gprs_ra_id rai_sgsn =
2193 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002194 struct gprs_ra_id rai_wrong_mcc_sgsn =
2195 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002196 struct gprs_ra_id rai_unknown =
2197 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2198 uint16_t cell_id = 0x1234;
2199
2200 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002201 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2202 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002203 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002204 const uint32_t local_sgsn_tlli2 = 0xe0987654;
2205 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Daniel Willmann537d4802015-10-12 19:36:35 +02002206 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002207 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002208
Daniel Willmann537d4802015-10-12 19:36:35 +02002209 const uint32_t bss_ptmsi = 0xc0dead01;
2210 const uint32_t bss_ptmsi2 = 0xc0dead02;
2211 const uint32_t bss_ptmsi3 = 0xc0dead03;
2212 const uint32_t local_bss_tlli = 0xc0dead01;
2213 const uint32_t local_bss_tlli2 = 0xc0dead02;
2214 const uint32_t local_bss_tlli3 = 0xc0dead03;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002215 const uint32_t foreign_bss_tlli = 0x8000dead;
2216
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002217
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002218 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002219 struct gbproxy_link_info *link_info;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002220 struct gbproxy_peer *peer;
2221 unsigned bss_nu = 0;
2222 unsigned sgsn_nu = 0;
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002223 int old_ctr;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002224
2225 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002226 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2227 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
2228 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2229 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
2230 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002231
2232 bssgp_nsi = nsi;
2233 gbcfg.nsi = bssgp_nsi;
2234 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2235 gbcfg.core_mcc = 123;
2236 gbcfg.core_mnc = 456;
2237 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2238 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2239 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002240
2241 configure_sgsn_peer(&sgsn_peer);
2242 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2243
2244 printf("=== %s ===\n", __func__);
2245 printf("--- Initialise SGSN ---\n\n");
2246
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002247 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002248
2249 printf("--- Initialise BSS 1 ---\n\n");
2250
2251 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2252 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2253
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02002254 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002255 OSMO_ASSERT(peer != NULL);
2256
2257 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2258
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002259 gprs_dump_nsi(nsi);
2260 dump_global(stdout, 0);
2261 dump_peers(stdout, 0, 0, &gbcfg);
2262
2263 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2264
2265 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2266 foreign_bss_tlli, &rai_unknown, cell_id,
2267 GPRS_SAPI_GMM, bss_nu++,
2268 dtap_attach_req, sizeof(dtap_attach_req));
2269
2270 dump_peers(stdout, 0, 0, &gbcfg);
2271
2272 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2273 random_sgsn_tlli, 0, NULL, 0,
2274 GPRS_SAPI_GMM, sgsn_nu++,
2275 dtap_identity_req, sizeof(dtap_identity_req));
2276
2277 dump_peers(stdout, 0, 0, &gbcfg);
2278
2279 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2280 foreign_bss_tlli, &rai_bss, cell_id,
2281 GPRS_SAPI_GMM, bss_nu++,
2282 dtap_identity_resp, sizeof(dtap_identity_resp));
2283
2284 dump_peers(stdout, 0, 0, &gbcfg);
2285
2286 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2287 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2288 GPRS_SAPI_GMM, sgsn_nu++,
2289 dtap_attach_acc, sizeof(dtap_attach_acc));
2290
2291 dump_peers(stdout, 0, 0, &gbcfg);
2292
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002293 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2294 OSMO_ASSERT(link_info);
2295 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2296 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2297 OSMO_ASSERT(!link_info->tlli.bss_validated);
2298 OSMO_ASSERT(!link_info->tlli.net_validated);
2299 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2300 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2301 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2302 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2303 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2304 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002305
2306 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2307 local_bss_tlli, &rai_bss, cell_id,
2308 GPRS_SAPI_GMM, bss_nu++,
2309 dtap_attach_complete, sizeof(dtap_attach_complete));
2310
2311 dump_peers(stdout, 0, 0, &gbcfg);
2312
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002313 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2314 OSMO_ASSERT(link_info);
2315 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2316 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2317 OSMO_ASSERT(link_info->tlli.bss_validated);
2318 OSMO_ASSERT(!link_info->tlli.net_validated);
2319 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2320 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2321 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2322 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002323
2324 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2325 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2326 GPRS_SAPI_GMM, sgsn_nu++,
2327 dtap_gmm_information, sizeof(dtap_gmm_information));
2328
2329 dump_peers(stdout, 0, 0, &gbcfg);
2330
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002331 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2332 OSMO_ASSERT(link_info);
2333 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2334 OSMO_ASSERT(link_info->tlli.assigned == 0);
2335 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2336 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002337
Jacob Erlbeck82add782014-09-05 18:08:12 +02002338 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
2339 local_bss_tlli, &rai_bss, cell_id,
2340 GPRS_SAPI_GMM, bss_nu++,
2341 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2342
2343 dump_peers(stdout, 0, 0, &gbcfg);
2344
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002345 /* Non-DTAP */
2346 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2347 local_bss_tlli, &rai_bss, cell_id,
2348 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2349
2350 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2351 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2352 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2353
2354 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2355 local_bss_tlli, &rai_bss, cell_id,
2356 llc_ui_ll11_dns_query_ul,
2357 sizeof(llc_ui_ll11_dns_query_ul));
2358
2359 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2360 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2361 llc_ui_ll11_dns_resp_dl,
2362 sizeof(llc_ui_ll11_dns_resp_dl));
2363
2364 dump_peers(stdout, 0, 0, &gbcfg);
2365
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002366 /* Repeated RA Update Requests */
2367 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", &bss_peer[0], 0x1002,
2368 local_bss_tlli, &rai_bss, 0x7080,
2369 GPRS_SAPI_GMM, bss_nu++,
2370 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2371
2372 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", &sgsn_peer, 0x1002,
2373 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2374 GPRS_SAPI_GMM, sgsn_nu++,
2375 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2376
2377 dump_peers(stdout, 0, 0, &gbcfg);
2378
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002379 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2380 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2381 OSMO_ASSERT(link_info);
2382 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2383 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2384 OSMO_ASSERT(!link_info->tlli.bss_validated);
2385 OSMO_ASSERT(!link_info->tlli.net_validated);
2386 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2387 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2388 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2389 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2390 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2391 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002392
2393 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", &bss_peer[0], 0x1002,
2394 local_bss_tlli2, &rai_bss, 0x7080,
2395 GPRS_SAPI_GMM, bss_nu++,
2396 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2397
2398 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", &sgsn_peer, 0x1002,
2399 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2400 GPRS_SAPI_GMM, sgsn_nu++,
2401 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2402
2403 dump_peers(stdout, 0, 0, &gbcfg);
2404
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002405 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2406 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI) != NULL);
2407 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2408 OSMO_ASSERT(link_info);
2409 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2410 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2411 OSMO_ASSERT(!link_info->tlli.bss_validated);
2412 OSMO_ASSERT(!link_info->tlli.net_validated);
2413 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2414 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2415 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2416 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2417 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2418 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002419
2420 send_llc_ul_ui(nsi, "RA UPD COMPLETE", &bss_peer[0], 0x1002,
2421 local_bss_tlli3, &rai_bss, 0x7080,
2422 GPRS_SAPI_GMM, bss_nu++,
2423 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2424
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002425 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002426
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002427 OSMO_ASSERT(link_info);
2428 OSMO_ASSERT(link_info->tlli.bss_validated);
2429 OSMO_ASSERT(!link_info->tlli.net_validated);
2430 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2431 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002432
2433 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2434 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2435 GPRS_SAPI_GMM, sgsn_nu++,
2436 dtap_gmm_information, sizeof(dtap_gmm_information));
2437
2438 dump_peers(stdout, 0, 0, &gbcfg);
2439
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002440 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2441 OSMO_ASSERT(link_info);
2442 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2443 OSMO_ASSERT(link_info->tlli.assigned == 0);
2444 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2445 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002446
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002447 /* Other messages */
2448 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002449 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002450
2451 dump_peers(stdout, 0, 0, &gbcfg);
2452
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002453 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002454
2455 dump_peers(stdout, 0, 0, &gbcfg);
2456
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002457 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002458
2459 dump_peers(stdout, 0, 0, &gbcfg);
2460
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002461 old_ctr = peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current;
2462
2463 send_bssgp_paging(nsi, &sgsn_peer, imsi, sizeof(imsi), &rai_bss, sgsn_ptmsi3);
2464
2465 dump_peers(stdout, 0, 0, &gbcfg);
2466
2467 OSMO_ASSERT(old_ctr + 1 ==
2468 peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current);
2469
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002470 /* Bad case: Invalid BVCI */
2471 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002472 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002473 dump_global(stdout, 0);
2474
2475 /* Bad case: Invalid RAI */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002476 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002477
2478 dump_global(stdout, 0);
2479
2480 /* Bad case: Invalid MCC (LAC ok) */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002481 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002482 &rai_wrong_mcc_sgsn);
2483
2484 dump_global(stdout, 0);
2485
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002486 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
2487 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2488 unknown_sgsn_tlli, 1, NULL, 0,
2489 GPRS_SAPI_GMM, 2,
2490 dtap_gmm_information, sizeof(dtap_gmm_information));
2491
2492 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
2493 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2494 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2495 GPRS_SAPI_GMM, 3,
2496 dtap_gmm_information, sizeof(dtap_gmm_information));
2497
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002498 /* Detach */
2499 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002500 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002501 GPRS_SAPI_GMM, bss_nu++,
2502 dtap_detach_req, sizeof(dtap_detach_req));
2503
2504 dump_peers(stdout, 0, 0, &gbcfg);
2505
2506 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002507 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002508 GPRS_SAPI_GMM, sgsn_nu++,
2509 dtap_detach_acc, sizeof(dtap_detach_acc));
2510
2511 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002512
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002513 dump_global(stdout, 0);
2514
2515 gbprox_reset(&gbcfg);
2516 gprs_ns_destroy(nsi);
2517 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002518
2519 cleanup_test();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002520}
2521
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002522static void test_gbproxy_ptmsi_patching_bad_cases()
2523{
2524 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2525 struct sockaddr_in bss_peer[1] = {{0},};
2526 struct sockaddr_in sgsn_peer= {0};
2527 struct gprs_ra_id rai_bss =
2528 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2529 struct gprs_ra_id rai_unknown =
2530 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2531 uint16_t cell_id = 0x1234;
2532
2533 const uint32_t sgsn_ptmsi = 0xefe2b700;
2534 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002535 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002536
Daniel Willmann537d4802015-10-12 19:36:35 +02002537 const uint32_t bss_ptmsi = 0xc0dead01;
2538 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002539 const uint32_t foreign_bss_tlli = 0x8000dead;
2540
2541
2542 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
2543 struct gbproxy_link_info *link_info;
2544 struct gbproxy_peer *peer;
2545 unsigned bss_nu = 0;
2546 unsigned sgsn_nu = 0;
2547
2548 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2549 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2550
2551 bssgp_nsi = nsi;
2552 gbcfg.nsi = bssgp_nsi;
2553 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2554 gbcfg.core_mcc = 123;
2555 gbcfg.core_mnc = 456;
2556 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2557 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2558 gbcfg.patch_ptmsi = 1;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002559
2560 configure_sgsn_peer(&sgsn_peer);
2561 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2562
2563 printf("=== %s ===\n", __func__);
2564 printf("--- Initialise SGSN ---\n\n");
2565
2566 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2567
2568 printf("--- Initialise BSS 1 ---\n\n");
2569
2570 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2571 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2572
2573 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2574 OSMO_ASSERT(peer != NULL);
2575
2576 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2577
2578 gprs_dump_nsi(nsi);
2579 dump_global(stdout, 0);
2580 dump_peers(stdout, 0, 0, &gbcfg);
2581
2582 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2583
2584 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2585 foreign_bss_tlli, &rai_unknown, cell_id,
2586 GPRS_SAPI_GMM, bss_nu++,
2587 dtap_attach_req, sizeof(dtap_attach_req));
2588
2589 dump_peers(stdout, 0, 0, &gbcfg);
2590
2591 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2592 random_sgsn_tlli, 0, NULL, 0,
2593 GPRS_SAPI_GMM, sgsn_nu++,
2594 dtap_identity_req, sizeof(dtap_identity_req));
2595
2596 dump_peers(stdout, 0, 0, &gbcfg);
2597
2598 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2599 foreign_bss_tlli, &rai_bss, cell_id,
2600 GPRS_SAPI_GMM, bss_nu++,
2601 dtap_identity_resp, sizeof(dtap_identity_resp));
2602
2603 dump_peers(stdout, 0, 0, &gbcfg);
2604
2605 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2606 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2607 GPRS_SAPI_GMM, sgsn_nu++,
2608 dtap_attach_acc, sizeof(dtap_attach_acc));
2609
2610 dump_peers(stdout, 0, 0, &gbcfg);
2611
2612 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2613 OSMO_ASSERT(link_info);
2614 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2615 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2616 OSMO_ASSERT(!link_info->tlli.bss_validated);
2617 OSMO_ASSERT(!link_info->tlli.net_validated);
2618 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2619 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2620 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2621 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2622 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2623 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2624
2625 send_llc_dl_ui(nsi, "ATTACH ACCEPT (duplicated)", &sgsn_peer, 0x1002,
2626 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2627 GPRS_SAPI_GMM, sgsn_nu++,
2628 dtap_attach_acc, sizeof(dtap_attach_acc));
2629
2630 dump_peers(stdout, 0, 0, &gbcfg);
2631
2632 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2633 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002634 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002635 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2636 OSMO_ASSERT(!link_info->tlli.bss_validated);
2637 OSMO_ASSERT(!link_info->tlli.net_validated);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002638 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002639 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2640 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2641 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2642 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2643 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2644
2645 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2646 local_bss_tlli, &rai_bss, cell_id,
2647 GPRS_SAPI_GMM, bss_nu++,
2648 dtap_attach_complete, sizeof(dtap_attach_complete));
2649
2650 dump_peers(stdout, 0, 0, &gbcfg);
2651
2652 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2653 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002654 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002655 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002656 OSMO_ASSERT(link_info->tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002657 OSMO_ASSERT(!link_info->tlli.net_validated);
2658 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2659 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002660 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002661 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2662
2663 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2664 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2665 GPRS_SAPI_GMM, sgsn_nu++,
2666 dtap_gmm_information, sizeof(dtap_gmm_information));
2667
2668 dump_peers(stdout, 0, 0, &gbcfg);
2669
2670 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2671 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002672 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2673 OSMO_ASSERT(link_info->tlli.assigned == 0);
2674 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2675 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002676
2677 /* Detach */
2678 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2679 local_bss_tlli, &rai_bss, cell_id,
2680 GPRS_SAPI_GMM, bss_nu++,
2681 dtap_detach_req, sizeof(dtap_detach_req));
2682
2683 dump_peers(stdout, 0, 0, &gbcfg);
2684
2685 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2686 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2687 GPRS_SAPI_GMM, sgsn_nu++,
2688 dtap_detach_acc, sizeof(dtap_detach_acc));
2689
2690 dump_peers(stdout, 0, 0, &gbcfg);
2691
2692 dump_global(stdout, 0);
2693
2694 gbprox_reset(&gbcfg);
2695 gprs_ns_destroy(nsi);
2696 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002697
2698 cleanup_test();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002699}
2700
2701
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002702static void test_gbproxy_imsi_acquisition()
2703{
2704 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2705 struct sockaddr_in bss_peer[1] = {{0},};
2706 struct sockaddr_in sgsn_peer= {0};
2707 struct gprs_ra_id rai_bss =
2708 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2709 struct gprs_ra_id rai_sgsn =
2710 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2711 struct gprs_ra_id rai_wrong_mcc_sgsn =
2712 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2713 struct gprs_ra_id rai_unknown =
2714 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2715 uint16_t cell_id = 0x1234;
2716
2717 const uint32_t sgsn_ptmsi = 0xefe2b700;
2718 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002719 const uint32_t random_sgsn_tlli = 0x78dead00;
2720 const uint32_t random_sgsn_tlli2 = 0x78dead02;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002721
Daniel Willmann537d4802015-10-12 19:36:35 +02002722 const uint32_t bss_ptmsi = 0xc0dead01;
2723 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002724 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002725 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002726
2727 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002728 struct gbproxy_link_info *link_info;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002729 struct gbproxy_peer *peer;
2730 unsigned bss_nu = 0;
2731 unsigned sgsn_nu = 0;
2732
2733 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2734
2735 bssgp_nsi = nsi;
2736 gbcfg.nsi = bssgp_nsi;
2737 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2738 gbcfg.core_mcc = 123;
2739 gbcfg.core_mnc = 456;
2740 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2741 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2742 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002743 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002744
2745 configure_sgsn_peer(&sgsn_peer);
2746 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2747
2748 printf("=== %s ===\n", __func__);
2749 printf("--- Initialise SGSN ---\n\n");
2750
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002751 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002752
2753 printf("--- Initialise BSS 1 ---\n\n");
2754
2755 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2756 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2757
2758 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2759 OSMO_ASSERT(peer != NULL);
2760
2761 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2762
2763 gprs_dump_nsi(nsi);
2764 dump_global(stdout, 0);
2765 dump_peers(stdout, 0, 0, &gbcfg);
2766
2767 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2768
2769 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002770 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002771 GPRS_SAPI_GMM, bss_nu++,
2772 dtap_attach_req, sizeof(dtap_attach_req));
2773
2774 dump_peers(stdout, 0, 0, &gbcfg);
2775
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002776 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2777 foreign_bss_tlli, &rai_bss, cell_id,
2778 GPRS_SAPI_GMM, bss_nu++,
2779 dtap_identity_resp, sizeof(dtap_identity_resp));
2780
2781 dump_peers(stdout, 0, 0, &gbcfg);
2782
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002783 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2784 random_sgsn_tlli, 0, NULL, 0,
2785 GPRS_SAPI_GMM, sgsn_nu++,
2786 dtap_identity_req, sizeof(dtap_identity_req));
2787
2788 dump_peers(stdout, 0, 0, &gbcfg);
2789
2790 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2791 foreign_bss_tlli, &rai_bss, cell_id,
2792 GPRS_SAPI_GMM, bss_nu++,
2793 dtap_identity_resp, sizeof(dtap_identity_resp));
2794
2795 dump_peers(stdout, 0, 0, &gbcfg);
2796
2797 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2798 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2799 GPRS_SAPI_GMM, sgsn_nu++,
2800 dtap_attach_acc, sizeof(dtap_attach_acc));
2801
2802 dump_peers(stdout, 0, 0, &gbcfg);
2803
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002804 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2805 OSMO_ASSERT(link_info);
2806 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2807 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2808 OSMO_ASSERT(!link_info->tlli.bss_validated);
2809 OSMO_ASSERT(!link_info->tlli.net_validated);
2810 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2811 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2812 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2813 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2814 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2815 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002816
2817 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2818 local_bss_tlli, &rai_bss, cell_id,
2819 GPRS_SAPI_GMM, bss_nu++,
2820 dtap_attach_complete, sizeof(dtap_attach_complete));
2821
2822 dump_peers(stdout, 0, 0, &gbcfg);
2823
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002824 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2825 OSMO_ASSERT(link_info);
2826 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2827 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2828 OSMO_ASSERT(link_info->tlli.bss_validated);
2829 OSMO_ASSERT(!link_info->tlli.net_validated);
2830 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2831 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2832 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2833 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002834
2835 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2836 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2837 GPRS_SAPI_GMM, sgsn_nu++,
2838 dtap_gmm_information, sizeof(dtap_gmm_information));
2839
2840 dump_peers(stdout, 0, 0, &gbcfg);
2841
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002842 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2843 OSMO_ASSERT(link_info);
2844 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2845 OSMO_ASSERT(link_info->tlli.assigned == 0);
2846 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2847 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002848
2849 /* Non-DTAP */
2850 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2851 local_bss_tlli, &rai_bss, cell_id,
2852 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2853
2854 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2855 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2856 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2857
2858 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2859 local_bss_tlli, &rai_bss, cell_id,
2860 llc_ui_ll11_dns_query_ul,
2861 sizeof(llc_ui_ll11_dns_query_ul));
2862
2863 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2864 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2865 llc_ui_ll11_dns_resp_dl,
2866 sizeof(llc_ui_ll11_dns_resp_dl));
2867
2868 dump_peers(stdout, 0, 0, &gbcfg);
2869
2870 /* Other messages */
2871 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2872 local_bss_tlli, 1, 12);
2873
2874 dump_peers(stdout, 0, 0, &gbcfg);
2875
2876 send_bssgp_llc_discarded(nsi, &sgsn_peer, 0x1002,
2877 local_sgsn_tlli, 1, 12);
2878
2879 dump_peers(stdout, 0, 0, &gbcfg);
2880
2881 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2882
2883 dump_peers(stdout, 0, 0, &gbcfg);
2884
2885 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_sgsn);
2886
2887 dump_peers(stdout, 0, 0, &gbcfg);
2888
2889 /* Bad case: Invalid BVCI */
2890 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
2891 local_bss_tlli, 1, 12);
2892 dump_global(stdout, 0);
2893
2894 /* Bad case: Invalid RAI */
2895 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_unknown);
2896
2897 dump_global(stdout, 0);
2898
2899 /* Bad case: Invalid MCC (LAC ok) */
2900 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli,
2901 &rai_wrong_mcc_sgsn);
2902
2903 dump_global(stdout, 0);
2904
2905 /* Detach */
2906 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2907 local_bss_tlli, &rai_bss, cell_id,
2908 GPRS_SAPI_GMM, bss_nu++,
2909 dtap_detach_req, sizeof(dtap_detach_req));
2910
2911 dump_peers(stdout, 0, 0, &gbcfg);
2912
2913 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2914 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2915 GPRS_SAPI_GMM, sgsn_nu++,
2916 dtap_detach_acc, sizeof(dtap_detach_acc));
2917
2918 dump_peers(stdout, 0, 0, &gbcfg);
2919
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002920 /* RA Update request */
2921
2922 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2923 foreign_bss_tlli, &rai_unknown, 0x7080,
2924 GPRS_SAPI_GMM, bss_nu++,
2925 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2926
2927 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2928 foreign_bss_tlli, &rai_bss, cell_id,
2929 GPRS_SAPI_GMM, bss_nu++,
2930 dtap_identity_resp, sizeof(dtap_identity_resp));
2931
2932 dump_peers(stdout, 0, 0, &gbcfg);
2933
2934 send_llc_dl_ui(nsi, "RA UDP ACC", &sgsn_peer, 0x1002,
2935 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2936 GPRS_SAPI_GMM, sgsn_nu++,
2937 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2938
2939 dump_peers(stdout, 0, 0, &gbcfg);
2940
2941 /* Detach */
2942
2943 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2944 local_bss_tlli, &rai_bss, cell_id,
2945 GPRS_SAPI_GMM, bss_nu++,
2946 dtap_detach_req, sizeof(dtap_detach_req));
2947
2948 dump_peers(stdout, 0, 0, &gbcfg);
2949
2950 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2951 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2952 GPRS_SAPI_GMM, sgsn_nu++,
2953 dtap_detach_acc, sizeof(dtap_detach_acc));
2954
2955 dump_peers(stdout, 0, 0, &gbcfg);
2956
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002957 /* Special case: Repeated Attach Requests */
2958
2959 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2960 foreign_bss_tlli, &rai_unknown, cell_id,
2961 GPRS_SAPI_GMM, bss_nu++,
2962 dtap_attach_req, sizeof(dtap_attach_req));
2963
2964 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2965 foreign_bss_tlli, &rai_unknown, cell_id,
2966 GPRS_SAPI_GMM, bss_nu++,
2967 dtap_attach_req, sizeof(dtap_attach_req));
2968
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002969 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2970 foreign_bss_tlli, &rai_bss, cell_id,
2971 GPRS_SAPI_GMM, bss_nu++,
2972 dtap_detach_req, sizeof(dtap_detach_req));
2973
2974 dump_peers(stdout, 0, 0, &gbcfg);
2975
2976 /* Special case: Detach from an unknown TLLI */
2977
2978 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", &bss_peer[0], 0x1002,
2979 other_bss_tlli, &rai_bss, cell_id,
2980 GPRS_SAPI_GMM, bss_nu++,
2981 dtap_detach_req, sizeof(dtap_detach_req));
2982
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002983 dump_peers(stdout, 0, 0, &gbcfg);
2984
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002985 /* Special case: Repeated RA Update Requests */
2986
2987 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2988 foreign_bss_tlli, &rai_unknown, 0x7080,
2989 GPRS_SAPI_GMM, bss_nu++,
2990 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2991
2992 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2993 foreign_bss_tlli, &rai_unknown, 0x7080,
2994 GPRS_SAPI_GMM, bss_nu++,
2995 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2996
2997 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2998 foreign_bss_tlli, &rai_bss, cell_id,
2999 GPRS_SAPI_GMM, bss_nu++,
3000 dtap_detach_req, sizeof(dtap_detach_req));
3001
3002 dump_peers(stdout, 0, 0, &gbcfg);
3003
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02003004 dump_global(stdout, 0);
3005
3006 gbprox_reset(&gbcfg);
3007 gprs_ns_destroy(nsi);
3008 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003009
3010 cleanup_test();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02003011}
3012
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003013static void test_gbproxy_secondary_sgsn()
3014{
3015 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
3016 struct sockaddr_in bss_peer[1] = {{0},};
3017 struct sockaddr_in sgsn_peer[2]= {{0},};
3018 struct gprs_ra_id rai_bss =
3019 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3020 struct gprs_ra_id rai_sgsn =
3021 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
3022 struct gprs_ra_id rai_unknown =
3023 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
3024 uint16_t cell_id = 0x1234;
3025
3026 const uint32_t sgsn_ptmsi = 0xefe2b700;
3027 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02003028 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003029
Daniel Willmann537d4802015-10-12 19:36:35 +02003030 const uint32_t bss_ptmsi = 0xc0dead01;
3031 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003032 const uint32_t foreign_bss_tlli = 0x8000dead;
3033
3034 const uint32_t sgsn_ptmsi2 = 0xe0987654;
3035 const uint32_t local_sgsn_tlli2 = 0xe0987654;
Daniel Willmann537d4802015-10-12 19:36:35 +02003036 const uint32_t random_sgsn_tlli2 = 0x78dead02;
3037 const uint32_t bss_ptmsi2 = 0xc0dead03;
3038 const uint32_t local_bss_tlli2 = 0xc0dead03;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003039 const uint32_t foreign_bss_tlli2 = 0x8000beef;
3040
Daniel Willmann537d4802015-10-12 19:36:35 +02003041 const uint32_t random_sgsn_tlli3 = 0x78dead04;
3042 const uint32_t bss_ptmsi3 = 0xc0dead05;
3043 const uint32_t local_bss_tlli3 = 0xc0dead05;
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003044 const uint32_t foreign_bss_tlli3 = 0x8000feed;
3045
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003046 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
3047 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003048 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0x28};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003049 struct gbproxy_link_info *link_info;
3050 struct gbproxy_link_info *other_info;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003051 struct gbproxy_peer *peer;
3052 unsigned bss_nu = 0;
3053 unsigned sgsn_nu = 0;
3054
3055 const char *err_msg = NULL;
3056 const char *filter_re = "999999";
3057
3058 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
3059 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
3060
3061 bssgp_nsi = nsi;
3062 gbcfg.nsi = bssgp_nsi;
3063 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3064 gbcfg.core_mcc = 123;
3065 gbcfg.core_mnc = 456;
3066 gbcfg.core_apn = talloc_zero_size(NULL, 100);
3067 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
3068 gbcfg.patch_ptmsi = 1;
3069 gbcfg.acquire_imsi = 1;
Daniel Willmann537d4802015-10-12 19:36:35 +02003070
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003071 gbcfg.route_to_sgsn2 = 1;
3072 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
3073
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003074 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING],
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02003075 filter_re, &err_msg) != 0) {
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003076 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
3077 err_msg);
3078 OSMO_ASSERT(err_msg == NULL);
3079 }
3080
3081 configure_sgsn_peer(&sgsn_peer[0]);
3082 configure_sgsn2_peer(&sgsn_peer[1]);
3083 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3084
3085 printf("=== %s ===\n", __func__);
3086 printf("--- Initialise SGSN 1 ---\n\n");
3087
3088 connect_sgsn(nsi, &sgsn_peer[0], SGSN_NSEI);
3089
3090 printf("--- Initialise SGSN 2 ---\n\n");
3091
3092 connect_sgsn(nsi, &sgsn_peer[1], SGSN2_NSEI);
3093
3094 printf("--- Initialise BSS 1 ---\n\n");
3095
3096 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3097 setup_bssgp(nsi, &bss_peer[0], 0x0);
3098 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x0);
3099 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3100 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x1002);
3101 send_bssgp_reset_ack(nsi, &sgsn_peer[1], 0x1002);
3102
3103 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3104 OSMO_ASSERT(peer != NULL);
3105
3106 gprs_dump_nsi(nsi);
3107 dump_global(stdout, 0);
3108 dump_peers(stdout, 0, 0, &gbcfg);
3109
3110 printf("--- Flow control ---\n\n");
3111
3112 send_bssgp_flow_control_bvc(nsi, &bss_peer[0], 0x1002, 1);
3113 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[0], 0x1002, 1);
3114 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[1], 0x1002, 1);
3115
3116 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
3117
3118 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3119 foreign_bss_tlli, &rai_unknown, cell_id,
3120 GPRS_SAPI_GMM, bss_nu++,
3121 dtap_attach_req, sizeof(dtap_attach_req));
3122
3123 dump_peers(stdout, 0, 0, &gbcfg);
3124
3125 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3126 foreign_bss_tlli, &rai_bss, cell_id,
3127 GPRS_SAPI_GMM, bss_nu++,
3128 dtap_identity_resp, sizeof(dtap_identity_resp));
3129
3130 dump_peers(stdout, 0, 0, &gbcfg);
3131
3132 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[0], 0x1002,
3133 random_sgsn_tlli, 0, NULL, 0,
3134 GPRS_SAPI_GMM, sgsn_nu++,
3135 dtap_identity_req, sizeof(dtap_identity_req));
3136
3137 dump_peers(stdout, 0, 0, &gbcfg);
3138
3139 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3140 foreign_bss_tlli, &rai_bss, cell_id,
3141 GPRS_SAPI_GMM, bss_nu++,
3142 dtap_identity_resp, sizeof(dtap_identity_resp));
3143
3144 dump_peers(stdout, 0, 0, &gbcfg);
3145
3146 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[0], 0x1002,
3147 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3148 GPRS_SAPI_GMM, sgsn_nu++,
3149 dtap_attach_acc, sizeof(dtap_attach_acc));
3150
3151 dump_peers(stdout, 0, 0, &gbcfg);
3152
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003153 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3154 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
3155 OSMO_ASSERT(link_info);
3156 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3157 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3158 OSMO_ASSERT(!link_info->tlli.bss_validated);
3159 OSMO_ASSERT(!link_info->tlli.net_validated);
3160 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
3161 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3162 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3163 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3164 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3165 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003166
3167 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3168 local_bss_tlli, &rai_bss, cell_id,
3169 GPRS_SAPI_GMM, bss_nu++,
3170 dtap_attach_complete, sizeof(dtap_attach_complete));
3171
3172 dump_peers(stdout, 0, 0, &gbcfg);
3173
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003174 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3175 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3176 OSMO_ASSERT(link_info);
3177 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3178 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3179 OSMO_ASSERT(link_info->tlli.bss_validated);
3180 OSMO_ASSERT(!link_info->tlli.net_validated);
3181 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3182 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3183 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3184 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003185
3186 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[0], 0x1002,
3187 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3188 GPRS_SAPI_GMM, sgsn_nu++,
3189 dtap_gmm_information, sizeof(dtap_gmm_information));
3190
3191 dump_peers(stdout, 0, 0, &gbcfg);
3192
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003193 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3194 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3195 OSMO_ASSERT(link_info);
3196 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
3197 OSMO_ASSERT(link_info->tlli.assigned == 0);
3198 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3199 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003200
3201 /* Non-DTAP */
3202 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3203 local_bss_tlli, &rai_bss, cell_id,
3204 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3205
3206 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[0], 0x1002,
3207 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3208 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3209
3210 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3211 local_bss_tlli, &rai_bss, cell_id,
3212 llc_ui_ll11_dns_query_ul,
3213 sizeof(llc_ui_ll11_dns_query_ul));
3214
3215 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[0], 0x1002,
3216 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3217 llc_ui_ll11_dns_resp_dl,
3218 sizeof(llc_ui_ll11_dns_resp_dl));
3219
3220 dump_peers(stdout, 0, 0, &gbcfg);
3221
3222 /* Other messages */
3223 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3224 local_bss_tlli, 1, 12);
3225
3226 dump_peers(stdout, 0, 0, &gbcfg);
3227
3228 send_bssgp_llc_discarded(nsi, &sgsn_peer[0], 0x1002,
3229 local_sgsn_tlli, 1, 12);
3230
3231 dump_peers(stdout, 0, 0, &gbcfg);
3232
3233 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
3234
3235 dump_peers(stdout, 0, 0, &gbcfg);
3236
3237 send_bssgp_suspend_ack(nsi, &sgsn_peer[0], local_sgsn_tlli, &rai_sgsn);
3238
3239 dump_peers(stdout, 0, 0, &gbcfg);
3240
3241 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
3242
3243 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3244 foreign_bss_tlli2, &rai_unknown, cell_id,
3245 GPRS_SAPI_GMM, bss_nu++,
3246 dtap_attach_req, sizeof(dtap_attach_req));
3247
3248 dump_peers(stdout, 0, 0, &gbcfg);
3249
3250 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3251 foreign_bss_tlli2, &rai_bss, cell_id,
3252 GPRS_SAPI_GMM, bss_nu++,
3253 dtap_identity2_resp, sizeof(dtap_identity2_resp));
3254
3255 dump_peers(stdout, 0, 0, &gbcfg);
3256
3257 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3258 random_sgsn_tlli2, 0, NULL, 0,
3259 GPRS_SAPI_GMM, sgsn_nu++,
3260 dtap_identity_req, sizeof(dtap_identity_req));
3261
3262 dump_peers(stdout, 0, 0, &gbcfg);
3263
3264 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3265 foreign_bss_tlli2, &rai_bss, cell_id,
3266 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02003267 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003268
3269 dump_peers(stdout, 0, 0, &gbcfg);
3270
3271 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[1], 0x1002,
3272 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3273 GPRS_SAPI_GMM, sgsn_nu++,
3274 dtap_attach_acc2, sizeof(dtap_attach_acc2));
3275
3276 dump_peers(stdout, 0, 0, &gbcfg);
3277
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003278 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
3279 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
3280 OSMO_ASSERT(link_info);
3281 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3282 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3283 OSMO_ASSERT(!link_info->tlli.bss_validated);
3284 OSMO_ASSERT(!link_info->tlli.net_validated);
3285 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
3286 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3287 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3288 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3289 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3290 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003291
3292 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3293 local_bss_tlli2, &rai_bss, cell_id,
3294 GPRS_SAPI_GMM, bss_nu++,
3295 dtap_attach_complete, sizeof(dtap_attach_complete));
3296
3297 dump_peers(stdout, 0, 0, &gbcfg);
3298
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003299 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3300 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3301 OSMO_ASSERT(link_info);
3302 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3303 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3304 OSMO_ASSERT(link_info->tlli.bss_validated);
3305 OSMO_ASSERT(!link_info->tlli.net_validated);
3306 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3307 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3308 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3309 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003310
3311 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3312 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3313 GPRS_SAPI_GMM, sgsn_nu++,
3314 dtap_gmm_information, sizeof(dtap_gmm_information));
3315
3316 dump_peers(stdout, 0, 0, &gbcfg);
3317
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003318 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3319 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3320 OSMO_ASSERT(link_info);
3321 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
3322 OSMO_ASSERT(link_info->tlli.assigned == 0);
3323 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
3324 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003325
3326 /* Non-DTAP */
3327 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3328 local_bss_tlli2, &rai_bss, cell_id,
3329 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3330
3331 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[1], 0x1002,
3332 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3333 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3334
3335 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3336 local_bss_tlli2, &rai_bss, cell_id,
3337 llc_ui_ll11_dns_query_ul,
3338 sizeof(llc_ui_ll11_dns_query_ul));
3339
3340 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[1], 0x1002,
3341 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3342 llc_ui_ll11_dns_resp_dl,
3343 sizeof(llc_ui_ll11_dns_resp_dl));
3344
3345 dump_peers(stdout, 0, 0, &gbcfg);
3346
3347 /* Other messages */
3348 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3349 local_bss_tlli2, 1, 12);
3350
3351 dump_peers(stdout, 0, 0, &gbcfg);
3352
3353 send_bssgp_llc_discarded(nsi, &sgsn_peer[1], 0x1002,
3354 local_sgsn_tlli2, 1, 12);
3355
3356 dump_peers(stdout, 0, 0, &gbcfg);
3357
3358 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli2, &rai_bss);
3359
3360 dump_peers(stdout, 0, 0, &gbcfg);
3361
3362 send_bssgp_suspend_ack(nsi, &sgsn_peer[1], local_sgsn_tlli2, &rai_sgsn);
3363
3364 dump_peers(stdout, 0, 0, &gbcfg);
3365
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003366 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
3367
3368 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3369 foreign_bss_tlli3, &rai_unknown, cell_id,
3370 GPRS_SAPI_GMM, bss_nu++,
3371 dtap_attach_req, sizeof(dtap_attach_req));
3372
3373 dump_peers(stdout, 0, 0, &gbcfg);
3374
3375 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3376 foreign_bss_tlli3, &rai_bss, cell_id,
3377 GPRS_SAPI_GMM, bss_nu++,
3378 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3379
3380 dump_peers(stdout, 0, 0, &gbcfg);
3381
3382 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3383 random_sgsn_tlli3, 0, NULL, 0,
3384 GPRS_SAPI_GMM, sgsn_nu++,
3385 dtap_identity_req, sizeof(dtap_identity_req));
3386
3387 dump_peers(stdout, 0, 0, &gbcfg);
3388
3389 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3390 foreign_bss_tlli3, &rai_bss, cell_id,
3391 GPRS_SAPI_GMM, bss_nu++,
3392 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3393
3394 dump_peers(stdout, 0, 0, &gbcfg);
3395
3396 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", &sgsn_peer[1], 0x1002,
3397 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
3398 GPRS_SAPI_GMM, sgsn_nu++,
3399 dtap_attach_acc, sizeof(dtap_attach_acc));
3400
3401 dump_peers(stdout, 0, 0, &gbcfg);
3402
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003403 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
3404 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
3405 OSMO_ASSERT(link_info);
3406 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3407 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3408 OSMO_ASSERT(!link_info->tlli.bss_validated);
3409 OSMO_ASSERT(!link_info->tlli.net_validated);
3410 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
3411 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3412 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3413 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3414 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3415 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003416
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003417 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3418 local_bss_tlli3, &rai_bss, cell_id,
3419 GPRS_SAPI_GMM, bss_nu++,
3420 dtap_attach_complete, sizeof(dtap_attach_complete));
3421
3422 dump_peers(stdout, 0, 0, &gbcfg);
3423
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003424 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003425 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003426 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3427 OSMO_ASSERT(link_info);
3428 OSMO_ASSERT(link_info != other_info);
3429 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3430 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3431 OSMO_ASSERT(link_info->tlli.bss_validated);
3432 OSMO_ASSERT(!link_info->tlli.net_validated);
3433 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3434 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3435 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3436 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003437
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003438 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3439 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3440 GPRS_SAPI_GMM, sgsn_nu++,
3441 dtap_gmm_information, sizeof(dtap_gmm_information));
3442
3443 dump_peers(stdout, 0, 0, &gbcfg);
3444
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003445 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003446 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003447 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3448 OSMO_ASSERT(link_info);
3449 OSMO_ASSERT(link_info != other_info);
3450 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
3451 OSMO_ASSERT(link_info->tlli.assigned == 0);
3452 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3453 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003454
3455
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003456 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
3457
3458 /* Detach */
3459 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3460 local_bss_tlli, &rai_bss, cell_id,
3461 GPRS_SAPI_GMM, bss_nu++,
3462 dtap_detach_req, sizeof(dtap_detach_req));
3463
3464 dump_peers(stdout, 0, 0, &gbcfg);
3465
3466 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[0], 0x1002,
3467 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3468 GPRS_SAPI_GMM, sgsn_nu++,
3469 dtap_detach_acc, sizeof(dtap_detach_acc));
3470
3471 dump_peers(stdout, 0, 0, &gbcfg);
3472
3473 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
3474
3475 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3476 local_bss_tlli2, &rai_bss, cell_id,
3477 GPRS_SAPI_GMM, bss_nu++,
3478 dtap_detach_req, sizeof(dtap_detach_req));
3479
3480 dump_peers(stdout, 0, 0, &gbcfg);
3481
3482 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3483 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3484 GPRS_SAPI_GMM, sgsn_nu++,
3485 dtap_detach_acc, sizeof(dtap_detach_acc));
3486
3487 dump_peers(stdout, 0, 0, &gbcfg);
3488
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003489 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
3490
3491 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3492 local_bss_tlli3, &rai_bss, cell_id,
3493 GPRS_SAPI_GMM, bss_nu++,
3494 dtap_detach_req, sizeof(dtap_detach_req));
3495
3496 dump_peers(stdout, 0, 0, &gbcfg);
3497
3498 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3499 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3500 GPRS_SAPI_GMM, sgsn_nu++,
3501 dtap_detach_acc, sizeof(dtap_detach_acc));
3502
3503 dump_peers(stdout, 0, 0, &gbcfg);
3504
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003505 dump_global(stdout, 0);
3506
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003507 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING]);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003508 gbprox_reset(&gbcfg);
3509 gprs_ns_destroy(nsi);
3510 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003511
3512 cleanup_test();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003513}
3514
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003515static void test_gbproxy_keep_info()
3516{
3517 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
3518 struct sockaddr_in bss_peer[1] = {{0},};
3519 struct sockaddr_in sgsn_peer= {0};
3520 struct gprs_ra_id rai_bss =
3521 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3522 uint16_t cell_id = 0x1234;
3523
3524 const uint32_t ptmsi = 0xefe2b700;
3525 const uint32_t local_tlli = 0xefe2b700;
3526 const uint32_t foreign_tlli = 0xafe2b700;
3527
3528 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003529 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003530 struct gbproxy_peer *peer;
3531 unsigned bss_nu = 0;
3532 unsigned sgsn_nu = 0;
3533
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003534 LLIST_HEAD(rcv_list);
3535
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003536 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3537
3538 bssgp_nsi = nsi;
3539 gbcfg.nsi = bssgp_nsi;
3540 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3541 gbcfg.patch_ptmsi = 0;
3542 gbcfg.acquire_imsi = 1;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003543 gbcfg.core_mcc = 0;
3544 gbcfg.core_mnc = 0;
3545 gbcfg.core_apn = NULL;
3546 gbcfg.core_apn_size = 0;
3547 gbcfg.route_to_sgsn2 = 0;
3548 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003549 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003550
3551 configure_sgsn_peer(&sgsn_peer);
3552 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3553
3554 printf("=== %s ===\n", __func__);
3555 printf("--- Initialise SGSN ---\n\n");
3556
3557 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
3558
3559 printf("--- Initialise BSS 1 ---\n\n");
3560
3561 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3562 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3563
3564 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3565 OSMO_ASSERT(peer != NULL);
3566
3567 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
3568
3569 gprs_dump_nsi(nsi);
3570 dump_global(stdout, 0);
3571 dump_peers(stdout, 0, 0, &gbcfg);
3572
3573 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3574
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003575 received_messages = &rcv_list;
3576
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003577 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3578 foreign_tlli, &rai_bss, cell_id,
3579 GPRS_SAPI_GMM, bss_nu++,
3580 dtap_attach_req, sizeof(dtap_attach_req));
3581
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003582 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3583
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003584 dump_peers(stdout, 0, 0, &gbcfg);
3585
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003586 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3587 OSMO_ASSERT(link_info);
3588 OSMO_ASSERT(link_info->imsi_len == 0);
3589 OSMO_ASSERT(!link_info->is_deregistered);
3590 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003591
3592 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3593 foreign_tlli, &rai_bss, cell_id,
3594 GPRS_SAPI_GMM, bss_nu++,
3595 dtap_identity_resp, sizeof(dtap_identity_resp));
3596
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003597 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3598
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003599 dump_peers(stdout, 0, 0, &gbcfg);
3600
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003601 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3602 OSMO_ASSERT(link_info);
3603 OSMO_ASSERT(link_info->imsi_len > 0);
3604 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003605 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003606
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003607 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
3608 foreign_tlli, 0, NULL, 0,
3609 GPRS_SAPI_GMM, sgsn_nu++,
3610 dtap_identity_req, sizeof(dtap_identity_req));
3611
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003612 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3613
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003614 dump_peers(stdout, 0, 0, &gbcfg);
3615
3616 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3617 foreign_tlli, &rai_bss, cell_id,
3618 GPRS_SAPI_GMM, bss_nu++,
3619 dtap_identity_resp, sizeof(dtap_identity_resp));
3620
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003621 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
3622
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003623 dump_peers(stdout, 0, 0, &gbcfg);
3624
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003625 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3626 OSMO_ASSERT(link_info);
3627 OSMO_ASSERT(link_info->imsi_len > 0);
3628 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003629
3630 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3631 foreign_tlli, 1, imsi, sizeof(imsi),
3632 GPRS_SAPI_GMM, sgsn_nu++,
3633 dtap_attach_acc, sizeof(dtap_attach_acc));
3634
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003635 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3636
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003637 dump_peers(stdout, 0, 0, &gbcfg);
3638
3639 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3640 local_tlli, &rai_bss, cell_id,
3641 GPRS_SAPI_GMM, bss_nu++,
3642 dtap_attach_complete, sizeof(dtap_attach_complete));
3643
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003644 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3645
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003646 dump_peers(stdout, 0, 0, &gbcfg);
3647
3648 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
3649 local_tlli, 1, imsi, sizeof(imsi),
3650 GPRS_SAPI_GMM, sgsn_nu++,
3651 dtap_gmm_information, sizeof(dtap_gmm_information));
3652
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003653 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3654
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003655 dump_peers(stdout, 0, 0, &gbcfg);
3656
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003657 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3658 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003659
3660 /* Detach (MO) */
3661 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3662 local_tlli, &rai_bss, cell_id,
3663 GPRS_SAPI_GMM, bss_nu++,
3664 dtap_detach_req, sizeof(dtap_detach_req));
3665
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003666 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3667
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003668 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3669 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003670
3671 dump_peers(stdout, 0, 0, &gbcfg);
3672
3673 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3674 local_tlli, 1, imsi, sizeof(imsi),
3675 GPRS_SAPI_GMM, sgsn_nu++,
3676 dtap_detach_acc, sizeof(dtap_detach_acc));
3677
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003678 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3679
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003680 dump_peers(stdout, 0, 0, &gbcfg);
3681
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003682 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3683 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3684 OSMO_ASSERT(link_info);
3685 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003686
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003687 OSMO_ASSERT(!expect_msg());
3688
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003689 /* Re-Attach */
3690 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3691 foreign_tlli, &rai_bss, cell_id,
3692 GPRS_SAPI_GMM, bss_nu++,
3693 dtap_attach_req3, sizeof(dtap_attach_req3));
3694
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003695 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3696
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003697 dump_peers(stdout, 0, 0, &gbcfg);
3698
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003699 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3700 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3701 OSMO_ASSERT(link_info);
3702 OSMO_ASSERT(link_info == link_info2);
3703 OSMO_ASSERT(link_info->imsi_len != 0);
3704 OSMO_ASSERT(!link_info->is_deregistered);
3705 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003706 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003707
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003708 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3709 foreign_tlli, 1, imsi, sizeof(imsi),
3710 GPRS_SAPI_GMM, sgsn_nu++,
3711 dtap_attach_acc, sizeof(dtap_attach_acc));
3712
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003713 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3714
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003715 dump_peers(stdout, 0, 0, &gbcfg);
3716
3717 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3718 local_tlli, &rai_bss, cell_id,
3719 GPRS_SAPI_GMM, bss_nu++,
3720 dtap_attach_complete, sizeof(dtap_attach_complete));
3721
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003722 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3723
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003724 dump_peers(stdout, 0, 0, &gbcfg);
3725
3726 /* Detach (MT) */
3727 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
3728 local_tlli, 1, imsi, sizeof(imsi),
3729 GPRS_SAPI_GMM, sgsn_nu++,
3730 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3731
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003732 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3733
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003734 dump_peers(stdout, 0, 0, &gbcfg);
3735
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003736 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3737 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003738
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003739 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003740 local_tlli, &rai_bss, cell_id,
3741 GPRS_SAPI_GMM, bss_nu++,
3742 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3743
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003744 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3745 OSMO_ASSERT(!expect_msg());
3746
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003747 dump_peers(stdout, 0, 0, &gbcfg);
3748
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003749 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3750 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3751 OSMO_ASSERT(link_info);
3752 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003753
3754 /* Re-Attach */
3755 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3756 foreign_tlli, &rai_bss, cell_id,
3757 GPRS_SAPI_GMM, bss_nu++,
3758 dtap_attach_req3, sizeof(dtap_attach_req3));
3759
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003760 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3761
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003762 dump_peers(stdout, 0, 0, &gbcfg);
3763
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003764 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3765 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3766 OSMO_ASSERT(link_info);
3767 OSMO_ASSERT(link_info == link_info2);
3768 OSMO_ASSERT(link_info->imsi_len != 0);
3769 OSMO_ASSERT(!link_info->is_deregistered);
3770 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003771
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003772 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3773 foreign_tlli, 1, imsi, sizeof(imsi),
3774 GPRS_SAPI_GMM, sgsn_nu++,
3775 dtap_attach_acc, sizeof(dtap_attach_acc));
3776
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003777 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3778
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003779 dump_peers(stdout, 0, 0, &gbcfg);
3780
3781 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3782 local_tlli, &rai_bss, cell_id,
3783 GPRS_SAPI_GMM, bss_nu++,
3784 dtap_attach_complete, sizeof(dtap_attach_complete));
3785
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003786 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3787
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003788 dump_peers(stdout, 0, 0, &gbcfg);
3789
3790 /* Detach (MT) */
3791 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3792 local_tlli, 1, imsi, sizeof(imsi),
3793 GPRS_SAPI_GMM, sgsn_nu++,
3794 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3795
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003796 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3797
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003798 dump_peers(stdout, 0, 0, &gbcfg);
3799
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003800 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3801 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003802
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003803 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003804 local_tlli, &rai_bss, cell_id,
3805 GPRS_SAPI_GMM, bss_nu++,
3806 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3807
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003808 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3809 OSMO_ASSERT(!expect_msg());
3810
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003811 dump_peers(stdout, 0, 0, &gbcfg);
3812
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003813 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3814 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3815 OSMO_ASSERT(link_info);
3816 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003817
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003818 /* Re-Attach with IMSI */
3819 send_llc_ul_ui(nsi, "ATTACH REQUEST (IMSI)", &bss_peer[0], 0x1002,
3820 foreign_tlli, &rai_bss, cell_id,
3821 GPRS_SAPI_GMM, bss_nu++,
3822 dtap_attach_req4, sizeof(dtap_attach_req4));
3823
3824 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3825
3826 dump_peers(stdout, 0, 0, &gbcfg);
3827
3828 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3829 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3830 OSMO_ASSERT(link_info);
3831 OSMO_ASSERT(link_info == link_info2);
3832 OSMO_ASSERT(link_info->imsi_len != 0);
3833 OSMO_ASSERT(!link_info->is_deregistered);
3834 OSMO_ASSERT(!link_info->imsi_acq_pending);
3835 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
3836
3837 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3838 foreign_tlli, 1, imsi, sizeof(imsi),
3839 GPRS_SAPI_GMM, sgsn_nu++,
3840 dtap_attach_acc, sizeof(dtap_attach_acc));
3841
3842 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3843
3844 dump_peers(stdout, 0, 0, &gbcfg);
3845
3846 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3847 local_tlli, &rai_bss, cell_id,
3848 GPRS_SAPI_GMM, bss_nu++,
3849 dtap_attach_complete, sizeof(dtap_attach_complete));
3850
3851 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3852
3853 dump_peers(stdout, 0, 0, &gbcfg);
3854
3855 /* Detach (MT) */
3856 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3857 local_tlli, 1, imsi, sizeof(imsi),
3858 GPRS_SAPI_GMM, sgsn_nu++,
3859 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3860
3861 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3862
3863 dump_peers(stdout, 0, 0, &gbcfg);
3864
3865 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3866 OSMO_ASSERT(link_info);
3867
3868 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
3869 local_tlli, &rai_bss, cell_id,
3870 GPRS_SAPI_GMM, bss_nu++,
3871 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3872
3873 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3874 OSMO_ASSERT(!expect_msg());
3875
3876 dump_peers(stdout, 0, 0, &gbcfg);
3877
3878 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3879 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3880 OSMO_ASSERT(link_info);
3881 OSMO_ASSERT(link_info->is_deregistered);
3882
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003883 /* Re-Attach */
3884 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3885 foreign_tlli, &rai_bss, cell_id,
3886 GPRS_SAPI_GMM, bss_nu++,
3887 dtap_attach_req3, sizeof(dtap_attach_req3));
3888
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003889 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3890
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003891 dump_peers(stdout, 0, 0, &gbcfg);
3892
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003893 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3894 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3895 OSMO_ASSERT(link_info);
3896 OSMO_ASSERT(link_info == link_info2);
3897 OSMO_ASSERT(link_info->imsi_len != 0);
3898 OSMO_ASSERT(!link_info->is_deregistered);
3899 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003900
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003901 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3902 foreign_tlli, 1, imsi, sizeof(imsi),
3903 GPRS_SAPI_GMM, sgsn_nu++,
3904 dtap_attach_acc, sizeof(dtap_attach_acc));
3905
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003906 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3907
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003908 dump_peers(stdout, 0, 0, &gbcfg);
3909
3910 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3911 local_tlli, &rai_bss, cell_id,
3912 GPRS_SAPI_GMM, bss_nu++,
3913 dtap_attach_complete, sizeof(dtap_attach_complete));
3914
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003915 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3916
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003917 dump_peers(stdout, 0, 0, &gbcfg);
3918
3919 /* RA update procedure (reject -> Detach) */
3920 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3921 local_tlli, &rai_bss, 0x7080,
3922 GPRS_SAPI_GMM, bss_nu++,
3923 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3924
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003925 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
3926
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003927 send_llc_dl_ui(nsi, "RA UDP REJ", &sgsn_peer, 0x1002,
3928 local_tlli, 1, imsi, sizeof(imsi),
3929 GPRS_SAPI_GMM, sgsn_nu++,
3930 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3931
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003932 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
3933 OSMO_ASSERT(!expect_msg());
3934
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003935 dump_peers(stdout, 0, 0, &gbcfg);
3936
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003937 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3938 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3939 OSMO_ASSERT(link_info);
3940 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003941
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003942 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
3943 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3944 foreign_tlli, &rai_bss, cell_id,
3945 GPRS_SAPI_GMM, bss_nu++,
3946 dtap_attach_req, sizeof(dtap_attach_req));
3947
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003948 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3949
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003950 dump_peers(stdout, 0, 0, &gbcfg);
3951
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003952 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3953 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3954 OSMO_ASSERT(link_info);
3955 OSMO_ASSERT(link_info != link_info2);
3956 OSMO_ASSERT(link_info->imsi_len == 0);
3957 OSMO_ASSERT(!link_info->is_deregistered);
3958 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003959
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003960 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3961 foreign_tlli, &rai_bss, cell_id,
3962 GPRS_SAPI_GMM, bss_nu++,
3963 dtap_identity_resp, sizeof(dtap_identity_resp));
3964
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003965 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3966
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003967 dump_peers(stdout, 0, 0, &gbcfg);
3968
3969 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3970 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3971 OSMO_ASSERT(link_info);
3972 OSMO_ASSERT(link_info == link_info2);
3973 OSMO_ASSERT(link_info->imsi_len != 0);
3974 OSMO_ASSERT(!link_info->is_deregistered);
3975 OSMO_ASSERT(!link_info->imsi_acq_pending);
3976
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003977 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3978 foreign_tlli, 1, imsi, sizeof(imsi),
3979 GPRS_SAPI_GMM, sgsn_nu++,
3980 dtap_attach_acc, sizeof(dtap_attach_acc));
3981
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003982 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3983
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003984 dump_peers(stdout, 0, 0, &gbcfg);
3985
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003986 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3987 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3988 OSMO_ASSERT(link_info);
3989 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeckea71b482014-09-22 09:28:27 +02003990 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003991
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003992 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3993 local_tlli, &rai_bss, cell_id,
3994 GPRS_SAPI_GMM, bss_nu++,
3995 dtap_attach_complete, sizeof(dtap_attach_complete));
3996
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003997 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3998
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003999 dump_peers(stdout, 0, 0, &gbcfg);
4000
4001 /* Detach (MT) */
4002 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4003 local_tlli, 1, imsi, sizeof(imsi),
4004 GPRS_SAPI_GMM, sgsn_nu++,
4005 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4006
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004007 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4008
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004009 dump_peers(stdout, 0, 0, &gbcfg);
4010
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004011 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4012 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004013
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004014 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004015 local_tlli, &rai_bss, cell_id,
4016 GPRS_SAPI_GMM, bss_nu++,
4017 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4018
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004019 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4020
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004021 dump_peers(stdout, 0, 0, &gbcfg);
4022
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004023 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4024 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4025 OSMO_ASSERT(link_info);
4026 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02004027
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004028 OSMO_ASSERT(!expect_msg());
4029
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004030 /* Bad case: Re-Attach with local TLLI */
4031 send_llc_ul_ui(nsi, "ATTACH REQUEST (local TLLI)", &bss_peer[0], 0x1002,
4032 local_tlli, &rai_bss, cell_id,
4033 GPRS_SAPI_GMM, bss_nu++,
4034 dtap_attach_req3, sizeof(dtap_attach_req3));
4035
4036 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4037
4038 dump_peers(stdout, 0, 0, &gbcfg);
4039
4040 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4041 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4042 OSMO_ASSERT(link_info);
4043 OSMO_ASSERT(link_info == link_info2);
4044 OSMO_ASSERT(link_info->imsi_len != 0);
4045 OSMO_ASSERT(!link_info->is_deregistered);
4046 OSMO_ASSERT(!link_info->imsi_acq_pending);
4047 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
4048
4049 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4050 local_tlli, 1, imsi, sizeof(imsi),
4051 GPRS_SAPI_GMM, sgsn_nu++,
4052 dtap_attach_acc, sizeof(dtap_attach_acc));
4053
4054 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4055
4056 dump_peers(stdout, 0, 0, &gbcfg);
4057
4058 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4059 local_tlli, &rai_bss, cell_id,
4060 GPRS_SAPI_GMM, bss_nu++,
4061 dtap_attach_complete, sizeof(dtap_attach_complete));
4062
4063 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4064
4065 dump_peers(stdout, 0, 0, &gbcfg);
4066
4067 /* Detach (MT) */
4068 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
4069 local_tlli, 1, imsi, sizeof(imsi),
4070 GPRS_SAPI_GMM, sgsn_nu++,
4071 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
4072
4073 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4074
4075 dump_peers(stdout, 0, 0, &gbcfg);
4076
4077 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4078 OSMO_ASSERT(link_info);
4079
4080 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4081 local_tlli, &rai_bss, cell_id,
4082 GPRS_SAPI_GMM, bss_nu++,
4083 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4084
4085 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4086 OSMO_ASSERT(!expect_msg());
4087
4088 dump_peers(stdout, 0, 0, &gbcfg);
4089
4090 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4091 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4092 OSMO_ASSERT(link_info);
4093 OSMO_ASSERT(link_info->is_deregistered);
4094
4095 /* Bad case: Unexpected Re-Attach with IMSI after completed attachment
4096 * procedure */
4097 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4098 foreign_tlli, &rai_bss, cell_id,
4099 GPRS_SAPI_GMM, bss_nu++,
4100 dtap_attach_req3, sizeof(dtap_attach_req3));
4101
4102 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4103
4104 dump_peers(stdout, 0, 0, &gbcfg);
4105
4106 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4107 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4108 OSMO_ASSERT(link_info);
4109 OSMO_ASSERT(link_info == link_info2);
4110 OSMO_ASSERT(link_info->imsi_len != 0);
4111 OSMO_ASSERT(!link_info->is_deregistered);
4112 OSMO_ASSERT(!link_info->imsi_acq_pending);
4113
4114 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4115 foreign_tlli, 1, imsi, sizeof(imsi),
4116 GPRS_SAPI_GMM, sgsn_nu++,
4117 dtap_attach_acc, sizeof(dtap_attach_acc));
4118
4119 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4120
4121 dump_peers(stdout, 0, 0, &gbcfg);
4122
4123 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4124 local_tlli, &rai_bss, cell_id,
4125 GPRS_SAPI_GMM, bss_nu++,
4126 dtap_attach_complete, sizeof(dtap_attach_complete));
4127
4128 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4129
4130 dump_peers(stdout, 0, 0, &gbcfg);
4131
4132 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4133 local_tlli, 1, imsi, sizeof(imsi),
4134 GPRS_SAPI_GMM, sgsn_nu++,
4135 dtap_gmm_information, sizeof(dtap_gmm_information));
4136
4137 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4138
4139 dump_peers(stdout, 0, 0, &gbcfg);
4140
4141 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected, IMSI)",
4142 &bss_peer[0], 0x1002,
4143 foreign_tlli, &rai_bss, cell_id,
4144 GPRS_SAPI_GMM, bss_nu++,
4145 dtap_attach_req4, sizeof(dtap_attach_req4));
4146
4147 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4148
4149 dump_peers(stdout, 0, 0, &gbcfg);
4150
4151 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4152 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004153 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004154 OSMO_ASSERT(link_info == link_info2);
4155 OSMO_ASSERT(link_info->imsi_len != 0);
4156 OSMO_ASSERT(!link_info->is_deregistered);
4157 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004158 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004159 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4160
4161 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4162 foreign_tlli, 1, imsi, sizeof(imsi),
4163 GPRS_SAPI_GMM, sgsn_nu++,
4164 dtap_attach_acc, sizeof(dtap_attach_acc));
4165
4166 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4167
4168 dump_peers(stdout, 0, 0, &gbcfg);
4169
4170 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4171 local_tlli, &rai_bss, cell_id,
4172 GPRS_SAPI_GMM, bss_nu++,
4173 dtap_attach_complete, sizeof(dtap_attach_complete));
4174
4175 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4176
4177 dump_peers(stdout, 0, 0, &gbcfg);
4178
4179 /* Detach (MT) */
4180 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4181 local_tlli, 1, imsi, sizeof(imsi),
4182 GPRS_SAPI_GMM, sgsn_nu++,
4183 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4184
4185 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4186
4187 dump_peers(stdout, 0, 0, &gbcfg);
4188
4189 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4190 OSMO_ASSERT(link_info);
4191
4192 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4193 local_tlli, &rai_bss, cell_id,
4194 GPRS_SAPI_GMM, bss_nu++,
4195 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4196
4197 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4198 OSMO_ASSERT(!expect_msg());
4199
4200 dump_peers(stdout, 0, 0, &gbcfg);
4201
4202 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4203 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4204 OSMO_ASSERT(link_info);
4205 OSMO_ASSERT(link_info->is_deregistered);
4206
4207 /* Bad case: Unexpected Re-Attach with P-TMSI after completed attachment
4208 * procedure */
4209 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4210 foreign_tlli, &rai_bss, cell_id,
4211 GPRS_SAPI_GMM, bss_nu++,
4212 dtap_attach_req3, sizeof(dtap_attach_req3));
4213
4214 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4215
4216 dump_peers(stdout, 0, 0, &gbcfg);
4217
4218 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4219 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4220 OSMO_ASSERT(link_info);
4221 OSMO_ASSERT(link_info == link_info2);
4222 OSMO_ASSERT(link_info->imsi_len != 0);
4223 OSMO_ASSERT(!link_info->is_deregistered);
4224 OSMO_ASSERT(!link_info->imsi_acq_pending);
4225
4226 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4227 foreign_tlli, 1, imsi, sizeof(imsi),
4228 GPRS_SAPI_GMM, sgsn_nu++,
4229 dtap_attach_acc, sizeof(dtap_attach_acc));
4230
4231 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4232
4233 dump_peers(stdout, 0, 0, &gbcfg);
4234
4235 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4236 local_tlli, &rai_bss, cell_id,
4237 GPRS_SAPI_GMM, bss_nu++,
4238 dtap_attach_complete, sizeof(dtap_attach_complete));
4239
4240 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4241
4242 dump_peers(stdout, 0, 0, &gbcfg);
4243
4244 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4245 local_tlli, 1, imsi, sizeof(imsi),
4246 GPRS_SAPI_GMM, sgsn_nu++,
4247 dtap_gmm_information, sizeof(dtap_gmm_information));
4248
4249 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4250
4251 dump_peers(stdout, 0, 0, &gbcfg);
4252
4253 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected)", &bss_peer[0], 0x1002,
4254 foreign_tlli, &rai_bss, cell_id,
4255 GPRS_SAPI_GMM, bss_nu++,
4256 dtap_attach_req3, sizeof(dtap_attach_req3));
4257
4258 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4259
4260 dump_peers(stdout, 0, 0, &gbcfg);
4261
4262 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4263 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004264 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004265 OSMO_ASSERT(link_info == link_info2);
4266 OSMO_ASSERT(link_info->imsi_len != 0);
4267 OSMO_ASSERT(!link_info->is_deregistered);
4268 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004269 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004270 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4271
4272 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4273 foreign_tlli, 1, imsi, sizeof(imsi),
4274 GPRS_SAPI_GMM, sgsn_nu++,
4275 dtap_attach_acc, sizeof(dtap_attach_acc));
4276
4277 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4278
4279 dump_peers(stdout, 0, 0, &gbcfg);
4280
4281 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4282 local_tlli, &rai_bss, cell_id,
4283 GPRS_SAPI_GMM, bss_nu++,
4284 dtap_attach_complete, sizeof(dtap_attach_complete));
4285
4286 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4287
4288 dump_peers(stdout, 0, 0, &gbcfg);
4289
4290 /* Detach (MT) */
4291 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4292 local_tlli, 1, imsi, sizeof(imsi),
4293 GPRS_SAPI_GMM, sgsn_nu++,
4294 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4295
4296 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4297
4298 dump_peers(stdout, 0, 0, &gbcfg);
4299
4300 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4301 OSMO_ASSERT(link_info);
4302
4303 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4304 local_tlli, &rai_bss, cell_id,
4305 GPRS_SAPI_GMM, bss_nu++,
4306 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4307
4308 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4309 OSMO_ASSERT(!expect_msg());
4310
4311 dump_peers(stdout, 0, 0, &gbcfg);
4312
4313 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4314 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4315 OSMO_ASSERT(link_info);
4316 OSMO_ASSERT(link_info->is_deregistered);
4317
4318
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004319 /* Attach rejected */
4320
4321 gbproxy_delete_link_infos(peer);
4322
4323 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4324 foreign_tlli, &rai_bss, cell_id,
4325 GPRS_SAPI_GMM, bss_nu++,
4326 dtap_attach_req, sizeof(dtap_attach_req));
4327
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004328 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4329
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004330 dump_peers(stdout, 0, 0, &gbcfg);
4331
4332 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4333 OSMO_ASSERT(link_info);
4334 OSMO_ASSERT(link_info->imsi_len == 0);
4335 OSMO_ASSERT(!link_info->is_deregistered);
4336 OSMO_ASSERT(link_info->imsi_acq_pending);
4337
4338 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4339 foreign_tlli, &rai_bss, cell_id,
4340 GPRS_SAPI_GMM, bss_nu++,
4341 dtap_identity_resp, sizeof(dtap_identity_resp));
4342
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004343 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4344
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004345 dump_peers(stdout, 0, 0, &gbcfg);
4346
4347 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4348 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4349 OSMO_ASSERT(link_info);
4350 OSMO_ASSERT(link_info == link_info2);
4351 OSMO_ASSERT(link_info->imsi_len != 0);
4352 OSMO_ASSERT(!link_info->is_deregistered);
4353 OSMO_ASSERT(!link_info->imsi_acq_pending);
4354
4355 send_llc_dl_ui(nsi, "ATTACH REJECT", &sgsn_peer, 0x1002,
4356 foreign_tlli, 1, imsi, sizeof(imsi),
4357 GPRS_SAPI_GMM, sgsn_nu++,
4358 dtap_attach_rej7, sizeof(dtap_attach_rej7));
4359
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004360 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
4361
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004362 dump_peers(stdout, 0, 0, &gbcfg);
4363
Jacob Erlbeck9c65c812014-09-22 10:42:05 +02004364 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4365
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004366 OSMO_ASSERT(!expect_msg());
4367
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004368 /* Attach (incomplete) and Detach (MO) */
4369
4370 gbproxy_delete_link_infos(peer);
4371
4372 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4373 foreign_tlli, &rai_bss, cell_id,
4374 GPRS_SAPI_GMM, bss_nu++,
4375 dtap_attach_req, sizeof(dtap_attach_req));
4376
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004377 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4378
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004379 dump_peers(stdout, 0, 0, &gbcfg);
4380
4381 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4382 OSMO_ASSERT(link_info);
4383 OSMO_ASSERT(link_info->imsi_len == 0);
4384 OSMO_ASSERT(!link_info->is_deregistered);
4385 OSMO_ASSERT(link_info->imsi_acq_pending);
4386
4387 send_llc_ul_ui(nsi, "DETACH REQ (MO)", &bss_peer[0], 0x1002,
4388 foreign_tlli, &rai_bss, cell_id,
4389 GPRS_SAPI_GMM, bss_nu++,
4390 dtap_detach_req, sizeof(dtap_detach_req));
4391
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004392 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4393
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004394 dump_peers(stdout, 0, 0, &gbcfg);
4395
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004396 OSMO_ASSERT(!expect_msg());
4397
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004398 /* Attach (incomplete) and Detach (MT) */
4399
4400 gbproxy_delete_link_infos(peer);
4401
4402 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4403 foreign_tlli, &rai_bss, cell_id,
4404 GPRS_SAPI_GMM, bss_nu++,
4405 dtap_attach_req, sizeof(dtap_attach_req));
4406
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004407 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4408
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004409 dump_peers(stdout, 0, 0, &gbcfg);
4410
4411 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4412 OSMO_ASSERT(link_info);
4413 OSMO_ASSERT(link_info->imsi_len == 0);
4414 OSMO_ASSERT(!link_info->is_deregistered);
4415 OSMO_ASSERT(link_info->imsi_acq_pending);
4416
4417 send_llc_dl_ui(nsi, "DETACH REQ (MT)", &sgsn_peer, 0x1002,
4418 foreign_tlli, 1, imsi, sizeof(imsi),
4419 GPRS_SAPI_GMM, sgsn_nu++,
4420 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4421
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004422 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4423
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004424 dump_peers(stdout, 0, 0, &gbcfg);
4425
4426 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4427 OSMO_ASSERT(link_info);
4428
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004429 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004430 foreign_tlli, &rai_bss, cell_id,
4431 GPRS_SAPI_GMM, bss_nu++,
4432 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4433
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004434 /* TODO: The stored messaged should be cleaned when receiving a Detach
4435 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
4436 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4437 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4438
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004439 dump_peers(stdout, 0, 0, &gbcfg);
4440
4441 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4442 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4443 OSMO_ASSERT(link_info);
4444 OSMO_ASSERT(link_info->is_deregistered);
4445
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004446 OSMO_ASSERT(!expect_msg());
4447 received_messages = NULL;
4448
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004449 dump_global(stdout, 0);
4450
4451 gbprox_reset(&gbcfg);
4452 gprs_ns_destroy(nsi);
4453 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004454
4455 cleanup_test();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004456}
4457
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004458struct gbproxy_link_info *register_tlli(
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004459 struct gbproxy_peer *peer, uint32_t tlli,
4460 const uint8_t *imsi, size_t imsi_len, time_t now)
4461{
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004462 struct gbproxy_link_info *link_info;
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004463 int imsi_matches = -1;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004464 int tlli_already_known = 0;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004465 struct gbproxy_config *cfg = peer->cfg;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004466
4467 /* Check, whether the IMSI matches */
4468 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004469 imsi_matches = gbproxy_check_imsi(
4470 &cfg->matches[GBPROX_MATCH_PATCHING], imsi, imsi_len);
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004471 if (imsi_matches < 0)
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004472 return NULL;
4473 }
4474
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004475 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004476
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004477 if (!link_info) {
4478 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004479
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004480 if (link_info) {
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004481 /* TLLI has changed somehow, adjust it */
4482 LOGP(DGPRS, LOGL_INFO,
4483 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004484 link_info->tlli.current, tlli);
4485 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004486 }
4487 }
4488
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004489 if (!link_info) {
4490 link_info = gbproxy_link_info_alloc(peer);
4491 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004492 } else {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004493 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004494 tlli_already_known = 1;
4495 }
4496
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004497 OSMO_ASSERT(link_info != NULL);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004498
4499 if (!tlli_already_known)
4500 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
4501
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004502 gbproxy_attach_link_info(peer, now, link_info);
4503 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004504
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004505 if (imsi_matches >= 0)
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004506 link_info->is_matching[GBPROX_MATCH_PATCHING] = imsi_matches;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004507
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004508 return link_info;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004509}
4510
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004511static void test_gbproxy_tlli_expire(void)
4512{
4513 struct gbproxy_config cfg = {0};
4514 struct gbproxy_peer *peer;
4515 const char *err_msg = NULL;
4516 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0x26 };
4517 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0x29 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004518 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004519 const uint32_t tlli1 = 1234 | 0xc0000000;
4520 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004521 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004522 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004523 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004524
4525 printf("Test TLLI info expiry\n\n");
4526
4527 gbproxy_init_config(&cfg);
4528
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004529 if (gbproxy_set_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING],
4530 filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004531 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
4532 err_msg);
4533 OSMO_ASSERT(err_msg == NULL);
4534 }
4535
4536 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004537 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004538
4539 printf("Test TLLI replacement:\n");
4540
4541 cfg.tlli_max_len = 0;
4542 cfg.tlli_max_age = 0;
4543 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004544 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004545
4546 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004547 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004548 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004549 OSMO_ASSERT(link_info);
4550 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004551 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004552
4553 /* replace the old entry */
4554 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004555 link_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004556 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004557 OSMO_ASSERT(link_info);
4558 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004559 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004560
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004561 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004562
4563 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004564 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4565 OSMO_ASSERT(link_info);
4566 OSMO_ASSERT(link_info->tlli.current == tlli2);
4567 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4568 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004569
4570 printf("\n");
4571
4572 gbproxy_peer_free(peer);
4573 }
4574
4575 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004576 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004577
4578 printf("Test IMSI replacement:\n");
4579
4580 cfg.tlli_max_len = 0;
4581 cfg.tlli_max_age = 0;
4582 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004583 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004584
4585 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004586 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004587 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004588 OSMO_ASSERT(link_info);
4589 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004590 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004591
4592 /* try to replace the old entry */
4593 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004594 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004595 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004596 OSMO_ASSERT(link_info);
4597 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004598 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004599
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004600 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004601
4602 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004603 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4604 OSMO_ASSERT(!link_info);
4605 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4606 OSMO_ASSERT(link_info);
4607 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004608
4609 printf("\n");
4610
4611 gbproxy_peer_free(peer);
4612 }
4613
4614 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004615 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004616 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004617
4618 printf("Test TLLI expiry, max_len == 1:\n");
4619
4620 cfg.tlli_max_len = 1;
4621 cfg.tlli_max_age = 0;
4622 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004623 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004624
4625 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004626 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004627 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004628
4629 /* replace the old entry */
4630 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004631 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004632 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004633
Jacob Erlbeck51fde082014-09-19 16:40:21 +02004634 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004635 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004636 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004637
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004638 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004639
4640 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004641 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4642 OSMO_ASSERT(!link_info);
4643 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4644 OSMO_ASSERT(link_info);
4645 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004646
4647 printf("\n");
4648
4649 gbproxy_peer_free(peer);
4650 }
4651
4652 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004653 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004654 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004655
4656 printf("Test TLLI expiry, max_age == 1:\n");
4657
4658 cfg.tlli_max_len = 0;
4659 cfg.tlli_max_age = 1;
4660 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004661 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004662
4663 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004664 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004665 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004666
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004667 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004668 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004669 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004670 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004671
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004672 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004673 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004674 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004675
4676 dump_peers(stdout, 2, now + 2, &cfg);
4677
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004678 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004679 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4680 OSMO_ASSERT(!link_info);
4681 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4682 OSMO_ASSERT(link_info);
4683 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004684
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004685 printf("\n");
4686
4687 gbproxy_peer_free(peer);
4688 }
4689
4690 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004691 struct gbproxy_link_info *link_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004692 int num_removed;
4693
4694 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
4695
4696 cfg.tlli_max_len = 0;
4697 cfg.tlli_max_age = 1;
4698 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004699 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004700
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004701 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004702 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004703 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004704
4705 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004706 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004707 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004708 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004709
4710 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004711 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004712 now + 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004713 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004714
4715 dump_peers(stdout, 2, now + 2, &cfg);
4716
4717 printf(" Remove stale TLLIs\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004718 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004719 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004720 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004721
4722 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004723
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004724 /* verify that tlli3 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004725 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4726 OSMO_ASSERT(!link_info);
4727 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4728 OSMO_ASSERT(!link_info);
4729 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
4730 OSMO_ASSERT(link_info);
4731 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004732
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004733 printf("\n");
4734
4735 gbproxy_peer_free(peer);
4736 }
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004737 gbproxy_clear_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING]);
4738 gbprox_reset(&cfg);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004739
4740 cleanup_test();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004741}
4742
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004743static void test_gbproxy_imsi_matching(void)
4744{
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004745 const char *err_msg = NULL;
4746 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4747 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4748 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4749 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4750 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4751 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4752 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4753 const char *filter_re1 = ".*";
4754 const char *filter_re2 = "^1234";
4755 const char *filter_re3 = "^4321";
4756 const char *filter_re4_bad = "^12[";
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004757 struct gbproxy_match match = {0,};
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004758
4759 printf("=== Test IMSI/TMSI matching ===\n\n");
4760
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004761 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004762
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004763 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re1, &err_msg) == 0);
4764 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004765
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004766 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4767 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004768
4769 err_msg = NULL;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004770 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004771 OSMO_ASSERT(err_msg != NULL);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004772 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004773
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004774 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4775 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004776
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004777 OSMO_ASSERT(gbproxy_set_patch_filter(&match, NULL, &err_msg) == 0);
4778 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004779
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004780 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4781 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004782
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004783 gbproxy_clear_patch_filter(&match);
4784 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004785
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004786 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4787 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004788
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004789 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 1);
4790 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004791 /* imsi3_bad contains 0xE and 0xF digits, but the conversion function
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004792 * doesn't complain, so gbproxy_check_imsi() doesn't return -1 in this
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004793 * case. */
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004794 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4795 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4796 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4797 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4798 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004799
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004800 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re3, &err_msg) == 0);
4801 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004802
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004803 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 0);
4804 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 0);
4805 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4806 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4807 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4808 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4809 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004810
4811 /* TODO: Check correct length but wrong type with is_mi_tmsi */
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004812
4813 gbproxy_clear_patch_filter(&match);
4814 OSMO_ASSERT(match.enable == 0);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004815
4816 cleanup_test();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004817}
4818
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004819static void test_gbproxy_stored_messages()
4820{
4821 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
4822 struct sockaddr_in bss_peer[1] = {{0},};
4823 struct sockaddr_in sgsn_peer= {0};
4824 struct gprs_ra_id rai_bss =
4825 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
4826 struct gprs_ra_id rai_unknown =
4827 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
4828 uint16_t cell_id = 0x1234;
4829
4830 const uint32_t ptmsi = 0xefe2b700;
4831 const uint32_t local_tlli = 0xefe2b700;
4832
4833 const uint32_t foreign_tlli1 = 0x8000dead;
4834
4835 struct gbproxy_peer *peer;
4836 unsigned bss_nu = 0;
4837 unsigned sgsn_nu = 0;
4838
4839 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
4840
4841 bssgp_nsi = nsi;
4842 gbcfg.nsi = bssgp_nsi;
4843 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
4844 gbcfg.core_mcc = 0;
4845 gbcfg.core_mnc = 0;
4846 gbcfg.core_apn = talloc_zero_size(NULL, 100);
4847 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
4848 gbcfg.patch_ptmsi = 0;
4849 gbcfg.acquire_imsi = 1;
4850 gbcfg.keep_link_infos = 0;
4851
4852 configure_sgsn_peer(&sgsn_peer);
4853 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
4854
4855 printf("=== %s ===\n", __func__);
4856 printf("--- Initialise SGSN ---\n\n");
4857
4858 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
4859
4860 printf("--- Initialise BSS 1 ---\n\n");
4861
4862 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
4863 setup_bssgp(nsi, &bss_peer[0], 0x1002);
4864
4865 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
4866 OSMO_ASSERT(peer != NULL);
4867
4868 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
4869
4870 gprs_dump_nsi(nsi);
4871 dump_global(stdout, 0);
4872 dump_peers(stdout, 0, 0, &gbcfg);
4873
4874 printf("--- Establish first LLC connection ---\n\n");
4875
4876 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4877 foreign_tlli1, &rai_unknown, cell_id,
4878 GPRS_SAPI_GMM, bss_nu++,
4879 dtap_attach_req, sizeof(dtap_attach_req));
4880
4881 dump_peers(stdout, 0, 0, &gbcfg);
4882
4883 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
4884 foreign_tlli1, 0, NULL, 0,
4885 GPRS_SAPI_GMM, sgsn_nu++,
4886 dtap_identity_req, sizeof(dtap_identity_req));
4887
4888 dump_peers(stdout, 0, 0, &gbcfg);
4889
4890 send_llc_ul_ui(nsi, "DETACH ACCEPT", &bss_peer[0], 0x1002,
4891 foreign_tlli1, &rai_bss, cell_id,
4892 GPRS_SAPI_GMM, bss_nu++,
4893 dtap_detach_acc, sizeof(dtap_detach_acc));
4894
4895 dump_peers(stdout, 0, 0, &gbcfg);
4896
4897 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4898 foreign_tlli1, &rai_bss, cell_id,
4899 GPRS_SAPI_GMM, bss_nu++,
4900 dtap_identity_resp, sizeof(dtap_identity_resp));
4901
4902 dump_peers(stdout, 0, 0, &gbcfg);
4903
4904 dump_global(stdout, 0);
4905
4906 gbprox_reset(&gbcfg);
4907 gprs_ns_destroy(nsi);
4908 nsi = NULL;
4909
4910 cleanup_test();
4911}
4912
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004913static struct log_info_cat gprs_categories[] = {
4914 [DGPRS] = {
4915 .name = "DGPRS",
4916 .description = "GPRS Packet Service",
4917 .enabled = 1, .loglevel = LOGL_DEBUG,
4918 },
4919 [DNS] = {
4920 .name = "DNS",
4921 .description = "GPRS Network Service (NS)",
4922 .enabled = 1, .loglevel = LOGL_INFO,
4923 },
4924 [DBSSGP] = {
4925 .name = "DBSSGP",
4926 .description = "GPRS BSS Gateway Protocol (BSSGP)",
4927 .enabled = 1, .loglevel = LOGL_DEBUG,
4928 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004929};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004930
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004931static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004932 .cat = gprs_categories,
4933 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004934};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004935
4936int main(int argc, char **argv)
4937{
Neels Hofmeyr4c2d4ab2016-09-16 02:31:17 +02004938 msgb_talloc_ctx_init(NULL, 0);
4939
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004940 osmo_init_logging(&info);
4941 log_set_use_color(osmo_stderr_target, 0);
4942 log_set_print_filename(osmo_stderr_target, 0);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02004943 osmo_signal_register_handler(SS_L_NS, &test_signal, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004944
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004945 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004946 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
4947 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004948
4949 rate_ctr_init(NULL);
4950
4951 setlinebuf(stdout);
4952
4953 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02004954 gbproxy_init_config(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004955 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004956 test_gbproxy_ident_changes();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004957 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02004958 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02004959 test_gbproxy_ra_patching();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02004960 test_gbproxy_ptmsi_patching();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02004961 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02004962 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02004963 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004964 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004965 test_gbproxy_tlli_expire();
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004966 test_gbproxy_stored_messages();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004967 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004968
4969 exit(EXIT_SUCCESS);
4970}