blob: 0ba827f763d54e8067d4a8373a330c946f77ea77 [file] [log] [blame]
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001/* test routines for gbproxy
2 * send NS messages to the gbproxy and dumps what happens
3 * (C) 2013 by sysmocom s.f.m.c. GmbH
4 * Author: Jacob Erlbeck <jerlbeck@sysmocom.de>
5 */
6
7#undef _GNU_SOURCE
8#define _GNU_SOURCE
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <stdint.h>
13#include <string.h>
14#include <getopt.h>
15#include <dlfcn.h>
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020016#include <time.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020017#include <sys/types.h>
18#include <sys/socket.h>
19
20#include <osmocom/core/msgb.h>
21#include <osmocom/core/application.h>
22#include <osmocom/core/utils.h>
23#include <osmocom/core/logging.h>
24#include <osmocom/core/talloc.h>
25#include <osmocom/core/signal.h>
26#include <osmocom/core/rate_ctr.h>
Jacob Erlbeckb1381062014-07-01 12:41:13 +020027#include <osmocom/gsm/tlv.h>
Jacob Erlbeck59748e62014-08-11 17:26:21 +020028#include <osmocom/gsm/gsm_utils.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020029#include <osmocom/gprs/gprs_msgb.h>
30#include <osmocom/gprs/gprs_ns.h>
31#include <osmocom/gprs/gprs_bssgp.h>
32
33#include <openbsc/gb_proxy.h>
Holger Hans Peter Freyther7127b022014-08-04 11:52:52 +020034#include <openbsc/gprs_utils.h>
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +020035#include <openbsc/gprs_llc.h>
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020036#include <openbsc/gprs_gb_parse.h>
37#include <openbsc/gsm_04_08_gprs.h>
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020038#include <openbsc/debug.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020039
Daniel Willmann537d4802015-10-12 19:36:35 +020040#include <openssl/rand.h>
41
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020042#define REMOTE_BSS_ADDR 0x01020304
43#define REMOTE_SGSN_ADDR 0x05060708
44
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020045#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020046
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +020047#define REMOTE_SGSN2_ADDR 0x15161718
48#define SGSN2_NSEI 0x0102
49
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020050#define MATCH_ANY (-1)
51
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
Daniel Willmann537d4802015-10-12 19:36:35 +020056/* override, requires '-Wl,--wrap=RAND_bytes' */
57int __real_RAND_bytes(unsigned char *buf, int num);
58int mock_RAND_bytes(unsigned char *buf, int num);
59int (*RAND_bytes_cb)(unsigned char *, int) =
60 &mock_RAND_bytes;
61
62int __wrap_RAND_bytes(unsigned char *buf, int num)
63{
64 return (*RAND_bytes_cb)(buf, num);
65}
66
67static int rand_seq_num = 0;
68int mock_RAND_bytes(unsigned char *buf, int num)
69{
70 uint32_t val;
71
72 OSMO_ASSERT(num == sizeof(val));
73 OSMO_ASSERT(__real_RAND_bytes(buf, num) == 1);
74
75 val = 0x00dead00 + rand_seq_num;
76
77 rand_seq_num++;
78
79 memcpy(buf, &val, num);
80
81 return 1;
82}
83
Daniel Willmannd1554ec2015-10-12 19:36:34 +020084static void cleanup_test()
85{
Daniel Willmann537d4802015-10-12 19:36:35 +020086 rand_seq_num = 0;
Daniel Willmannd1554ec2015-10-12 19:36:34 +020087}
88
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020089static int dump_global(FILE *stream, int indent)
90{
91 unsigned int i;
92 const struct rate_ctr_group_desc *desc;
93 int rc;
94
95 rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
96 if (rc < 0)
97 return rc;
98
99 desc = gbcfg.ctrg->desc;
100
101 for (i = 0; i < desc->num_ctr; i++) {
102 struct rate_ctr *ctr = &gbcfg.ctrg->ctr[i];
103 if (ctr->current) {
104 rc = fprintf(stream, "%*s %s: %llu\n",
105 indent, "",
106 desc->ctr_desc[i].description,
107 (long long)ctr->current);
108
109 if (rc < 0)
110 return rc;
111 }
112 }
113
114 return 0;
115}
116
Jacob Erlbeck7b821d02014-08-08 08:37:37 +0200117static int dump_peers(FILE *stream, int indent, time_t now,
118 struct gbproxy_config *cfg)
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200119{
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200120 struct gbproxy_peer *peer;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200121 struct gprs_ra_id raid;
122 unsigned int i;
123 const struct rate_ctr_group_desc *desc;
124 int rc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200125
126 rc = fprintf(stream, "%*sPeers:\n", indent, "");
127 if (rc < 0)
128 return rc;
129
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +0200130 llist_for_each_entry(peer, &cfg->bts_peers, list) {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200131 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200132 struct gbproxy_patch_state *state = &peer->patch_state;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200133 gsm48_parse_ra(&raid, peer->ra);
134
135 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, "
136 "RAI %u-%u-%u-%u\n",
137 indent, "",
138 peer->nsei, peer->bvci,
139 peer->blocked ? "" : "not ",
140 raid.mcc, raid.mnc, raid.lac, raid.rac);
141
142 if (rc < 0)
143 return rc;
144
145 desc = peer->ctrg->desc;
146
147 for (i = 0; i < desc->num_ctr; i++) {
148 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
149 if (ctr->current) {
150 rc = fprintf(stream, "%*s %s: %llu\n",
151 indent, "",
152 desc->ctr_desc[i].description,
153 (long long)ctr->current);
154
155 if (rc < 0)
156 return rc;
157 }
158 }
159
160 fprintf(stream, "%*s TLLI-Cache: %d\n",
Jacob Erlbeckf8562e32014-09-19 16:03:07 +0200161 indent, "", state->logical_link_count);
162 llist_for_each_entry(link_info, &state->logical_links, list) {
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200163 char mi_buf[200];
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200164 time_t age = now ? now - link_info->timestamp : 0;
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200165 int stored_msgs = 0;
166 struct llist_head *iter;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200167 enum gbproxy_match_id match_id;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200168 llist_for_each(iter, &link_info->stored_msgs)
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200169 stored_msgs++;
170
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200171 if (link_info->imsi_len > 0) {
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200172 snprintf(mi_buf, sizeof(mi_buf), "(invalid)");
173 gsm48_mi_to_string(mi_buf, sizeof(mi_buf),
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200174 link_info->imsi,
175 link_info->imsi_len);
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200176 } else {
177 snprintf(mi_buf, sizeof(mi_buf), "(none)");
178 }
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200179 fprintf(stream, "%*s TLLI %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200180 indent, "", link_info->tlli.current);
181 if (link_info->tlli.assigned)
182 fprintf(stream, "/%08x", link_info->tlli.assigned);
183 if (link_info->sgsn_tlli.current) {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200184 fprintf(stream, " -> %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200185 link_info->sgsn_tlli.current);
186 if (link_info->sgsn_tlli.assigned)
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200187 fprintf(stream, "/%08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200188 link_info->sgsn_tlli.assigned);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200189 }
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200190 fprintf(stream, ", IMSI %s, AGE %d",
191 mi_buf, (int)age);
192
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200193 if (stored_msgs)
194 fprintf(stream, ", STORED %d", stored_msgs);
195
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200196 for (match_id = 0; match_id < ARRAY_SIZE(cfg->matches);
197 ++match_id) {
198 if (cfg->matches[match_id].enable &&
199 link_info->is_matching[match_id]) {
200 fprintf(stream, ", IMSI matches");
201 break;
202 }
203 }
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200204
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200205 if (link_info->imsi_acq_pending)
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200206 fprintf(stream, ", IMSI acquisition in progress");
207
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200208 if (cfg->route_to_sgsn2)
209 fprintf(stream, ", SGSN NSEI %d",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200210 link_info->sgsn_nsei);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200211
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200212 if (link_info->is_deregistered)
Jacob Erlbeck7430da62014-09-12 15:09:56 +0200213 fprintf(stream, ", DE-REGISTERED");
214
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200215 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200216 if (rc < 0)
217 return rc;
218 }
219 }
220
221 return 0;
222}
223
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200224const uint8_t *convert_ra(struct gprs_ra_id *raid)
225{
226 static uint8_t buf[6];
227 gsm48_construct_ra(buf, raid);
228 return buf;
229}
230
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200231/* DTAP - Attach Request */
232static const unsigned char dtap_attach_req[] = {
233 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
234 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
235 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
236 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
237 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
238 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200239};
240
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200241/* DTAP - Attach Request (invalid RAI) */
242static const unsigned char dtap_attach_req2[] = {
243 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
244 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
245 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
246 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
247 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
248 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
249};
250
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200251/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
252static const unsigned char dtap_attach_req3[] = {
253 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
254 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
255 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
256 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
257 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
258 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
259};
260
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100261/* DTAP - Attach Request (IMSI 12131415161718) */
262static const unsigned char dtap_attach_req4[] = {
263 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
264 0x08, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
265 0x18, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19,
266 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00,
267 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60,
268 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80,
269 0x00,
270};
271
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200272/* DTAP - Identity Request */
273static const unsigned char dtap_identity_req[] = {
274 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200275};
276
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200277/* DTAP - Identity Response */
278static const unsigned char dtap_identity_resp[] = {
279 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
280 0x16, 0x17, 0x18
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200281};
282
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200283/* DTAP - Identity Response, IMSI 2 */
284static const unsigned char dtap_identity2_resp[] = {
285 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
286 0x16, 0x17, 0x18
287};
288
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200289/* DTAP - Identity Response, IMSI 3 */
290static const unsigned char dtap_identity3_resp[] = {
291 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
292 0x26, 0x27, 0x28
293};
294
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200295/* DTAP - Attach Accept */
296static const unsigned char dtap_attach_acc[] = {
297 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
298 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
299 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200300};
301
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200302/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200303static const unsigned char dtap_attach_acc2[] = {
304 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
305 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
306 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
307};
308
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200309/* DTAP - Attach Complete */
310static const unsigned char dtap_attach_complete[] = {
311 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200312};
313
Jacob Erlbeck2bf32612014-09-22 11:26:58 +0200314/* DTAP - Attach Reject (GPRS services not allowed) */
315static const unsigned char dtap_attach_rej7[] = {
316 0x08, 0x04, 0x07
317};
318
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200319/* DTAP - GMM Information */
320static const unsigned char dtap_gmm_information[] = {
321 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200322};
323
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200324/* DTAP - Routing Area Update Request */
325static const unsigned char dtap_ra_upd_req[] = {
326 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
327 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
328 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
329 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
330 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
331 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
332 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200333};
334
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200335/* DTAP - Routing Area Update Accept */
336static const unsigned char dtap_ra_upd_acc[] = {
337 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
338 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
339 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200340};
341
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200342/* DTAP - Routing Area Update Accept, P-TMSI 2 */
343static const unsigned char dtap_ra_upd_acc2[] = {
344 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
345 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
346 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
347};
348
349/* DTAP - Routing Area Update Accept, P-TMSI 3 */
350static const unsigned char dtap_ra_upd_acc3[] = {
351 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
352 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
353 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
354};
355
356/* DTAP - Routing Area Update Complete */
357static const unsigned char dtap_ra_upd_complete[] = {
358 0x08, 0x0a
359};
360
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200361/* DTAP - Routing Area Update Reject */
362/* cause = 10 ("Implicitly detached"), force_standby = 0 */
363static const unsigned char dtap_ra_upd_rej[] = {
364 0x08, 0x0b, 0x0a, 0x00,
365};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200366
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200367/* DTAP - Activate PDP Context Request */
368static const unsigned char dtap_act_pdp_ctx_req[] = {
369 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200370 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
372 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
373 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
374 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200375 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200376};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200377
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200378/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200379/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200380static const unsigned char dtap_detach_po_req[] = {
381 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
382 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200383};
384
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200385/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200386/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200387static const unsigned char dtap_detach_req[] = {
388 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
389 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200390};
391
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200392/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200393static const unsigned char dtap_detach_acc[] = {
394 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200395};
396
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200397/* DTAP - Detach Request (MT) */
398/* normal detach, reattach required, implicitly detached */
399static const unsigned char dtap_mt_detach_rea_req[] = {
400 0x08, 0x05, 0x01, 0x25, 0x0a
401};
402
403/* DTAP - Detach Request (MT) */
404/* normal detach, reattach not required, implicitly detached */
405static const unsigned char dtap_mt_detach_req[] = {
406 0x08, 0x05, 0x02, 0x25, 0x0a
407};
408
409/* DTAP - Detach Accept (MT) */
410static const unsigned char dtap_mt_detach_acc[] = {
411 0x08, 0x06
412};
413
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200414/* GPRS-LLC - SAPI: LLGMM, U, XID */
415static const unsigned char llc_u_xid_ul[] = {
416 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
417 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
418};
419
420/* GPRS-LLC - SAPI: LLGMM, U, XID */
421static const unsigned char llc_u_xid_dl[] = {
422 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
423 0xe4, 0xa9, 0x1a, 0x9e
424};
425
426/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
427static const unsigned char llc_ui_ll11_dns_query_ul[] = {
428 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
429 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
430 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
431 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
432 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
433 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
434 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
435 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
436 0x8f, 0x07
437};
438
439/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
440static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
441 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
442 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
443 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
444 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
445 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
446 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
447 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
448 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
449 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
450 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
451 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
452 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
453 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
454 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
455 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
456 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
457 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
458 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
459 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
460 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
461 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
462 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
463 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
464 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
465 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
466 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
467};
468
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200469static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
470 struct sockaddr_in *peer, const unsigned char* data,
471 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200472
473static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
474 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
475{
476 /* GPRS Network Service, PDU type: NS_RESET,
477 */
478 unsigned char msg[12] = {
479 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
480 0x04, 0x82, 0x11, 0x22
481 };
482
483 msg[3] = cause;
484 msg[6] = nsvci / 256;
485 msg[7] = nsvci % 256;
486 msg[10] = nsei / 256;
487 msg[11] = nsei % 256;
488
489 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
490}
491
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200492static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
493 uint16_t nsvci, uint16_t nsei)
494{
495 /* GPRS Network Service, PDU type: NS_RESET_ACK,
496 */
497 unsigned char msg[9] = {
498 0x03, 0x01, 0x82, 0x11, 0x22,
499 0x04, 0x82, 0x11, 0x22
500 };
501
502 msg[3] = nsvci / 256;
503 msg[4] = nsvci % 256;
504 msg[7] = nsei / 256;
505 msg[8] = nsei % 256;
506
507 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
508}
509
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200510static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
511{
512 /* GPRS Network Service, PDU type: NS_ALIVE */
513 unsigned char msg[1] = {
514 0x0a
515 };
516
517 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
518}
519
520static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
521{
522 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
523 unsigned char msg[1] = {
524 0x0b
525 };
526
527 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
528}
529
530static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
531{
532 /* GPRS Network Service, PDU type: NS_UNBLOCK */
533 unsigned char msg[1] = {
534 0x06
535 };
536
537 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
538}
539
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200540static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
541{
542 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
543 unsigned char msg[1] = {
544 0x07
545 };
546
547 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
548}
549
550static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
551 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200552 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
553{
554 /* GPRS Network Service, PDU type: NS_UNITDATA */
555 unsigned char msg[4096] = {
556 0x00, 0x00, 0x00, 0x00
557 };
558
559 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
560
561 msg[2] = nsbvci / 256;
562 msg[3] = nsbvci % 256;
563 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
564
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200565 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200566}
567
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200568static void send_bssgp_ul_unitdata(
569 struct gprs_ns_inst *nsi, const char *text,
570 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
571 struct gprs_ra_id *raid, uint16_t cell_id,
572 const uint8_t *llc_msg, size_t llc_msg_size)
573{
574 /* GPRS Network Service, PDU type: NS_UNITDATA */
575 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
576 unsigned char msg[4096] = {
577 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
578 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
579 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
580 };
581
582 size_t bssgp_msg_size = 23 + llc_msg_size;
583
584 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
585
586 gsm48_construct_ra(msg + 10, raid);
587 msg[1] = (uint8_t)(tlli >> 24);
588 msg[2] = (uint8_t)(tlli >> 16);
589 msg[3] = (uint8_t)(tlli >> 8);
590 msg[4] = (uint8_t)(tlli >> 0);
591 msg[16] = cell_id / 256;
592 msg[17] = cell_id % 256;
593 msg[21] = llc_msg_size / 256;
594 msg[22] = llc_msg_size % 256;
595 memcpy(msg + 23, llc_msg, llc_msg_size);
596
597 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
598 src_addr, nsbvci, msg, bssgp_msg_size);
599}
600
601static void send_bssgp_dl_unitdata(
602 struct gprs_ns_inst *nsi, const char *text,
603 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
604 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
605 const uint8_t *llc_msg, size_t llc_msg_size)
606{
607 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
608 unsigned char msg[4096] = {
609 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
610 0x16, 0x82, 0x02, 0x58,
611 };
612 unsigned char racap_drx[] = {
613 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
614 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
615 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
616 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
617 };
618
619 size_t bssgp_msg_size = 0;
620
621 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
622
623 msg[1] = (uint8_t)(tlli >> 24);
624 msg[2] = (uint8_t)(tlli >> 16);
625 msg[3] = (uint8_t)(tlli >> 8);
626 msg[4] = (uint8_t)(tlli >> 0);
627
628 bssgp_msg_size = 12;
629
630 if (with_racap_drx) {
631 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
632 bssgp_msg_size += sizeof(racap_drx);
633 }
634
635 if (imsi) {
636 OSMO_ASSERT(imsi_size <= 127);
637 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
638 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
639 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
640 bssgp_msg_size += 2 + imsi_size;
641 }
642
643 if ((bssgp_msg_size % 4) != 0) {
644 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
645 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
646 msg[bssgp_msg_size + 1] = 0x80 | abytes;
647 memset(msg + bssgp_msg_size + 2, 0, abytes);
648 bssgp_msg_size += 2 + abytes;
649 }
650
651 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
652 if (llc_msg_size < 128) {
653 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
654 bssgp_msg_size += 2;
655 } else {
656 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
657 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
658 bssgp_msg_size += 3;
659 }
660 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
661 bssgp_msg_size += llc_msg_size;
662
663
664 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
665 src_addr, nsbvci, msg, bssgp_msg_size);
666}
667
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200668static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
669 uint16_t bvci)
670{
671 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
672 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200673 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200674 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200675 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
676 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200677 };
678
679 msg[3] = bvci / 256;
680 msg[4] = bvci % 256;
681
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200682 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
683}
684
685static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
686 struct sockaddr_in *src_addr, uint16_t bvci)
687{
688 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
689 * BSSGP RESET_ACK */
690 static unsigned char msg[5] = {
691 0x23, 0x04, 0x82, 0x00,
692 0x00
693 };
694
695 msg[3] = bvci / 256;
696 msg[4] = bvci % 256;
697
698 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200699}
700
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200701static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
702 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200703 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200704 struct gprs_ra_id *raid)
705{
706 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
707 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200708 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
709 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200710 };
711
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200712 msg[3] = (uint8_t)(tlli >> 24);
713 msg[4] = (uint8_t)(tlli >> 16);
714 msg[5] = (uint8_t)(tlli >> 8);
715 msg[6] = (uint8_t)(tlli >> 0);
716
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200717 gsm48_construct_ra(msg + 9, raid);
718
719 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
720}
721
722static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
723 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200724 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200725 struct gprs_ra_id *raid)
726{
727 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
728 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200729 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
730 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200731 0x81, 0x01
732 };
733
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200734 msg[3] = (uint8_t)(tlli >> 24);
735 msg[4] = (uint8_t)(tlli >> 16);
736 msg[5] = (uint8_t)(tlli >> 8);
737 msg[6] = (uint8_t)(tlli >> 0);
738
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200739 gsm48_construct_ra(msg + 9, raid);
740
741 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
742}
743
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200744static void send_bssgp_llc_discarded(struct gprs_ns_inst *nsi,
745 struct sockaddr_in *src_addr,
746 uint16_t bvci, uint32_t tlli,
747 unsigned n_frames, unsigned n_octets)
748{
749 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
750 unsigned char msg[] = {
751 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
752 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
753 /* n octets */ 0xff, 0xff, 0xff
754 };
755
756 msg[3] = (uint8_t)(tlli >> 24);
757 msg[4] = (uint8_t)(tlli >> 16);
758 msg[5] = (uint8_t)(tlli >> 8);
759 msg[6] = (uint8_t)(tlli >> 0);
760 msg[9] = (uint8_t)(n_frames);
761 msg[12] = (uint8_t)(bvci >> 8);
762 msg[13] = (uint8_t)(bvci >> 0);
763 msg[16] = (uint8_t)(n_octets >> 16);
764 msg[17] = (uint8_t)(n_octets >> 8);
765 msg[18] = (uint8_t)(n_octets >> 0);
766
767 send_ns_unitdata(nsi, "LLC_DISCARDED", src_addr, 0, msg, sizeof(msg));
768}
769
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200770static void send_bssgp_paging(struct gprs_ns_inst *nsi,
771 struct sockaddr_in *src_addr,
772 const uint8_t *imsi, size_t imsi_size,
773 struct gprs_ra_id *raid, uint32_t ptmsi)
774{
775 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
776 unsigned char msg[100] = {
777 0x06,
778 };
779
780 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
781 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
782
783 size_t bssgp_msg_size = 1;
784
785 if (imsi) {
786 OSMO_ASSERT(imsi_size <= 127);
787 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
788 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
789 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
790 bssgp_msg_size += 2 + imsi_size;
791 }
792
793 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
794 bssgp_msg_size += sizeof(drx_ie);
795
796 if (raid) {
797 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
798 msg[bssgp_msg_size+1] = 0x86;
799 gsm48_construct_ra(msg + bssgp_msg_size + 2, raid);
800 bssgp_msg_size += 8;
801 }
802
803 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
804 bssgp_msg_size += sizeof(qos_ie);
805
806 if (ptmsi != GSM_RESERVED_TMSI) {
807 const uint32_t ptmsi_be = htonl(ptmsi);
808 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
809 msg[bssgp_msg_size+1] = 0x84;
810 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
811 bssgp_msg_size += 6;
812 }
813
814 send_ns_unitdata(nsi, "PAGING_PS", src_addr, 0, msg, bssgp_msg_size);
815}
816
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200817static void send_bssgp_flow_control_bvc(struct gprs_ns_inst *nsi,
818 struct sockaddr_in *src_addr,
819 uint16_t bvci, uint8_t tag)
820{
821 /* GPRS Network Service, PDU type: NS_UNITDATA,
822 * BSSGP FLOW_CONTROL_BVC */
823 unsigned char msg[] = {
824 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
825 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
826 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
827 };
828
829 msg[3] = tag;
830
831 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", src_addr, bvci,
832 msg, sizeof(msg));
833}
834
835static void send_bssgp_flow_control_bvc_ack(struct gprs_ns_inst *nsi,
836 struct sockaddr_in *src_addr,
837 uint16_t bvci, uint8_t tag)
838{
839 /* GPRS Network Service, PDU type: NS_UNITDATA,
840 * BSSGP FLOW_CONTROL_BVC_ACK */
841 unsigned char msg[] = {
842 0x27, 0x1e, 0x81, /* Tag */ 0xce
843 };
844
845 msg[3] = tag;
846
847 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", src_addr, bvci,
848 msg, sizeof(msg));
849}
850
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200851static void send_llc_ul_ui(
852 struct gprs_ns_inst *nsi, const char *text,
853 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
854 struct gprs_ra_id *raid, uint16_t cell_id,
855 unsigned sapi, unsigned nu,
856 const uint8_t *msg, size_t msg_size)
857{
858 unsigned char llc_msg[4096] = {
859 0x00, 0xc0, 0x01
860 };
861
862 size_t llc_msg_size = 3 + msg_size + 3;
863 uint8_t e_bit = 0;
864 uint8_t pm_bit = 1;
865 unsigned fcs;
866
867 nu &= 0x01ff;
868
869 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
870
871 llc_msg[0] = (sapi & 0x0f);
872 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
873 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
874
875 memcpy(llc_msg + 3, msg, msg_size);
876
877 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
878 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
879 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
880 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
881
882 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
883 src_addr, nsbvci, tlli, raid, cell_id,
884 llc_msg, llc_msg_size);
885}
886
887static void send_llc_dl_ui(
888 struct gprs_ns_inst *nsi, const char *text,
889 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
890 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
891 unsigned sapi, unsigned nu,
892 const uint8_t *msg, size_t msg_size)
893{
894 /* GPRS Network Service, PDU type: NS_UNITDATA */
895 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
896 unsigned char llc_msg[4096] = {
897 0x00, 0x00, 0x01
898 };
899
900 size_t llc_msg_size = 3 + msg_size + 3;
901 uint8_t e_bit = 0;
902 uint8_t pm_bit = 1;
903 unsigned fcs;
904
905 nu &= 0x01ff;
906
907 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
908
909 llc_msg[0] = 0x40 | (sapi & 0x0f);
910 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
911 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
912
913 memcpy(llc_msg + 3, msg, msg_size);
914
915 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
916 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
917 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
918 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
919
920 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
921 src_addr, nsbvci, tlli,
922 with_racap_drx, imsi, imsi_size,
923 llc_msg, llc_msg_size);
924}
925
926
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200927static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
928 uint16_t nsvci, uint16_t nsei)
929{
930 printf("Setup NS-VC: remote 0x%08x:%d, "
931 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
932 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
933 nsvci, nsvci, nsei, nsei);
934
935 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
936 send_ns_alive(nsi, src_addr);
937 send_ns_unblock(nsi, src_addr);
938 send_ns_alive_ack(nsi, src_addr);
939}
940
941static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
942 uint16_t bvci)
943{
944 printf("Setup BSSGP: remote 0x%08x:%d, "
945 "BVCI 0x%04x(%d)\n\n",
946 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
947 bvci, bvci);
948
949 send_bssgp_reset(nsi, src_addr, bvci);
950}
951
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200952static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer,
953 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200954{
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200955 gprs_ns_nsip_connect(nsi, sgsn_peer, sgsn_nsei, sgsn_nsei+1);
956 send_ns_reset_ack(nsi, sgsn_peer, sgsn_nsei+1, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200957 send_ns_alive_ack(nsi, sgsn_peer);
958 send_ns_unblock_ack(nsi, sgsn_peer);
959 send_ns_alive(nsi, sgsn_peer);
960}
961
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200962static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
963{
964 sgsn_peer->sin_family = AF_INET;
965 sgsn_peer->sin_port = htons(32000);
966 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
967}
968
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200969static void configure_sgsn2_peer(struct sockaddr_in *sgsn_peer)
970{
971 sgsn_peer->sin_family = AF_INET;
972 sgsn_peer->sin_port = htons(32001);
973 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN2_ADDR);
974}
975
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200976static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
977{
978 size_t i;
979
980 for (i = 0; i < size; ++i) {
981 bss_peers[i].sin_family = AF_INET;
982 bss_peers[i].sin_port = htons((i + 1) * 1111);
983 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
984 }
985}
986
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200987int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
988 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
989
990/* override */
991int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
992 struct msgb *msg, uint16_t bvci)
993{
Holger Hans Peter Freytherdaaea0c2015-08-03 09:28:41 +0200994 printf("CALLBACK, event %d, msg length %zu, bvci 0x%04x\n%s\n\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200995 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200996 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200997
998 switch (event) {
999 case GPRS_NS_EVT_UNIT_DATA:
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001000 return gbprox_rcvmsg(&gbcfg, msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001001 default:
1002 break;
1003 }
1004 return 0;
1005}
1006
1007/* override */
1008ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
1009 const struct sockaddr *dest_addr, socklen_t addrlen)
1010{
1011 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
1012 const struct sockaddr *, socklen_t);
1013 static sendto_t real_sendto = NULL;
1014 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001015 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001016
1017 if (!real_sendto)
1018 real_sendto = dlsym(RTLD_NEXT, "sendto");
1019
1020 if (dest_host == REMOTE_BSS_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001021 printf("MESSAGE to BSS at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001022 dest_host, dest_port,
1023 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001024 else if (dest_host == REMOTE_SGSN_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001025 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001026 dest_host, dest_port,
1027 len, osmo_hexdump(buf, len));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001028 else if (dest_host == REMOTE_SGSN2_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001029 printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001030 dest_host, dest_port,
1031 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001032 else
1033 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
1034
1035 return len;
1036}
1037
1038/* override */
1039int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
1040{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001041 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
1042 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001043 uint16_t bvci = msgb_bvci(msg);
1044 uint16_t nsei = msgb_nsei(msg);
1045
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001046 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001047
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001048 if (!real_gprs_ns_sendmsg)
1049 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
1050
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001051 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001052 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001053 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001054 bvci, len, __func__);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001055 else if (nsei == SGSN2_NSEI)
1056 printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001057 "msg length %zu (%s)\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001058 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001059 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001060 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001061 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001062 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001063
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001064 if (received_messages) {
1065 struct msgb *msg_copy;
1066 msg_copy = gprs_msgb_copy(msg, "received_messages");
1067 llist_add_tail(&msg_copy->list, received_messages);
1068 }
1069
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001070 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001071}
1072
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001073/* Get the next message from the receive FIFO
1074 *
1075 * \returns a pointer to the message which will be invalidated at the next call
1076 * to expect_msg. Returns NULL, if there is no message left.
1077 */
1078static struct msgb *expect_msg(void)
1079{
1080 static struct msgb *msg = NULL;
1081
1082 msgb_free(msg);
1083 msg = NULL;
1084
1085 if (!received_messages)
1086 return NULL;
1087
1088 if (llist_empty(received_messages))
1089 return NULL;
1090
1091 msg = llist_entry(received_messages->next, struct msgb, list);
1092 llist_del(&msg->list);
1093
1094 return msg;
1095}
1096
1097struct expect_result {
1098 struct msgb *msg;
1099 struct gprs_gb_parse_context parse_ctx;
1100};
1101
1102static struct expect_result *expect_bssgp_msg(
1103 int match_nsei, int match_bvci, int match_pdu_type)
1104{
1105 static struct expect_result result;
1106 static const struct expect_result empty_result = {0,};
1107 static struct msgb *msg;
1108 uint16_t nsei;
1109 int rc;
1110
1111 memcpy(&result, &empty_result, sizeof(result));
1112
1113 msg = expect_msg();
1114 if (!msg)
1115 return NULL;
1116
1117 nsei = msgb_nsei(msg);
1118
1119 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1120 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1121 __func__, match_nsei, nsei);
1122 return NULL;
1123 }
1124
1125 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1126 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1127 __func__, match_bvci, msgb_bvci(msg));
1128 return NULL;
1129 }
1130
1131 result.msg = msg;
1132
1133 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1134 result.parse_ctx.peer_nsei = nsei;
1135
1136 if (!msgb_bssgph(msg)) {
1137 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1138 return NULL;
1139 }
1140
1141 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1142 &result.parse_ctx);
1143
1144 if (!rc) {
1145 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1146 return NULL;
1147 }
1148
1149 if (match_pdu_type != MATCH_ANY &&
1150 match_pdu_type != result.parse_ctx.pdu_type) {
1151 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1152 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1153 return NULL;
1154 }
1155
1156 return &result;
1157}
1158
1159static struct expect_result *expect_llc_msg(
1160 int match_nsei, int match_bvci, int match_sapi, int match_type)
1161{
1162 static struct expect_result *result;
1163
1164 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1165 if (!result)
1166 return NULL;
1167
1168 if (!result->parse_ctx.llc) {
1169 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1170 return NULL;
1171 }
1172
1173 if (match_sapi != MATCH_ANY &&
1174 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1175 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1176 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1177 return NULL;
1178 }
1179
1180 if (match_type != MATCH_ANY &&
1181 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1182 fprintf(stderr,
1183 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1184 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1185 return NULL;
1186 }
1187
1188 return result;
1189}
1190
1191static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1192 int match_type)
1193{
1194 static struct expect_result *result;
1195
1196 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1197 if (!result)
1198 return NULL;
1199
1200 if (!result->parse_ctx.g48_hdr) {
1201 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1202 return NULL;
1203 }
1204
1205 if (match_type != MATCH_ANY &&
1206 match_type != result->parse_ctx.g48_hdr->msg_type) {
1207 fprintf(stderr,
1208 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1209 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1210 return NULL;
1211 }
1212
1213 return result;
1214}
1215
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001216static void dump_rate_ctr_group(FILE *stream, const char *prefix,
1217 struct rate_ctr_group *ctrg)
1218{
1219 unsigned int i;
1220
1221 for (i = 0; i < ctrg->desc->num_ctr; i++) {
1222 struct rate_ctr *ctr = &ctrg->ctr[i];
1223 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
1224 fprintf(stream, " %s%s: %llu%s",
1225 prefix, ctrg->desc->ctr_desc[i].description,
1226 (long long)ctr->current,
1227 "\n");
1228 };
1229}
1230
1231/* Signal handler for signals from NS layer */
1232static int test_signal(unsigned int subsys, unsigned int signal,
1233 void *handler_data, void *signal_data)
1234{
1235 struct ns_signal_data *nssd = signal_data;
1236 int rc;
1237
1238 if (subsys != SS_L_NS)
1239 return 0;
1240
1241 switch (signal) {
1242 case S_NS_RESET:
1243 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
1244 nssd->nsvc->nsvci,
1245 gprs_ns_ll_str(nssd->nsvc));
1246 break;
1247
1248 case S_NS_ALIVE_EXP:
1249 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
1250 nssd->nsvc->nsvci,
1251 gprs_ns_ll_str(nssd->nsvc));
1252 break;
1253
1254 case S_NS_BLOCK:
1255 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
1256 nssd->nsvc->nsvci,
1257 gprs_ns_ll_str(nssd->nsvc));
1258 break;
1259
1260 case S_NS_UNBLOCK:
1261 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
1262 nssd->nsvc->nsvci,
1263 gprs_ns_ll_str(nssd->nsvc));
1264 break;
1265
1266 case S_NS_REPLACED:
1267 printf("==> got signal NS_REPLACED: 0x%04x/%s",
1268 nssd->nsvc->nsvci,
1269 gprs_ns_ll_str(nssd->nsvc));
1270 printf(" -> 0x%04x/%s\n",
1271 nssd->old_nsvc->nsvci,
1272 gprs_ns_ll_str(nssd->old_nsvc));
1273 break;
1274
1275 default:
1276 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
1277 nssd->nsvc->nsvci,
1278 gprs_ns_ll_str(nssd->nsvc));
1279 break;
1280 }
1281 printf("\n");
1282 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
1283 return rc;
1284}
1285
1286static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
1287{
1288 struct msgb *msg;
1289 int ret;
1290 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001291 fprintf(stderr, "message too long: %zu\n", data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001292 return -1;
1293 }
1294
1295 msg = gprs_ns_msgb_alloc();
1296 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
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004819static struct log_info_cat gprs_categories[] = {
4820 [DGPRS] = {
4821 .name = "DGPRS",
4822 .description = "GPRS Packet Service",
4823 .enabled = 1, .loglevel = LOGL_DEBUG,
4824 },
4825 [DNS] = {
4826 .name = "DNS",
4827 .description = "GPRS Network Service (NS)",
4828 .enabled = 1, .loglevel = LOGL_INFO,
4829 },
4830 [DBSSGP] = {
4831 .name = "DBSSGP",
4832 .description = "GPRS BSS Gateway Protocol (BSSGP)",
4833 .enabled = 1, .loglevel = LOGL_DEBUG,
4834 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004835};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004836
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004837static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004838 .cat = gprs_categories,
4839 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004840};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004841
4842int main(int argc, char **argv)
4843{
4844 osmo_init_logging(&info);
4845 log_set_use_color(osmo_stderr_target, 0);
4846 log_set_print_filename(osmo_stderr_target, 0);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02004847 osmo_signal_register_handler(SS_L_NS, &test_signal, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004848
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004849 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004850 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
4851 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004852
4853 rate_ctr_init(NULL);
4854
4855 setlinebuf(stdout);
4856
4857 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02004858 gbproxy_init_config(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004859 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004860 test_gbproxy_ident_changes();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004861 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02004862 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02004863 test_gbproxy_ra_patching();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02004864 test_gbproxy_ptmsi_patching();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02004865 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02004866 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02004867 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004868 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004869 test_gbproxy_tlli_expire();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004870 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004871
4872 exit(EXIT_SUCCESS);
4873}