blob: cee79ca44c126aa9794c01afb6a9e15579e41404 [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
40#define REMOTE_BSS_ADDR 0x01020304
41#define REMOTE_SGSN_ADDR 0x05060708
42
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020043#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020044
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +020045#define REMOTE_SGSN2_ADDR 0x15161718
46#define SGSN2_NSEI 0x0102
47
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020048#define MATCH_ANY (-1)
49
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020050struct gbproxy_config gbcfg = {0};
51
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020052struct llist_head *received_messages = NULL;
53
Daniel Willmannd1554ec2015-10-12 19:36:34 +020054static void cleanup_test()
55{
56}
57
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020058static int dump_global(FILE *stream, int indent)
59{
60 unsigned int i;
61 const struct rate_ctr_group_desc *desc;
62 int rc;
63
64 rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
65 if (rc < 0)
66 return rc;
67
68 desc = gbcfg.ctrg->desc;
69
70 for (i = 0; i < desc->num_ctr; i++) {
71 struct rate_ctr *ctr = &gbcfg.ctrg->ctr[i];
72 if (ctr->current) {
73 rc = fprintf(stream, "%*s %s: %llu\n",
74 indent, "",
75 desc->ctr_desc[i].description,
76 (long long)ctr->current);
77
78 if (rc < 0)
79 return rc;
80 }
81 }
82
83 return 0;
84}
85
Jacob Erlbeck7b821d02014-08-08 08:37:37 +020086static int dump_peers(FILE *stream, int indent, time_t now,
87 struct gbproxy_config *cfg)
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020088{
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +020089 struct gbproxy_peer *peer;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020090 struct gprs_ra_id raid;
91 unsigned int i;
92 const struct rate_ctr_group_desc *desc;
93 int rc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020094
95 rc = fprintf(stream, "%*sPeers:\n", indent, "");
96 if (rc < 0)
97 return rc;
98
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +020099 llist_for_each_entry(peer, &cfg->bts_peers, list) {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200100 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200101 struct gbproxy_patch_state *state = &peer->patch_state;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200102 gsm48_parse_ra(&raid, peer->ra);
103
104 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, "
105 "RAI %u-%u-%u-%u\n",
106 indent, "",
107 peer->nsei, peer->bvci,
108 peer->blocked ? "" : "not ",
109 raid.mcc, raid.mnc, raid.lac, raid.rac);
110
111 if (rc < 0)
112 return rc;
113
114 desc = peer->ctrg->desc;
115
116 for (i = 0; i < desc->num_ctr; i++) {
117 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
118 if (ctr->current) {
119 rc = fprintf(stream, "%*s %s: %llu\n",
120 indent, "",
121 desc->ctr_desc[i].description,
122 (long long)ctr->current);
123
124 if (rc < 0)
125 return rc;
126 }
127 }
128
129 fprintf(stream, "%*s TLLI-Cache: %d\n",
Jacob Erlbeckf8562e32014-09-19 16:03:07 +0200130 indent, "", state->logical_link_count);
131 llist_for_each_entry(link_info, &state->logical_links, list) {
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200132 char mi_buf[200];
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200133 time_t age = now ? now - link_info->timestamp : 0;
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200134 int stored_msgs = 0;
135 struct llist_head *iter;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200136 enum gbproxy_match_id match_id;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200137 llist_for_each(iter, &link_info->stored_msgs)
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200138 stored_msgs++;
139
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200140 if (link_info->imsi_len > 0) {
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200141 snprintf(mi_buf, sizeof(mi_buf), "(invalid)");
142 gsm48_mi_to_string(mi_buf, sizeof(mi_buf),
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200143 link_info->imsi,
144 link_info->imsi_len);
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200145 } else {
146 snprintf(mi_buf, sizeof(mi_buf), "(none)");
147 }
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200148 fprintf(stream, "%*s TLLI %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200149 indent, "", link_info->tlli.current);
150 if (link_info->tlli.assigned)
151 fprintf(stream, "/%08x", link_info->tlli.assigned);
152 if (link_info->sgsn_tlli.current) {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200153 fprintf(stream, " -> %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200154 link_info->sgsn_tlli.current);
155 if (link_info->sgsn_tlli.assigned)
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200156 fprintf(stream, "/%08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200157 link_info->sgsn_tlli.assigned);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200158 }
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200159 fprintf(stream, ", IMSI %s, AGE %d",
160 mi_buf, (int)age);
161
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200162 if (stored_msgs)
163 fprintf(stream, ", STORED %d", stored_msgs);
164
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200165 for (match_id = 0; match_id < ARRAY_SIZE(cfg->matches);
166 ++match_id) {
167 if (cfg->matches[match_id].enable &&
168 link_info->is_matching[match_id]) {
169 fprintf(stream, ", IMSI matches");
170 break;
171 }
172 }
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200173
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200174 if (link_info->imsi_acq_pending)
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200175 fprintf(stream, ", IMSI acquisition in progress");
176
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200177 if (cfg->route_to_sgsn2)
178 fprintf(stream, ", SGSN NSEI %d",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200179 link_info->sgsn_nsei);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200180
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200181 if (link_info->is_deregistered)
Jacob Erlbeck7430da62014-09-12 15:09:56 +0200182 fprintf(stream, ", DE-REGISTERED");
183
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200184 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200185 if (rc < 0)
186 return rc;
187 }
188 }
189
190 return 0;
191}
192
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200193const uint8_t *convert_ra(struct gprs_ra_id *raid)
194{
195 static uint8_t buf[6];
196 gsm48_construct_ra(buf, raid);
197 return buf;
198}
199
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200200/* DTAP - Attach Request */
201static const unsigned char dtap_attach_req[] = {
202 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
203 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
204 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
205 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
206 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
207 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200208};
209
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200210/* DTAP - Attach Request (invalid RAI) */
211static const unsigned char dtap_attach_req2[] = {
212 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
213 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
214 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
215 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
216 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
217 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
218};
219
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200220/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
221static const unsigned char dtap_attach_req3[] = {
222 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
223 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
224 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
225 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
226 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
227 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
228};
229
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100230/* DTAP - Attach Request (IMSI 12131415161718) */
231static const unsigned char dtap_attach_req4[] = {
232 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
233 0x08, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
234 0x18, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19,
235 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00,
236 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60,
237 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80,
238 0x00,
239};
240
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200241/* DTAP - Identity Request */
242static const unsigned char dtap_identity_req[] = {
243 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200244};
245
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200246/* DTAP - Identity Response */
247static const unsigned char dtap_identity_resp[] = {
248 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
249 0x16, 0x17, 0x18
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200250};
251
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200252/* DTAP - Identity Response, IMSI 2 */
253static const unsigned char dtap_identity2_resp[] = {
254 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
255 0x16, 0x17, 0x18
256};
257
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200258/* DTAP - Identity Response, IMSI 3 */
259static const unsigned char dtap_identity3_resp[] = {
260 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
261 0x26, 0x27, 0x28
262};
263
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200264/* DTAP - Attach Accept */
265static const unsigned char dtap_attach_acc[] = {
266 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
267 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
268 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200269};
270
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200271/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200272static const unsigned char dtap_attach_acc2[] = {
273 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
274 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
275 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
276};
277
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200278/* DTAP - Attach Complete */
279static const unsigned char dtap_attach_complete[] = {
280 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200281};
282
Jacob Erlbeck2bf32612014-09-22 11:26:58 +0200283/* DTAP - Attach Reject (GPRS services not allowed) */
284static const unsigned char dtap_attach_rej7[] = {
285 0x08, 0x04, 0x07
286};
287
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200288/* DTAP - GMM Information */
289static const unsigned char dtap_gmm_information[] = {
290 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200291};
292
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200293/* DTAP - Routing Area Update Request */
294static const unsigned char dtap_ra_upd_req[] = {
295 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
296 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
297 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
298 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
299 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
300 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
301 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200302};
303
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200304/* DTAP - Routing Area Update Accept */
305static const unsigned char dtap_ra_upd_acc[] = {
306 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
307 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
308 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200309};
310
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200311/* DTAP - Routing Area Update Accept, P-TMSI 2 */
312static const unsigned char dtap_ra_upd_acc2[] = {
313 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
314 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
315 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
316};
317
318/* DTAP - Routing Area Update Accept, P-TMSI 3 */
319static const unsigned char dtap_ra_upd_acc3[] = {
320 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
321 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
322 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
323};
324
325/* DTAP - Routing Area Update Complete */
326static const unsigned char dtap_ra_upd_complete[] = {
327 0x08, 0x0a
328};
329
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200330/* DTAP - Routing Area Update Reject */
331/* cause = 10 ("Implicitly detached"), force_standby = 0 */
332static const unsigned char dtap_ra_upd_rej[] = {
333 0x08, 0x0b, 0x0a, 0x00,
334};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200335
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200336/* DTAP - Activate PDP Context Request */
337static const unsigned char dtap_act_pdp_ctx_req[] = {
338 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200339 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
341 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
342 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
343 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200344 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200345};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200346
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200347/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200348/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200349static const unsigned char dtap_detach_po_req[] = {
350 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
351 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200352};
353
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200354/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200355/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200356static const unsigned char dtap_detach_req[] = {
357 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
358 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200359};
360
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200361/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200362static const unsigned char dtap_detach_acc[] = {
363 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200364};
365
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200366/* DTAP - Detach Request (MT) */
367/* normal detach, reattach required, implicitly detached */
368static const unsigned char dtap_mt_detach_rea_req[] = {
369 0x08, 0x05, 0x01, 0x25, 0x0a
370};
371
372/* DTAP - Detach Request (MT) */
373/* normal detach, reattach not required, implicitly detached */
374static const unsigned char dtap_mt_detach_req[] = {
375 0x08, 0x05, 0x02, 0x25, 0x0a
376};
377
378/* DTAP - Detach Accept (MT) */
379static const unsigned char dtap_mt_detach_acc[] = {
380 0x08, 0x06
381};
382
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200383/* GPRS-LLC - SAPI: LLGMM, U, XID */
384static const unsigned char llc_u_xid_ul[] = {
385 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
386 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
387};
388
389/* GPRS-LLC - SAPI: LLGMM, U, XID */
390static const unsigned char llc_u_xid_dl[] = {
391 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
392 0xe4, 0xa9, 0x1a, 0x9e
393};
394
395/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
396static const unsigned char llc_ui_ll11_dns_query_ul[] = {
397 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
398 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
399 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
400 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
401 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
402 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
403 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
404 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
405 0x8f, 0x07
406};
407
408/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
409static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
410 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
411 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
412 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
413 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
414 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
415 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
416 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
417 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
418 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
419 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
420 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
421 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
422 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
423 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
424 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
425 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
426 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
427 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
428 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
429 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
430 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
431 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
432 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
433 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
434 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
435 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
436};
437
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200438static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
439 struct sockaddr_in *peer, const unsigned char* data,
440 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200441
442static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
443 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
444{
445 /* GPRS Network Service, PDU type: NS_RESET,
446 */
447 unsigned char msg[12] = {
448 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
449 0x04, 0x82, 0x11, 0x22
450 };
451
452 msg[3] = cause;
453 msg[6] = nsvci / 256;
454 msg[7] = nsvci % 256;
455 msg[10] = nsei / 256;
456 msg[11] = nsei % 256;
457
458 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
459}
460
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200461static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
462 uint16_t nsvci, uint16_t nsei)
463{
464 /* GPRS Network Service, PDU type: NS_RESET_ACK,
465 */
466 unsigned char msg[9] = {
467 0x03, 0x01, 0x82, 0x11, 0x22,
468 0x04, 0x82, 0x11, 0x22
469 };
470
471 msg[3] = nsvci / 256;
472 msg[4] = nsvci % 256;
473 msg[7] = nsei / 256;
474 msg[8] = nsei % 256;
475
476 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
477}
478
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200479static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
480{
481 /* GPRS Network Service, PDU type: NS_ALIVE */
482 unsigned char msg[1] = {
483 0x0a
484 };
485
486 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
487}
488
489static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
490{
491 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
492 unsigned char msg[1] = {
493 0x0b
494 };
495
496 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
497}
498
499static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
500{
501 /* GPRS Network Service, PDU type: NS_UNBLOCK */
502 unsigned char msg[1] = {
503 0x06
504 };
505
506 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
507}
508
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200509static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
510{
511 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
512 unsigned char msg[1] = {
513 0x07
514 };
515
516 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
517}
518
519static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
520 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200521 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
522{
523 /* GPRS Network Service, PDU type: NS_UNITDATA */
524 unsigned char msg[4096] = {
525 0x00, 0x00, 0x00, 0x00
526 };
527
528 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
529
530 msg[2] = nsbvci / 256;
531 msg[3] = nsbvci % 256;
532 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
533
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200534 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200535}
536
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200537static void send_bssgp_ul_unitdata(
538 struct gprs_ns_inst *nsi, const char *text,
539 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
540 struct gprs_ra_id *raid, uint16_t cell_id,
541 const uint8_t *llc_msg, size_t llc_msg_size)
542{
543 /* GPRS Network Service, PDU type: NS_UNITDATA */
544 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
545 unsigned char msg[4096] = {
546 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
547 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
548 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
549 };
550
551 size_t bssgp_msg_size = 23 + llc_msg_size;
552
553 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
554
555 gsm48_construct_ra(msg + 10, raid);
556 msg[1] = (uint8_t)(tlli >> 24);
557 msg[2] = (uint8_t)(tlli >> 16);
558 msg[3] = (uint8_t)(tlli >> 8);
559 msg[4] = (uint8_t)(tlli >> 0);
560 msg[16] = cell_id / 256;
561 msg[17] = cell_id % 256;
562 msg[21] = llc_msg_size / 256;
563 msg[22] = llc_msg_size % 256;
564 memcpy(msg + 23, llc_msg, llc_msg_size);
565
566 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
567 src_addr, nsbvci, msg, bssgp_msg_size);
568}
569
570static void send_bssgp_dl_unitdata(
571 struct gprs_ns_inst *nsi, const char *text,
572 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
573 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
574 const uint8_t *llc_msg, size_t llc_msg_size)
575{
576 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
577 unsigned char msg[4096] = {
578 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
579 0x16, 0x82, 0x02, 0x58,
580 };
581 unsigned char racap_drx[] = {
582 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
583 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
584 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
585 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
586 };
587
588 size_t bssgp_msg_size = 0;
589
590 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
591
592 msg[1] = (uint8_t)(tlli >> 24);
593 msg[2] = (uint8_t)(tlli >> 16);
594 msg[3] = (uint8_t)(tlli >> 8);
595 msg[4] = (uint8_t)(tlli >> 0);
596
597 bssgp_msg_size = 12;
598
599 if (with_racap_drx) {
600 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
601 bssgp_msg_size += sizeof(racap_drx);
602 }
603
604 if (imsi) {
605 OSMO_ASSERT(imsi_size <= 127);
606 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
607 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
608 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
609 bssgp_msg_size += 2 + imsi_size;
610 }
611
612 if ((bssgp_msg_size % 4) != 0) {
613 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
614 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
615 msg[bssgp_msg_size + 1] = 0x80 | abytes;
616 memset(msg + bssgp_msg_size + 2, 0, abytes);
617 bssgp_msg_size += 2 + abytes;
618 }
619
620 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
621 if (llc_msg_size < 128) {
622 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
623 bssgp_msg_size += 2;
624 } else {
625 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
626 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
627 bssgp_msg_size += 3;
628 }
629 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
630 bssgp_msg_size += llc_msg_size;
631
632
633 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
634 src_addr, nsbvci, msg, bssgp_msg_size);
635}
636
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200637static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
638 uint16_t bvci)
639{
640 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
641 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200642 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200643 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200644 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
645 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200646 };
647
648 msg[3] = bvci / 256;
649 msg[4] = bvci % 256;
650
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200651 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
652}
653
654static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
655 struct sockaddr_in *src_addr, uint16_t bvci)
656{
657 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
658 * BSSGP RESET_ACK */
659 static unsigned char msg[5] = {
660 0x23, 0x04, 0x82, 0x00,
661 0x00
662 };
663
664 msg[3] = bvci / 256;
665 msg[4] = bvci % 256;
666
667 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200668}
669
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200670static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
671 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200672 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200673 struct gprs_ra_id *raid)
674{
675 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
676 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200677 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
678 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200679 };
680
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200681 msg[3] = (uint8_t)(tlli >> 24);
682 msg[4] = (uint8_t)(tlli >> 16);
683 msg[5] = (uint8_t)(tlli >> 8);
684 msg[6] = (uint8_t)(tlli >> 0);
685
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200686 gsm48_construct_ra(msg + 9, raid);
687
688 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
689}
690
691static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
692 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200693 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200694 struct gprs_ra_id *raid)
695{
696 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
697 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200698 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
699 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200700 0x81, 0x01
701 };
702
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200703 msg[3] = (uint8_t)(tlli >> 24);
704 msg[4] = (uint8_t)(tlli >> 16);
705 msg[5] = (uint8_t)(tlli >> 8);
706 msg[6] = (uint8_t)(tlli >> 0);
707
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200708 gsm48_construct_ra(msg + 9, raid);
709
710 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
711}
712
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200713static void send_bssgp_llc_discarded(struct gprs_ns_inst *nsi,
714 struct sockaddr_in *src_addr,
715 uint16_t bvci, uint32_t tlli,
716 unsigned n_frames, unsigned n_octets)
717{
718 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
719 unsigned char msg[] = {
720 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
721 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
722 /* n octets */ 0xff, 0xff, 0xff
723 };
724
725 msg[3] = (uint8_t)(tlli >> 24);
726 msg[4] = (uint8_t)(tlli >> 16);
727 msg[5] = (uint8_t)(tlli >> 8);
728 msg[6] = (uint8_t)(tlli >> 0);
729 msg[9] = (uint8_t)(n_frames);
730 msg[12] = (uint8_t)(bvci >> 8);
731 msg[13] = (uint8_t)(bvci >> 0);
732 msg[16] = (uint8_t)(n_octets >> 16);
733 msg[17] = (uint8_t)(n_octets >> 8);
734 msg[18] = (uint8_t)(n_octets >> 0);
735
736 send_ns_unitdata(nsi, "LLC_DISCARDED", src_addr, 0, msg, sizeof(msg));
737}
738
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200739static void send_bssgp_paging(struct gprs_ns_inst *nsi,
740 struct sockaddr_in *src_addr,
741 const uint8_t *imsi, size_t imsi_size,
742 struct gprs_ra_id *raid, uint32_t ptmsi)
743{
744 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
745 unsigned char msg[100] = {
746 0x06,
747 };
748
749 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
750 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
751
752 size_t bssgp_msg_size = 1;
753
754 if (imsi) {
755 OSMO_ASSERT(imsi_size <= 127);
756 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
757 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
758 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
759 bssgp_msg_size += 2 + imsi_size;
760 }
761
762 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
763 bssgp_msg_size += sizeof(drx_ie);
764
765 if (raid) {
766 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
767 msg[bssgp_msg_size+1] = 0x86;
768 gsm48_construct_ra(msg + bssgp_msg_size + 2, raid);
769 bssgp_msg_size += 8;
770 }
771
772 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
773 bssgp_msg_size += sizeof(qos_ie);
774
775 if (ptmsi != GSM_RESERVED_TMSI) {
776 const uint32_t ptmsi_be = htonl(ptmsi);
777 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
778 msg[bssgp_msg_size+1] = 0x84;
779 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
780 bssgp_msg_size += 6;
781 }
782
783 send_ns_unitdata(nsi, "PAGING_PS", src_addr, 0, msg, bssgp_msg_size);
784}
785
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200786static void send_bssgp_flow_control_bvc(struct gprs_ns_inst *nsi,
787 struct sockaddr_in *src_addr,
788 uint16_t bvci, uint8_t tag)
789{
790 /* GPRS Network Service, PDU type: NS_UNITDATA,
791 * BSSGP FLOW_CONTROL_BVC */
792 unsigned char msg[] = {
793 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
794 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
795 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
796 };
797
798 msg[3] = tag;
799
800 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", src_addr, bvci,
801 msg, sizeof(msg));
802}
803
804static void send_bssgp_flow_control_bvc_ack(struct gprs_ns_inst *nsi,
805 struct sockaddr_in *src_addr,
806 uint16_t bvci, uint8_t tag)
807{
808 /* GPRS Network Service, PDU type: NS_UNITDATA,
809 * BSSGP FLOW_CONTROL_BVC_ACK */
810 unsigned char msg[] = {
811 0x27, 0x1e, 0x81, /* Tag */ 0xce
812 };
813
814 msg[3] = tag;
815
816 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", src_addr, bvci,
817 msg, sizeof(msg));
818}
819
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200820static void send_llc_ul_ui(
821 struct gprs_ns_inst *nsi, const char *text,
822 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
823 struct gprs_ra_id *raid, uint16_t cell_id,
824 unsigned sapi, unsigned nu,
825 const uint8_t *msg, size_t msg_size)
826{
827 unsigned char llc_msg[4096] = {
828 0x00, 0xc0, 0x01
829 };
830
831 size_t llc_msg_size = 3 + msg_size + 3;
832 uint8_t e_bit = 0;
833 uint8_t pm_bit = 1;
834 unsigned fcs;
835
836 nu &= 0x01ff;
837
838 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
839
840 llc_msg[0] = (sapi & 0x0f);
841 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
842 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
843
844 memcpy(llc_msg + 3, msg, msg_size);
845
846 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
847 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
848 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
849 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
850
851 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
852 src_addr, nsbvci, tlli, raid, cell_id,
853 llc_msg, llc_msg_size);
854}
855
856static void send_llc_dl_ui(
857 struct gprs_ns_inst *nsi, const char *text,
858 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
859 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
860 unsigned sapi, unsigned nu,
861 const uint8_t *msg, size_t msg_size)
862{
863 /* GPRS Network Service, PDU type: NS_UNITDATA */
864 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
865 unsigned char llc_msg[4096] = {
866 0x00, 0x00, 0x01
867 };
868
869 size_t llc_msg_size = 3 + msg_size + 3;
870 uint8_t e_bit = 0;
871 uint8_t pm_bit = 1;
872 unsigned fcs;
873
874 nu &= 0x01ff;
875
876 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
877
878 llc_msg[0] = 0x40 | (sapi & 0x0f);
879 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
880 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
881
882 memcpy(llc_msg + 3, msg, msg_size);
883
884 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
885 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
886 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
887 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
888
889 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
890 src_addr, nsbvci, tlli,
891 with_racap_drx, imsi, imsi_size,
892 llc_msg, llc_msg_size);
893}
894
895
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200896static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
897 uint16_t nsvci, uint16_t nsei)
898{
899 printf("Setup NS-VC: remote 0x%08x:%d, "
900 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
901 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
902 nsvci, nsvci, nsei, nsei);
903
904 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
905 send_ns_alive(nsi, src_addr);
906 send_ns_unblock(nsi, src_addr);
907 send_ns_alive_ack(nsi, src_addr);
908}
909
910static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
911 uint16_t bvci)
912{
913 printf("Setup BSSGP: remote 0x%08x:%d, "
914 "BVCI 0x%04x(%d)\n\n",
915 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
916 bvci, bvci);
917
918 send_bssgp_reset(nsi, src_addr, bvci);
919}
920
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200921static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer,
922 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200923{
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200924 gprs_ns_nsip_connect(nsi, sgsn_peer, sgsn_nsei, sgsn_nsei+1);
925 send_ns_reset_ack(nsi, sgsn_peer, sgsn_nsei+1, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200926 send_ns_alive_ack(nsi, sgsn_peer);
927 send_ns_unblock_ack(nsi, sgsn_peer);
928 send_ns_alive(nsi, sgsn_peer);
929}
930
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200931static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
932{
933 sgsn_peer->sin_family = AF_INET;
934 sgsn_peer->sin_port = htons(32000);
935 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
936}
937
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200938static void configure_sgsn2_peer(struct sockaddr_in *sgsn_peer)
939{
940 sgsn_peer->sin_family = AF_INET;
941 sgsn_peer->sin_port = htons(32001);
942 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN2_ADDR);
943}
944
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200945static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
946{
947 size_t i;
948
949 for (i = 0; i < size; ++i) {
950 bss_peers[i].sin_family = AF_INET;
951 bss_peers[i].sin_port = htons((i + 1) * 1111);
952 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
953 }
954}
955
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200956int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
957 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
958
959/* override */
960int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
961 struct msgb *msg, uint16_t bvci)
962{
Holger Hans Peter Freytherdaaea0c2015-08-03 09:28:41 +0200963 printf("CALLBACK, event %d, msg length %zu, bvci 0x%04x\n%s\n\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200964 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200965 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200966
967 switch (event) {
968 case GPRS_NS_EVT_UNIT_DATA:
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +0200969 return gbprox_rcvmsg(&gbcfg, msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200970 default:
971 break;
972 }
973 return 0;
974}
975
976/* override */
977ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
978 const struct sockaddr *dest_addr, socklen_t addrlen)
979{
980 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
981 const struct sockaddr *, socklen_t);
982 static sendto_t real_sendto = NULL;
983 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200984 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200985
986 if (!real_sendto)
987 real_sendto = dlsym(RTLD_NEXT, "sendto");
988
989 if (dest_host == REMOTE_BSS_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -0400990 printf("MESSAGE to BSS at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200991 dest_host, dest_port,
992 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200993 else if (dest_host == REMOTE_SGSN_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -0400994 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200995 dest_host, dest_port,
996 len, osmo_hexdump(buf, len));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200997 else if (dest_host == REMOTE_SGSN2_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -0400998 printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200999 dest_host, dest_port,
1000 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001001 else
1002 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
1003
1004 return len;
1005}
1006
1007/* override */
1008int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
1009{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001010 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
1011 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001012 uint16_t bvci = msgb_bvci(msg);
1013 uint16_t nsei = msgb_nsei(msg);
1014
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001015 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001016
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001017 if (!real_gprs_ns_sendmsg)
1018 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
1019
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001020 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001021 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001022 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001023 bvci, len, __func__);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001024 else if (nsei == SGSN2_NSEI)
1025 printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001026 "msg length %zu (%s)\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001027 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001028 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001029 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001030 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001031 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001032
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001033 if (received_messages) {
1034 struct msgb *msg_copy;
1035 msg_copy = gprs_msgb_copy(msg, "received_messages");
1036 llist_add_tail(&msg_copy->list, received_messages);
1037 }
1038
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001039 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001040}
1041
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001042/* Get the next message from the receive FIFO
1043 *
1044 * \returns a pointer to the message which will be invalidated at the next call
1045 * to expect_msg. Returns NULL, if there is no message left.
1046 */
1047static struct msgb *expect_msg(void)
1048{
1049 static struct msgb *msg = NULL;
1050
1051 msgb_free(msg);
1052 msg = NULL;
1053
1054 if (!received_messages)
1055 return NULL;
1056
1057 if (llist_empty(received_messages))
1058 return NULL;
1059
1060 msg = llist_entry(received_messages->next, struct msgb, list);
1061 llist_del(&msg->list);
1062
1063 return msg;
1064}
1065
1066struct expect_result {
1067 struct msgb *msg;
1068 struct gprs_gb_parse_context parse_ctx;
1069};
1070
1071static struct expect_result *expect_bssgp_msg(
1072 int match_nsei, int match_bvci, int match_pdu_type)
1073{
1074 static struct expect_result result;
1075 static const struct expect_result empty_result = {0,};
1076 static struct msgb *msg;
1077 uint16_t nsei;
1078 int rc;
1079
1080 memcpy(&result, &empty_result, sizeof(result));
1081
1082 msg = expect_msg();
1083 if (!msg)
1084 return NULL;
1085
1086 nsei = msgb_nsei(msg);
1087
1088 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1089 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1090 __func__, match_nsei, nsei);
1091 return NULL;
1092 }
1093
1094 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1095 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1096 __func__, match_bvci, msgb_bvci(msg));
1097 return NULL;
1098 }
1099
1100 result.msg = msg;
1101
1102 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1103 result.parse_ctx.peer_nsei = nsei;
1104
1105 if (!msgb_bssgph(msg)) {
1106 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1107 return NULL;
1108 }
1109
1110 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1111 &result.parse_ctx);
1112
1113 if (!rc) {
1114 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1115 return NULL;
1116 }
1117
1118 if (match_pdu_type != MATCH_ANY &&
1119 match_pdu_type != result.parse_ctx.pdu_type) {
1120 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1121 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1122 return NULL;
1123 }
1124
1125 return &result;
1126}
1127
1128static struct expect_result *expect_llc_msg(
1129 int match_nsei, int match_bvci, int match_sapi, int match_type)
1130{
1131 static struct expect_result *result;
1132
1133 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1134 if (!result)
1135 return NULL;
1136
1137 if (!result->parse_ctx.llc) {
1138 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1139 return NULL;
1140 }
1141
1142 if (match_sapi != MATCH_ANY &&
1143 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1144 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1145 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1146 return NULL;
1147 }
1148
1149 if (match_type != MATCH_ANY &&
1150 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1151 fprintf(stderr,
1152 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1153 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1154 return NULL;
1155 }
1156
1157 return result;
1158}
1159
1160static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1161 int match_type)
1162{
1163 static struct expect_result *result;
1164
1165 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1166 if (!result)
1167 return NULL;
1168
1169 if (!result->parse_ctx.g48_hdr) {
1170 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1171 return NULL;
1172 }
1173
1174 if (match_type != MATCH_ANY &&
1175 match_type != result->parse_ctx.g48_hdr->msg_type) {
1176 fprintf(stderr,
1177 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1178 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1179 return NULL;
1180 }
1181
1182 return result;
1183}
1184
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001185static void dump_rate_ctr_group(FILE *stream, const char *prefix,
1186 struct rate_ctr_group *ctrg)
1187{
1188 unsigned int i;
1189
1190 for (i = 0; i < ctrg->desc->num_ctr; i++) {
1191 struct rate_ctr *ctr = &ctrg->ctr[i];
1192 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
1193 fprintf(stream, " %s%s: %llu%s",
1194 prefix, ctrg->desc->ctr_desc[i].description,
1195 (long long)ctr->current,
1196 "\n");
1197 };
1198}
1199
1200/* Signal handler for signals from NS layer */
1201static int test_signal(unsigned int subsys, unsigned int signal,
1202 void *handler_data, void *signal_data)
1203{
1204 struct ns_signal_data *nssd = signal_data;
1205 int rc;
1206
1207 if (subsys != SS_L_NS)
1208 return 0;
1209
1210 switch (signal) {
1211 case S_NS_RESET:
1212 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
1213 nssd->nsvc->nsvci,
1214 gprs_ns_ll_str(nssd->nsvc));
1215 break;
1216
1217 case S_NS_ALIVE_EXP:
1218 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
1219 nssd->nsvc->nsvci,
1220 gprs_ns_ll_str(nssd->nsvc));
1221 break;
1222
1223 case S_NS_BLOCK:
1224 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
1225 nssd->nsvc->nsvci,
1226 gprs_ns_ll_str(nssd->nsvc));
1227 break;
1228
1229 case S_NS_UNBLOCK:
1230 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
1231 nssd->nsvc->nsvci,
1232 gprs_ns_ll_str(nssd->nsvc));
1233 break;
1234
1235 case S_NS_REPLACED:
1236 printf("==> got signal NS_REPLACED: 0x%04x/%s",
1237 nssd->nsvc->nsvci,
1238 gprs_ns_ll_str(nssd->nsvc));
1239 printf(" -> 0x%04x/%s\n",
1240 nssd->old_nsvc->nsvci,
1241 gprs_ns_ll_str(nssd->old_nsvc));
1242 break;
1243
1244 default:
1245 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
1246 nssd->nsvc->nsvci,
1247 gprs_ns_ll_str(nssd->nsvc));
1248 break;
1249 }
1250 printf("\n");
1251 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
1252 return rc;
1253}
1254
1255static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
1256{
1257 struct msgb *msg;
1258 int ret;
1259 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001260 fprintf(stderr, "message too long: %zu\n", data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001261 return -1;
1262 }
1263
1264 msg = gprs_ns_msgb_alloc();
1265 memmove(msg->data, data, data_len);
1266 msg->l2h = msg->data;
1267 msgb_put(msg, data_len);
1268
1269 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
1270 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1271 osmo_hexdump(data, data_len));
1272
1273 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
1274
1275 printf("result (%s) = %d\n\n", text, ret);
1276
1277 msgb_free(msg);
1278
1279 return ret;
1280}
1281
1282static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
1283{
1284 struct gprs_nsvc *nsvc;
1285
1286 printf("Current NS-VCIs:\n");
1287 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
1288 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001289 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001290 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001291 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1292 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
1293 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001294 );
1295 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
1296 }
1297 printf("\n");
1298}
1299
1300static void test_gbproxy()
1301{
1302 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1303 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001304 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001305
1306 bssgp_nsi = nsi;
1307 gbcfg.nsi = bssgp_nsi;
1308 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1309
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001310 configure_sgsn_peer(&sgsn_peer);
1311 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001312
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001313 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001314 printf("--- Initialise SGSN ---\n\n");
1315
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001316 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001317 gprs_dump_nsi(nsi);
1318
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001319 printf("--- Initialise BSS 1 ---\n\n");
1320
1321 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1322 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1323 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001324 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001325
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001326 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1327
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001328 printf("--- Initialise BSS 2 ---\n\n");
1329
1330 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
1331 setup_bssgp(nsi, &bss_peer[1], 0x2002);
1332 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001333 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001334
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001335 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
1336
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001337 printf("--- Move BSS 1 to new port ---\n\n");
1338
1339 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
1340 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001341 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001342
1343 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1344
1345 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1346 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001347 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001348
1349 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
1350
1351 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1352 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001353 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001354
1355 printf("--- Move BSS 2 to new port ---\n\n");
1356
1357 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
1358 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001359 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001360
1361 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1362
1363 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
1364 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001365 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001366
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001367 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
1368
1369 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1370 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001371 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001372
1373 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1374
1375 setup_bssgp(nsi, &bss_peer[0], 0x1012);
1376 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001377 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001378
1379 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
1380
1381 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1382
1383 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1384 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001385 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001386
1387 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1388
1389 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1390
1391 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1392 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001393 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001394
1395 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1396
1397 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1398
1399 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1400
1401 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1402
1403 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1404
1405 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1406
1407 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1408
1409 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1410
1411 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1412
1413 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1414
1415 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
1416
1417 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1418
1419 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
1420
1421 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1422
1423 setup_bssgp(nsi, &bss_peer[2], 0x1002);
1424 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001425 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001426
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001427 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001428
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001429 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1430
1431 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1432
1433 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1434
1435 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1436
1437 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1438
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001439 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1440
1441 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
1442
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001443 /* Find peer */
1444 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1445 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1446 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1447 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1448 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1449 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1450
1451
1452 /* Cleanup */
1453 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1454 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1455 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1456 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1457 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1458
1459 dump_peers(stdout, 0, 0, &gbcfg);
1460
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001461 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001462
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001463 gbprox_reset(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001464 gprs_ns_destroy(nsi);
1465 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001466}
1467
1468static void test_gbproxy_ident_changes()
1469{
1470 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1471 struct sockaddr_in bss_peer[1] = {{0},};
1472 struct sockaddr_in sgsn_peer= {0};
1473 uint16_t nsei[2] = {0x1000, 0x2000};
1474 uint16_t nsvci[2] = {0x1001, 0x2001};
1475 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
1476
1477 bssgp_nsi = nsi;
1478 gbcfg.nsi = bssgp_nsi;
1479 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1480
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001481 configure_sgsn_peer(&sgsn_peer);
1482 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001483
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001484 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001485 printf("--- Initialise SGSN ---\n\n");
1486
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001487 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001488 gprs_dump_nsi(nsi);
1489
1490 printf("--- Initialise BSS 1 ---\n\n");
1491
1492 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
1493 gprs_dump_nsi(nsi);
1494
1495 printf("--- Setup BVCI 1 ---\n\n");
1496
1497 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1498 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001499 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001500
1501 printf("--- Setup BVCI 2 ---\n\n");
1502
1503 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
1504 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001505 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001506
1507 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1508
1509 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1510 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1511
1512 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1513
1514 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
1515 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
1516
1517 printf("--- Change NSEI ---\n\n");
1518
1519 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
1520 gprs_dump_nsi(nsi);
1521
1522 printf("--- Setup BVCI 1 ---\n\n");
1523
1524 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1525 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001526 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001527
1528 printf("--- Setup BVCI 3 ---\n\n");
1529
1530 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
1531 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001532 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001533
1534 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1535
1536 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1537 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1538
1539 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1540 " (should fail) ---\n\n");
1541
1542 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001543 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001544 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001545 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001546
1547 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1548
1549 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1550 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1551
1552 printf("--- Change NSVCI ---\n\n");
1553
1554 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
1555 gprs_dump_nsi(nsi);
1556
1557 printf("--- Setup BVCI 1 ---\n\n");
1558
1559 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1560 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001561 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001562
1563 printf("--- Setup BVCI 4 ---\n\n");
1564
1565 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
1566 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001567 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001568
1569 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1570
1571 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1572 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1573
1574 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1575 " (should fail) ---\n\n");
1576
1577 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001578 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001579 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001580 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001581
1582 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1583
1584 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1585 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1586
1587 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
1588
1589 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
1590 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
1591
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001592 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001593 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001594
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001595 gbprox_reset(&gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001596 gprs_ns_destroy(nsi);
1597 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001598}
1599
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001600static void test_gbproxy_ra_patching()
1601{
1602 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1603 struct sockaddr_in bss_peer[1] = {{0},};
1604 struct sockaddr_in sgsn_peer= {0};
1605 struct gprs_ra_id rai_bss =
1606 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1607 struct gprs_ra_id rai_sgsn =
1608 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1609 struct gprs_ra_id rai_unknown =
1610 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001611 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001612 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001613 const uint32_t ptmsi = 0xefe2b700;
1614 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001615 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001616 const uint32_t foreign_tlli2 = 0xbb00beef;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001617 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001618 const char *patch_re = "^9898|^121314";
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001619 struct gbproxy_link_info *link_info;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001620 struct gbproxy_peer *peer;
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001621 LLIST_HEAD(rcv_list);
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001622 struct expect_result *expect_res;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001623
1624 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001625
1626 bssgp_nsi = nsi;
1627 gbcfg.nsi = bssgp_nsi;
1628 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Jacob Erlbeck67a44452014-05-19 10:14:58 +02001629 gbcfg.core_mcc = 123;
1630 gbcfg.core_mnc = 456;
Jacob Erlbeck73685282014-05-23 20:48:07 +02001631 gbcfg.core_apn = talloc_zero_size(NULL, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001632 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001633 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001634
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001635 configure_sgsn_peer(&sgsn_peer);
1636 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001637
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001638 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING],
1639 patch_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001640 fprintf(stderr, "Failed to compile RE '%s': %s\n",
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001641 patch_re, err_msg);
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001642 exit(1);
1643 }
1644
1645
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001646 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001647 printf("--- Initialise SGSN ---\n\n");
1648
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001649 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001650 gprs_dump_nsi(nsi);
1651
1652 printf("--- Initialise BSS 1 ---\n\n");
1653
1654 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001655
1656 received_messages = &rcv_list;
1657
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001658 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1659 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001660 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001661
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001662 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001663 OSMO_ASSERT(peer != NULL);
1664
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001665 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_BVC_RESET));
1666
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001667 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1668
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001669 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_BVC_RESET_ACK));
1670
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001671 send_bssgp_suspend(nsi, &bss_peer[0], 0xccd1758b, &rai_bss);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001672
1673 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_SUSPEND));
1674
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001675 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001676
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001677 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_SUSPEND_ACK));
1678
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001679 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001680 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001681
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001682 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1683 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1684
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001685 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1686
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001687 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1688 foreign_tlli, &rai_bss, cell_id,
1689 GPRS_SAPI_GMM, 0,
1690 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001691
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001692 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001693 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001694
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001695 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1696 foreign_tlli, 0, NULL, 0,
1697 GPRS_SAPI_GMM, 0,
1698 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001699
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001700 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
1701
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001702 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1703 foreign_tlli, &rai_bss, cell_id,
1704 GPRS_SAPI_GMM, 3,
1705 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001706
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001707 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
1708
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001709 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1710 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1711
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001712 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1713 foreign_tlli, 1, imsi, sizeof(imsi),
1714 GPRS_SAPI_GMM, 1,
1715 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001716
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001717 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
1718
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001719 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1720
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001721 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1722 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1723 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1724
1725 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1726 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1727 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1728
1729 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1730 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1731 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1732
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001733 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1734 OSMO_ASSERT(link_info);
1735 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1736 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1737 OSMO_ASSERT(!link_info->tlli.bss_validated);
1738 OSMO_ASSERT(!link_info->tlli.net_validated);
1739 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1740 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1741 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1742 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001743
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001744 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1745 local_tlli, &rai_bss, cell_id,
1746 GPRS_SAPI_GMM, 4,
1747 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001748
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001749 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
1750
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001751 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1752
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001753 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1754 OSMO_ASSERT(link_info);
1755 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1756 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1757 OSMO_ASSERT(link_info->tlli.bss_validated);
1758 OSMO_ASSERT(!link_info->tlli.net_validated);
1759 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1760 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1761 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1762 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001763
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001764 /* Replace APN (1) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001765 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1766 local_tlli, &rai_bss, cell_id,
1767 GPRS_SAPI_GMM, 3,
1768 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001769
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001770 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1771
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001772 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1773
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001774 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1775 OSMO_ASSERT(link_info);
1776 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1777 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1778 OSMO_ASSERT(link_info->tlli.bss_validated);
1779 OSMO_ASSERT(!link_info->tlli.net_validated);
1780 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1781 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1782 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1783 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001784
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001785 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1786 local_tlli, 1, imsi, sizeof(imsi),
1787 GPRS_SAPI_GMM, 2,
1788 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001789
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001790 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
1791
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001792 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1793
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001794 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1795 OSMO_ASSERT(link_info);
1796 OSMO_ASSERT(link_info->tlli.assigned == 0);
1797 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1798 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1799 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001800
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001801 /* Replace APN (2) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001802 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1803 local_tlli, &rai_bss, cell_id,
1804 GPRS_SAPI_GMM, 3,
1805 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001806
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001807 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1808 OSMO_ASSERT(expect_res != NULL);
1809 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == gbcfg.core_apn_size + 2);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001810
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001811 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1812
Jacob Erlbeck73685282014-05-23 20:48:07 +02001813 gbcfg.core_apn[0] = 0;
1814 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001815
1816 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001817 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1818 local_tlli, &rai_bss, cell_id,
1819 GPRS_SAPI_GMM, 3,
1820 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001821
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001822 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1823 OSMO_ASSERT(expect_res != NULL);
1824 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001825
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001826 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1827
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001828 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001829
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001830 /* Detach */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001831 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1832 local_tlli, &rai_bss, cell_id,
1833 GPRS_SAPI_GMM, 6,
1834 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001835
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001836 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1837
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001838 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1839 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1840
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001841 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1842 local_tlli, 1, imsi, sizeof(imsi),
1843 GPRS_SAPI_GMM, 5,
1844 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001845
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001846 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
1847
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001848 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001849
1850 printf("--- RA update ---\n\n");
1851
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001852 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
1853 foreign_tlli, &rai_bss, 0x7080,
1854 GPRS_SAPI_GMM, 5,
1855 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001856
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001857 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
1858
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001859 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1860
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001861 send_llc_dl_ui(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
1862 foreign_tlli, 1, imsi, sizeof(imsi),
1863 GPRS_SAPI_GMM, 6,
1864 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001865
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001866 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_ACK));
1867
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001868 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1869
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001870 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001871 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1872 local_tlli, &rai_bss, cell_id,
1873 GPRS_SAPI_GMM, 3,
1874 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001875
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001876 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1877 OSMO_ASSERT(expect_res != NULL);
1878 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001879
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001880 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1881
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001882 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001883
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001884 /* Detach (power off -> no Detach Accept) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001885 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", &bss_peer[0], 0x1002,
1886 local_tlli, &rai_bss, cell_id,
1887 GPRS_SAPI_GMM, 6,
1888 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001889
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001890 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1891
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001892 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1893
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001894 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001895 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001896
1897 printf("--- Bad cases ---\n\n");
1898
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001899 /* The RAI in the Attach Request message differs from the RAI in the
1900 * BSSGP message, only patch the latter */
1901
1902 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", &bss_peer[0], 0x1002,
1903 foreign_tlli2, &rai_bss, cell_id,
1904 GPRS_SAPI_GMM, 0,
1905 dtap_attach_req2, sizeof(dtap_attach_req2));
1906
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001907 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
1908
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001909 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1910
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001911 printf("TLLI is already detached, shouldn't patch\n");
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001912 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", &bss_peer[0], 0x1002,
1913 local_tlli, &rai_bss, cell_id,
1914 GPRS_SAPI_GMM, 3,
1915 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001916
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001917 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1918
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001919 printf("Invalid RAI, shouldn't patch\n");
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001920 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001921
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001922 /* TODO: The following breaks with the current libosmocore, enable it
1923 * again (and remove the plain expect_msg), when the msgb_bssgph patch
1924 * is integrated */
1925 /* OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_STATUS)); */
1926 OSMO_ASSERT(expect_msg());
1927
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001928 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001929 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001930
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001931 OSMO_ASSERT(!expect_msg());
1932 received_messages = NULL;
1933
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02001934 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING]);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001935 gbprox_reset(&gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001936 gprs_ns_destroy(nsi);
1937 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001938}
1939
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001940static void test_gbproxy_ptmsi_assignment()
1941{
1942 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
1943 struct sockaddr_in bss_peer[1] = {{0},};
1944 struct sockaddr_in sgsn_peer= {0};
1945 struct gprs_ra_id rai_bss =
1946 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1947 struct gprs_ra_id rai_unknown =
1948 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1949 uint16_t cell_id = 0x1234;
1950
1951 const uint32_t ptmsi = 0xefe2b700;
1952 const uint32_t local_tlli = 0xefe2b700;
1953
1954 const uint32_t foreign_tlli1 = 0x8000dead;
1955 const uint32_t foreign_tlli2 = 0x8000beef;
1956
1957 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
1958 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
1959
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001960 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001961 struct gbproxy_peer *peer;
1962 unsigned bss_nu = 0;
1963 unsigned sgsn_nu = 0;
1964
1965 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
1966
1967 bssgp_nsi = nsi;
1968 gbcfg.nsi = bssgp_nsi;
1969 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1970 gbcfg.core_mcc = 0;
1971 gbcfg.core_mnc = 0;
1972 gbcfg.core_apn = talloc_zero_size(NULL, 100);
1973 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1974 gbcfg.patch_ptmsi = 0;
1975 gbcfg.bss_ptmsi_state = 0;
1976 gbcfg.sgsn_tlli_state = 1;
1977
1978 configure_sgsn_peer(&sgsn_peer);
1979 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
1980
1981 printf("=== %s ===\n", __func__);
1982 printf("--- Initialise SGSN ---\n\n");
1983
1984 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
1985
1986 printf("--- Initialise BSS 1 ---\n\n");
1987
1988 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1989 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1990
1991 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
1992 OSMO_ASSERT(peer != NULL);
1993
1994 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1995
1996 gprs_dump_nsi(nsi);
1997 dump_global(stdout, 0);
1998 dump_peers(stdout, 0, 0, &gbcfg);
1999
2000 printf("--- Establish first LLC connection ---\n\n");
2001
2002 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2003 foreign_tlli1, &rai_unknown, cell_id,
2004 GPRS_SAPI_GMM, bss_nu++,
2005 dtap_attach_req, sizeof(dtap_attach_req));
2006
2007 dump_peers(stdout, 0, 0, &gbcfg);
2008
2009 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2010 foreign_tlli1, 0, NULL, 0,
2011 GPRS_SAPI_GMM, sgsn_nu++,
2012 dtap_identity_req, sizeof(dtap_identity_req));
2013
2014 dump_peers(stdout, 0, 0, &gbcfg);
2015
2016 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2017 foreign_tlli1, &rai_bss, cell_id,
2018 GPRS_SAPI_GMM, bss_nu++,
2019 dtap_identity_resp, sizeof(dtap_identity_resp));
2020
2021 dump_peers(stdout, 0, 0, &gbcfg);
2022
2023 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2024 foreign_tlli1, 1, imsi1, sizeof(imsi1),
2025 GPRS_SAPI_GMM, sgsn_nu++,
2026 dtap_attach_acc, sizeof(dtap_attach_acc));
2027
2028 dump_peers(stdout, 0, 0, &gbcfg);
2029
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002030 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
2031 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2032 OSMO_ASSERT(link_info);
2033 OSMO_ASSERT(link_info == link_info2);
2034 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2035 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2036 OSMO_ASSERT(!link_info->tlli.bss_validated);
2037 OSMO_ASSERT(!link_info->tlli.net_validated);
2038 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002039
2040 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2041 local_tlli, &rai_bss, cell_id,
2042 GPRS_SAPI_GMM, bss_nu++,
2043 dtap_attach_complete, sizeof(dtap_attach_complete));
2044
2045 dump_peers(stdout, 0, 0, &gbcfg);
2046
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002047 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2048 OSMO_ASSERT(link_info);
2049 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2050 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2051 OSMO_ASSERT(link_info->tlli.bss_validated);
2052 OSMO_ASSERT(!link_info->tlli.net_validated);
2053 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002054
2055
2056 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2057 local_tlli, 1, imsi1, sizeof(imsi1),
2058 GPRS_SAPI_GMM, sgsn_nu++,
2059 dtap_gmm_information, sizeof(dtap_gmm_information));
2060
2061 dump_peers(stdout, 0, 0, &gbcfg);
2062
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002063 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
2064 OSMO_ASSERT(link_info);
2065 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2066 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002067
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002068 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2069 OSMO_ASSERT(link_info == link_info2);
2070 OSMO_ASSERT(link_info->tlli.assigned == 0);
2071 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2072 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002073
2074 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
2075
2076 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2077 foreign_tlli2, &rai_unknown, cell_id,
2078 GPRS_SAPI_GMM, bss_nu++,
2079 dtap_attach_req, sizeof(dtap_attach_req));
2080
2081 dump_peers(stdout, 0, 0, &gbcfg);
2082
2083 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2084 foreign_tlli2, 0, NULL, 0,
2085 GPRS_SAPI_GMM, sgsn_nu++,
2086 dtap_identity_req, sizeof(dtap_identity_req));
2087
2088 dump_peers(stdout, 0, 0, &gbcfg);
2089
2090 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2091 foreign_tlli2, &rai_bss, cell_id,
2092 GPRS_SAPI_GMM, bss_nu++,
2093 dtap_identity2_resp, sizeof(dtap_identity2_resp));
2094
2095 dump_peers(stdout, 0, 0, &gbcfg);
2096
2097 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2098 foreign_tlli2, 1, imsi2, sizeof(imsi2),
2099 GPRS_SAPI_GMM, sgsn_nu++,
2100 dtap_attach_acc, sizeof(dtap_attach_acc));
2101
2102 dump_peers(stdout, 0, 0, &gbcfg);
2103
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002104 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
2105 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2106 OSMO_ASSERT(link_info);
2107 OSMO_ASSERT(link_info == link_info2);
2108 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2109 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2110 OSMO_ASSERT(!link_info->tlli.bss_validated);
2111 OSMO_ASSERT(!link_info->tlli.net_validated);
2112 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002113
2114 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2115 local_tlli, &rai_bss, cell_id,
2116 GPRS_SAPI_GMM, bss_nu++,
2117 dtap_attach_complete, sizeof(dtap_attach_complete));
2118
2119 dump_peers(stdout, 0, 0, &gbcfg);
2120
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002121 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2122 OSMO_ASSERT(link_info);
2123 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2124 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2125 OSMO_ASSERT(link_info->tlli.bss_validated);
2126 OSMO_ASSERT(!link_info->tlli.net_validated);
2127 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002128
2129 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2130 local_tlli, 1, imsi2, sizeof(imsi2),
2131 GPRS_SAPI_GMM, sgsn_nu++,
2132 dtap_gmm_information, sizeof(dtap_gmm_information));
2133
2134 dump_peers(stdout, 0, 0, &gbcfg);
2135
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002136 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
2137 OSMO_ASSERT(link_info);
2138 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2139 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002140
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002141 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2142 OSMO_ASSERT(link_info == link_info2);
2143 OSMO_ASSERT(link_info->tlli.assigned == 0);
2144 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2145 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002146
2147 dump_global(stdout, 0);
2148
2149 gbprox_reset(&gbcfg);
2150 gprs_ns_destroy(nsi);
2151 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002152
2153 cleanup_test();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002154}
2155
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002156static void test_gbproxy_ptmsi_patching()
2157{
2158 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2159 struct sockaddr_in bss_peer[1] = {{0},};
2160 struct sockaddr_in sgsn_peer= {0};
2161 struct gprs_ra_id rai_bss =
2162 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2163 struct gprs_ra_id rai_sgsn =
2164 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002165 struct gprs_ra_id rai_wrong_mcc_sgsn =
2166 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002167 struct gprs_ra_id rai_unknown =
2168 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2169 uint16_t cell_id = 0x1234;
2170
2171 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002172 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2173 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002174 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002175 const uint32_t local_sgsn_tlli2 = 0xe0987654;
2176 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002177 const uint32_t random_sgsn_tlli = 0x7c69fb81;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002178 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002179
2180 const uint32_t bss_ptmsi = 0xc00f7304;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002181 const uint32_t bss_ptmsi2 = 0xe656aa1f;
2182 const uint32_t bss_ptmsi3 = 0xead4775a;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002183 const uint32_t local_bss_tlli = 0xc00f7304;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002184 const uint32_t local_bss_tlli2 = 0xe656aa1f;
2185 const uint32_t local_bss_tlli3 = 0xead4775a;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002186 const uint32_t foreign_bss_tlli = 0x8000dead;
2187
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002188
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002189 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002190 struct gbproxy_link_info *link_info;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002191 struct gbproxy_peer *peer;
2192 unsigned bss_nu = 0;
2193 unsigned sgsn_nu = 0;
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002194 int old_ctr;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002195
2196 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002197 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2198 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
2199 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2200 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
2201 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002202
2203 bssgp_nsi = nsi;
2204 gbcfg.nsi = bssgp_nsi;
2205 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2206 gbcfg.core_mcc = 123;
2207 gbcfg.core_mnc = 456;
2208 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2209 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2210 gbcfg.patch_ptmsi = 1;
2211 gbcfg.bss_ptmsi_state = 0;
2212 gbcfg.sgsn_tlli_state = 1;
2213
2214 configure_sgsn_peer(&sgsn_peer);
2215 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2216
2217 printf("=== %s ===\n", __func__);
2218 printf("--- Initialise SGSN ---\n\n");
2219
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002220 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002221
2222 printf("--- Initialise BSS 1 ---\n\n");
2223
2224 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2225 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2226
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02002227 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002228 OSMO_ASSERT(peer != NULL);
2229
2230 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2231
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002232 gprs_dump_nsi(nsi);
2233 dump_global(stdout, 0);
2234 dump_peers(stdout, 0, 0, &gbcfg);
2235
2236 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2237
2238 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2239 foreign_bss_tlli, &rai_unknown, cell_id,
2240 GPRS_SAPI_GMM, bss_nu++,
2241 dtap_attach_req, sizeof(dtap_attach_req));
2242
2243 dump_peers(stdout, 0, 0, &gbcfg);
2244
2245 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2246 random_sgsn_tlli, 0, NULL, 0,
2247 GPRS_SAPI_GMM, sgsn_nu++,
2248 dtap_identity_req, sizeof(dtap_identity_req));
2249
2250 dump_peers(stdout, 0, 0, &gbcfg);
2251
2252 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2253 foreign_bss_tlli, &rai_bss, cell_id,
2254 GPRS_SAPI_GMM, bss_nu++,
2255 dtap_identity_resp, sizeof(dtap_identity_resp));
2256
2257 dump_peers(stdout, 0, 0, &gbcfg);
2258
2259 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2260 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2261 GPRS_SAPI_GMM, sgsn_nu++,
2262 dtap_attach_acc, sizeof(dtap_attach_acc));
2263
2264 dump_peers(stdout, 0, 0, &gbcfg);
2265
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002266 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2267 OSMO_ASSERT(link_info);
2268 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2269 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2270 OSMO_ASSERT(!link_info->tlli.bss_validated);
2271 OSMO_ASSERT(!link_info->tlli.net_validated);
2272 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2273 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2274 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2275 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2276 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2277 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002278
2279 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2280 local_bss_tlli, &rai_bss, cell_id,
2281 GPRS_SAPI_GMM, bss_nu++,
2282 dtap_attach_complete, sizeof(dtap_attach_complete));
2283
2284 dump_peers(stdout, 0, 0, &gbcfg);
2285
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002286 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2287 OSMO_ASSERT(link_info);
2288 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2289 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2290 OSMO_ASSERT(link_info->tlli.bss_validated);
2291 OSMO_ASSERT(!link_info->tlli.net_validated);
2292 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2293 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2294 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2295 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002296
2297 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2298 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2299 GPRS_SAPI_GMM, sgsn_nu++,
2300 dtap_gmm_information, sizeof(dtap_gmm_information));
2301
2302 dump_peers(stdout, 0, 0, &gbcfg);
2303
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002304 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2305 OSMO_ASSERT(link_info);
2306 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2307 OSMO_ASSERT(link_info->tlli.assigned == 0);
2308 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2309 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002310
Jacob Erlbeck82add782014-09-05 18:08:12 +02002311 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
2312 local_bss_tlli, &rai_bss, cell_id,
2313 GPRS_SAPI_GMM, bss_nu++,
2314 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2315
2316 dump_peers(stdout, 0, 0, &gbcfg);
2317
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002318 /* Non-DTAP */
2319 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2320 local_bss_tlli, &rai_bss, cell_id,
2321 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2322
2323 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2324 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2325 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2326
2327 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2328 local_bss_tlli, &rai_bss, cell_id,
2329 llc_ui_ll11_dns_query_ul,
2330 sizeof(llc_ui_ll11_dns_query_ul));
2331
2332 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2333 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2334 llc_ui_ll11_dns_resp_dl,
2335 sizeof(llc_ui_ll11_dns_resp_dl));
2336
2337 dump_peers(stdout, 0, 0, &gbcfg);
2338
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002339 /* Repeated RA Update Requests */
2340 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", &bss_peer[0], 0x1002,
2341 local_bss_tlli, &rai_bss, 0x7080,
2342 GPRS_SAPI_GMM, bss_nu++,
2343 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2344
2345 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", &sgsn_peer, 0x1002,
2346 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2347 GPRS_SAPI_GMM, sgsn_nu++,
2348 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2349
2350 dump_peers(stdout, 0, 0, &gbcfg);
2351
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002352 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2353 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2354 OSMO_ASSERT(link_info);
2355 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2356 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2357 OSMO_ASSERT(!link_info->tlli.bss_validated);
2358 OSMO_ASSERT(!link_info->tlli.net_validated);
2359 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2360 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2361 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2362 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2363 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2364 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002365
2366 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", &bss_peer[0], 0x1002,
2367 local_bss_tlli2, &rai_bss, 0x7080,
2368 GPRS_SAPI_GMM, bss_nu++,
2369 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2370
2371 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", &sgsn_peer, 0x1002,
2372 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2373 GPRS_SAPI_GMM, sgsn_nu++,
2374 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2375
2376 dump_peers(stdout, 0, 0, &gbcfg);
2377
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002378 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2379 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, 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_tlli3);
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_ptmsi3);
2387 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
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_ptmsi3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002392
2393 send_llc_ul_ui(nsi, "RA UPD COMPLETE", &bss_peer[0], 0x1002,
2394 local_bss_tlli3, &rai_bss, 0x7080,
2395 GPRS_SAPI_GMM, bss_nu++,
2396 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2397
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002398 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002399
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002400 OSMO_ASSERT(link_info);
2401 OSMO_ASSERT(link_info->tlli.bss_validated);
2402 OSMO_ASSERT(!link_info->tlli.net_validated);
2403 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2404 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002405
2406 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2407 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2408 GPRS_SAPI_GMM, sgsn_nu++,
2409 dtap_gmm_information, sizeof(dtap_gmm_information));
2410
2411 dump_peers(stdout, 0, 0, &gbcfg);
2412
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002413 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2414 OSMO_ASSERT(link_info);
2415 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2416 OSMO_ASSERT(link_info->tlli.assigned == 0);
2417 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2418 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002419
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002420 /* Other messages */
2421 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002422 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002423
2424 dump_peers(stdout, 0, 0, &gbcfg);
2425
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002426 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002427
2428 dump_peers(stdout, 0, 0, &gbcfg);
2429
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002430 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002431
2432 dump_peers(stdout, 0, 0, &gbcfg);
2433
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002434 old_ctr = peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current;
2435
2436 send_bssgp_paging(nsi, &sgsn_peer, imsi, sizeof(imsi), &rai_bss, sgsn_ptmsi3);
2437
2438 dump_peers(stdout, 0, 0, &gbcfg);
2439
2440 OSMO_ASSERT(old_ctr + 1 ==
2441 peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current);
2442
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002443 /* Bad case: Invalid BVCI */
2444 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002445 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002446 dump_global(stdout, 0);
2447
2448 /* Bad case: Invalid RAI */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002449 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002450
2451 dump_global(stdout, 0);
2452
2453 /* Bad case: Invalid MCC (LAC ok) */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002454 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002455 &rai_wrong_mcc_sgsn);
2456
2457 dump_global(stdout, 0);
2458
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002459 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
2460 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2461 unknown_sgsn_tlli, 1, NULL, 0,
2462 GPRS_SAPI_GMM, 2,
2463 dtap_gmm_information, sizeof(dtap_gmm_information));
2464
2465 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
2466 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2467 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2468 GPRS_SAPI_GMM, 3,
2469 dtap_gmm_information, sizeof(dtap_gmm_information));
2470
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002471 /* Detach */
2472 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002473 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002474 GPRS_SAPI_GMM, bss_nu++,
2475 dtap_detach_req, sizeof(dtap_detach_req));
2476
2477 dump_peers(stdout, 0, 0, &gbcfg);
2478
2479 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002480 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002481 GPRS_SAPI_GMM, sgsn_nu++,
2482 dtap_detach_acc, sizeof(dtap_detach_acc));
2483
2484 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002485
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002486 dump_global(stdout, 0);
2487
2488 gbprox_reset(&gbcfg);
2489 gprs_ns_destroy(nsi);
2490 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002491
2492 cleanup_test();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002493}
2494
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002495static void test_gbproxy_ptmsi_patching_bad_cases()
2496{
2497 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2498 struct sockaddr_in bss_peer[1] = {{0},};
2499 struct sockaddr_in sgsn_peer= {0};
2500 struct gprs_ra_id rai_bss =
2501 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2502 struct gprs_ra_id rai_unknown =
2503 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2504 uint16_t cell_id = 0x1234;
2505
2506 const uint32_t sgsn_ptmsi = 0xefe2b700;
2507 const uint32_t local_sgsn_tlli = 0xefe2b700;
2508 const uint32_t random_sgsn_tlli = 0x7c69fb81;
2509
2510 const uint32_t bss_ptmsi = 0xc00f7304;
2511 const uint32_t local_bss_tlli = 0xc00f7304;
2512 const uint32_t foreign_bss_tlli = 0x8000dead;
2513
2514
2515 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
2516 struct gbproxy_link_info *link_info;
2517 struct gbproxy_peer *peer;
2518 unsigned bss_nu = 0;
2519 unsigned sgsn_nu = 0;
2520
2521 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2522 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2523
2524 bssgp_nsi = nsi;
2525 gbcfg.nsi = bssgp_nsi;
2526 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2527 gbcfg.core_mcc = 123;
2528 gbcfg.core_mnc = 456;
2529 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2530 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2531 gbcfg.patch_ptmsi = 1;
2532 gbcfg.bss_ptmsi_state = 0;
2533 gbcfg.sgsn_tlli_state = 1;
2534
2535 configure_sgsn_peer(&sgsn_peer);
2536 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2537
2538 printf("=== %s ===\n", __func__);
2539 printf("--- Initialise SGSN ---\n\n");
2540
2541 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2542
2543 printf("--- Initialise BSS 1 ---\n\n");
2544
2545 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2546 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2547
2548 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2549 OSMO_ASSERT(peer != NULL);
2550
2551 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2552
2553 gprs_dump_nsi(nsi);
2554 dump_global(stdout, 0);
2555 dump_peers(stdout, 0, 0, &gbcfg);
2556
2557 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2558
2559 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2560 foreign_bss_tlli, &rai_unknown, cell_id,
2561 GPRS_SAPI_GMM, bss_nu++,
2562 dtap_attach_req, sizeof(dtap_attach_req));
2563
2564 dump_peers(stdout, 0, 0, &gbcfg);
2565
2566 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2567 random_sgsn_tlli, 0, NULL, 0,
2568 GPRS_SAPI_GMM, sgsn_nu++,
2569 dtap_identity_req, sizeof(dtap_identity_req));
2570
2571 dump_peers(stdout, 0, 0, &gbcfg);
2572
2573 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2574 foreign_bss_tlli, &rai_bss, cell_id,
2575 GPRS_SAPI_GMM, bss_nu++,
2576 dtap_identity_resp, sizeof(dtap_identity_resp));
2577
2578 dump_peers(stdout, 0, 0, &gbcfg);
2579
2580 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2581 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2582 GPRS_SAPI_GMM, sgsn_nu++,
2583 dtap_attach_acc, sizeof(dtap_attach_acc));
2584
2585 dump_peers(stdout, 0, 0, &gbcfg);
2586
2587 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2588 OSMO_ASSERT(link_info);
2589 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2590 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2591 OSMO_ASSERT(!link_info->tlli.bss_validated);
2592 OSMO_ASSERT(!link_info->tlli.net_validated);
2593 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2594 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2595 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2596 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2597 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2598 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2599
2600 send_llc_dl_ui(nsi, "ATTACH ACCEPT (duplicated)", &sgsn_peer, 0x1002,
2601 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2602 GPRS_SAPI_GMM, sgsn_nu++,
2603 dtap_attach_acc, sizeof(dtap_attach_acc));
2604
2605 dump_peers(stdout, 0, 0, &gbcfg);
2606
2607 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2608 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002609 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002610 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2611 OSMO_ASSERT(!link_info->tlli.bss_validated);
2612 OSMO_ASSERT(!link_info->tlli.net_validated);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002613 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002614 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2615 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2616 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2617 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2618 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2619
2620 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2621 local_bss_tlli, &rai_bss, cell_id,
2622 GPRS_SAPI_GMM, bss_nu++,
2623 dtap_attach_complete, sizeof(dtap_attach_complete));
2624
2625 dump_peers(stdout, 0, 0, &gbcfg);
2626
2627 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2628 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002629 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002630 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002631 OSMO_ASSERT(link_info->tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002632 OSMO_ASSERT(!link_info->tlli.net_validated);
2633 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2634 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002635 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002636 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2637
2638 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2639 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2640 GPRS_SAPI_GMM, sgsn_nu++,
2641 dtap_gmm_information, sizeof(dtap_gmm_information));
2642
2643 dump_peers(stdout, 0, 0, &gbcfg);
2644
2645 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2646 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002647 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2648 OSMO_ASSERT(link_info->tlli.assigned == 0);
2649 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2650 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002651
2652 /* Detach */
2653 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2654 local_bss_tlli, &rai_bss, cell_id,
2655 GPRS_SAPI_GMM, bss_nu++,
2656 dtap_detach_req, sizeof(dtap_detach_req));
2657
2658 dump_peers(stdout, 0, 0, &gbcfg);
2659
2660 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2661 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2662 GPRS_SAPI_GMM, sgsn_nu++,
2663 dtap_detach_acc, sizeof(dtap_detach_acc));
2664
2665 dump_peers(stdout, 0, 0, &gbcfg);
2666
2667 dump_global(stdout, 0);
2668
2669 gbprox_reset(&gbcfg);
2670 gprs_ns_destroy(nsi);
2671 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002672
2673 cleanup_test();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002674}
2675
2676
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002677static void test_gbproxy_imsi_acquisition()
2678{
2679 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2680 struct sockaddr_in bss_peer[1] = {{0},};
2681 struct sockaddr_in sgsn_peer= {0};
2682 struct gprs_ra_id rai_bss =
2683 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2684 struct gprs_ra_id rai_sgsn =
2685 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2686 struct gprs_ra_id rai_wrong_mcc_sgsn =
2687 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2688 struct gprs_ra_id rai_unknown =
2689 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2690 uint16_t cell_id = 0x1234;
2691
2692 const uint32_t sgsn_ptmsi = 0xefe2b700;
2693 const uint32_t local_sgsn_tlli = 0xefe2b700;
2694 const uint32_t random_sgsn_tlli = 0x7c69fb81;
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002695 const uint32_t random_sgsn_tlli2 = 0x7eb52dfb;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002696
2697 const uint32_t bss_ptmsi = 0xc00f7304;
2698 const uint32_t local_bss_tlli = 0xc00f7304;
2699 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002700 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002701
2702 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002703 struct gbproxy_link_info *link_info;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002704 struct gbproxy_peer *peer;
2705 unsigned bss_nu = 0;
2706 unsigned sgsn_nu = 0;
2707
2708 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2709
2710 bssgp_nsi = nsi;
2711 gbcfg.nsi = bssgp_nsi;
2712 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
2713 gbcfg.core_mcc = 123;
2714 gbcfg.core_mnc = 456;
2715 gbcfg.core_apn = talloc_zero_size(NULL, 100);
2716 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2717 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002718 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002719 gbcfg.bss_ptmsi_state = 0;
2720 gbcfg.sgsn_tlli_state = 1;
2721
2722 configure_sgsn_peer(&sgsn_peer);
2723 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2724
2725 printf("=== %s ===\n", __func__);
2726 printf("--- Initialise SGSN ---\n\n");
2727
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002728 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002729
2730 printf("--- Initialise BSS 1 ---\n\n");
2731
2732 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2733 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2734
2735 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2736 OSMO_ASSERT(peer != NULL);
2737
2738 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2739
2740 gprs_dump_nsi(nsi);
2741 dump_global(stdout, 0);
2742 dump_peers(stdout, 0, 0, &gbcfg);
2743
2744 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2745
2746 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002747 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002748 GPRS_SAPI_GMM, bss_nu++,
2749 dtap_attach_req, sizeof(dtap_attach_req));
2750
2751 dump_peers(stdout, 0, 0, &gbcfg);
2752
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002753 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2754 foreign_bss_tlli, &rai_bss, cell_id,
2755 GPRS_SAPI_GMM, bss_nu++,
2756 dtap_identity_resp, sizeof(dtap_identity_resp));
2757
2758 dump_peers(stdout, 0, 0, &gbcfg);
2759
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002760 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2761 random_sgsn_tlli, 0, NULL, 0,
2762 GPRS_SAPI_GMM, sgsn_nu++,
2763 dtap_identity_req, sizeof(dtap_identity_req));
2764
2765 dump_peers(stdout, 0, 0, &gbcfg);
2766
2767 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2768 foreign_bss_tlli, &rai_bss, cell_id,
2769 GPRS_SAPI_GMM, bss_nu++,
2770 dtap_identity_resp, sizeof(dtap_identity_resp));
2771
2772 dump_peers(stdout, 0, 0, &gbcfg);
2773
2774 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2775 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2776 GPRS_SAPI_GMM, sgsn_nu++,
2777 dtap_attach_acc, sizeof(dtap_attach_acc));
2778
2779 dump_peers(stdout, 0, 0, &gbcfg);
2780
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002781 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2782 OSMO_ASSERT(link_info);
2783 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2784 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2785 OSMO_ASSERT(!link_info->tlli.bss_validated);
2786 OSMO_ASSERT(!link_info->tlli.net_validated);
2787 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2788 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2789 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2790 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2791 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2792 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002793
2794 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2795 local_bss_tlli, &rai_bss, cell_id,
2796 GPRS_SAPI_GMM, bss_nu++,
2797 dtap_attach_complete, sizeof(dtap_attach_complete));
2798
2799 dump_peers(stdout, 0, 0, &gbcfg);
2800
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002801 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2802 OSMO_ASSERT(link_info);
2803 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2804 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2805 OSMO_ASSERT(link_info->tlli.bss_validated);
2806 OSMO_ASSERT(!link_info->tlli.net_validated);
2807 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2808 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2809 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2810 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002811
2812 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2813 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2814 GPRS_SAPI_GMM, sgsn_nu++,
2815 dtap_gmm_information, sizeof(dtap_gmm_information));
2816
2817 dump_peers(stdout, 0, 0, &gbcfg);
2818
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002819 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2820 OSMO_ASSERT(link_info);
2821 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2822 OSMO_ASSERT(link_info->tlli.assigned == 0);
2823 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2824 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002825
2826 /* Non-DTAP */
2827 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2828 local_bss_tlli, &rai_bss, cell_id,
2829 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2830
2831 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2832 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2833 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2834
2835 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2836 local_bss_tlli, &rai_bss, cell_id,
2837 llc_ui_ll11_dns_query_ul,
2838 sizeof(llc_ui_ll11_dns_query_ul));
2839
2840 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2841 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2842 llc_ui_ll11_dns_resp_dl,
2843 sizeof(llc_ui_ll11_dns_resp_dl));
2844
2845 dump_peers(stdout, 0, 0, &gbcfg);
2846
2847 /* Other messages */
2848 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2849 local_bss_tlli, 1, 12);
2850
2851 dump_peers(stdout, 0, 0, &gbcfg);
2852
2853 send_bssgp_llc_discarded(nsi, &sgsn_peer, 0x1002,
2854 local_sgsn_tlli, 1, 12);
2855
2856 dump_peers(stdout, 0, 0, &gbcfg);
2857
2858 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2859
2860 dump_peers(stdout, 0, 0, &gbcfg);
2861
2862 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_sgsn);
2863
2864 dump_peers(stdout, 0, 0, &gbcfg);
2865
2866 /* Bad case: Invalid BVCI */
2867 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
2868 local_bss_tlli, 1, 12);
2869 dump_global(stdout, 0);
2870
2871 /* Bad case: Invalid RAI */
2872 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_unknown);
2873
2874 dump_global(stdout, 0);
2875
2876 /* Bad case: Invalid MCC (LAC ok) */
2877 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli,
2878 &rai_wrong_mcc_sgsn);
2879
2880 dump_global(stdout, 0);
2881
2882 /* Detach */
2883 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2884 local_bss_tlli, &rai_bss, cell_id,
2885 GPRS_SAPI_GMM, bss_nu++,
2886 dtap_detach_req, sizeof(dtap_detach_req));
2887
2888 dump_peers(stdout, 0, 0, &gbcfg);
2889
2890 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2891 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2892 GPRS_SAPI_GMM, sgsn_nu++,
2893 dtap_detach_acc, sizeof(dtap_detach_acc));
2894
2895 dump_peers(stdout, 0, 0, &gbcfg);
2896
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002897 /* RA Update request */
2898
2899 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2900 foreign_bss_tlli, &rai_unknown, 0x7080,
2901 GPRS_SAPI_GMM, bss_nu++,
2902 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2903
2904 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2905 foreign_bss_tlli, &rai_bss, cell_id,
2906 GPRS_SAPI_GMM, bss_nu++,
2907 dtap_identity_resp, sizeof(dtap_identity_resp));
2908
2909 dump_peers(stdout, 0, 0, &gbcfg);
2910
2911 send_llc_dl_ui(nsi, "RA UDP ACC", &sgsn_peer, 0x1002,
2912 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2913 GPRS_SAPI_GMM, sgsn_nu++,
2914 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2915
2916 dump_peers(stdout, 0, 0, &gbcfg);
2917
2918 /* Detach */
2919
2920 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2921 local_bss_tlli, &rai_bss, cell_id,
2922 GPRS_SAPI_GMM, bss_nu++,
2923 dtap_detach_req, sizeof(dtap_detach_req));
2924
2925 dump_peers(stdout, 0, 0, &gbcfg);
2926
2927 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2928 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2929 GPRS_SAPI_GMM, sgsn_nu++,
2930 dtap_detach_acc, sizeof(dtap_detach_acc));
2931
2932 dump_peers(stdout, 0, 0, &gbcfg);
2933
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002934 /* Special case: Repeated Attach Requests */
2935
2936 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2937 foreign_bss_tlli, &rai_unknown, cell_id,
2938 GPRS_SAPI_GMM, bss_nu++,
2939 dtap_attach_req, sizeof(dtap_attach_req));
2940
2941 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2942 foreign_bss_tlli, &rai_unknown, cell_id,
2943 GPRS_SAPI_GMM, bss_nu++,
2944 dtap_attach_req, sizeof(dtap_attach_req));
2945
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002946 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2947 foreign_bss_tlli, &rai_bss, cell_id,
2948 GPRS_SAPI_GMM, bss_nu++,
2949 dtap_detach_req, sizeof(dtap_detach_req));
2950
2951 dump_peers(stdout, 0, 0, &gbcfg);
2952
2953 /* Special case: Detach from an unknown TLLI */
2954
2955 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", &bss_peer[0], 0x1002,
2956 other_bss_tlli, &rai_bss, cell_id,
2957 GPRS_SAPI_GMM, bss_nu++,
2958 dtap_detach_req, sizeof(dtap_detach_req));
2959
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002960 dump_peers(stdout, 0, 0, &gbcfg);
2961
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002962 /* Special case: Repeated RA Update Requests */
2963
2964 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2965 foreign_bss_tlli, &rai_unknown, 0x7080,
2966 GPRS_SAPI_GMM, bss_nu++,
2967 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2968
2969 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2970 foreign_bss_tlli, &rai_unknown, 0x7080,
2971 GPRS_SAPI_GMM, bss_nu++,
2972 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2973
2974 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2975 foreign_bss_tlli, &rai_bss, cell_id,
2976 GPRS_SAPI_GMM, bss_nu++,
2977 dtap_detach_req, sizeof(dtap_detach_req));
2978
2979 dump_peers(stdout, 0, 0, &gbcfg);
2980
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002981 dump_global(stdout, 0);
2982
2983 gbprox_reset(&gbcfg);
2984 gprs_ns_destroy(nsi);
2985 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002986
2987 cleanup_test();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002988}
2989
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002990static void test_gbproxy_secondary_sgsn()
2991{
2992 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
2993 struct sockaddr_in bss_peer[1] = {{0},};
2994 struct sockaddr_in sgsn_peer[2]= {{0},};
2995 struct gprs_ra_id rai_bss =
2996 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2997 struct gprs_ra_id rai_sgsn =
2998 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2999 struct gprs_ra_id rai_unknown =
3000 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
3001 uint16_t cell_id = 0x1234;
3002
3003 const uint32_t sgsn_ptmsi = 0xefe2b700;
3004 const uint32_t local_sgsn_tlli = 0xefe2b700;
3005 const uint32_t random_sgsn_tlli = 0x7c69fb81;
3006
3007 const uint32_t bss_ptmsi = 0xc00f7304;
3008 const uint32_t local_bss_tlli = 0xc00f7304;
3009 const uint32_t foreign_bss_tlli = 0x8000dead;
3010
3011 const uint32_t sgsn_ptmsi2 = 0xe0987654;
3012 const uint32_t local_sgsn_tlli2 = 0xe0987654;
3013 const uint32_t random_sgsn_tlli2 = 0x7eb52dfb;
3014 const uint32_t bss_ptmsi2 = 0xe656aa1f;
3015 const uint32_t local_bss_tlli2 = 0xe656aa1f;
3016 const uint32_t foreign_bss_tlli2 = 0x8000beef;
3017
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003018 const uint32_t random_sgsn_tlli3 = 0x7e23ef54;
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003019 const uint32_t bss_ptmsi3 = 0xead4775a;
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003020 const uint32_t local_bss_tlli3 = 0xead4775a;
3021 const uint32_t foreign_bss_tlli3 = 0x8000feed;
3022
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003023 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
3024 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003025 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0x28};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003026 struct gbproxy_link_info *link_info;
3027 struct gbproxy_link_info *other_info;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003028 struct gbproxy_peer *peer;
3029 unsigned bss_nu = 0;
3030 unsigned sgsn_nu = 0;
3031
3032 const char *err_msg = NULL;
3033 const char *filter_re = "999999";
3034
3035 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
3036 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
3037
3038 bssgp_nsi = nsi;
3039 gbcfg.nsi = bssgp_nsi;
3040 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3041 gbcfg.core_mcc = 123;
3042 gbcfg.core_mnc = 456;
3043 gbcfg.core_apn = talloc_zero_size(NULL, 100);
3044 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
3045 gbcfg.patch_ptmsi = 1;
3046 gbcfg.acquire_imsi = 1;
3047 gbcfg.bss_ptmsi_state = 0;
3048 gbcfg.sgsn_tlli_state = 1;
3049 gbcfg.route_to_sgsn2 = 1;
3050 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
3051
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003052 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING],
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02003053 filter_re, &err_msg) != 0) {
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003054 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
3055 err_msg);
3056 OSMO_ASSERT(err_msg == NULL);
3057 }
3058
3059 configure_sgsn_peer(&sgsn_peer[0]);
3060 configure_sgsn2_peer(&sgsn_peer[1]);
3061 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3062
3063 printf("=== %s ===\n", __func__);
3064 printf("--- Initialise SGSN 1 ---\n\n");
3065
3066 connect_sgsn(nsi, &sgsn_peer[0], SGSN_NSEI);
3067
3068 printf("--- Initialise SGSN 2 ---\n\n");
3069
3070 connect_sgsn(nsi, &sgsn_peer[1], SGSN2_NSEI);
3071
3072 printf("--- Initialise BSS 1 ---\n\n");
3073
3074 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3075 setup_bssgp(nsi, &bss_peer[0], 0x0);
3076 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x0);
3077 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3078 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x1002);
3079 send_bssgp_reset_ack(nsi, &sgsn_peer[1], 0x1002);
3080
3081 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3082 OSMO_ASSERT(peer != NULL);
3083
3084 gprs_dump_nsi(nsi);
3085 dump_global(stdout, 0);
3086 dump_peers(stdout, 0, 0, &gbcfg);
3087
3088 printf("--- Flow control ---\n\n");
3089
3090 send_bssgp_flow_control_bvc(nsi, &bss_peer[0], 0x1002, 1);
3091 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[0], 0x1002, 1);
3092 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[1], 0x1002, 1);
3093
3094 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
3095
3096 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3097 foreign_bss_tlli, &rai_unknown, cell_id,
3098 GPRS_SAPI_GMM, bss_nu++,
3099 dtap_attach_req, sizeof(dtap_attach_req));
3100
3101 dump_peers(stdout, 0, 0, &gbcfg);
3102
3103 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3104 foreign_bss_tlli, &rai_bss, cell_id,
3105 GPRS_SAPI_GMM, bss_nu++,
3106 dtap_identity_resp, sizeof(dtap_identity_resp));
3107
3108 dump_peers(stdout, 0, 0, &gbcfg);
3109
3110 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[0], 0x1002,
3111 random_sgsn_tlli, 0, NULL, 0,
3112 GPRS_SAPI_GMM, sgsn_nu++,
3113 dtap_identity_req, sizeof(dtap_identity_req));
3114
3115 dump_peers(stdout, 0, 0, &gbcfg);
3116
3117 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3118 foreign_bss_tlli, &rai_bss, cell_id,
3119 GPRS_SAPI_GMM, bss_nu++,
3120 dtap_identity_resp, sizeof(dtap_identity_resp));
3121
3122 dump_peers(stdout, 0, 0, &gbcfg);
3123
3124 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[0], 0x1002,
3125 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3126 GPRS_SAPI_GMM, sgsn_nu++,
3127 dtap_attach_acc, sizeof(dtap_attach_acc));
3128
3129 dump_peers(stdout, 0, 0, &gbcfg);
3130
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003131 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3132 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
3133 OSMO_ASSERT(link_info);
3134 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3135 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3136 OSMO_ASSERT(!link_info->tlli.bss_validated);
3137 OSMO_ASSERT(!link_info->tlli.net_validated);
3138 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
3139 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3140 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3141 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3142 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3143 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003144
3145 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3146 local_bss_tlli, &rai_bss, cell_id,
3147 GPRS_SAPI_GMM, bss_nu++,
3148 dtap_attach_complete, sizeof(dtap_attach_complete));
3149
3150 dump_peers(stdout, 0, 0, &gbcfg);
3151
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003152 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3153 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3154 OSMO_ASSERT(link_info);
3155 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3156 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3157 OSMO_ASSERT(link_info->tlli.bss_validated);
3158 OSMO_ASSERT(!link_info->tlli.net_validated);
3159 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3160 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3161 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3162 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003163
3164 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[0], 0x1002,
3165 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3166 GPRS_SAPI_GMM, sgsn_nu++,
3167 dtap_gmm_information, sizeof(dtap_gmm_information));
3168
3169 dump_peers(stdout, 0, 0, &gbcfg);
3170
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003171 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3172 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3173 OSMO_ASSERT(link_info);
3174 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
3175 OSMO_ASSERT(link_info->tlli.assigned == 0);
3176 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3177 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003178
3179 /* Non-DTAP */
3180 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3181 local_bss_tlli, &rai_bss, cell_id,
3182 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3183
3184 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[0], 0x1002,
3185 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3186 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3187
3188 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3189 local_bss_tlli, &rai_bss, cell_id,
3190 llc_ui_ll11_dns_query_ul,
3191 sizeof(llc_ui_ll11_dns_query_ul));
3192
3193 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[0], 0x1002,
3194 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3195 llc_ui_ll11_dns_resp_dl,
3196 sizeof(llc_ui_ll11_dns_resp_dl));
3197
3198 dump_peers(stdout, 0, 0, &gbcfg);
3199
3200 /* Other messages */
3201 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3202 local_bss_tlli, 1, 12);
3203
3204 dump_peers(stdout, 0, 0, &gbcfg);
3205
3206 send_bssgp_llc_discarded(nsi, &sgsn_peer[0], 0x1002,
3207 local_sgsn_tlli, 1, 12);
3208
3209 dump_peers(stdout, 0, 0, &gbcfg);
3210
3211 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
3212
3213 dump_peers(stdout, 0, 0, &gbcfg);
3214
3215 send_bssgp_suspend_ack(nsi, &sgsn_peer[0], local_sgsn_tlli, &rai_sgsn);
3216
3217 dump_peers(stdout, 0, 0, &gbcfg);
3218
3219 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
3220
3221 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3222 foreign_bss_tlli2, &rai_unknown, cell_id,
3223 GPRS_SAPI_GMM, bss_nu++,
3224 dtap_attach_req, sizeof(dtap_attach_req));
3225
3226 dump_peers(stdout, 0, 0, &gbcfg);
3227
3228 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3229 foreign_bss_tlli2, &rai_bss, cell_id,
3230 GPRS_SAPI_GMM, bss_nu++,
3231 dtap_identity2_resp, sizeof(dtap_identity2_resp));
3232
3233 dump_peers(stdout, 0, 0, &gbcfg);
3234
3235 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3236 random_sgsn_tlli2, 0, NULL, 0,
3237 GPRS_SAPI_GMM, sgsn_nu++,
3238 dtap_identity_req, sizeof(dtap_identity_req));
3239
3240 dump_peers(stdout, 0, 0, &gbcfg);
3241
3242 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3243 foreign_bss_tlli2, &rai_bss, cell_id,
3244 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02003245 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003246
3247 dump_peers(stdout, 0, 0, &gbcfg);
3248
3249 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[1], 0x1002,
3250 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3251 GPRS_SAPI_GMM, sgsn_nu++,
3252 dtap_attach_acc2, sizeof(dtap_attach_acc2));
3253
3254 dump_peers(stdout, 0, 0, &gbcfg);
3255
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003256 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
3257 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
3258 OSMO_ASSERT(link_info);
3259 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3260 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3261 OSMO_ASSERT(!link_info->tlli.bss_validated);
3262 OSMO_ASSERT(!link_info->tlli.net_validated);
3263 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
3264 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3265 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3266 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3267 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3268 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003269
3270 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3271 local_bss_tlli2, &rai_bss, cell_id,
3272 GPRS_SAPI_GMM, bss_nu++,
3273 dtap_attach_complete, sizeof(dtap_attach_complete));
3274
3275 dump_peers(stdout, 0, 0, &gbcfg);
3276
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003277 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3278 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3279 OSMO_ASSERT(link_info);
3280 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3281 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3282 OSMO_ASSERT(link_info->tlli.bss_validated);
3283 OSMO_ASSERT(!link_info->tlli.net_validated);
3284 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3285 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3286 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3287 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003288
3289 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3290 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3291 GPRS_SAPI_GMM, sgsn_nu++,
3292 dtap_gmm_information, sizeof(dtap_gmm_information));
3293
3294 dump_peers(stdout, 0, 0, &gbcfg);
3295
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003296 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3297 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3298 OSMO_ASSERT(link_info);
3299 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
3300 OSMO_ASSERT(link_info->tlli.assigned == 0);
3301 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
3302 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003303
3304 /* Non-DTAP */
3305 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3306 local_bss_tlli2, &rai_bss, cell_id,
3307 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3308
3309 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[1], 0x1002,
3310 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3311 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3312
3313 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3314 local_bss_tlli2, &rai_bss, cell_id,
3315 llc_ui_ll11_dns_query_ul,
3316 sizeof(llc_ui_ll11_dns_query_ul));
3317
3318 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[1], 0x1002,
3319 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3320 llc_ui_ll11_dns_resp_dl,
3321 sizeof(llc_ui_ll11_dns_resp_dl));
3322
3323 dump_peers(stdout, 0, 0, &gbcfg);
3324
3325 /* Other messages */
3326 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3327 local_bss_tlli2, 1, 12);
3328
3329 dump_peers(stdout, 0, 0, &gbcfg);
3330
3331 send_bssgp_llc_discarded(nsi, &sgsn_peer[1], 0x1002,
3332 local_sgsn_tlli2, 1, 12);
3333
3334 dump_peers(stdout, 0, 0, &gbcfg);
3335
3336 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli2, &rai_bss);
3337
3338 dump_peers(stdout, 0, 0, &gbcfg);
3339
3340 send_bssgp_suspend_ack(nsi, &sgsn_peer[1], local_sgsn_tlli2, &rai_sgsn);
3341
3342 dump_peers(stdout, 0, 0, &gbcfg);
3343
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003344 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
3345
3346 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3347 foreign_bss_tlli3, &rai_unknown, cell_id,
3348 GPRS_SAPI_GMM, bss_nu++,
3349 dtap_attach_req, sizeof(dtap_attach_req));
3350
3351 dump_peers(stdout, 0, 0, &gbcfg);
3352
3353 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3354 foreign_bss_tlli3, &rai_bss, cell_id,
3355 GPRS_SAPI_GMM, bss_nu++,
3356 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3357
3358 dump_peers(stdout, 0, 0, &gbcfg);
3359
3360 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3361 random_sgsn_tlli3, 0, NULL, 0,
3362 GPRS_SAPI_GMM, sgsn_nu++,
3363 dtap_identity_req, sizeof(dtap_identity_req));
3364
3365 dump_peers(stdout, 0, 0, &gbcfg);
3366
3367 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3368 foreign_bss_tlli3, &rai_bss, cell_id,
3369 GPRS_SAPI_GMM, bss_nu++,
3370 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3371
3372 dump_peers(stdout, 0, 0, &gbcfg);
3373
3374 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", &sgsn_peer[1], 0x1002,
3375 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
3376 GPRS_SAPI_GMM, sgsn_nu++,
3377 dtap_attach_acc, sizeof(dtap_attach_acc));
3378
3379 dump_peers(stdout, 0, 0, &gbcfg);
3380
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003381 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
3382 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
3383 OSMO_ASSERT(link_info);
3384 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3385 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3386 OSMO_ASSERT(!link_info->tlli.bss_validated);
3387 OSMO_ASSERT(!link_info->tlli.net_validated);
3388 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
3389 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3390 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3391 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3392 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3393 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003394
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003395 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3396 local_bss_tlli3, &rai_bss, cell_id,
3397 GPRS_SAPI_GMM, bss_nu++,
3398 dtap_attach_complete, sizeof(dtap_attach_complete));
3399
3400 dump_peers(stdout, 0, 0, &gbcfg);
3401
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003402 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003403 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003404 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3405 OSMO_ASSERT(link_info);
3406 OSMO_ASSERT(link_info != other_info);
3407 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3408 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3409 OSMO_ASSERT(link_info->tlli.bss_validated);
3410 OSMO_ASSERT(!link_info->tlli.net_validated);
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);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003415
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003416 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3417 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3418 GPRS_SAPI_GMM, sgsn_nu++,
3419 dtap_gmm_information, sizeof(dtap_gmm_information));
3420
3421 dump_peers(stdout, 0, 0, &gbcfg);
3422
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003423 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003424 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003425 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3426 OSMO_ASSERT(link_info);
3427 OSMO_ASSERT(link_info != other_info);
3428 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
3429 OSMO_ASSERT(link_info->tlli.assigned == 0);
3430 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3431 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003432
3433
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003434 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
3435
3436 /* Detach */
3437 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3438 local_bss_tlli, &rai_bss, cell_id,
3439 GPRS_SAPI_GMM, bss_nu++,
3440 dtap_detach_req, sizeof(dtap_detach_req));
3441
3442 dump_peers(stdout, 0, 0, &gbcfg);
3443
3444 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[0], 0x1002,
3445 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3446 GPRS_SAPI_GMM, sgsn_nu++,
3447 dtap_detach_acc, sizeof(dtap_detach_acc));
3448
3449 dump_peers(stdout, 0, 0, &gbcfg);
3450
3451 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
3452
3453 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3454 local_bss_tlli2, &rai_bss, cell_id,
3455 GPRS_SAPI_GMM, bss_nu++,
3456 dtap_detach_req, sizeof(dtap_detach_req));
3457
3458 dump_peers(stdout, 0, 0, &gbcfg);
3459
3460 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3461 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3462 GPRS_SAPI_GMM, sgsn_nu++,
3463 dtap_detach_acc, sizeof(dtap_detach_acc));
3464
3465 dump_peers(stdout, 0, 0, &gbcfg);
3466
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003467 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
3468
3469 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3470 local_bss_tlli3, &rai_bss, cell_id,
3471 GPRS_SAPI_GMM, bss_nu++,
3472 dtap_detach_req, sizeof(dtap_detach_req));
3473
3474 dump_peers(stdout, 0, 0, &gbcfg);
3475
3476 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3477 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3478 GPRS_SAPI_GMM, sgsn_nu++,
3479 dtap_detach_acc, sizeof(dtap_detach_acc));
3480
3481 dump_peers(stdout, 0, 0, &gbcfg);
3482
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003483 dump_global(stdout, 0);
3484
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003485 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING]);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003486 gbprox_reset(&gbcfg);
3487 gprs_ns_destroy(nsi);
3488 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003489
3490 cleanup_test();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003491}
3492
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003493static void test_gbproxy_keep_info()
3494{
3495 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
3496 struct sockaddr_in bss_peer[1] = {{0},};
3497 struct sockaddr_in sgsn_peer= {0};
3498 struct gprs_ra_id rai_bss =
3499 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3500 uint16_t cell_id = 0x1234;
3501
3502 const uint32_t ptmsi = 0xefe2b700;
3503 const uint32_t local_tlli = 0xefe2b700;
3504 const uint32_t foreign_tlli = 0xafe2b700;
3505
3506 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003507 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003508 struct gbproxy_peer *peer;
3509 unsigned bss_nu = 0;
3510 unsigned sgsn_nu = 0;
3511
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003512 LLIST_HEAD(rcv_list);
3513
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003514 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3515
3516 bssgp_nsi = nsi;
3517 gbcfg.nsi = bssgp_nsi;
3518 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3519 gbcfg.patch_ptmsi = 0;
3520 gbcfg.acquire_imsi = 1;
3521 gbcfg.bss_ptmsi_state = 0;
3522 gbcfg.sgsn_tlli_state = 1;
3523 gbcfg.core_mcc = 0;
3524 gbcfg.core_mnc = 0;
3525 gbcfg.core_apn = NULL;
3526 gbcfg.core_apn_size = 0;
3527 gbcfg.route_to_sgsn2 = 0;
3528 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003529 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003530
3531 configure_sgsn_peer(&sgsn_peer);
3532 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3533
3534 printf("=== %s ===\n", __func__);
3535 printf("--- Initialise SGSN ---\n\n");
3536
3537 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
3538
3539 printf("--- Initialise BSS 1 ---\n\n");
3540
3541 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3542 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3543
3544 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3545 OSMO_ASSERT(peer != NULL);
3546
3547 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
3548
3549 gprs_dump_nsi(nsi);
3550 dump_global(stdout, 0);
3551 dump_peers(stdout, 0, 0, &gbcfg);
3552
3553 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3554
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003555 received_messages = &rcv_list;
3556
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003557 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3558 foreign_tlli, &rai_bss, cell_id,
3559 GPRS_SAPI_GMM, bss_nu++,
3560 dtap_attach_req, sizeof(dtap_attach_req));
3561
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003562 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3563
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003564 dump_peers(stdout, 0, 0, &gbcfg);
3565
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003566 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3567 OSMO_ASSERT(link_info);
3568 OSMO_ASSERT(link_info->imsi_len == 0);
3569 OSMO_ASSERT(!link_info->is_deregistered);
3570 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003571
3572 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3573 foreign_tlli, &rai_bss, cell_id,
3574 GPRS_SAPI_GMM, bss_nu++,
3575 dtap_identity_resp, sizeof(dtap_identity_resp));
3576
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003577 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3578
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003579 dump_peers(stdout, 0, 0, &gbcfg);
3580
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003581 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3582 OSMO_ASSERT(link_info);
3583 OSMO_ASSERT(link_info->imsi_len > 0);
3584 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003585 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003586
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003587 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
3588 foreign_tlli, 0, NULL, 0,
3589 GPRS_SAPI_GMM, sgsn_nu++,
3590 dtap_identity_req, sizeof(dtap_identity_req));
3591
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003592 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3593
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003594 dump_peers(stdout, 0, 0, &gbcfg);
3595
3596 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3597 foreign_tlli, &rai_bss, cell_id,
3598 GPRS_SAPI_GMM, bss_nu++,
3599 dtap_identity_resp, sizeof(dtap_identity_resp));
3600
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003601 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
3602
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003603 dump_peers(stdout, 0, 0, &gbcfg);
3604
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003605 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3606 OSMO_ASSERT(link_info);
3607 OSMO_ASSERT(link_info->imsi_len > 0);
3608 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003609
3610 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3611 foreign_tlli, 1, imsi, sizeof(imsi),
3612 GPRS_SAPI_GMM, sgsn_nu++,
3613 dtap_attach_acc, sizeof(dtap_attach_acc));
3614
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003615 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3616
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003617 dump_peers(stdout, 0, 0, &gbcfg);
3618
3619 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3620 local_tlli, &rai_bss, cell_id,
3621 GPRS_SAPI_GMM, bss_nu++,
3622 dtap_attach_complete, sizeof(dtap_attach_complete));
3623
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003624 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3625
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003626 dump_peers(stdout, 0, 0, &gbcfg);
3627
3628 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
3629 local_tlli, 1, imsi, sizeof(imsi),
3630 GPRS_SAPI_GMM, sgsn_nu++,
3631 dtap_gmm_information, sizeof(dtap_gmm_information));
3632
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003633 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3634
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003635 dump_peers(stdout, 0, 0, &gbcfg);
3636
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003637 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3638 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003639
3640 /* Detach (MO) */
3641 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3642 local_tlli, &rai_bss, cell_id,
3643 GPRS_SAPI_GMM, bss_nu++,
3644 dtap_detach_req, sizeof(dtap_detach_req));
3645
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003646 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3647
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003648 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3649 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003650
3651 dump_peers(stdout, 0, 0, &gbcfg);
3652
3653 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3654 local_tlli, 1, imsi, sizeof(imsi),
3655 GPRS_SAPI_GMM, sgsn_nu++,
3656 dtap_detach_acc, sizeof(dtap_detach_acc));
3657
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003658 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3659
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003660 dump_peers(stdout, 0, 0, &gbcfg);
3661
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003662 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3663 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3664 OSMO_ASSERT(link_info);
3665 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003666
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003667 OSMO_ASSERT(!expect_msg());
3668
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003669 /* Re-Attach */
3670 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3671 foreign_tlli, &rai_bss, cell_id,
3672 GPRS_SAPI_GMM, bss_nu++,
3673 dtap_attach_req3, sizeof(dtap_attach_req3));
3674
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003675 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3676
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003677 dump_peers(stdout, 0, 0, &gbcfg);
3678
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003679 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3680 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3681 OSMO_ASSERT(link_info);
3682 OSMO_ASSERT(link_info == link_info2);
3683 OSMO_ASSERT(link_info->imsi_len != 0);
3684 OSMO_ASSERT(!link_info->is_deregistered);
3685 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003686 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003687
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003688 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3689 foreign_tlli, 1, imsi, sizeof(imsi),
3690 GPRS_SAPI_GMM, sgsn_nu++,
3691 dtap_attach_acc, sizeof(dtap_attach_acc));
3692
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003693 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3694
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003695 dump_peers(stdout, 0, 0, &gbcfg);
3696
3697 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3698 local_tlli, &rai_bss, cell_id,
3699 GPRS_SAPI_GMM, bss_nu++,
3700 dtap_attach_complete, sizeof(dtap_attach_complete));
3701
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003702 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3703
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003704 dump_peers(stdout, 0, 0, &gbcfg);
3705
3706 /* Detach (MT) */
3707 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
3708 local_tlli, 1, imsi, sizeof(imsi),
3709 GPRS_SAPI_GMM, sgsn_nu++,
3710 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3711
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003712 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3713
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003714 dump_peers(stdout, 0, 0, &gbcfg);
3715
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003716 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3717 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003718
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003719 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003720 local_tlli, &rai_bss, cell_id,
3721 GPRS_SAPI_GMM, bss_nu++,
3722 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3723
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003724 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3725 OSMO_ASSERT(!expect_msg());
3726
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003727 dump_peers(stdout, 0, 0, &gbcfg);
3728
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003729 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3730 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3731 OSMO_ASSERT(link_info);
3732 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003733
3734 /* Re-Attach */
3735 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3736 foreign_tlli, &rai_bss, cell_id,
3737 GPRS_SAPI_GMM, bss_nu++,
3738 dtap_attach_req3, sizeof(dtap_attach_req3));
3739
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003740 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3741
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003742 dump_peers(stdout, 0, 0, &gbcfg);
3743
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003744 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3745 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3746 OSMO_ASSERT(link_info);
3747 OSMO_ASSERT(link_info == link_info2);
3748 OSMO_ASSERT(link_info->imsi_len != 0);
3749 OSMO_ASSERT(!link_info->is_deregistered);
3750 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003751
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003752 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3753 foreign_tlli, 1, imsi, sizeof(imsi),
3754 GPRS_SAPI_GMM, sgsn_nu++,
3755 dtap_attach_acc, sizeof(dtap_attach_acc));
3756
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003757 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3758
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003759 dump_peers(stdout, 0, 0, &gbcfg);
3760
3761 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3762 local_tlli, &rai_bss, cell_id,
3763 GPRS_SAPI_GMM, bss_nu++,
3764 dtap_attach_complete, sizeof(dtap_attach_complete));
3765
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003766 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3767
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003768 dump_peers(stdout, 0, 0, &gbcfg);
3769
3770 /* Detach (MT) */
3771 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3772 local_tlli, 1, imsi, sizeof(imsi),
3773 GPRS_SAPI_GMM, sgsn_nu++,
3774 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3775
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003776 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3777
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003778 dump_peers(stdout, 0, 0, &gbcfg);
3779
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003780 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3781 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003782
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003783 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003784 local_tlli, &rai_bss, cell_id,
3785 GPRS_SAPI_GMM, bss_nu++,
3786 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3787
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003788 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3789 OSMO_ASSERT(!expect_msg());
3790
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003791 dump_peers(stdout, 0, 0, &gbcfg);
3792
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003793 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3794 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3795 OSMO_ASSERT(link_info);
3796 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003797
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003798 /* Re-Attach with IMSI */
3799 send_llc_ul_ui(nsi, "ATTACH REQUEST (IMSI)", &bss_peer[0], 0x1002,
3800 foreign_tlli, &rai_bss, cell_id,
3801 GPRS_SAPI_GMM, bss_nu++,
3802 dtap_attach_req4, sizeof(dtap_attach_req4));
3803
3804 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3805
3806 dump_peers(stdout, 0, 0, &gbcfg);
3807
3808 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3809 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3810 OSMO_ASSERT(link_info);
3811 OSMO_ASSERT(link_info == link_info2);
3812 OSMO_ASSERT(link_info->imsi_len != 0);
3813 OSMO_ASSERT(!link_info->is_deregistered);
3814 OSMO_ASSERT(!link_info->imsi_acq_pending);
3815 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
3816
3817 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3818 foreign_tlli, 1, imsi, sizeof(imsi),
3819 GPRS_SAPI_GMM, sgsn_nu++,
3820 dtap_attach_acc, sizeof(dtap_attach_acc));
3821
3822 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3823
3824 dump_peers(stdout, 0, 0, &gbcfg);
3825
3826 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3827 local_tlli, &rai_bss, cell_id,
3828 GPRS_SAPI_GMM, bss_nu++,
3829 dtap_attach_complete, sizeof(dtap_attach_complete));
3830
3831 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3832
3833 dump_peers(stdout, 0, 0, &gbcfg);
3834
3835 /* Detach (MT) */
3836 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3837 local_tlli, 1, imsi, sizeof(imsi),
3838 GPRS_SAPI_GMM, sgsn_nu++,
3839 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3840
3841 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3842
3843 dump_peers(stdout, 0, 0, &gbcfg);
3844
3845 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3846 OSMO_ASSERT(link_info);
3847
3848 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
3849 local_tlli, &rai_bss, cell_id,
3850 GPRS_SAPI_GMM, bss_nu++,
3851 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3852
3853 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3854 OSMO_ASSERT(!expect_msg());
3855
3856 dump_peers(stdout, 0, 0, &gbcfg);
3857
3858 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3859 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3860 OSMO_ASSERT(link_info);
3861 OSMO_ASSERT(link_info->is_deregistered);
3862
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003863 /* Re-Attach */
3864 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3865 foreign_tlli, &rai_bss, cell_id,
3866 GPRS_SAPI_GMM, bss_nu++,
3867 dtap_attach_req3, sizeof(dtap_attach_req3));
3868
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003869 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3870
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003871 dump_peers(stdout, 0, 0, &gbcfg);
3872
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003873 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3874 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3875 OSMO_ASSERT(link_info);
3876 OSMO_ASSERT(link_info == link_info2);
3877 OSMO_ASSERT(link_info->imsi_len != 0);
3878 OSMO_ASSERT(!link_info->is_deregistered);
3879 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003880
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003881 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3882 foreign_tlli, 1, imsi, sizeof(imsi),
3883 GPRS_SAPI_GMM, sgsn_nu++,
3884 dtap_attach_acc, sizeof(dtap_attach_acc));
3885
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003886 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3887
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003888 dump_peers(stdout, 0, 0, &gbcfg);
3889
3890 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3891 local_tlli, &rai_bss, cell_id,
3892 GPRS_SAPI_GMM, bss_nu++,
3893 dtap_attach_complete, sizeof(dtap_attach_complete));
3894
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003895 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3896
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003897 dump_peers(stdout, 0, 0, &gbcfg);
3898
3899 /* RA update procedure (reject -> Detach) */
3900 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3901 local_tlli, &rai_bss, 0x7080,
3902 GPRS_SAPI_GMM, bss_nu++,
3903 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3904
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003905 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
3906
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003907 send_llc_dl_ui(nsi, "RA UDP REJ", &sgsn_peer, 0x1002,
3908 local_tlli, 1, imsi, sizeof(imsi),
3909 GPRS_SAPI_GMM, sgsn_nu++,
3910 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3911
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003912 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
3913 OSMO_ASSERT(!expect_msg());
3914
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003915 dump_peers(stdout, 0, 0, &gbcfg);
3916
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003917 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3918 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3919 OSMO_ASSERT(link_info);
3920 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003921
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003922 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
3923 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3924 foreign_tlli, &rai_bss, cell_id,
3925 GPRS_SAPI_GMM, bss_nu++,
3926 dtap_attach_req, sizeof(dtap_attach_req));
3927
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003928 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3929
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003930 dump_peers(stdout, 0, 0, &gbcfg);
3931
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003932 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3933 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3934 OSMO_ASSERT(link_info);
3935 OSMO_ASSERT(link_info != link_info2);
3936 OSMO_ASSERT(link_info->imsi_len == 0);
3937 OSMO_ASSERT(!link_info->is_deregistered);
3938 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003939
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003940 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3941 foreign_tlli, &rai_bss, cell_id,
3942 GPRS_SAPI_GMM, bss_nu++,
3943 dtap_identity_resp, sizeof(dtap_identity_resp));
3944
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003945 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3946
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003947 dump_peers(stdout, 0, 0, &gbcfg);
3948
3949 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3950 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3951 OSMO_ASSERT(link_info);
3952 OSMO_ASSERT(link_info == link_info2);
3953 OSMO_ASSERT(link_info->imsi_len != 0);
3954 OSMO_ASSERT(!link_info->is_deregistered);
3955 OSMO_ASSERT(!link_info->imsi_acq_pending);
3956
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003957 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3958 foreign_tlli, 1, imsi, sizeof(imsi),
3959 GPRS_SAPI_GMM, sgsn_nu++,
3960 dtap_attach_acc, sizeof(dtap_attach_acc));
3961
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003962 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3963
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003964 dump_peers(stdout, 0, 0, &gbcfg);
3965
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003966 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3967 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3968 OSMO_ASSERT(link_info);
3969 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeckea71b482014-09-22 09:28:27 +02003970 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003971
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003972 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3973 local_tlli, &rai_bss, cell_id,
3974 GPRS_SAPI_GMM, bss_nu++,
3975 dtap_attach_complete, sizeof(dtap_attach_complete));
3976
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003977 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3978
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003979 dump_peers(stdout, 0, 0, &gbcfg);
3980
3981 /* Detach (MT) */
3982 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3983 local_tlli, 1, imsi, sizeof(imsi),
3984 GPRS_SAPI_GMM, sgsn_nu++,
3985 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3986
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003987 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3988
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003989 dump_peers(stdout, 0, 0, &gbcfg);
3990
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003991 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3992 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003993
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003994 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003995 local_tlli, &rai_bss, cell_id,
3996 GPRS_SAPI_GMM, bss_nu++,
3997 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3998
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003999 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4000
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004001 dump_peers(stdout, 0, 0, &gbcfg);
4002
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004003 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4004 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4005 OSMO_ASSERT(link_info);
4006 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02004007
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004008 OSMO_ASSERT(!expect_msg());
4009
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004010 /* Bad case: Re-Attach with local TLLI */
4011 send_llc_ul_ui(nsi, "ATTACH REQUEST (local TLLI)", &bss_peer[0], 0x1002,
4012 local_tlli, &rai_bss, cell_id,
4013 GPRS_SAPI_GMM, bss_nu++,
4014 dtap_attach_req3, sizeof(dtap_attach_req3));
4015
4016 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4017
4018 dump_peers(stdout, 0, 0, &gbcfg);
4019
4020 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4021 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4022 OSMO_ASSERT(link_info);
4023 OSMO_ASSERT(link_info == link_info2);
4024 OSMO_ASSERT(link_info->imsi_len != 0);
4025 OSMO_ASSERT(!link_info->is_deregistered);
4026 OSMO_ASSERT(!link_info->imsi_acq_pending);
4027 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
4028
4029 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4030 local_tlli, 1, imsi, sizeof(imsi),
4031 GPRS_SAPI_GMM, sgsn_nu++,
4032 dtap_attach_acc, sizeof(dtap_attach_acc));
4033
4034 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4035
4036 dump_peers(stdout, 0, 0, &gbcfg);
4037
4038 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4039 local_tlli, &rai_bss, cell_id,
4040 GPRS_SAPI_GMM, bss_nu++,
4041 dtap_attach_complete, sizeof(dtap_attach_complete));
4042
4043 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4044
4045 dump_peers(stdout, 0, 0, &gbcfg);
4046
4047 /* Detach (MT) */
4048 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
4049 local_tlli, 1, imsi, sizeof(imsi),
4050 GPRS_SAPI_GMM, sgsn_nu++,
4051 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
4052
4053 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4054
4055 dump_peers(stdout, 0, 0, &gbcfg);
4056
4057 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4058 OSMO_ASSERT(link_info);
4059
4060 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4061 local_tlli, &rai_bss, cell_id,
4062 GPRS_SAPI_GMM, bss_nu++,
4063 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4064
4065 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4066 OSMO_ASSERT(!expect_msg());
4067
4068 dump_peers(stdout, 0, 0, &gbcfg);
4069
4070 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4071 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4072 OSMO_ASSERT(link_info);
4073 OSMO_ASSERT(link_info->is_deregistered);
4074
4075 /* Bad case: Unexpected Re-Attach with IMSI after completed attachment
4076 * procedure */
4077 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4078 foreign_tlli, &rai_bss, cell_id,
4079 GPRS_SAPI_GMM, bss_nu++,
4080 dtap_attach_req3, sizeof(dtap_attach_req3));
4081
4082 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4083
4084 dump_peers(stdout, 0, 0, &gbcfg);
4085
4086 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4087 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4088 OSMO_ASSERT(link_info);
4089 OSMO_ASSERT(link_info == link_info2);
4090 OSMO_ASSERT(link_info->imsi_len != 0);
4091 OSMO_ASSERT(!link_info->is_deregistered);
4092 OSMO_ASSERT(!link_info->imsi_acq_pending);
4093
4094 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4095 foreign_tlli, 1, imsi, sizeof(imsi),
4096 GPRS_SAPI_GMM, sgsn_nu++,
4097 dtap_attach_acc, sizeof(dtap_attach_acc));
4098
4099 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4100
4101 dump_peers(stdout, 0, 0, &gbcfg);
4102
4103 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4104 local_tlli, &rai_bss, cell_id,
4105 GPRS_SAPI_GMM, bss_nu++,
4106 dtap_attach_complete, sizeof(dtap_attach_complete));
4107
4108 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4109
4110 dump_peers(stdout, 0, 0, &gbcfg);
4111
4112 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4113 local_tlli, 1, imsi, sizeof(imsi),
4114 GPRS_SAPI_GMM, sgsn_nu++,
4115 dtap_gmm_information, sizeof(dtap_gmm_information));
4116
4117 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4118
4119 dump_peers(stdout, 0, 0, &gbcfg);
4120
4121 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected, IMSI)",
4122 &bss_peer[0], 0x1002,
4123 foreign_tlli, &rai_bss, cell_id,
4124 GPRS_SAPI_GMM, bss_nu++,
4125 dtap_attach_req4, sizeof(dtap_attach_req4));
4126
4127 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4128
4129 dump_peers(stdout, 0, 0, &gbcfg);
4130
4131 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4132 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004133 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004134 OSMO_ASSERT(link_info == link_info2);
4135 OSMO_ASSERT(link_info->imsi_len != 0);
4136 OSMO_ASSERT(!link_info->is_deregistered);
4137 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004138 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004139 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4140
4141 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4142 foreign_tlli, 1, imsi, sizeof(imsi),
4143 GPRS_SAPI_GMM, sgsn_nu++,
4144 dtap_attach_acc, sizeof(dtap_attach_acc));
4145
4146 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4147
4148 dump_peers(stdout, 0, 0, &gbcfg);
4149
4150 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4151 local_tlli, &rai_bss, cell_id,
4152 GPRS_SAPI_GMM, bss_nu++,
4153 dtap_attach_complete, sizeof(dtap_attach_complete));
4154
4155 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4156
4157 dump_peers(stdout, 0, 0, &gbcfg);
4158
4159 /* Detach (MT) */
4160 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4161 local_tlli, 1, imsi, sizeof(imsi),
4162 GPRS_SAPI_GMM, sgsn_nu++,
4163 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4164
4165 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4166
4167 dump_peers(stdout, 0, 0, &gbcfg);
4168
4169 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4170 OSMO_ASSERT(link_info);
4171
4172 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4173 local_tlli, &rai_bss, cell_id,
4174 GPRS_SAPI_GMM, bss_nu++,
4175 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4176
4177 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4178 OSMO_ASSERT(!expect_msg());
4179
4180 dump_peers(stdout, 0, 0, &gbcfg);
4181
4182 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4183 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4184 OSMO_ASSERT(link_info);
4185 OSMO_ASSERT(link_info->is_deregistered);
4186
4187 /* Bad case: Unexpected Re-Attach with P-TMSI after completed attachment
4188 * procedure */
4189 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4190 foreign_tlli, &rai_bss, cell_id,
4191 GPRS_SAPI_GMM, bss_nu++,
4192 dtap_attach_req3, sizeof(dtap_attach_req3));
4193
4194 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4195
4196 dump_peers(stdout, 0, 0, &gbcfg);
4197
4198 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4199 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4200 OSMO_ASSERT(link_info);
4201 OSMO_ASSERT(link_info == link_info2);
4202 OSMO_ASSERT(link_info->imsi_len != 0);
4203 OSMO_ASSERT(!link_info->is_deregistered);
4204 OSMO_ASSERT(!link_info->imsi_acq_pending);
4205
4206 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4207 foreign_tlli, 1, imsi, sizeof(imsi),
4208 GPRS_SAPI_GMM, sgsn_nu++,
4209 dtap_attach_acc, sizeof(dtap_attach_acc));
4210
4211 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4212
4213 dump_peers(stdout, 0, 0, &gbcfg);
4214
4215 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4216 local_tlli, &rai_bss, cell_id,
4217 GPRS_SAPI_GMM, bss_nu++,
4218 dtap_attach_complete, sizeof(dtap_attach_complete));
4219
4220 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4221
4222 dump_peers(stdout, 0, 0, &gbcfg);
4223
4224 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4225 local_tlli, 1, imsi, sizeof(imsi),
4226 GPRS_SAPI_GMM, sgsn_nu++,
4227 dtap_gmm_information, sizeof(dtap_gmm_information));
4228
4229 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4230
4231 dump_peers(stdout, 0, 0, &gbcfg);
4232
4233 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected)", &bss_peer[0], 0x1002,
4234 foreign_tlli, &rai_bss, cell_id,
4235 GPRS_SAPI_GMM, bss_nu++,
4236 dtap_attach_req3, sizeof(dtap_attach_req3));
4237
4238 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4239
4240 dump_peers(stdout, 0, 0, &gbcfg);
4241
4242 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4243 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004244 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004245 OSMO_ASSERT(link_info == link_info2);
4246 OSMO_ASSERT(link_info->imsi_len != 0);
4247 OSMO_ASSERT(!link_info->is_deregistered);
4248 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004249 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004250 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4251
4252 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4253 foreign_tlli, 1, imsi, sizeof(imsi),
4254 GPRS_SAPI_GMM, sgsn_nu++,
4255 dtap_attach_acc, sizeof(dtap_attach_acc));
4256
4257 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4258
4259 dump_peers(stdout, 0, 0, &gbcfg);
4260
4261 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4262 local_tlli, &rai_bss, cell_id,
4263 GPRS_SAPI_GMM, bss_nu++,
4264 dtap_attach_complete, sizeof(dtap_attach_complete));
4265
4266 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4267
4268 dump_peers(stdout, 0, 0, &gbcfg);
4269
4270 /* Detach (MT) */
4271 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4272 local_tlli, 1, imsi, sizeof(imsi),
4273 GPRS_SAPI_GMM, sgsn_nu++,
4274 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4275
4276 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4277
4278 dump_peers(stdout, 0, 0, &gbcfg);
4279
4280 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4281 OSMO_ASSERT(link_info);
4282
4283 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4284 local_tlli, &rai_bss, cell_id,
4285 GPRS_SAPI_GMM, bss_nu++,
4286 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4287
4288 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4289 OSMO_ASSERT(!expect_msg());
4290
4291 dump_peers(stdout, 0, 0, &gbcfg);
4292
4293 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4294 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4295 OSMO_ASSERT(link_info);
4296 OSMO_ASSERT(link_info->is_deregistered);
4297
4298
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004299 /* Attach rejected */
4300
4301 gbproxy_delete_link_infos(peer);
4302
4303 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4304 foreign_tlli, &rai_bss, cell_id,
4305 GPRS_SAPI_GMM, bss_nu++,
4306 dtap_attach_req, sizeof(dtap_attach_req));
4307
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004308 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4309
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004310 dump_peers(stdout, 0, 0, &gbcfg);
4311
4312 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4313 OSMO_ASSERT(link_info);
4314 OSMO_ASSERT(link_info->imsi_len == 0);
4315 OSMO_ASSERT(!link_info->is_deregistered);
4316 OSMO_ASSERT(link_info->imsi_acq_pending);
4317
4318 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4319 foreign_tlli, &rai_bss, cell_id,
4320 GPRS_SAPI_GMM, bss_nu++,
4321 dtap_identity_resp, sizeof(dtap_identity_resp));
4322
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004323 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4324
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004325 dump_peers(stdout, 0, 0, &gbcfg);
4326
4327 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4328 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4329 OSMO_ASSERT(link_info);
4330 OSMO_ASSERT(link_info == link_info2);
4331 OSMO_ASSERT(link_info->imsi_len != 0);
4332 OSMO_ASSERT(!link_info->is_deregistered);
4333 OSMO_ASSERT(!link_info->imsi_acq_pending);
4334
4335 send_llc_dl_ui(nsi, "ATTACH REJECT", &sgsn_peer, 0x1002,
4336 foreign_tlli, 1, imsi, sizeof(imsi),
4337 GPRS_SAPI_GMM, sgsn_nu++,
4338 dtap_attach_rej7, sizeof(dtap_attach_rej7));
4339
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004340 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
4341
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004342 dump_peers(stdout, 0, 0, &gbcfg);
4343
Jacob Erlbeck9c65c812014-09-22 10:42:05 +02004344 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4345
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004346 OSMO_ASSERT(!expect_msg());
4347
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004348 /* Attach (incomplete) and Detach (MO) */
4349
4350 gbproxy_delete_link_infos(peer);
4351
4352 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4353 foreign_tlli, &rai_bss, cell_id,
4354 GPRS_SAPI_GMM, bss_nu++,
4355 dtap_attach_req, sizeof(dtap_attach_req));
4356
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004357 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4358
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004359 dump_peers(stdout, 0, 0, &gbcfg);
4360
4361 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4362 OSMO_ASSERT(link_info);
4363 OSMO_ASSERT(link_info->imsi_len == 0);
4364 OSMO_ASSERT(!link_info->is_deregistered);
4365 OSMO_ASSERT(link_info->imsi_acq_pending);
4366
4367 send_llc_ul_ui(nsi, "DETACH REQ (MO)", &bss_peer[0], 0x1002,
4368 foreign_tlli, &rai_bss, cell_id,
4369 GPRS_SAPI_GMM, bss_nu++,
4370 dtap_detach_req, sizeof(dtap_detach_req));
4371
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004372 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4373
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004374 dump_peers(stdout, 0, 0, &gbcfg);
4375
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004376 OSMO_ASSERT(!expect_msg());
4377
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004378 /* Attach (incomplete) and Detach (MT) */
4379
4380 gbproxy_delete_link_infos(peer);
4381
4382 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4383 foreign_tlli, &rai_bss, cell_id,
4384 GPRS_SAPI_GMM, bss_nu++,
4385 dtap_attach_req, sizeof(dtap_attach_req));
4386
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004387 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4388
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004389 dump_peers(stdout, 0, 0, &gbcfg);
4390
4391 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4392 OSMO_ASSERT(link_info);
4393 OSMO_ASSERT(link_info->imsi_len == 0);
4394 OSMO_ASSERT(!link_info->is_deregistered);
4395 OSMO_ASSERT(link_info->imsi_acq_pending);
4396
4397 send_llc_dl_ui(nsi, "DETACH REQ (MT)", &sgsn_peer, 0x1002,
4398 foreign_tlli, 1, imsi, sizeof(imsi),
4399 GPRS_SAPI_GMM, sgsn_nu++,
4400 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4401
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004402 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4403
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004404 dump_peers(stdout, 0, 0, &gbcfg);
4405
4406 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4407 OSMO_ASSERT(link_info);
4408
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004409 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004410 foreign_tlli, &rai_bss, cell_id,
4411 GPRS_SAPI_GMM, bss_nu++,
4412 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4413
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004414 /* TODO: The stored messaged should be cleaned when receiving a Detach
4415 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
4416 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4417 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4418
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004419 dump_peers(stdout, 0, 0, &gbcfg);
4420
4421 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4422 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4423 OSMO_ASSERT(link_info);
4424 OSMO_ASSERT(link_info->is_deregistered);
4425
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004426 OSMO_ASSERT(!expect_msg());
4427 received_messages = NULL;
4428
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004429 dump_global(stdout, 0);
4430
4431 gbprox_reset(&gbcfg);
4432 gprs_ns_destroy(nsi);
4433 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004434
4435 cleanup_test();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004436}
4437
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004438struct gbproxy_link_info *register_tlli(
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004439 struct gbproxy_peer *peer, uint32_t tlli,
4440 const uint8_t *imsi, size_t imsi_len, time_t now)
4441{
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004442 struct gbproxy_link_info *link_info;
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004443 int imsi_matches = -1;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004444 int tlli_already_known = 0;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004445 struct gbproxy_config *cfg = peer->cfg;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004446
4447 /* Check, whether the IMSI matches */
4448 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004449 imsi_matches = gbproxy_check_imsi(
4450 &cfg->matches[GBPROX_MATCH_PATCHING], imsi, imsi_len);
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004451 if (imsi_matches < 0)
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004452 return NULL;
4453 }
4454
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004455 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004456
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004457 if (!link_info) {
4458 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004459
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004460 if (link_info) {
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004461 /* TLLI has changed somehow, adjust it */
4462 LOGP(DGPRS, LOGL_INFO,
4463 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004464 link_info->tlli.current, tlli);
4465 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004466 }
4467 }
4468
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004469 if (!link_info) {
4470 link_info = gbproxy_link_info_alloc(peer);
4471 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004472 } else {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004473 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004474 tlli_already_known = 1;
4475 }
4476
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004477 OSMO_ASSERT(link_info != NULL);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004478
4479 if (!tlli_already_known)
4480 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
4481
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004482 gbproxy_attach_link_info(peer, now, link_info);
4483 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004484
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004485 if (imsi_matches >= 0)
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004486 link_info->is_matching[GBPROX_MATCH_PATCHING] = imsi_matches;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004487
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004488 return link_info;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004489}
4490
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004491static void test_gbproxy_tlli_expire(void)
4492{
4493 struct gbproxy_config cfg = {0};
4494 struct gbproxy_peer *peer;
4495 const char *err_msg = NULL;
4496 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0x26 };
4497 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0x29 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004498 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004499 const uint32_t tlli1 = 1234 | 0xc0000000;
4500 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004501 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004502 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004503 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004504
4505 printf("Test TLLI info expiry\n\n");
4506
4507 gbproxy_init_config(&cfg);
4508
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004509 if (gbproxy_set_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING],
4510 filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004511 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
4512 err_msg);
4513 OSMO_ASSERT(err_msg == NULL);
4514 }
4515
4516 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004517 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004518
4519 printf("Test TLLI replacement:\n");
4520
4521 cfg.tlli_max_len = 0;
4522 cfg.tlli_max_age = 0;
4523 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004524 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004525
4526 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004527 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004528 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004529 OSMO_ASSERT(link_info);
4530 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004531 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004532
4533 /* replace the old entry */
4534 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004535 link_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004536 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004537 OSMO_ASSERT(link_info);
4538 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004539 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004540
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004541 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004542
4543 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004544 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4545 OSMO_ASSERT(link_info);
4546 OSMO_ASSERT(link_info->tlli.current == tlli2);
4547 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4548 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004549
4550 printf("\n");
4551
4552 gbproxy_peer_free(peer);
4553 }
4554
4555 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004556 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004557
4558 printf("Test IMSI replacement:\n");
4559
4560 cfg.tlli_max_len = 0;
4561 cfg.tlli_max_age = 0;
4562 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004563 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004564
4565 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004566 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004567 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004568 OSMO_ASSERT(link_info);
4569 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004570 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004571
4572 /* try to replace the old entry */
4573 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004574 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004575 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004576 OSMO_ASSERT(link_info);
4577 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004578 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004579
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004580 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004581
4582 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004583 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4584 OSMO_ASSERT(!link_info);
4585 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4586 OSMO_ASSERT(link_info);
4587 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004588
4589 printf("\n");
4590
4591 gbproxy_peer_free(peer);
4592 }
4593
4594 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004595 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004596 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004597
4598 printf("Test TLLI expiry, max_len == 1:\n");
4599
4600 cfg.tlli_max_len = 1;
4601 cfg.tlli_max_age = 0;
4602 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004603 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004604
4605 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004606 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004607 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004608
4609 /* replace the old entry */
4610 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004611 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004612 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004613
Jacob Erlbeck51fde082014-09-19 16:40:21 +02004614 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004615 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004616 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004617
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004618 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004619
4620 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004621 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4622 OSMO_ASSERT(!link_info);
4623 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4624 OSMO_ASSERT(link_info);
4625 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004626
4627 printf("\n");
4628
4629 gbproxy_peer_free(peer);
4630 }
4631
4632 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004633 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004634 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004635
4636 printf("Test TLLI expiry, max_age == 1:\n");
4637
4638 cfg.tlli_max_len = 0;
4639 cfg.tlli_max_age = 1;
4640 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004641 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004642
4643 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004644 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004645 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004646
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004647 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004648 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004649 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004650 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004651
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004652 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004653 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004654 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004655
4656 dump_peers(stdout, 2, now + 2, &cfg);
4657
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004658 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004659 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4660 OSMO_ASSERT(!link_info);
4661 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4662 OSMO_ASSERT(link_info);
4663 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004664
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004665 printf("\n");
4666
4667 gbproxy_peer_free(peer);
4668 }
4669
4670 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004671 struct gbproxy_link_info *link_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004672 int num_removed;
4673
4674 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
4675
4676 cfg.tlli_max_len = 0;
4677 cfg.tlli_max_age = 1;
4678 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004679 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004680
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004681 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004682 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004683 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004684
4685 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004686 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004687 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004688 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004689
4690 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004691 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004692 now + 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004693 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004694
4695 dump_peers(stdout, 2, now + 2, &cfg);
4696
4697 printf(" Remove stale TLLIs\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004698 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004699 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004700 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004701
4702 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004703
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004704 /* verify that tlli3 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004705 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4706 OSMO_ASSERT(!link_info);
4707 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4708 OSMO_ASSERT(!link_info);
4709 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
4710 OSMO_ASSERT(link_info);
4711 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004712
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004713 printf("\n");
4714
4715 gbproxy_peer_free(peer);
4716 }
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004717 gbproxy_clear_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING]);
4718 gbprox_reset(&cfg);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004719
4720 cleanup_test();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004721}
4722
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004723static void test_gbproxy_imsi_matching(void)
4724{
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004725 const char *err_msg = NULL;
4726 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4727 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4728 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4729 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4730 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4731 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4732 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4733 const char *filter_re1 = ".*";
4734 const char *filter_re2 = "^1234";
4735 const char *filter_re3 = "^4321";
4736 const char *filter_re4_bad = "^12[";
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004737 struct gbproxy_match match = {0,};
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004738
4739 printf("=== Test IMSI/TMSI matching ===\n\n");
4740
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004741 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004742
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004743 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re1, &err_msg) == 0);
4744 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004745
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004746 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4747 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004748
4749 err_msg = NULL;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004750 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004751 OSMO_ASSERT(err_msg != NULL);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004752 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004753
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004754 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4755 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004756
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004757 OSMO_ASSERT(gbproxy_set_patch_filter(&match, NULL, &err_msg) == 0);
4758 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004759
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004760 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4761 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004762
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004763 gbproxy_clear_patch_filter(&match);
4764 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +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
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004769 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 1);
4770 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004771 /* imsi3_bad contains 0xE and 0xF digits, but the conversion function
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004772 * doesn't complain, so gbproxy_check_imsi() doesn't return -1 in this
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004773 * case. */
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004774 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4775 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4776 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4777 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4778 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004779
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004780 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re3, &err_msg) == 0);
4781 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004782
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004783 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 0);
4784 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 0);
4785 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4786 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4787 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4788 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4789 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004790
4791 /* TODO: Check correct length but wrong type with is_mi_tmsi */
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004792
4793 gbproxy_clear_patch_filter(&match);
4794 OSMO_ASSERT(match.enable == 0);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004795
4796 cleanup_test();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004797}
4798
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004799static struct log_info_cat gprs_categories[] = {
4800 [DGPRS] = {
4801 .name = "DGPRS",
4802 .description = "GPRS Packet Service",
4803 .enabled = 1, .loglevel = LOGL_DEBUG,
4804 },
4805 [DNS] = {
4806 .name = "DNS",
4807 .description = "GPRS Network Service (NS)",
4808 .enabled = 1, .loglevel = LOGL_INFO,
4809 },
4810 [DBSSGP] = {
4811 .name = "DBSSGP",
4812 .description = "GPRS BSS Gateway Protocol (BSSGP)",
4813 .enabled = 1, .loglevel = LOGL_DEBUG,
4814 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004815};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004816
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004817static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004818 .cat = gprs_categories,
4819 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004820};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004821
4822int main(int argc, char **argv)
4823{
4824 osmo_init_logging(&info);
4825 log_set_use_color(osmo_stderr_target, 0);
4826 log_set_print_filename(osmo_stderr_target, 0);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02004827 osmo_signal_register_handler(SS_L_NS, &test_signal, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004828
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004829 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004830 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
4831 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004832
4833 rate_ctr_init(NULL);
4834
4835 setlinebuf(stdout);
4836
4837 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02004838 gbproxy_init_config(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004839 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004840 test_gbproxy_ident_changes();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004841 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02004842 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02004843 test_gbproxy_ra_patching();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02004844 test_gbproxy_ptmsi_patching();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02004845 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02004846 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02004847 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004848 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004849 test_gbproxy_tlli_expire();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004850 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004851
4852 exit(EXIT_SUCCESS);
4853}