blob: 78fa8cbde0548abc80cf004cdd5a6f10a2776149 [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
Alexander Couzens82182d02020-09-22 13:21:46 +02003 * (C) 2013-2020 by sysmocom s.f.m.c. GmbH
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004 * Author: Jacob Erlbeck <jerlbeck@sysmocom.de>
5 */
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02006#undef _GNU_SOURCE
7#define _GNU_SOURCE
8
9#include <stdio.h>
10#include <stdlib.h>
11#include <stdint.h>
12#include <string.h>
13#include <getopt.h>
14#include <dlfcn.h>
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020015#include <time.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020016#include <sys/types.h>
17#include <sys/socket.h>
18
Alexander Couzens82182d02020-09-22 13:21:46 +020019#include <talloc.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020020#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>
Alexander Couzens82182d02020-09-22 13:21:46 +020026#include <osmocom/core/socket.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020027#include <osmocom/core/rate_ctr.h>
Jacob Erlbeckb1381062014-07-01 12:41:13 +020028#include <osmocom/gsm/tlv.h>
Jacob Erlbeck59748e62014-08-11 17:26:21 +020029#include <osmocom/gsm/gsm_utils.h>
Harald Welte53373bc2016-04-20 17:11:43 +020030#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020031#include <osmocom/gprs/gprs_msgb.h>
Alexander Couzens82182d02020-09-22 13:21:46 +020032#include <osmocom/gprs/gprs_ns2.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020033#include <osmocom/gprs/gprs_bssgp.h>
Alexander Couzens82182d02020-09-22 13:21:46 +020034#include <osmocom/core/prim.h>
35#include <osmocom/vty/command.h>
Neels Hofmeyr396f2e62017-09-04 15:13:25 +020036#include <osmocom/sgsn/gb_proxy.h>
37#include <osmocom/sgsn/gprs_utils.h>
38#include <osmocom/sgsn/gprs_llc.h>
39#include <osmocom/sgsn/gprs_gb_parse.h>
40#include <osmocom/sgsn/debug.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020041
42#define REMOTE_BSS_ADDR 0x01020304
43#define REMOTE_SGSN_ADDR 0x05060708
44
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020045#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020046
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +020047#define REMOTE_SGSN2_ADDR 0x15161718
48#define SGSN2_NSEI 0x0102
49
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020050#define MATCH_ANY (-1)
51
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +010052void *tall_sgsn_ctx = NULL;
Neels Hofmeyree6cfdc2017-07-13 02:03:50 +020053
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020054struct gbproxy_config gbcfg = {0};
55
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020056struct llist_head *received_messages = NULL;
57
Max3b6332f2017-11-01 13:28:38 +010058/* override, requires '-Wl,--wrap=osmo_get_rand_id' */
59int __real_osmo_get_rand_id(uint8_t *data, size_t len);
60int mock_osmo_get_rand_id(uint8_t *data, size_t len);
61int (*osmo_get_rand_id_cb)(uint8_t *, size_t) =
62 &mock_osmo_get_rand_id;
Daniel Willmann537d4802015-10-12 19:36:35 +020063
Max3b6332f2017-11-01 13:28:38 +010064int __wrap_osmo_get_rand_id(uint8_t *buf, size_t num)
Daniel Willmann537d4802015-10-12 19:36:35 +020065{
Max3b6332f2017-11-01 13:28:38 +010066 return (*osmo_get_rand_id_cb)(buf, num);
Daniel Willmann537d4802015-10-12 19:36:35 +020067}
68
69static int rand_seq_num = 0;
Max3b6332f2017-11-01 13:28:38 +010070int mock_osmo_get_rand_id(uint8_t *buf, size_t num)
Daniel Willmann537d4802015-10-12 19:36:35 +020071{
72 uint32_t val;
73
74 OSMO_ASSERT(num == sizeof(val));
Daniel Willmann537d4802015-10-12 19:36:35 +020075
76 val = 0x00dead00 + rand_seq_num;
77
78 rand_seq_num++;
79
80 memcpy(buf, &val, num);
81
82 return 1;
83}
84
Daniel Willmannd1554ec2015-10-12 19:36:34 +020085static void cleanup_test()
86{
Daniel Willmann537d4802015-10-12 19:36:35 +020087 rand_seq_num = 0;
Daniel Willmannd1554ec2015-10-12 19:36:34 +020088}
89
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020090static int dump_global(FILE *stream, int indent)
91{
92 unsigned int i;
93 const struct rate_ctr_group_desc *desc;
94 int rc;
95
96 rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
97 if (rc < 0)
98 return rc;
99
100 desc = gbcfg.ctrg->desc;
101
102 for (i = 0; i < desc->num_ctr; i++) {
103 struct rate_ctr *ctr = &gbcfg.ctrg->ctr[i];
104 if (ctr->current) {
105 rc = fprintf(stream, "%*s %s: %llu\n",
106 indent, "",
107 desc->ctr_desc[i].description,
108 (long long)ctr->current);
109
110 if (rc < 0)
111 return rc;
112 }
113 }
114
115 return 0;
116}
117
Jacob Erlbeck7b821d02014-08-08 08:37:37 +0200118static int dump_peers(FILE *stream, int indent, time_t now,
119 struct gbproxy_config *cfg)
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200120{
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200121 struct gbproxy_peer *peer;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200122 struct gprs_ra_id raid;
123 unsigned int i;
124 const struct rate_ctr_group_desc *desc;
125 int rc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200126
127 rc = fprintf(stream, "%*sPeers:\n", indent, "");
128 if (rc < 0)
129 return rc;
130
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +0200131 llist_for_each_entry(peer, &cfg->bts_peers, list) {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200132 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200133 struct gbproxy_patch_state *state = &peer->patch_state;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200134 gsm48_parse_ra(&raid, peer->ra);
135
Neels Hofmeyr10719b72018-02-21 00:39:36 +0100136 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, RAI %s\n",
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200137 indent, "",
138 peer->nsei, peer->bvci,
139 peer->blocked ? "" : "not ",
Neels Hofmeyr10719b72018-02-21 00:39:36 +0100140 osmo_rai_name(&raid));
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200141
142 if (rc < 0)
143 return rc;
144
145 desc = peer->ctrg->desc;
146
147 for (i = 0; i < desc->num_ctr; i++) {
148 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
149 if (ctr->current) {
150 rc = fprintf(stream, "%*s %s: %llu\n",
151 indent, "",
152 desc->ctr_desc[i].description,
153 (long long)ctr->current);
154
155 if (rc < 0)
156 return rc;
157 }
158 }
159
160 fprintf(stream, "%*s TLLI-Cache: %d\n",
Jacob Erlbeckf8562e32014-09-19 16:03:07 +0200161 indent, "", state->logical_link_count);
162 llist_for_each_entry(link_info, &state->logical_links, list) {
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +0200163 struct osmo_mobile_identity mi;
164 const char *imsi_str;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200165 time_t age = now ? now - link_info->timestamp : 0;
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200166 int stored_msgs = 0;
167 struct llist_head *iter;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200168 enum gbproxy_match_id match_id;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200169 llist_for_each(iter, &link_info->stored_msgs)
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200170 stored_msgs++;
171
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +0200172 if (link_info->imsi > 0) {
173 if (osmo_mobile_identity_decode(&mi, link_info->imsi, link_info->imsi_len, false)
174 || mi.type != GSM_MI_TYPE_IMSI)
175 imsi_str = "(invalid)";
176 else
177 imsi_str = mi.imsi;
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200178 } else {
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +0200179 imsi_str = "(none)";
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200180 }
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200181 fprintf(stream, "%*s TLLI %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200182 indent, "", link_info->tlli.current);
183 if (link_info->tlli.assigned)
184 fprintf(stream, "/%08x", link_info->tlli.assigned);
185 if (link_info->sgsn_tlli.current) {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200186 fprintf(stream, " -> %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200187 link_info->sgsn_tlli.current);
188 if (link_info->sgsn_tlli.assigned)
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200189 fprintf(stream, "/%08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200190 link_info->sgsn_tlli.assigned);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200191 }
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200192 fprintf(stream, ", IMSI %s, AGE %d",
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +0200193 imsi_str, (int)age);
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200194
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200195 if (stored_msgs)
196 fprintf(stream, ", STORED %d", stored_msgs);
197
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200198 for (match_id = 0; match_id < ARRAY_SIZE(cfg->matches);
199 ++match_id) {
200 if (cfg->matches[match_id].enable &&
201 link_info->is_matching[match_id]) {
202 fprintf(stream, ", IMSI matches");
203 break;
204 }
205 }
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200206
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200207 if (link_info->imsi_acq_pending)
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200208 fprintf(stream, ", IMSI acquisition in progress");
209
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200210 if (cfg->route_to_sgsn2)
211 fprintf(stream, ", SGSN NSEI %d",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200212 link_info->sgsn_nsei);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200213
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200214 if (link_info->is_deregistered)
Jacob Erlbeck7430da62014-09-12 15:09:56 +0200215 fprintf(stream, ", DE-REGISTERED");
216
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200217 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200218 if (rc < 0)
219 return rc;
220 }
221 }
222
223 return 0;
224}
225
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200226const uint8_t *convert_ra(struct gprs_ra_id *raid)
227{
Max25c65c32018-01-08 14:43:53 +0100228 static struct gsm48_ra_id r;
229 gsm48_encode_ra(&r, raid);
230 return (const uint8_t *)&r;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200231}
232
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200233/* DTAP - Attach Request */
234static const unsigned char dtap_attach_req[] = {
235 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
236 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
237 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
238 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
239 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
240 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200241};
242
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200243/* DTAP - Attach Request (invalid RAI) */
244static const unsigned char dtap_attach_req2[] = {
245 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
246 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
247 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
248 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
249 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
250 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
251};
252
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200253/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
254static const unsigned char dtap_attach_req3[] = {
255 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
256 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
257 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
258 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
259 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
260 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
261};
262
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100263/* DTAP - Attach Request (IMSI 12131415161718) */
264static const unsigned char dtap_attach_req4[] = {
265 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
266 0x08, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200267 0xf8, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100268 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00,
269 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60,
270 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80,
271 0x00,
272};
273
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200274/* DTAP - Identity Request */
275static const unsigned char dtap_identity_req[] = {
276 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200277};
278
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200279/* DTAP - Identity Response */
280static const unsigned char dtap_identity_resp[] = {
281 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200282 0x16, 0x17, 0xf8
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200283};
284
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200285/* DTAP - Identity Response, IMSI 2 */
286static const unsigned char dtap_identity2_resp[] = {
287 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200288 0x16, 0x17, 0xf8
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200289};
290
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200291/* DTAP - Identity Response, IMSI 3 */
292static const unsigned char dtap_identity3_resp[] = {
293 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200294 0x26, 0x27, 0xf8
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200295};
296
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200297/* DTAP - Attach Accept */
298static const unsigned char dtap_attach_acc[] = {
299 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
300 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
301 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200302};
303
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200304/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200305static const unsigned char dtap_attach_acc2[] = {
306 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
307 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
308 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
309};
310
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200311/* DTAP - Attach Complete */
312static const unsigned char dtap_attach_complete[] = {
313 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200314};
315
Jacob Erlbeck2bf32612014-09-22 11:26:58 +0200316/* DTAP - Attach Reject (GPRS services not allowed) */
317static const unsigned char dtap_attach_rej7[] = {
318 0x08, 0x04, 0x07
319};
320
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200321/* DTAP - GMM Information */
322static const unsigned char dtap_gmm_information[] = {
323 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200324};
325
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200326/* DTAP - Routing Area Update Request */
327static const unsigned char dtap_ra_upd_req[] = {
328 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
329 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
330 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
331 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
332 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
333 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
334 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200335};
336
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200337/* DTAP - Routing Area Update Accept */
338static const unsigned char dtap_ra_upd_acc[] = {
339 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
340 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
341 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200342};
343
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200344/* DTAP - Routing Area Update Accept, P-TMSI 2 */
345static const unsigned char dtap_ra_upd_acc2[] = {
346 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
347 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
348 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
349};
350
351/* DTAP - Routing Area Update Accept, P-TMSI 3 */
352static const unsigned char dtap_ra_upd_acc3[] = {
353 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
354 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
355 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
356};
357
358/* DTAP - Routing Area Update Complete */
359static const unsigned char dtap_ra_upd_complete[] = {
360 0x08, 0x0a
361};
362
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200363/* DTAP - Routing Area Update Reject */
364/* cause = 10 ("Implicitly detached"), force_standby = 0 */
365static const unsigned char dtap_ra_upd_rej[] = {
366 0x08, 0x0b, 0x0a, 0x00,
367};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200368
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200369/* DTAP - Activate PDP Context Request */
370static const unsigned char dtap_act_pdp_ctx_req[] = {
371 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200372 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
374 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
375 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
376 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200377 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200378};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200379
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200380/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200381/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200382static const unsigned char dtap_detach_po_req[] = {
383 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
384 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200385};
386
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200387/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200388/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200389static const unsigned char dtap_detach_req[] = {
390 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
391 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200392};
393
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200394/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200395static const unsigned char dtap_detach_acc[] = {
396 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200397};
398
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200399/* DTAP - Detach Request (MT) */
400/* normal detach, reattach required, implicitly detached */
401static const unsigned char dtap_mt_detach_rea_req[] = {
402 0x08, 0x05, 0x01, 0x25, 0x0a
403};
404
405/* DTAP - Detach Request (MT) */
406/* normal detach, reattach not required, implicitly detached */
407static const unsigned char dtap_mt_detach_req[] = {
408 0x08, 0x05, 0x02, 0x25, 0x0a
409};
410
411/* DTAP - Detach Accept (MT) */
412static const unsigned char dtap_mt_detach_acc[] = {
413 0x08, 0x06
414};
415
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200416/* GPRS-LLC - SAPI: LLGMM, U, XID */
417static const unsigned char llc_u_xid_ul[] = {
418 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
419 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
420};
421
422/* GPRS-LLC - SAPI: LLGMM, U, XID */
423static const unsigned char llc_u_xid_dl[] = {
424 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
425 0xe4, 0xa9, 0x1a, 0x9e
426};
427
428/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
429static const unsigned char llc_ui_ll11_dns_query_ul[] = {
430 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
431 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
432 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
433 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
434 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
435 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
436 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
437 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
438 0x8f, 0x07
439};
440
441/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
442static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
443 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
444 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
445 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
446 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
447 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
448 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
449 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
450 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
451 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
452 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
453 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
454 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
455 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
456 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
457 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
458 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
459 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
460 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
461 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
462 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
463 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
464 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
465 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
466 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
467 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
468 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
469};
470
Alexander Couzens82182d02020-09-22 13:21:46 +0200471#define NS_ALLOC_HEADROOM 128
472#define NS_ALLOC_SIZE 3072
473static int gprs_ns2_callback(struct osmo_prim_hdr *oph, void *ctx);
474static void send_ns_unitdata(struct gprs_ns2_inst *nsi, const char *text,
475 uint16_t nsei, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200476 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
477{
Alexander Couzens82182d02020-09-22 13:21:46 +0200478 struct msgb *msg;
479 struct osmo_gprs_ns2_prim nsp = {};
480 nsp.nsei = nsei;
481 nsp.bvci = nsbvci;
482 //nsp.u.unitdata.change
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200483
Alexander Couzens82182d02020-09-22 13:21:46 +0200484 if (bssgp_msg_size > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
485 fprintf(stderr, "message too long: %zu\n", bssgp_msg_size);
486 return;
487 }
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200488
Alexander Couzens82182d02020-09-22 13:21:46 +0200489 msg = msgb_alloc_headroom(NS_ALLOC_SIZE, NS_ALLOC_HEADROOM,
490 "GPRS/NS");
491 OSMO_ASSERT(msg);
492 memmove(msg->data, bssgp_msg, bssgp_msg_size);
493 msgb_bssgph(msg) = msg->data;
494 msg->l2h = msg->data;
495 msg->l3h = msg->data;
496 msgb_put(msg, bssgp_msg_size);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200497
Alexander Couzens82182d02020-09-22 13:21:46 +0200498 printf("PROCESSING %s from NSEI %d\n%s\n\n",
499 text, nsei,
500 osmo_hexdump(bssgp_msg, bssgp_msg_size));
501
502
503 //gprs_process_message(nsi, text ? text : "UNITDATA", nsei, msg, bssgp_msg_size + 4);
504 osmo_prim_init(&nsp.oph, SAP_NS, PRIM_NS_UNIT_DATA,
505 PRIM_OP_INDICATION, msg);
506
507 gprs_ns2_callback(&nsp.oph, &gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +0200508}
509static int gbprox_test_bssgp_send_cb(void *ctx, struct msgb *msg);
510
511/* wrap */
512int gprs_ns2_recv_prim(struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph)
513{
514 struct osmo_gprs_ns2_prim *nsp;
515
516 if (oph->sap != SAP_NS)
517 return 0;
518
519 nsp = container_of(oph, struct osmo_gprs_ns2_prim, oph);
520
521 if (oph->operation != PRIM_OP_REQUEST) {
522 LOGP(DPCU, LOGL_NOTICE, "NS: %s Unknown prim %d from NS\n",
523 get_value_string(osmo_prim_op_names, oph->operation),
524 oph->operation);
525 return 0;
526 }
527
528 switch (oph->primitive) {
529 case PRIM_NS_UNIT_DATA:
530 /* hand the message into the BSSGP implementation */
531 msgb_bssgph(oph->msg) = oph->msg->l3h;
532 msgb_bvci(oph->msg) = nsp->bvci;
533 msgb_nsei(oph->msg) = nsp->nsei;
534 printf("NS2 UD REQUEST, prim %d, msg length %zu, bvci 0x%04x\n%s\n\n",
535 oph->primitive, msgb_bssgp_len(oph->msg), nsp->bvci,
536 osmo_hexdump(msgb_l3(oph->msg), msgb_l3len(oph->msg)));
537 return gbprox_test_bssgp_send_cb(&gbcfg, oph->msg);
538 break;
539 default:
540 printf("NS2 REQUEST, prim %d, bvci 0x%04x\n\n",
541 oph->primitive, nsp->bvci);
542
543 break;
544 }
545 return 0;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200546}
547
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200548static void send_bssgp_ul_unitdata(
Alexander Couzens82182d02020-09-22 13:21:46 +0200549 struct gprs_ns2_inst *nsi, const char *text,
550 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200551 struct gprs_ra_id *raid, uint16_t cell_id,
552 const uint8_t *llc_msg, size_t llc_msg_size)
553{
554 /* GPRS Network Service, PDU type: NS_UNITDATA */
555 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
556 unsigned char msg[4096] = {
557 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
558 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
559 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
560 };
561
562 size_t bssgp_msg_size = 23 + llc_msg_size;
563
564 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
565
Max25c65c32018-01-08 14:43:53 +0100566 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 10), raid);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200567 msg[1] = (uint8_t)(tlli >> 24);
568 msg[2] = (uint8_t)(tlli >> 16);
569 msg[3] = (uint8_t)(tlli >> 8);
570 msg[4] = (uint8_t)(tlli >> 0);
571 msg[16] = cell_id / 256;
572 msg[17] = cell_id % 256;
573 msg[21] = llc_msg_size / 256;
574 msg[22] = llc_msg_size % 256;
575 memcpy(msg + 23, llc_msg, llc_msg_size);
576
577 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
Alexander Couzens82182d02020-09-22 13:21:46 +0200578 nsei, nsbvci, msg, bssgp_msg_size);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200579}
580
581static void send_bssgp_dl_unitdata(
Alexander Couzens82182d02020-09-22 13:21:46 +0200582 struct gprs_ns2_inst *nsi, const char *text,
583 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200584 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
585 const uint8_t *llc_msg, size_t llc_msg_size)
586{
587 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
588 unsigned char msg[4096] = {
589 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
590 0x16, 0x82, 0x02, 0x58,
591 };
592 unsigned char racap_drx[] = {
593 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
594 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
595 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
596 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
597 };
598
599 size_t bssgp_msg_size = 0;
600
601 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
602
603 msg[1] = (uint8_t)(tlli >> 24);
604 msg[2] = (uint8_t)(tlli >> 16);
605 msg[3] = (uint8_t)(tlli >> 8);
606 msg[4] = (uint8_t)(tlli >> 0);
607
608 bssgp_msg_size = 12;
609
610 if (with_racap_drx) {
611 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
612 bssgp_msg_size += sizeof(racap_drx);
613 }
614
615 if (imsi) {
616 OSMO_ASSERT(imsi_size <= 127);
617 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
618 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
619 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
620 bssgp_msg_size += 2 + imsi_size;
621 }
622
623 if ((bssgp_msg_size % 4) != 0) {
624 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
625 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
626 msg[bssgp_msg_size + 1] = 0x80 | abytes;
627 memset(msg + bssgp_msg_size + 2, 0, abytes);
628 bssgp_msg_size += 2 + abytes;
629 }
630
631 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
632 if (llc_msg_size < 128) {
633 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
634 bssgp_msg_size += 2;
635 } else {
636 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
637 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
638 bssgp_msg_size += 3;
639 }
640 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
641 bssgp_msg_size += llc_msg_size;
642
643
644 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
Alexander Couzens82182d02020-09-22 13:21:46 +0200645 nsei, nsbvci, msg, bssgp_msg_size);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200646}
647
Alexander Couzens82182d02020-09-22 13:21:46 +0200648static void send_bssgp_reset(struct gprs_ns2_inst *nsi,
649 uint16_t nsei, uint16_t bvci)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200650{
651 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
652 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200653 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200654 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200655 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
656 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200657 };
658
659 msg[3] = bvci / 256;
660 msg[4] = bvci % 256;
661
Alexander Couzens82182d02020-09-22 13:21:46 +0200662 send_ns_unitdata(nsi, "BVC_RESET", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200663}
664
Alexander Couzens82182d02020-09-22 13:21:46 +0200665static void send_bssgp_reset_ack(struct gprs_ns2_inst *nsi,
666 uint16_t nsei, uint16_t bvci)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200667{
668 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
669 * BSSGP RESET_ACK */
670 static unsigned char msg[5] = {
671 0x23, 0x04, 0x82, 0x00,
672 0x00
673 };
674
675 msg[3] = bvci / 256;
676 msg[4] = bvci % 256;
677
Alexander Couzens82182d02020-09-22 13:21:46 +0200678 send_ns_unitdata(nsi, "BVC_RESET_ACK", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200679}
680
Alexander Couzens82182d02020-09-22 13:21:46 +0200681static void send_bssgp_suspend(struct gprs_ns2_inst *nsi,
682 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200683 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200684 struct gprs_ra_id *raid)
685{
686 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
687 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200688 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
689 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200690 };
691
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200692 msg[3] = (uint8_t)(tlli >> 24);
693 msg[4] = (uint8_t)(tlli >> 16);
694 msg[5] = (uint8_t)(tlli >> 8);
695 msg[6] = (uint8_t)(tlli >> 0);
696
Max25c65c32018-01-08 14:43:53 +0100697 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200698
Alexander Couzens82182d02020-09-22 13:21:46 +0200699 send_ns_unitdata(nsi, "BVC_SUSPEND", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200700}
701
Alexander Couzens82182d02020-09-22 13:21:46 +0200702static void send_bssgp_suspend_ack(struct gprs_ns2_inst *nsi,
703 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200704 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200705 struct gprs_ra_id *raid)
706{
707 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
708 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200709 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
710 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200711 0x81, 0x01
712 };
713
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200714 msg[3] = (uint8_t)(tlli >> 24);
715 msg[4] = (uint8_t)(tlli >> 16);
716 msg[5] = (uint8_t)(tlli >> 8);
717 msg[6] = (uint8_t)(tlli >> 0);
718
Max25c65c32018-01-08 14:43:53 +0100719 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200720
Alexander Couzens82182d02020-09-22 13:21:46 +0200721 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200722}
723
Alexander Couzens82182d02020-09-22 13:21:46 +0200724static void send_bssgp_llc_discarded(struct gprs_ns2_inst *nsi,
725 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200726 uint16_t bvci, uint32_t tlli,
727 unsigned n_frames, unsigned n_octets)
728{
729 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
730 unsigned char msg[] = {
731 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
732 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
733 /* n octets */ 0xff, 0xff, 0xff
734 };
735
736 msg[3] = (uint8_t)(tlli >> 24);
737 msg[4] = (uint8_t)(tlli >> 16);
738 msg[5] = (uint8_t)(tlli >> 8);
739 msg[6] = (uint8_t)(tlli >> 0);
740 msg[9] = (uint8_t)(n_frames);
741 msg[12] = (uint8_t)(bvci >> 8);
742 msg[13] = (uint8_t)(bvci >> 0);
743 msg[16] = (uint8_t)(n_octets >> 16);
744 msg[17] = (uint8_t)(n_octets >> 8);
745 msg[18] = (uint8_t)(n_octets >> 0);
746
Alexander Couzens82182d02020-09-22 13:21:46 +0200747 send_ns_unitdata(nsi, "LLC_DISCARDED", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200748}
749
Alexander Couzens82182d02020-09-22 13:21:46 +0200750static void send_bssgp_paging(struct gprs_ns2_inst *nsi,
751 uint16_t nsei,
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200752 const uint8_t *imsi, size_t imsi_size,
753 struct gprs_ra_id *raid, uint32_t ptmsi)
754{
755 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
756 unsigned char msg[100] = {
757 0x06,
758 };
759
760 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
761 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
762
763 size_t bssgp_msg_size = 1;
764
765 if (imsi) {
766 OSMO_ASSERT(imsi_size <= 127);
767 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
768 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
769 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
770 bssgp_msg_size += 2 + imsi_size;
771 }
772
773 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
774 bssgp_msg_size += sizeof(drx_ie);
775
776 if (raid) {
777 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
778 msg[bssgp_msg_size+1] = 0x86;
Max25c65c32018-01-08 14:43:53 +0100779 gsm48_encode_ra((struct gsm48_ra_id *)(msg + bssgp_msg_size + 2), raid);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200780 bssgp_msg_size += 8;
781 }
782
783 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
784 bssgp_msg_size += sizeof(qos_ie);
785
786 if (ptmsi != GSM_RESERVED_TMSI) {
787 const uint32_t ptmsi_be = htonl(ptmsi);
788 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
789 msg[bssgp_msg_size+1] = 0x84;
790 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
791 bssgp_msg_size += 6;
792 }
793
Alexander Couzens82182d02020-09-22 13:21:46 +0200794 send_ns_unitdata(nsi, "PAGING_PS", nsei, 0, msg, bssgp_msg_size);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200795}
796
Alexander Couzens82182d02020-09-22 13:21:46 +0200797static void send_bssgp_flow_control_bvc(struct gprs_ns2_inst *nsi,
798 uint16_t nsei,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200799 uint16_t bvci, uint8_t tag)
800{
801 /* GPRS Network Service, PDU type: NS_UNITDATA,
802 * BSSGP FLOW_CONTROL_BVC */
803 unsigned char msg[] = {
804 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
805 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
806 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
807 };
808
809 msg[3] = tag;
810
Alexander Couzens82182d02020-09-22 13:21:46 +0200811 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", nsei, bvci,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200812 msg, sizeof(msg));
813}
814
Alexander Couzens82182d02020-09-22 13:21:46 +0200815static void send_bssgp_flow_control_bvc_ack(struct gprs_ns2_inst *nsi,
816 uint16_t nsei,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200817 uint16_t bvci, uint8_t tag)
818{
819 /* GPRS Network Service, PDU type: NS_UNITDATA,
820 * BSSGP FLOW_CONTROL_BVC_ACK */
821 unsigned char msg[] = {
822 0x27, 0x1e, 0x81, /* Tag */ 0xce
823 };
824
825 msg[3] = tag;
826
Alexander Couzens82182d02020-09-22 13:21:46 +0200827 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", nsei, bvci,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200828 msg, sizeof(msg));
829}
830
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200831static void send_llc_ul_ui(
Alexander Couzens82182d02020-09-22 13:21:46 +0200832 struct gprs_ns2_inst *nsi, const char *text,
833 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200834 struct gprs_ra_id *raid, uint16_t cell_id,
835 unsigned sapi, unsigned nu,
836 const uint8_t *msg, size_t msg_size)
837{
838 unsigned char llc_msg[4096] = {
839 0x00, 0xc0, 0x01
840 };
841
842 size_t llc_msg_size = 3 + msg_size + 3;
843 uint8_t e_bit = 0;
844 uint8_t pm_bit = 1;
845 unsigned fcs;
846
847 nu &= 0x01ff;
848
849 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
850
851 llc_msg[0] = (sapi & 0x0f);
852 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
853 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
854
855 memcpy(llc_msg + 3, msg, msg_size);
856
857 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
858 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
859 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
860 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
861
862 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
Alexander Couzens82182d02020-09-22 13:21:46 +0200863 nsei, nsbvci, tlli, raid, cell_id,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200864 llc_msg, llc_msg_size);
865}
866
867static void send_llc_dl_ui(
Alexander Couzens82182d02020-09-22 13:21:46 +0200868 struct gprs_ns2_inst *nsi, const char *text,
869 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200870 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
871 unsigned sapi, unsigned nu,
872 const uint8_t *msg, size_t msg_size)
873{
874 /* GPRS Network Service, PDU type: NS_UNITDATA */
875 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
876 unsigned char llc_msg[4096] = {
877 0x00, 0x00, 0x01
878 };
879
880 size_t llc_msg_size = 3 + msg_size + 3;
881 uint8_t e_bit = 0;
882 uint8_t pm_bit = 1;
883 unsigned fcs;
884
885 nu &= 0x01ff;
886
887 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
888
889 llc_msg[0] = 0x40 | (sapi & 0x0f);
890 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
891 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
892
893 memcpy(llc_msg + 3, msg, msg_size);
894
895 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
896 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
897 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
898 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
899
900 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
Alexander Couzens82182d02020-09-22 13:21:46 +0200901 nsei, nsbvci, tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200902 with_racap_drx, imsi, imsi_size,
903 llc_msg, llc_msg_size);
904}
905
906
Alexander Couzens82182d02020-09-22 13:21:46 +0200907/* STATUS indications */
908static void send_ns_avail(struct gprs_ns2_inst *nsi,
909 uint16_t sgsn_nsei)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200910{
Alexander Couzens82182d02020-09-22 13:21:46 +0200911 struct osmo_gprs_ns2_prim nsp = {};
912 nsp.nsei = sgsn_nsei;
913 nsp.bvci = 0;
914 nsp.u.status.cause = NS_AFF_CAUSE_RECOVERY;
915 nsp.u.status.transfer = -1;
916 nsp.u.status.first = true;
917 osmo_prim_init(&nsp.oph, SAP_NS, PRIM_NS_STATUS,
918 PRIM_OP_INDICATION, NULL);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200919
Alexander Couzens82182d02020-09-22 13:21:46 +0200920 gprs_ns2_callback(&nsp.oph, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200921}
922
Alexander Couzens82182d02020-09-22 13:21:46 +0200923static void setup_ns(struct gprs_ns2_inst *nsi,
924 uint16_t nsei)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200925{
Alexander Couzens82182d02020-09-22 13:21:46 +0200926 printf("Setup NS-VC: "
927 "NSEI 0x%04x(%d)\n\n",
928 nsei, nsei);
929 send_ns_avail(nsi, nsei);
930}
931
932static void setup_bssgp(struct gprs_ns2_inst *nsi,
933 uint16_t nsei, uint16_t bvci)
934{
935 printf("Setup BSSGP: "
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200936 "BVCI 0x%04x(%d)\n\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200937 bvci, bvci);
938
Alexander Couzens82182d02020-09-22 13:21:46 +0200939 send_bssgp_reset(nsi, nsei, bvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200940}
941
Alexander Couzens82182d02020-09-22 13:21:46 +0200942static void connect_sgsn(struct gprs_ns2_inst *nsi,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200943 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200944{
Alexander Couzens82182d02020-09-22 13:21:46 +0200945 send_ns_avail(nsi, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200946}
947
Alexander Couzens82182d02020-09-22 13:21:46 +0200948/* Function used to send a BSSGP message through NS */
949static int gbprox_test_bssgp_send_cb(void *ctx, struct msgb *msg)
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200950{
Alexander Couzens82182d02020-09-22 13:21:46 +0200951 int rc;
952 struct gbproxy_config *cfg = (struct gbproxy_config *) ctx;
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200953
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200954 uint16_t nsei = msgb_nsei(msg);
Alexander Couzens82182d02020-09-22 13:21:46 +0200955 uint16_t bvci = msgb_bvci(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200956
Jacob Erlbeckacfaff32014-09-22 18:54:34 +0200957 if (received_messages) {
958 struct msgb *msg_copy;
Pau Espin Pedrol816a67d2018-08-15 13:53:48 +0200959 msg_copy = bssgp_msgb_copy(msg, "received_messages");
Jacob Erlbeckacfaff32014-09-22 18:54:34 +0200960 llist_add_tail(&msg_copy->list, received_messages);
961 }
962
Alexander Couzens82182d02020-09-22 13:21:46 +0200963 if (nsei == cfg->nsip_sgsn_nsei)
964 printf("Message for SGSN");
965 else if (nsei == cfg->nsip_sgsn2_nsei)
966 printf("Message for SGSN2");
967 else
968 printf("Message for BSS");
969 printf(" (NSEI=%d BVCI=%d):\n%s\n\n", nsei, bvci, msgb_hexdump(msg));
970
971 rc = msgb_length(msg);
972 msgb_free(msg);
973
974 return rc;
975}
976
977static void gprs_ns2_test_prim_status_cb(struct gbproxy_config *cfg, struct osmo_gprs_ns2_prim *nsp)
978{
979 enum gprs_ns2_affecting_cause cause = nsp->u.status.cause;
980
981 switch (cause) {
982 case NS_AFF_CAUSE_RECOVERY:
983 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d became available\n", nsp->nsei);
984 break;
985 case NS_AFF_CAUSE_FAILURE:
986 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d became unavailable\n", nsp->nsei);
987 break;
988 case NS_AFF_CAUSE_VC_RECOVERY:
989 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d NS-VC %s became available\n", nsp->nsei, nsp->u.status.nsvc);
990 break;
991 case NS_AFF_CAUSE_VC_FAILURE:
992 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d NS-VC %s became unavailable\n", nsp->nsei, nsp->u.status.nsvc);
993 break;
994 default:
995 LOGP(DPCU, LOGL_NOTICE, "Unhandled status %d (NS-NSE %d)\n", cause, nsp->nsei);
996 break;
997 }
998}
999
1000int gprs_ns2_prim_cb(struct osmo_prim_hdr *oph, void *ctx);
1001
1002/* override */
1003static int gprs_ns2_callback(struct osmo_prim_hdr *oph, void *ctx)
1004{
1005 struct osmo_gprs_ns2_prim *nsp;
1006 struct gbproxy_config *cfg = (struct gbproxy_config *) ctx;
1007
1008 if (oph->sap != SAP_NS)
1009 return 0;
1010
1011 nsp = container_of(oph, struct osmo_gprs_ns2_prim, oph);
1012
1013 if (oph->operation != PRIM_OP_INDICATION) {
1014 LOGP(DPCU, LOGL_NOTICE, "NS: %s Unknown prim %d from NS\n",
1015 get_value_string(osmo_prim_op_names, oph->operation),
1016 oph->operation);
1017 return 0;
1018 }
1019
1020 switch (oph->primitive) {
1021 case PRIM_NS_UNIT_DATA:
1022 /* hand the message into the BSSGP implementation */
1023 msgb_bssgph(oph->msg) = oph->msg->l3h;
1024 msgb_bvci(oph->msg) = nsp->bvci;
1025 msgb_nsei(oph->msg) = nsp->nsei;
1026 printf("NS2 CALLBACK, prim %d, msg length %zu, bvci 0x%04x\n%s\n\n",
1027 oph->primitive, msgb_bssgp_len(oph->msg), nsp->bvci,
1028 osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));
1029 break;
1030 case PRIM_NS_STATUS:
1031 gprs_ns2_test_prim_status_cb(cfg, nsp);
1032 default:
1033 printf("NS2 CALLBACK, prim %d, bvci 0x%04x\n\n",
1034 oph->primitive, nsp->bvci);
1035
1036 break;
1037 }
1038
Daniel Willmann02f2c342020-11-04 17:32:56 +01001039 /* Hand off to gbproxy which will free the msg */
Alexander Couzens82182d02020-09-22 13:21:46 +02001040 return gprs_ns2_prim_cb(oph, ctx);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001041}
1042
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001043/* Get the next message from the receive FIFO
1044 *
1045 * \returns a pointer to the message which will be invalidated at the next call
1046 * to expect_msg. Returns NULL, if there is no message left.
1047 */
1048static struct msgb *expect_msg(void)
1049{
1050 static struct msgb *msg = NULL;
1051
1052 msgb_free(msg);
1053 msg = NULL;
1054
1055 if (!received_messages)
1056 return NULL;
1057
1058 if (llist_empty(received_messages))
1059 return NULL;
1060
1061 msg = llist_entry(received_messages->next, struct msgb, list);
1062 llist_del(&msg->list);
1063
1064 return msg;
1065}
1066
1067struct expect_result {
1068 struct msgb *msg;
1069 struct gprs_gb_parse_context parse_ctx;
1070};
1071
1072static struct expect_result *expect_bssgp_msg(
1073 int match_nsei, int match_bvci, int match_pdu_type)
1074{
1075 static struct expect_result result;
1076 static const struct expect_result empty_result = {0,};
1077 static struct msgb *msg;
1078 uint16_t nsei;
1079 int rc;
1080
1081 memcpy(&result, &empty_result, sizeof(result));
1082
1083 msg = expect_msg();
1084 if (!msg)
1085 return NULL;
1086
1087 nsei = msgb_nsei(msg);
1088
1089 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1090 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1091 __func__, match_nsei, nsei);
1092 return NULL;
1093 }
1094
1095 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1096 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1097 __func__, match_bvci, msgb_bvci(msg));
1098 return NULL;
1099 }
1100
1101 result.msg = msg;
1102
1103 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1104 result.parse_ctx.peer_nsei = nsei;
1105
1106 if (!msgb_bssgph(msg)) {
1107 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1108 return NULL;
1109 }
1110
1111 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1112 &result.parse_ctx);
1113
1114 if (!rc) {
1115 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1116 return NULL;
1117 }
1118
1119 if (match_pdu_type != MATCH_ANY &&
1120 match_pdu_type != result.parse_ctx.pdu_type) {
1121 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1122 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1123 return NULL;
1124 }
1125
1126 return &result;
1127}
1128
1129static struct expect_result *expect_llc_msg(
1130 int match_nsei, int match_bvci, int match_sapi, int match_type)
1131{
1132 static struct expect_result *result;
1133
1134 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1135 if (!result)
1136 return NULL;
1137
1138 if (!result->parse_ctx.llc) {
1139 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1140 return NULL;
1141 }
1142
1143 if (match_sapi != MATCH_ANY &&
1144 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1145 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1146 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1147 return NULL;
1148 }
1149
1150 if (match_type != MATCH_ANY &&
1151 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1152 fprintf(stderr,
1153 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1154 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1155 return NULL;
1156 }
1157
1158 return result;
1159}
1160
1161static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1162 int match_type)
1163{
1164 static struct expect_result *result;
1165
1166 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1167 if (!result)
1168 return NULL;
1169
1170 if (!result->parse_ctx.g48_hdr) {
1171 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1172 return NULL;
1173 }
1174
1175 if (match_type != MATCH_ANY &&
1176 match_type != result->parse_ctx.g48_hdr->msg_type) {
1177 fprintf(stderr,
1178 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1179 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1180 return NULL;
1181 }
1182
1183 return result;
1184}
1185
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001186static void test_gbproxy()
1187{
Alexander Couzens82182d02020-09-22 13:21:46 +02001188 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
1189 uint16_t bss_nsei[2] = {0x1000, 0x2000};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001190
Alexander Couzens82182d02020-09-22 13:21:46 +02001191 gbcfg.nsi = nsi;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001192 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1193
Alexander Couzens82182d02020-09-22 13:21:46 +02001194 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001195
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001196 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001197 printf("--- Initialise SGSN ---\n\n");
1198
Alexander Couzens82182d02020-09-22 13:21:46 +02001199 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001200
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001201 printf("--- Initialise BSS 1 ---\n\n");
1202
Alexander Couzens82182d02020-09-22 13:21:46 +02001203 setup_ns(nsi, bss_nsei[0]);
1204 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001205 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001206
Alexander Couzens82182d02020-09-22 13:21:46 +02001207 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001208
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001209 printf("--- Initialise BSS 2 ---\n\n");
1210
Alexander Couzens82182d02020-09-22 13:21:46 +02001211 setup_ns(nsi, bss_nsei[1]);
1212 setup_bssgp(nsi, bss_nsei[1], 0x2002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001213 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001214
Alexander Couzens82182d02020-09-22 13:21:46 +02001215 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x2002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001216
1217 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1218
Alexander Couzens82182d02020-09-22 13:21:46 +02001219 setup_bssgp(nsi, bss_nsei[0], 0x1012);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001220 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001221
Alexander Couzens82182d02020-09-22 13:21:46 +02001222 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1012);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001223
1224 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1225
Alexander Couzens82182d02020-09-22 13:21:46 +02001226 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001227 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001228
Alexander Couzens82182d02020-09-22 13:21:46 +02001229 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001230
1231 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1232
Alexander Couzens82182d02020-09-22 13:21:46 +02001233 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001234 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001235
Alexander Couzens82182d02020-09-22 13:21:46 +02001236 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001237
1238 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1239
Alexander Couzens82182d02020-09-22 13:21:46 +02001240 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001241
1242 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1243
Alexander Couzens82182d02020-09-22 13:21:46 +02001244 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001245
1246 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1247
Alexander Couzens82182d02020-09-22 13:21:46 +02001248 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001249
1250 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1251
Alexander Couzens82182d02020-09-22 13:21:46 +02001252 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001253
1254 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1255
Alexander Couzens82182d02020-09-22 13:21:46 +02001256 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x2002, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001257
1258 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1259
Alexander Couzens82182d02020-09-22 13:21:46 +02001260 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x2002, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001261
1262 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1263
Alexander Couzens82182d02020-09-22 13:21:46 +02001264 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001265 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001266
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001267 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001268
Alexander Couzens82182d02020-09-22 13:21:46 +02001269 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001270
1271 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1272
Alexander Couzens82182d02020-09-22 13:21:46 +02001273 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001274
1275 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1276
Alexander Couzens82182d02020-09-22 13:21:46 +02001277 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001278
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001279 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1280
Alexander Couzens82182d02020-09-22 13:21:46 +02001281 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x10ff, (uint8_t *)"", 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001282
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001283 /* Find peer */
1284 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1285 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1286 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1287 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1288 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1289 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1290
1291
1292 /* Cleanup */
1293 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1294 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1295 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1296 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1297 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1298
1299 dump_peers(stdout, 0, 0, &gbcfg);
1300
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001301 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001302
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001303 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001304 gprs_ns2_free(nsi);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001305 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001306}
1307
1308static void test_gbproxy_ident_changes()
1309{
Alexander Couzens82182d02020-09-22 13:21:46 +02001310 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
1311 uint16_t bss_nsei[2] = {0x1000, 0x2000};
Daniel Willmannf7a1aed2020-11-30 15:15:23 +01001312 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002};
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001313
Alexander Couzens82182d02020-09-22 13:21:46 +02001314 gbcfg.nsi = nsi;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001315 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1316
Alexander Couzens82182d02020-09-22 13:21:46 +02001317 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001318
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001319 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001320 printf("--- Initialise SGSN ---\n\n");
1321
Alexander Couzens82182d02020-09-22 13:21:46 +02001322 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001323
1324 printf("--- Initialise BSS 1 ---\n\n");
1325
Alexander Couzens82182d02020-09-22 13:21:46 +02001326 setup_ns(nsi, bss_nsei[0]);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001327
1328 printf("--- Setup BVCI 1 ---\n\n");
1329
Alexander Couzens82182d02020-09-22 13:21:46 +02001330 setup_bssgp(nsi, bss_nsei[0], bvci[0]);
1331 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001332 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001333
1334 printf("--- Setup BVCI 2 ---\n\n");
1335
Alexander Couzens82182d02020-09-22 13:21:46 +02001336 setup_bssgp(nsi, bss_nsei[0], bvci[1]);
1337 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001338 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001339
1340 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1341
Alexander Couzens82182d02020-09-22 13:21:46 +02001342 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[0], (uint8_t *)"", 0);
1343 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[0], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001344
1345 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1346
Alexander Couzens82182d02020-09-22 13:21:46 +02001347 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[1], (uint8_t *)"", 0);
1348 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001349
1350 printf("--- Change NSEI ---\n\n");
1351
Alexander Couzens82182d02020-09-22 13:21:46 +02001352 setup_ns(nsi, bss_nsei[1]);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001353
1354 printf("--- Setup BVCI 1 ---\n\n");
1355
Alexander Couzens82182d02020-09-22 13:21:46 +02001356 setup_bssgp(nsi, bss_nsei[1], bvci[0]);
1357 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001358 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001359
1360 printf("--- Setup BVCI 3 ---\n\n");
1361
Alexander Couzens82182d02020-09-22 13:21:46 +02001362 setup_bssgp(nsi, bss_nsei[1], bvci[2]);
1363 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001364 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001365
1366 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1367
Alexander Couzens82182d02020-09-22 13:21:46 +02001368 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[0], (uint8_t *)"", 0);
1369 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[0], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001370
1371 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1372 " (should fail) ---\n\n");
1373
Alexander Couzens82182d02020-09-22 13:21:46 +02001374 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001375 dump_peers(stdout, 0, 0, &gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001376 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001377 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001378
1379 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1380
Alexander Couzens82182d02020-09-22 13:21:46 +02001381 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[2], (uint8_t *)"", 0);
1382 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[2], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001383
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001384 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001385 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001386
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001387 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001388 gprs_ns2_free(nsi);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001389 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001390}
1391
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001392static void test_gbproxy_ra_patching()
1393{
Alexander Couzens82182d02020-09-22 13:21:46 +02001394 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001395 struct gprs_ra_id rai_bss =
1396 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1397 struct gprs_ra_id rai_sgsn =
1398 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1399 struct gprs_ra_id rai_unknown =
1400 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001401 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001402 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001403 const uint32_t ptmsi = 0xefe2b700;
1404 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001405 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001406 const uint32_t foreign_tlli2 = 0xbb00beef;
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001407 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001408 const char *patch_re = "^9898|^121314";
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001409 struct gbproxy_link_info *link_info;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001410 struct gbproxy_peer *peer;
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001411 LLIST_HEAD(rcv_list);
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001412 struct expect_result *expect_res;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001413
Alexander Couzens82182d02020-09-22 13:21:46 +02001414 uint16_t bss_nsei[1] = { 0x1000 };
1415
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001416 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001417
Alexander Couzens82182d02020-09-22 13:21:46 +02001418 gbcfg.nsi = nsi;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001419 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001420 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001421 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001422 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001423 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001424
Alexander Couzens82182d02020-09-22 13:21:46 +02001425 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001426
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001427 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING],
1428 patch_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001429 fprintf(stderr, "Failed to compile RE '%s': %s\n",
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001430 patch_re, err_msg);
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001431 exit(1);
1432 }
1433
1434
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001435 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001436 printf("--- Initialise SGSN ---\n\n");
1437
Alexander Couzens82182d02020-09-22 13:21:46 +02001438 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001439
1440 printf("--- Initialise BSS 1 ---\n\n");
1441
Alexander Couzens82182d02020-09-22 13:21:46 +02001442 setup_ns(nsi, bss_nsei[0]);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001443
1444 received_messages = &rcv_list;
1445
Alexander Couzens82182d02020-09-22 13:21:46 +02001446 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001447 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001448
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001449 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001450 OSMO_ASSERT(peer != NULL);
1451
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001452 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_BVC_RESET));
1453
Alexander Couzens82182d02020-09-22 13:21:46 +02001454 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001455
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001456 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_BVC_RESET_ACK));
1457
Alexander Couzens82182d02020-09-22 13:21:46 +02001458 send_bssgp_suspend(nsi, bss_nsei[0], 0xccd1758b, &rai_bss);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001459
1460 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_SUSPEND));
1461
Alexander Couzens82182d02020-09-22 13:21:46 +02001462 send_bssgp_suspend_ack(nsi, SGSN_NSEI, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001463
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001464 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_SUSPEND_ACK));
1465
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001466 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001467 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001468
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001469 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1470 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1471
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001472 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1473
Alexander Couzens82182d02020-09-22 13:21:46 +02001474 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001475 foreign_tlli, &rai_bss, cell_id,
1476 GPRS_SAPI_GMM, 0,
1477 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001478
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001479 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001480 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001481
Alexander Couzens82182d02020-09-22 13:21:46 +02001482 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001483 foreign_tlli, 0, NULL, 0,
1484 GPRS_SAPI_GMM, 0,
1485 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001486
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001487 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
1488
Alexander Couzens82182d02020-09-22 13:21:46 +02001489 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001490 foreign_tlli, &rai_bss, cell_id,
1491 GPRS_SAPI_GMM, 3,
1492 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001493
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001494 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
1495
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001496 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1497 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1498
Alexander Couzens82182d02020-09-22 13:21:46 +02001499 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001500 foreign_tlli, 1, imsi, sizeof(imsi),
1501 GPRS_SAPI_GMM, 1,
1502 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001503
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001504 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
1505
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001506 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1507
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001508 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1509 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1510 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1511
1512 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1513 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1514 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1515
1516 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1517 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1518 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1519
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001520 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1521 OSMO_ASSERT(link_info);
1522 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1523 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1524 OSMO_ASSERT(!link_info->tlli.bss_validated);
1525 OSMO_ASSERT(!link_info->tlli.net_validated);
1526 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1527 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1528 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1529 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001530
Alexander Couzens82182d02020-09-22 13:21:46 +02001531 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001532 local_tlli, &rai_bss, cell_id,
1533 GPRS_SAPI_GMM, 4,
1534 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001535
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001536 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
1537
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001538 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1539
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001540 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1541 OSMO_ASSERT(link_info);
1542 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1543 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1544 OSMO_ASSERT(link_info->tlli.bss_validated);
1545 OSMO_ASSERT(!link_info->tlli.net_validated);
1546 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1547 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1548 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1549 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001550
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001551 /* Replace APN (1) */
Alexander Couzens82182d02020-09-22 13:21:46 +02001552 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001553 local_tlli, &rai_bss, cell_id,
1554 GPRS_SAPI_GMM, 3,
1555 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001556
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001557 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1558
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001559 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1560
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001561 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1562 OSMO_ASSERT(link_info);
1563 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1564 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1565 OSMO_ASSERT(link_info->tlli.bss_validated);
1566 OSMO_ASSERT(!link_info->tlli.net_validated);
1567 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1568 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1569 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1570 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001571
Alexander Couzens82182d02020-09-22 13:21:46 +02001572 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001573 local_tlli, 1, imsi, sizeof(imsi),
1574 GPRS_SAPI_GMM, 2,
1575 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001576
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001577 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
1578
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001579 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1580
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001581 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1582 OSMO_ASSERT(link_info);
1583 OSMO_ASSERT(link_info->tlli.assigned == 0);
1584 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1585 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1586 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001587
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001588 /* Replace APN (2) */
Alexander Couzens82182d02020-09-22 13:21:46 +02001589 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001590 local_tlli, &rai_bss, cell_id,
1591 GPRS_SAPI_GMM, 3,
1592 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001593
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001594 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1595 OSMO_ASSERT(expect_res != NULL);
1596 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == gbcfg.core_apn_size + 2);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001597
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001598 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1599
Jacob Erlbeck73685282014-05-23 20:48:07 +02001600 gbcfg.core_apn[0] = 0;
1601 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001602
1603 /* Remove APN */
Alexander Couzens82182d02020-09-22 13:21:46 +02001604 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001605 local_tlli, &rai_bss, cell_id,
1606 GPRS_SAPI_GMM, 3,
1607 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001608
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001609 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1610 OSMO_ASSERT(expect_res != NULL);
1611 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001612
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001613 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1614
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001615 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001616
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001617 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02001618 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001619 local_tlli, &rai_bss, cell_id,
1620 GPRS_SAPI_GMM, 6,
1621 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001622
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001623 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1624
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001625 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1626 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1627
Alexander Couzens82182d02020-09-22 13:21:46 +02001628 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001629 local_tlli, 1, imsi, sizeof(imsi),
1630 GPRS_SAPI_GMM, 5,
1631 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001632
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001633 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
1634
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001635 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001636
1637 printf("--- RA update ---\n\n");
1638
Alexander Couzens82182d02020-09-22 13:21:46 +02001639 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001640 foreign_tlli, &rai_bss, 0x7080,
1641 GPRS_SAPI_GMM, 5,
1642 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001643
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001644 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
1645
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001646 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1647
Alexander Couzens82182d02020-09-22 13:21:46 +02001648 send_llc_dl_ui(nsi, "RA UPD ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001649 foreign_tlli, 1, imsi, sizeof(imsi),
1650 GPRS_SAPI_GMM, 6,
1651 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001652
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001653 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_ACK));
1654
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001655 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1656
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001657 /* Remove APN */
Alexander Couzens82182d02020-09-22 13:21:46 +02001658 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001659 local_tlli, &rai_bss, cell_id,
1660 GPRS_SAPI_GMM, 3,
1661 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001662
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001663 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1664 OSMO_ASSERT(expect_res != NULL);
1665 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001666
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001667 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1668
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001669 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001670
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001671 /* Detach (power off -> no Detach Accept) */
Alexander Couzens82182d02020-09-22 13:21:46 +02001672 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001673 local_tlli, &rai_bss, cell_id,
1674 GPRS_SAPI_GMM, 6,
1675 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001676
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001677 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1678
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001679 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1680
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001681 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001682 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001683
1684 printf("--- Bad cases ---\n\n");
1685
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001686 /* The RAI in the Attach Request message differs from the RAI in the
1687 * BSSGP message, only patch the latter */
1688
Alexander Couzens82182d02020-09-22 13:21:46 +02001689 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001690 foreign_tlli2, &rai_bss, cell_id,
1691 GPRS_SAPI_GMM, 0,
1692 dtap_attach_req2, sizeof(dtap_attach_req2));
1693
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001694 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
1695
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001696 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1697
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001698 printf("TLLI is already detached, shouldn't patch\n");
Alexander Couzens82182d02020-09-22 13:21:46 +02001699 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001700 local_tlli, &rai_bss, cell_id,
1701 GPRS_SAPI_GMM, 3,
1702 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001703
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001704 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1705
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001706 printf("Invalid RAI, shouldn't patch\n");
Alexander Couzens82182d02020-09-22 13:21:46 +02001707 send_bssgp_suspend_ack(nsi, SGSN_NSEI, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001708
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001709 /* TODO: The following breaks with the current libosmocore, enable it
1710 * again (and remove the plain expect_msg), when the msgb_bssgph patch
1711 * is integrated */
1712 /* OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_STATUS)); */
1713 OSMO_ASSERT(expect_msg());
1714
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001715 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001716 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001717
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001718 OSMO_ASSERT(!expect_msg());
1719 received_messages = NULL;
1720
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02001721 talloc_free(gbcfg.core_apn);
1722 gbcfg.core_apn = NULL;
1723
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02001724 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING]);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001725 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001726 gprs_ns2_free(nsi);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001727 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001728}
1729
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001730static void test_gbproxy_ptmsi_assignment()
1731{
Alexander Couzens82182d02020-09-22 13:21:46 +02001732 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001733 struct gprs_ra_id rai_bss =
1734 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1735 struct gprs_ra_id rai_unknown =
1736 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1737 uint16_t cell_id = 0x1234;
1738
1739 const uint32_t ptmsi = 0xefe2b700;
1740 const uint32_t local_tlli = 0xefe2b700;
1741
1742 const uint32_t foreign_tlli1 = 0x8000dead;
1743 const uint32_t foreign_tlli2 = 0x8000beef;
1744
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001745 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
1746 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0xf8};
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001747
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001748 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001749 struct gbproxy_peer *peer;
1750 unsigned bss_nu = 0;
1751 unsigned sgsn_nu = 0;
1752
Alexander Couzens82182d02020-09-22 13:21:46 +02001753 uint16_t bss_nsei[1] = { 0x1000 };
1754
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001755 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
1756
Alexander Couzens82182d02020-09-22 13:21:46 +02001757 gbcfg.nsi = nsi;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001758 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001759 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001760 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001761 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1762 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001763
Alexander Couzens82182d02020-09-22 13:21:46 +02001764 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001765
1766 printf("=== %s ===\n", __func__);
1767 printf("--- Initialise SGSN ---\n\n");
1768
Alexander Couzens82182d02020-09-22 13:21:46 +02001769 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001770
1771 printf("--- Initialise BSS 1 ---\n\n");
1772
Alexander Couzens82182d02020-09-22 13:21:46 +02001773 setup_ns(nsi, bss_nsei[0]);
1774 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001775
1776 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
1777 OSMO_ASSERT(peer != NULL);
1778
Alexander Couzens82182d02020-09-22 13:21:46 +02001779 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001780
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001781 dump_global(stdout, 0);
1782 dump_peers(stdout, 0, 0, &gbcfg);
1783
1784 printf("--- Establish first LLC connection ---\n\n");
1785
Alexander Couzens82182d02020-09-22 13:21:46 +02001786 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001787 foreign_tlli1, &rai_unknown, cell_id,
1788 GPRS_SAPI_GMM, bss_nu++,
1789 dtap_attach_req, sizeof(dtap_attach_req));
1790
1791 dump_peers(stdout, 0, 0, &gbcfg);
1792
Alexander Couzens82182d02020-09-22 13:21:46 +02001793 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001794 foreign_tlli1, 0, NULL, 0,
1795 GPRS_SAPI_GMM, sgsn_nu++,
1796 dtap_identity_req, sizeof(dtap_identity_req));
1797
1798 dump_peers(stdout, 0, 0, &gbcfg);
1799
Alexander Couzens82182d02020-09-22 13:21:46 +02001800 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001801 foreign_tlli1, &rai_bss, cell_id,
1802 GPRS_SAPI_GMM, bss_nu++,
1803 dtap_identity_resp, sizeof(dtap_identity_resp));
1804
1805 dump_peers(stdout, 0, 0, &gbcfg);
1806
Alexander Couzens82182d02020-09-22 13:21:46 +02001807 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001808 foreign_tlli1, 1, imsi1, sizeof(imsi1),
1809 GPRS_SAPI_GMM, sgsn_nu++,
1810 dtap_attach_acc, sizeof(dtap_attach_acc));
1811
1812 dump_peers(stdout, 0, 0, &gbcfg);
1813
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001814 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
1815 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1816 OSMO_ASSERT(link_info);
1817 OSMO_ASSERT(link_info == link_info2);
1818 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1819 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
1820 OSMO_ASSERT(!link_info->tlli.bss_validated);
1821 OSMO_ASSERT(!link_info->tlli.net_validated);
1822 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001823
Alexander Couzens82182d02020-09-22 13:21:46 +02001824 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001825 local_tlli, &rai_bss, cell_id,
1826 GPRS_SAPI_GMM, bss_nu++,
1827 dtap_attach_complete, sizeof(dtap_attach_complete));
1828
1829 dump_peers(stdout, 0, 0, &gbcfg);
1830
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001831 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
1832 OSMO_ASSERT(link_info);
1833 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1834 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
1835 OSMO_ASSERT(link_info->tlli.bss_validated);
1836 OSMO_ASSERT(!link_info->tlli.net_validated);
1837 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001838
1839
Alexander Couzens82182d02020-09-22 13:21:46 +02001840 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001841 local_tlli, 1, imsi1, sizeof(imsi1),
1842 GPRS_SAPI_GMM, sgsn_nu++,
1843 dtap_gmm_information, sizeof(dtap_gmm_information));
1844
1845 dump_peers(stdout, 0, 0, &gbcfg);
1846
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001847 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
1848 OSMO_ASSERT(link_info);
1849 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
1850 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001851
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001852 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1853 OSMO_ASSERT(link_info == link_info2);
1854 OSMO_ASSERT(link_info->tlli.assigned == 0);
1855 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1856 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001857
1858 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
1859
Alexander Couzens82182d02020-09-22 13:21:46 +02001860 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001861 foreign_tlli2, &rai_unknown, cell_id,
1862 GPRS_SAPI_GMM, bss_nu++,
1863 dtap_attach_req, sizeof(dtap_attach_req));
1864
1865 dump_peers(stdout, 0, 0, &gbcfg);
1866
Alexander Couzens82182d02020-09-22 13:21:46 +02001867 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001868 foreign_tlli2, 0, NULL, 0,
1869 GPRS_SAPI_GMM, sgsn_nu++,
1870 dtap_identity_req, sizeof(dtap_identity_req));
1871
1872 dump_peers(stdout, 0, 0, &gbcfg);
1873
Alexander Couzens82182d02020-09-22 13:21:46 +02001874 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001875 foreign_tlli2, &rai_bss, cell_id,
1876 GPRS_SAPI_GMM, bss_nu++,
1877 dtap_identity2_resp, sizeof(dtap_identity2_resp));
1878
1879 dump_peers(stdout, 0, 0, &gbcfg);
1880
Alexander Couzens82182d02020-09-22 13:21:46 +02001881 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001882 foreign_tlli2, 1, imsi2, sizeof(imsi2),
1883 GPRS_SAPI_GMM, sgsn_nu++,
1884 dtap_attach_acc, sizeof(dtap_attach_acc));
1885
1886 dump_peers(stdout, 0, 0, &gbcfg);
1887
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001888 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
1889 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1890 OSMO_ASSERT(link_info);
1891 OSMO_ASSERT(link_info == link_info2);
1892 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1893 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
1894 OSMO_ASSERT(!link_info->tlli.bss_validated);
1895 OSMO_ASSERT(!link_info->tlli.net_validated);
1896 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001897
Alexander Couzens82182d02020-09-22 13:21:46 +02001898 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001899 local_tlli, &rai_bss, cell_id,
1900 GPRS_SAPI_GMM, bss_nu++,
1901 dtap_attach_complete, sizeof(dtap_attach_complete));
1902
1903 dump_peers(stdout, 0, 0, &gbcfg);
1904
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001905 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
1906 OSMO_ASSERT(link_info);
1907 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1908 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
1909 OSMO_ASSERT(link_info->tlli.bss_validated);
1910 OSMO_ASSERT(!link_info->tlli.net_validated);
1911 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001912
Alexander Couzens82182d02020-09-22 13:21:46 +02001913 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001914 local_tlli, 1, imsi2, sizeof(imsi2),
1915 GPRS_SAPI_GMM, sgsn_nu++,
1916 dtap_gmm_information, sizeof(dtap_gmm_information));
1917
1918 dump_peers(stdout, 0, 0, &gbcfg);
1919
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001920 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
1921 OSMO_ASSERT(link_info);
1922 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
1923 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001924
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001925 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1926 OSMO_ASSERT(link_info == link_info2);
1927 OSMO_ASSERT(link_info->tlli.assigned == 0);
1928 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1929 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001930
1931 dump_global(stdout, 0);
1932
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02001933 talloc_free(gbcfg.core_apn);
1934 gbcfg.core_apn = NULL;
1935
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001936 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001937 gprs_ns2_free(nsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001938 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02001939
1940 cleanup_test();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001941}
1942
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001943static void test_gbproxy_ptmsi_patching()
1944{
Alexander Couzens82182d02020-09-22 13:21:46 +02001945 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001946 struct gprs_ra_id rai_bss =
1947 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1948 struct gprs_ra_id rai_sgsn =
1949 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001950 struct gprs_ra_id rai_wrong_mcc_sgsn =
1951 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001952 struct gprs_ra_id rai_unknown =
1953 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1954 uint16_t cell_id = 0x1234;
1955
1956 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001957 const uint32_t sgsn_ptmsi2 = 0xe0987654;
1958 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001959 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001960 const uint32_t local_sgsn_tlli2 = 0xe0987654;
1961 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Daniel Willmann537d4802015-10-12 19:36:35 +02001962 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001963 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001964
Daniel Willmann537d4802015-10-12 19:36:35 +02001965 const uint32_t bss_ptmsi = 0xc0dead01;
1966 const uint32_t bss_ptmsi2 = 0xc0dead02;
1967 const uint32_t bss_ptmsi3 = 0xc0dead03;
1968 const uint32_t local_bss_tlli = 0xc0dead01;
1969 const uint32_t local_bss_tlli2 = 0xc0dead02;
1970 const uint32_t local_bss_tlli3 = 0xc0dead03;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001971 const uint32_t foreign_bss_tlli = 0x8000dead;
1972
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001973
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001974 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001975 struct gbproxy_link_info *link_info;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001976 struct gbproxy_peer *peer;
1977 unsigned bss_nu = 0;
1978 unsigned sgsn_nu = 0;
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02001979 int old_ctr;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001980
Alexander Couzens82182d02020-09-22 13:21:46 +02001981 uint16_t bss_nsei[1] = { 0x1000 };
1982
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001983 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001984 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
1985 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
1986 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
1987 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
1988 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001989
Alexander Couzens82182d02020-09-22 13:21:46 +02001990 gbcfg.nsi = nsi;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001991 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001992 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001993 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001994 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1995 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001996
Alexander Couzens82182d02020-09-22 13:21:46 +02001997 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001998
1999 printf("=== %s ===\n", __func__);
2000 printf("--- Initialise SGSN ---\n\n");
2001
Alexander Couzens82182d02020-09-22 13:21:46 +02002002 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002003
2004 printf("--- Initialise BSS 1 ---\n\n");
2005
Alexander Couzens82182d02020-09-22 13:21:46 +02002006 setup_ns(nsi, bss_nsei[0]);
2007 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002008
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02002009 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002010 OSMO_ASSERT(peer != NULL);
2011
Alexander Couzens82182d02020-09-22 13:21:46 +02002012 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002013
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002014 dump_global(stdout, 0);
2015 dump_peers(stdout, 0, 0, &gbcfg);
2016
2017 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2018
Alexander Couzens82182d02020-09-22 13:21:46 +02002019 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002020 foreign_bss_tlli, &rai_unknown, cell_id,
2021 GPRS_SAPI_GMM, bss_nu++,
2022 dtap_attach_req, sizeof(dtap_attach_req));
2023
2024 dump_peers(stdout, 0, 0, &gbcfg);
2025
Alexander Couzens82182d02020-09-22 13:21:46 +02002026 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002027 random_sgsn_tlli, 0, NULL, 0,
2028 GPRS_SAPI_GMM, sgsn_nu++,
2029 dtap_identity_req, sizeof(dtap_identity_req));
2030
2031 dump_peers(stdout, 0, 0, &gbcfg);
2032
Alexander Couzens82182d02020-09-22 13:21:46 +02002033 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002034 foreign_bss_tlli, &rai_bss, cell_id,
2035 GPRS_SAPI_GMM, bss_nu++,
2036 dtap_identity_resp, sizeof(dtap_identity_resp));
2037
2038 dump_peers(stdout, 0, 0, &gbcfg);
2039
Alexander Couzens82182d02020-09-22 13:21:46 +02002040 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002041 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2042 GPRS_SAPI_GMM, sgsn_nu++,
2043 dtap_attach_acc, sizeof(dtap_attach_acc));
2044
2045 dump_peers(stdout, 0, 0, &gbcfg);
2046
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002047 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2048 OSMO_ASSERT(link_info);
2049 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2050 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2051 OSMO_ASSERT(!link_info->tlli.bss_validated);
2052 OSMO_ASSERT(!link_info->tlli.net_validated);
2053 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2054 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2055 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2056 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2057 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2058 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002059
Alexander Couzens82182d02020-09-22 13:21:46 +02002060 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002061 local_bss_tlli, &rai_bss, cell_id,
2062 GPRS_SAPI_GMM, bss_nu++,
2063 dtap_attach_complete, sizeof(dtap_attach_complete));
2064
2065 dump_peers(stdout, 0, 0, &gbcfg);
2066
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002067 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2068 OSMO_ASSERT(link_info);
2069 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2070 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2071 OSMO_ASSERT(link_info->tlli.bss_validated);
2072 OSMO_ASSERT(!link_info->tlli.net_validated);
2073 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2074 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2075 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2076 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002077
Alexander Couzens82182d02020-09-22 13:21:46 +02002078 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002079 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2080 GPRS_SAPI_GMM, sgsn_nu++,
2081 dtap_gmm_information, sizeof(dtap_gmm_information));
2082
2083 dump_peers(stdout, 0, 0, &gbcfg);
2084
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002085 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2086 OSMO_ASSERT(link_info);
2087 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2088 OSMO_ASSERT(link_info->tlli.assigned == 0);
2089 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2090 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002091
Alexander Couzens82182d02020-09-22 13:21:46 +02002092 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeck82add782014-09-05 18:08:12 +02002093 local_bss_tlli, &rai_bss, cell_id,
2094 GPRS_SAPI_GMM, bss_nu++,
2095 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2096
2097 dump_peers(stdout, 0, 0, &gbcfg);
2098
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002099 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002100 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002101 local_bss_tlli, &rai_bss, cell_id,
2102 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2103
Alexander Couzens82182d02020-09-22 13:21:46 +02002104 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002105 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2106 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2107
Alexander Couzens82182d02020-09-22 13:21:46 +02002108 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002109 local_bss_tlli, &rai_bss, cell_id,
2110 llc_ui_ll11_dns_query_ul,
2111 sizeof(llc_ui_ll11_dns_query_ul));
2112
Alexander Couzens82182d02020-09-22 13:21:46 +02002113 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002114 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2115 llc_ui_ll11_dns_resp_dl,
2116 sizeof(llc_ui_ll11_dns_resp_dl));
2117
2118 dump_peers(stdout, 0, 0, &gbcfg);
2119
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002120 /* Repeated RA Update Requests */
Alexander Couzens82182d02020-09-22 13:21:46 +02002121 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002122 local_bss_tlli, &rai_bss, 0x7080,
2123 GPRS_SAPI_GMM, bss_nu++,
2124 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2125
Alexander Couzens82182d02020-09-22 13:21:46 +02002126 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002127 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2128 GPRS_SAPI_GMM, sgsn_nu++,
2129 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2130
2131 dump_peers(stdout, 0, 0, &gbcfg);
2132
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002133 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2134 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2135 OSMO_ASSERT(link_info);
2136 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2137 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2138 OSMO_ASSERT(!link_info->tlli.bss_validated);
2139 OSMO_ASSERT(!link_info->tlli.net_validated);
2140 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2141 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2142 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2143 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2144 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2145 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002146
Alexander Couzens82182d02020-09-22 13:21:46 +02002147 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002148 local_bss_tlli2, &rai_bss, 0x7080,
2149 GPRS_SAPI_GMM, bss_nu++,
2150 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2151
Alexander Couzens82182d02020-09-22 13:21:46 +02002152 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002153 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2154 GPRS_SAPI_GMM, sgsn_nu++,
2155 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2156
2157 dump_peers(stdout, 0, 0, &gbcfg);
2158
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002159 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2160 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI) != NULL);
2161 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2162 OSMO_ASSERT(link_info);
2163 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2164 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2165 OSMO_ASSERT(!link_info->tlli.bss_validated);
2166 OSMO_ASSERT(!link_info->tlli.net_validated);
2167 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2168 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2169 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2170 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2171 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2172 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002173
Alexander Couzens82182d02020-09-22 13:21:46 +02002174 send_llc_ul_ui(nsi, "RA UPD COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002175 local_bss_tlli3, &rai_bss, 0x7080,
2176 GPRS_SAPI_GMM, bss_nu++,
2177 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2178
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002179 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002180
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002181 OSMO_ASSERT(link_info);
2182 OSMO_ASSERT(link_info->tlli.bss_validated);
2183 OSMO_ASSERT(!link_info->tlli.net_validated);
2184 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2185 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002186
Alexander Couzens82182d02020-09-22 13:21:46 +02002187 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002188 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2189 GPRS_SAPI_GMM, sgsn_nu++,
2190 dtap_gmm_information, sizeof(dtap_gmm_information));
2191
2192 dump_peers(stdout, 0, 0, &gbcfg);
2193
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002194 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2195 OSMO_ASSERT(link_info);
2196 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2197 OSMO_ASSERT(link_info->tlli.assigned == 0);
2198 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2199 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002200
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002201 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02002202 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002203 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002204
2205 dump_peers(stdout, 0, 0, &gbcfg);
2206
Alexander Couzens82182d02020-09-22 13:21:46 +02002207 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002208
2209 dump_peers(stdout, 0, 0, &gbcfg);
2210
Alexander Couzens82182d02020-09-22 13:21:46 +02002211 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002212
2213 dump_peers(stdout, 0, 0, &gbcfg);
2214
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002215 old_ctr = peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current;
2216
Alexander Couzens82182d02020-09-22 13:21:46 +02002217 send_bssgp_paging(nsi, SGSN_NSEI, imsi, sizeof(imsi), &rai_bss, sgsn_ptmsi3);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002218
2219 dump_peers(stdout, 0, 0, &gbcfg);
2220
2221 OSMO_ASSERT(old_ctr + 1 ==
2222 peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current);
2223
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002224 /* Bad case: Invalid BVCI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002225 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002226 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002227 dump_global(stdout, 0);
2228
2229 /* Bad case: Invalid RAI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002230 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002231
2232 dump_global(stdout, 0);
2233
2234 /* Bad case: Invalid MCC (LAC ok) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002235 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002236 &rai_wrong_mcc_sgsn);
2237
2238 dump_global(stdout, 0);
2239
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002240 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002241 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002242 unknown_sgsn_tlli, 1, NULL, 0,
2243 GPRS_SAPI_GMM, 2,
2244 dtap_gmm_information, sizeof(dtap_gmm_information));
2245
2246 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002247 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002248 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2249 GPRS_SAPI_GMM, 3,
2250 dtap_gmm_information, sizeof(dtap_gmm_information));
2251
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002252 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002253 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002254 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002255 GPRS_SAPI_GMM, bss_nu++,
2256 dtap_detach_req, sizeof(dtap_detach_req));
2257
2258 dump_peers(stdout, 0, 0, &gbcfg);
2259
Alexander Couzens82182d02020-09-22 13:21:46 +02002260 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002261 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002262 GPRS_SAPI_GMM, sgsn_nu++,
2263 dtap_detach_acc, sizeof(dtap_detach_acc));
2264
2265 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002266
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002267 dump_global(stdout, 0);
2268
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002269 talloc_free(gbcfg.core_apn);
2270 gbcfg.core_apn = NULL;
2271
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002272 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002273 gprs_ns2_free(nsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002274 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002275
2276 cleanup_test();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002277}
2278
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002279static void test_gbproxy_ptmsi_patching_bad_cases()
2280{
Alexander Couzens82182d02020-09-22 13:21:46 +02002281 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002282 struct gprs_ra_id rai_bss =
2283 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2284 struct gprs_ra_id rai_unknown =
2285 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2286 uint16_t cell_id = 0x1234;
2287
2288 const uint32_t sgsn_ptmsi = 0xefe2b700;
2289 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002290 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002291
Daniel Willmann537d4802015-10-12 19:36:35 +02002292 const uint32_t bss_ptmsi = 0xc0dead01;
2293 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002294 const uint32_t foreign_bss_tlli = 0x8000dead;
2295
2296
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002297 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002298 struct gbproxy_link_info *link_info;
2299 struct gbproxy_peer *peer;
2300 unsigned bss_nu = 0;
2301 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02002302 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002303
2304 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2305 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2306
Alexander Couzens82182d02020-09-22 13:21:46 +02002307 gbcfg.nsi = nsi;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002308 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002309 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002310 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002311 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2312 gbcfg.patch_ptmsi = 1;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002313
Alexander Couzens82182d02020-09-22 13:21:46 +02002314 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002315
2316 printf("=== %s ===\n", __func__);
2317 printf("--- Initialise SGSN ---\n\n");
2318
Alexander Couzens82182d02020-09-22 13:21:46 +02002319 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002320
2321 printf("--- Initialise BSS 1 ---\n\n");
2322
Alexander Couzens82182d02020-09-22 13:21:46 +02002323 setup_ns(nsi, bss_nsei[0]);
2324 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002325
2326 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2327 OSMO_ASSERT(peer != NULL);
2328
Alexander Couzens82182d02020-09-22 13:21:46 +02002329 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002330
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002331 dump_global(stdout, 0);
2332 dump_peers(stdout, 0, 0, &gbcfg);
2333
2334 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2335
Alexander Couzens82182d02020-09-22 13:21:46 +02002336 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002337 foreign_bss_tlli, &rai_unknown, cell_id,
2338 GPRS_SAPI_GMM, bss_nu++,
2339 dtap_attach_req, sizeof(dtap_attach_req));
2340
2341 dump_peers(stdout, 0, 0, &gbcfg);
2342
Alexander Couzens82182d02020-09-22 13:21:46 +02002343 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002344 random_sgsn_tlli, 0, NULL, 0,
2345 GPRS_SAPI_GMM, sgsn_nu++,
2346 dtap_identity_req, sizeof(dtap_identity_req));
2347
2348 dump_peers(stdout, 0, 0, &gbcfg);
2349
Alexander Couzens82182d02020-09-22 13:21:46 +02002350 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002351 foreign_bss_tlli, &rai_bss, cell_id,
2352 GPRS_SAPI_GMM, bss_nu++,
2353 dtap_identity_resp, sizeof(dtap_identity_resp));
2354
2355 dump_peers(stdout, 0, 0, &gbcfg);
2356
Alexander Couzens82182d02020-09-22 13:21:46 +02002357 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002358 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2359 GPRS_SAPI_GMM, sgsn_nu++,
2360 dtap_attach_acc, sizeof(dtap_attach_acc));
2361
2362 dump_peers(stdout, 0, 0, &gbcfg);
2363
2364 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2365 OSMO_ASSERT(link_info);
2366 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2367 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2368 OSMO_ASSERT(!link_info->tlli.bss_validated);
2369 OSMO_ASSERT(!link_info->tlli.net_validated);
2370 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2371 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2372 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2373 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2374 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2375 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2376
Alexander Couzens82182d02020-09-22 13:21:46 +02002377 send_llc_dl_ui(nsi, "ATTACH ACCEPT (duplicated)", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002378 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2379 GPRS_SAPI_GMM, sgsn_nu++,
2380 dtap_attach_acc, sizeof(dtap_attach_acc));
2381
2382 dump_peers(stdout, 0, 0, &gbcfg);
2383
2384 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2385 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002386 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002387 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2388 OSMO_ASSERT(!link_info->tlli.bss_validated);
2389 OSMO_ASSERT(!link_info->tlli.net_validated);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002390 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002391 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2392 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2393 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2394 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2395 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2396
Alexander Couzens82182d02020-09-22 13:21:46 +02002397 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002398 local_bss_tlli, &rai_bss, cell_id,
2399 GPRS_SAPI_GMM, bss_nu++,
2400 dtap_attach_complete, sizeof(dtap_attach_complete));
2401
2402 dump_peers(stdout, 0, 0, &gbcfg);
2403
2404 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2405 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002406 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002407 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002408 OSMO_ASSERT(link_info->tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002409 OSMO_ASSERT(!link_info->tlli.net_validated);
2410 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2411 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002412 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002413 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2414
Alexander Couzens82182d02020-09-22 13:21:46 +02002415 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002416 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2417 GPRS_SAPI_GMM, sgsn_nu++,
2418 dtap_gmm_information, sizeof(dtap_gmm_information));
2419
2420 dump_peers(stdout, 0, 0, &gbcfg);
2421
2422 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2423 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002424 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2425 OSMO_ASSERT(link_info->tlli.assigned == 0);
2426 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2427 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002428
2429 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002430 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002431 local_bss_tlli, &rai_bss, cell_id,
2432 GPRS_SAPI_GMM, bss_nu++,
2433 dtap_detach_req, sizeof(dtap_detach_req));
2434
2435 dump_peers(stdout, 0, 0, &gbcfg);
2436
Alexander Couzens82182d02020-09-22 13:21:46 +02002437 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002438 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2439 GPRS_SAPI_GMM, sgsn_nu++,
2440 dtap_detach_acc, sizeof(dtap_detach_acc));
2441
2442 dump_peers(stdout, 0, 0, &gbcfg);
2443
2444 dump_global(stdout, 0);
2445
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002446 talloc_free(gbcfg.core_apn);
2447 gbcfg.core_apn = NULL;
2448
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002449 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002450 gprs_ns2_free(nsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002451 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002452
2453 cleanup_test();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002454}
2455
2456
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002457static void test_gbproxy_imsi_acquisition()
2458{
Alexander Couzens82182d02020-09-22 13:21:46 +02002459 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002460 struct gprs_ra_id rai_bss =
2461 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2462 struct gprs_ra_id rai_sgsn =
2463 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2464 struct gprs_ra_id rai_wrong_mcc_sgsn =
2465 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2466 struct gprs_ra_id rai_unknown =
2467 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2468 uint16_t cell_id = 0x1234;
2469
2470 const uint32_t sgsn_ptmsi = 0xefe2b700;
2471 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002472 const uint32_t random_sgsn_tlli = 0x78dead00;
2473 const uint32_t random_sgsn_tlli2 = 0x78dead02;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002474
Daniel Willmann537d4802015-10-12 19:36:35 +02002475 const uint32_t bss_ptmsi = 0xc0dead01;
2476 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002477 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002478 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002479
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002480 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002481 struct gbproxy_link_info *link_info;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002482 struct gbproxy_peer *peer;
2483 unsigned bss_nu = 0;
2484 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02002485 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002486
2487 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2488
Alexander Couzens82182d02020-09-22 13:21:46 +02002489 gbcfg.nsi = nsi;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002490 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002491 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002492 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002493 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2494 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002495 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002496
Alexander Couzens82182d02020-09-22 13:21:46 +02002497 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002498
2499 printf("=== %s ===\n", __func__);
2500 printf("--- Initialise SGSN ---\n\n");
2501
Alexander Couzens82182d02020-09-22 13:21:46 +02002502 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002503
2504 printf("--- Initialise BSS 1 ---\n\n");
2505
Alexander Couzens82182d02020-09-22 13:21:46 +02002506 setup_ns(nsi, bss_nsei[0]);
2507 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002508
2509 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2510 OSMO_ASSERT(peer != NULL);
2511
Alexander Couzens82182d02020-09-22 13:21:46 +02002512 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002513
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002514 dump_global(stdout, 0);
2515 dump_peers(stdout, 0, 0, &gbcfg);
2516
2517 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2518
Alexander Couzens82182d02020-09-22 13:21:46 +02002519 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002520 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002521 GPRS_SAPI_GMM, bss_nu++,
2522 dtap_attach_req, sizeof(dtap_attach_req));
2523
2524 dump_peers(stdout, 0, 0, &gbcfg);
2525
Alexander Couzens82182d02020-09-22 13:21:46 +02002526 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002527 foreign_bss_tlli, &rai_bss, cell_id,
2528 GPRS_SAPI_GMM, bss_nu++,
2529 dtap_identity_resp, sizeof(dtap_identity_resp));
2530
2531 dump_peers(stdout, 0, 0, &gbcfg);
2532
Alexander Couzens82182d02020-09-22 13:21:46 +02002533 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002534 random_sgsn_tlli, 0, NULL, 0,
2535 GPRS_SAPI_GMM, sgsn_nu++,
2536 dtap_identity_req, sizeof(dtap_identity_req));
2537
2538 dump_peers(stdout, 0, 0, &gbcfg);
2539
Alexander Couzens82182d02020-09-22 13:21:46 +02002540 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002541 foreign_bss_tlli, &rai_bss, cell_id,
2542 GPRS_SAPI_GMM, bss_nu++,
2543 dtap_identity_resp, sizeof(dtap_identity_resp));
2544
2545 dump_peers(stdout, 0, 0, &gbcfg);
2546
Alexander Couzens82182d02020-09-22 13:21:46 +02002547 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002548 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2549 GPRS_SAPI_GMM, sgsn_nu++,
2550 dtap_attach_acc, sizeof(dtap_attach_acc));
2551
2552 dump_peers(stdout, 0, 0, &gbcfg);
2553
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002554 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2555 OSMO_ASSERT(link_info);
2556 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2557 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2558 OSMO_ASSERT(!link_info->tlli.bss_validated);
2559 OSMO_ASSERT(!link_info->tlli.net_validated);
2560 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2561 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2562 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2563 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2564 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2565 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002566
Alexander Couzens82182d02020-09-22 13:21:46 +02002567 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002568 local_bss_tlli, &rai_bss, cell_id,
2569 GPRS_SAPI_GMM, bss_nu++,
2570 dtap_attach_complete, sizeof(dtap_attach_complete));
2571
2572 dump_peers(stdout, 0, 0, &gbcfg);
2573
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002574 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2575 OSMO_ASSERT(link_info);
2576 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2577 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2578 OSMO_ASSERT(link_info->tlli.bss_validated);
2579 OSMO_ASSERT(!link_info->tlli.net_validated);
2580 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2581 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2582 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2583 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002584
Alexander Couzens82182d02020-09-22 13:21:46 +02002585 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002586 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2587 GPRS_SAPI_GMM, sgsn_nu++,
2588 dtap_gmm_information, sizeof(dtap_gmm_information));
2589
2590 dump_peers(stdout, 0, 0, &gbcfg);
2591
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002592 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2593 OSMO_ASSERT(link_info);
2594 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2595 OSMO_ASSERT(link_info->tlli.assigned == 0);
2596 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2597 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002598
2599 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002600 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002601 local_bss_tlli, &rai_bss, cell_id,
2602 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2603
Alexander Couzens82182d02020-09-22 13:21:46 +02002604 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002605 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2606 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2607
Alexander Couzens82182d02020-09-22 13:21:46 +02002608 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002609 local_bss_tlli, &rai_bss, cell_id,
2610 llc_ui_ll11_dns_query_ul,
2611 sizeof(llc_ui_ll11_dns_query_ul));
2612
Alexander Couzens82182d02020-09-22 13:21:46 +02002613 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002614 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2615 llc_ui_ll11_dns_resp_dl,
2616 sizeof(llc_ui_ll11_dns_resp_dl));
2617
2618 dump_peers(stdout, 0, 0, &gbcfg);
2619
2620 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02002621 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002622 local_bss_tlli, 1, 12);
2623
2624 dump_peers(stdout, 0, 0, &gbcfg);
2625
Alexander Couzens82182d02020-09-22 13:21:46 +02002626 send_bssgp_llc_discarded(nsi, SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002627 local_sgsn_tlli, 1, 12);
2628
2629 dump_peers(stdout, 0, 0, &gbcfg);
2630
Alexander Couzens82182d02020-09-22 13:21:46 +02002631 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli, &rai_bss);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002632
2633 dump_peers(stdout, 0, 0, &gbcfg);
2634
Alexander Couzens82182d02020-09-22 13:21:46 +02002635 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_sgsn);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002636
2637 dump_peers(stdout, 0, 0, &gbcfg);
2638
2639 /* Bad case: Invalid BVCI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002640 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0xeee1,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002641 local_bss_tlli, 1, 12);
2642 dump_global(stdout, 0);
2643
2644 /* Bad case: Invalid RAI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002645 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_unknown);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002646
2647 dump_global(stdout, 0);
2648
2649 /* Bad case: Invalid MCC (LAC ok) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002650 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002651 &rai_wrong_mcc_sgsn);
2652
2653 dump_global(stdout, 0);
2654
2655 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002656 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002657 local_bss_tlli, &rai_bss, cell_id,
2658 GPRS_SAPI_GMM, bss_nu++,
2659 dtap_detach_req, sizeof(dtap_detach_req));
2660
2661 dump_peers(stdout, 0, 0, &gbcfg);
2662
Alexander Couzens82182d02020-09-22 13:21:46 +02002663 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002664 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2665 GPRS_SAPI_GMM, sgsn_nu++,
2666 dtap_detach_acc, sizeof(dtap_detach_acc));
2667
2668 dump_peers(stdout, 0, 0, &gbcfg);
2669
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002670 /* RA Update request */
2671
Alexander Couzens82182d02020-09-22 13:21:46 +02002672 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002673 foreign_bss_tlli, &rai_unknown, 0x7080,
2674 GPRS_SAPI_GMM, bss_nu++,
2675 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2676
Alexander Couzens82182d02020-09-22 13:21:46 +02002677 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002678 foreign_bss_tlli, &rai_bss, cell_id,
2679 GPRS_SAPI_GMM, bss_nu++,
2680 dtap_identity_resp, sizeof(dtap_identity_resp));
2681
2682 dump_peers(stdout, 0, 0, &gbcfg);
2683
Alexander Couzens82182d02020-09-22 13:21:46 +02002684 send_llc_dl_ui(nsi, "RA UDP ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002685 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2686 GPRS_SAPI_GMM, sgsn_nu++,
2687 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2688
2689 dump_peers(stdout, 0, 0, &gbcfg);
2690
2691 /* Detach */
2692
Alexander Couzens82182d02020-09-22 13:21:46 +02002693 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002694 local_bss_tlli, &rai_bss, cell_id,
2695 GPRS_SAPI_GMM, bss_nu++,
2696 dtap_detach_req, sizeof(dtap_detach_req));
2697
2698 dump_peers(stdout, 0, 0, &gbcfg);
2699
Alexander Couzens82182d02020-09-22 13:21:46 +02002700 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002701 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2702 GPRS_SAPI_GMM, sgsn_nu++,
2703 dtap_detach_acc, sizeof(dtap_detach_acc));
2704
2705 dump_peers(stdout, 0, 0, &gbcfg);
2706
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002707 /* Special case: Repeated Attach Requests */
2708
Alexander Couzens82182d02020-09-22 13:21:46 +02002709 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002710 foreign_bss_tlli, &rai_unknown, cell_id,
2711 GPRS_SAPI_GMM, bss_nu++,
2712 dtap_attach_req, sizeof(dtap_attach_req));
2713
Alexander Couzens82182d02020-09-22 13:21:46 +02002714 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002715 foreign_bss_tlli, &rai_unknown, cell_id,
2716 GPRS_SAPI_GMM, bss_nu++,
2717 dtap_attach_req, sizeof(dtap_attach_req));
2718
Alexander Couzens82182d02020-09-22 13:21:46 +02002719 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002720 foreign_bss_tlli, &rai_bss, cell_id,
2721 GPRS_SAPI_GMM, bss_nu++,
2722 dtap_detach_req, sizeof(dtap_detach_req));
2723
2724 dump_peers(stdout, 0, 0, &gbcfg);
2725
2726 /* Special case: Detach from an unknown TLLI */
2727
Alexander Couzens82182d02020-09-22 13:21:46 +02002728 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002729 other_bss_tlli, &rai_bss, cell_id,
2730 GPRS_SAPI_GMM, bss_nu++,
2731 dtap_detach_req, sizeof(dtap_detach_req));
2732
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002733 dump_peers(stdout, 0, 0, &gbcfg);
2734
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002735 /* Special case: Repeated RA Update Requests */
2736
Alexander Couzens82182d02020-09-22 13:21:46 +02002737 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002738 foreign_bss_tlli, &rai_unknown, 0x7080,
2739 GPRS_SAPI_GMM, bss_nu++,
2740 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2741
Alexander Couzens82182d02020-09-22 13:21:46 +02002742 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002743 foreign_bss_tlli, &rai_unknown, 0x7080,
2744 GPRS_SAPI_GMM, bss_nu++,
2745 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2746
Alexander Couzens82182d02020-09-22 13:21:46 +02002747 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002748 foreign_bss_tlli, &rai_bss, cell_id,
2749 GPRS_SAPI_GMM, bss_nu++,
2750 dtap_detach_req, sizeof(dtap_detach_req));
2751
2752 dump_peers(stdout, 0, 0, &gbcfg);
2753
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002754 dump_global(stdout, 0);
2755
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002756 talloc_free(gbcfg.core_apn);
2757 gbcfg.core_apn = NULL;
2758
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002759 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002760 gprs_ns2_free(nsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002761 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002762
2763 cleanup_test();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002764}
2765
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002766static void test_gbproxy_secondary_sgsn()
2767{
Alexander Couzens82182d02020-09-22 13:21:46 +02002768 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002769 struct gprs_ra_id rai_bss =
2770 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2771 struct gprs_ra_id rai_sgsn =
2772 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2773 struct gprs_ra_id rai_unknown =
2774 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2775 uint16_t cell_id = 0x1234;
2776
2777 const uint32_t sgsn_ptmsi = 0xefe2b700;
2778 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002779 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002780
Daniel Willmann537d4802015-10-12 19:36:35 +02002781 const uint32_t bss_ptmsi = 0xc0dead01;
2782 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002783 const uint32_t foreign_bss_tlli = 0x8000dead;
2784
2785 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2786 const uint32_t local_sgsn_tlli2 = 0xe0987654;
Daniel Willmann537d4802015-10-12 19:36:35 +02002787 const uint32_t random_sgsn_tlli2 = 0x78dead02;
2788 const uint32_t bss_ptmsi2 = 0xc0dead03;
2789 const uint32_t local_bss_tlli2 = 0xc0dead03;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002790 const uint32_t foreign_bss_tlli2 = 0x8000beef;
2791
Daniel Willmann537d4802015-10-12 19:36:35 +02002792 const uint32_t random_sgsn_tlli3 = 0x78dead04;
2793 const uint32_t bss_ptmsi3 = 0xc0dead05;
2794 const uint32_t local_bss_tlli3 = 0xc0dead05;
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002795 const uint32_t foreign_bss_tlli3 = 0x8000feed;
2796
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002797 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
2798 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0xf8};
2799 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002800 struct gbproxy_link_info *link_info;
2801 struct gbproxy_link_info *other_info;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002802 struct gbproxy_peer *peer;
2803 unsigned bss_nu = 0;
2804 unsigned sgsn_nu = 0;
2805
2806 const char *err_msg = NULL;
2807 const char *filter_re = "999999";
Alexander Couzens82182d02020-09-22 13:21:46 +02002808 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002809
2810 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2811 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2812
Alexander Couzens82182d02020-09-22 13:21:46 +02002813 gbcfg.nsi = nsi;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002814 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002815 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002816 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002817 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2818 gbcfg.patch_ptmsi = 1;
2819 gbcfg.acquire_imsi = 1;
Daniel Willmann537d4802015-10-12 19:36:35 +02002820
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002821 gbcfg.route_to_sgsn2 = 1;
2822 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
2823
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02002824 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING],
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02002825 filter_re, &err_msg) != 0) {
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002826 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
2827 err_msg);
2828 OSMO_ASSERT(err_msg == NULL);
2829 }
2830
Alexander Couzens82182d02020-09-22 13:21:46 +02002831 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002832
2833 printf("=== %s ===\n", __func__);
2834 printf("--- Initialise SGSN 1 ---\n\n");
2835
Alexander Couzens82182d02020-09-22 13:21:46 +02002836 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002837
2838 printf("--- Initialise SGSN 2 ---\n\n");
2839
Alexander Couzens82182d02020-09-22 13:21:46 +02002840 connect_sgsn(nsi, SGSN2_NSEI);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002841
2842 printf("--- Initialise BSS 1 ---\n\n");
2843
Alexander Couzens82182d02020-09-22 13:21:46 +02002844 setup_ns(nsi, bss_nsei[0]);
2845 setup_bssgp(nsi, bss_nsei[0], 0x0);
2846 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x0);
2847 setup_bssgp(nsi, bss_nsei[0], 0x1002);
2848 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
2849 send_bssgp_reset_ack(nsi, SGSN2_NSEI, 0x1002);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002850
2851 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2852 OSMO_ASSERT(peer != NULL);
2853
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002854 dump_global(stdout, 0);
2855 dump_peers(stdout, 0, 0, &gbcfg);
2856
2857 printf("--- Flow control ---\n\n");
2858
Alexander Couzens82182d02020-09-22 13:21:46 +02002859 send_bssgp_flow_control_bvc(nsi, bss_nsei[0], 0x1002, 1);
2860 send_bssgp_flow_control_bvc_ack(nsi, SGSN_NSEI, 0x1002, 1);
2861 send_bssgp_flow_control_bvc_ack(nsi, SGSN2_NSEI, 0x1002, 1);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002862
2863 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
2864
Alexander Couzens82182d02020-09-22 13:21:46 +02002865 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002866 foreign_bss_tlli, &rai_unknown, cell_id,
2867 GPRS_SAPI_GMM, bss_nu++,
2868 dtap_attach_req, sizeof(dtap_attach_req));
2869
2870 dump_peers(stdout, 0, 0, &gbcfg);
2871
Alexander Couzens82182d02020-09-22 13:21:46 +02002872 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002873 foreign_bss_tlli, &rai_bss, cell_id,
2874 GPRS_SAPI_GMM, bss_nu++,
2875 dtap_identity_resp, sizeof(dtap_identity_resp));
2876
2877 dump_peers(stdout, 0, 0, &gbcfg);
2878
Alexander Couzens82182d02020-09-22 13:21:46 +02002879 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002880 random_sgsn_tlli, 0, NULL, 0,
2881 GPRS_SAPI_GMM, sgsn_nu++,
2882 dtap_identity_req, sizeof(dtap_identity_req));
2883
2884 dump_peers(stdout, 0, 0, &gbcfg);
2885
Alexander Couzens82182d02020-09-22 13:21:46 +02002886 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002887 foreign_bss_tlli, &rai_bss, cell_id,
2888 GPRS_SAPI_GMM, bss_nu++,
2889 dtap_identity_resp, sizeof(dtap_identity_resp));
2890
2891 dump_peers(stdout, 0, 0, &gbcfg);
2892
Alexander Couzens82182d02020-09-22 13:21:46 +02002893 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002894 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2895 GPRS_SAPI_GMM, sgsn_nu++,
2896 dtap_attach_acc, sizeof(dtap_attach_acc));
2897
2898 dump_peers(stdout, 0, 0, &gbcfg);
2899
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002900 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2901 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2902 OSMO_ASSERT(link_info);
2903 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2904 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2905 OSMO_ASSERT(!link_info->tlli.bss_validated);
2906 OSMO_ASSERT(!link_info->tlli.net_validated);
2907 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2908 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2909 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2910 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2911 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2912 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002913
Alexander Couzens82182d02020-09-22 13:21:46 +02002914 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002915 local_bss_tlli, &rai_bss, cell_id,
2916 GPRS_SAPI_GMM, bss_nu++,
2917 dtap_attach_complete, sizeof(dtap_attach_complete));
2918
2919 dump_peers(stdout, 0, 0, &gbcfg);
2920
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002921 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2922 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2923 OSMO_ASSERT(link_info);
2924 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2925 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2926 OSMO_ASSERT(link_info->tlli.bss_validated);
2927 OSMO_ASSERT(!link_info->tlli.net_validated);
2928 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2929 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2930 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2931 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002932
Alexander Couzens82182d02020-09-22 13:21:46 +02002933 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002934 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2935 GPRS_SAPI_GMM, sgsn_nu++,
2936 dtap_gmm_information, sizeof(dtap_gmm_information));
2937
2938 dump_peers(stdout, 0, 0, &gbcfg);
2939
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002940 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2941 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2942 OSMO_ASSERT(link_info);
2943 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2944 OSMO_ASSERT(link_info->tlli.assigned == 0);
2945 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2946 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002947
2948 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002949 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002950 local_bss_tlli, &rai_bss, cell_id,
2951 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2952
Alexander Couzens82182d02020-09-22 13:21:46 +02002953 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002954 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2955 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2956
Alexander Couzens82182d02020-09-22 13:21:46 +02002957 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002958 local_bss_tlli, &rai_bss, cell_id,
2959 llc_ui_ll11_dns_query_ul,
2960 sizeof(llc_ui_ll11_dns_query_ul));
2961
Alexander Couzens82182d02020-09-22 13:21:46 +02002962 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002963 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2964 llc_ui_ll11_dns_resp_dl,
2965 sizeof(llc_ui_ll11_dns_resp_dl));
2966
2967 dump_peers(stdout, 0, 0, &gbcfg);
2968
2969 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02002970 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002971 local_bss_tlli, 1, 12);
2972
2973 dump_peers(stdout, 0, 0, &gbcfg);
2974
Alexander Couzens82182d02020-09-22 13:21:46 +02002975 send_bssgp_llc_discarded(nsi, SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002976 local_sgsn_tlli, 1, 12);
2977
2978 dump_peers(stdout, 0, 0, &gbcfg);
2979
Alexander Couzens82182d02020-09-22 13:21:46 +02002980 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli, &rai_bss);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002981
2982 dump_peers(stdout, 0, 0, &gbcfg);
2983
Alexander Couzens82182d02020-09-22 13:21:46 +02002984 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_sgsn);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002985
2986 dump_peers(stdout, 0, 0, &gbcfg);
2987
2988 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
2989
Alexander Couzens82182d02020-09-22 13:21:46 +02002990 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002991 foreign_bss_tlli2, &rai_unknown, cell_id,
2992 GPRS_SAPI_GMM, bss_nu++,
2993 dtap_attach_req, sizeof(dtap_attach_req));
2994
2995 dump_peers(stdout, 0, 0, &gbcfg);
2996
Alexander Couzens82182d02020-09-22 13:21:46 +02002997 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002998 foreign_bss_tlli2, &rai_bss, cell_id,
2999 GPRS_SAPI_GMM, bss_nu++,
3000 dtap_identity2_resp, sizeof(dtap_identity2_resp));
3001
3002 dump_peers(stdout, 0, 0, &gbcfg);
3003
Alexander Couzens82182d02020-09-22 13:21:46 +02003004 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003005 random_sgsn_tlli2, 0, NULL, 0,
3006 GPRS_SAPI_GMM, sgsn_nu++,
3007 dtap_identity_req, sizeof(dtap_identity_req));
3008
3009 dump_peers(stdout, 0, 0, &gbcfg);
3010
Alexander Couzens82182d02020-09-22 13:21:46 +02003011 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003012 foreign_bss_tlli2, &rai_bss, cell_id,
3013 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02003014 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003015
3016 dump_peers(stdout, 0, 0, &gbcfg);
3017
Alexander Couzens82182d02020-09-22 13:21:46 +02003018 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003019 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3020 GPRS_SAPI_GMM, sgsn_nu++,
3021 dtap_attach_acc2, sizeof(dtap_attach_acc2));
3022
3023 dump_peers(stdout, 0, 0, &gbcfg);
3024
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003025 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
3026 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
3027 OSMO_ASSERT(link_info);
3028 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3029 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3030 OSMO_ASSERT(!link_info->tlli.bss_validated);
3031 OSMO_ASSERT(!link_info->tlli.net_validated);
3032 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
3033 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3034 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3035 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3036 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3037 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003038
Alexander Couzens82182d02020-09-22 13:21:46 +02003039 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003040 local_bss_tlli2, &rai_bss, cell_id,
3041 GPRS_SAPI_GMM, bss_nu++,
3042 dtap_attach_complete, sizeof(dtap_attach_complete));
3043
3044 dump_peers(stdout, 0, 0, &gbcfg);
3045
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003046 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3047 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3048 OSMO_ASSERT(link_info);
3049 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3050 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3051 OSMO_ASSERT(link_info->tlli.bss_validated);
3052 OSMO_ASSERT(!link_info->tlli.net_validated);
3053 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3054 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3055 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3056 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003057
Alexander Couzens82182d02020-09-22 13:21:46 +02003058 send_llc_dl_ui(nsi, "GMM INFO", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003059 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3060 GPRS_SAPI_GMM, sgsn_nu++,
3061 dtap_gmm_information, sizeof(dtap_gmm_information));
3062
3063 dump_peers(stdout, 0, 0, &gbcfg);
3064
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003065 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3066 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3067 OSMO_ASSERT(link_info);
3068 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
3069 OSMO_ASSERT(link_info->tlli.assigned == 0);
3070 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
3071 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003072
3073 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02003074 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003075 local_bss_tlli2, &rai_bss, cell_id,
3076 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3077
Alexander Couzens82182d02020-09-22 13:21:46 +02003078 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003079 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3080 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3081
Alexander Couzens82182d02020-09-22 13:21:46 +02003082 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003083 local_bss_tlli2, &rai_bss, cell_id,
3084 llc_ui_ll11_dns_query_ul,
3085 sizeof(llc_ui_ll11_dns_query_ul));
3086
Alexander Couzens82182d02020-09-22 13:21:46 +02003087 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003088 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3089 llc_ui_ll11_dns_resp_dl,
3090 sizeof(llc_ui_ll11_dns_resp_dl));
3091
3092 dump_peers(stdout, 0, 0, &gbcfg);
3093
3094 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02003095 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003096 local_bss_tlli2, 1, 12);
3097
3098 dump_peers(stdout, 0, 0, &gbcfg);
3099
Alexander Couzens82182d02020-09-22 13:21:46 +02003100 send_bssgp_llc_discarded(nsi, SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003101 local_sgsn_tlli2, 1, 12);
3102
3103 dump_peers(stdout, 0, 0, &gbcfg);
3104
Alexander Couzens82182d02020-09-22 13:21:46 +02003105 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli2, &rai_bss);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003106
3107 dump_peers(stdout, 0, 0, &gbcfg);
3108
Alexander Couzens82182d02020-09-22 13:21:46 +02003109 send_bssgp_suspend_ack(nsi, SGSN2_NSEI, local_sgsn_tlli2, &rai_sgsn);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003110
3111 dump_peers(stdout, 0, 0, &gbcfg);
3112
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003113 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
3114
Alexander Couzens82182d02020-09-22 13:21:46 +02003115 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003116 foreign_bss_tlli3, &rai_unknown, cell_id,
3117 GPRS_SAPI_GMM, bss_nu++,
3118 dtap_attach_req, sizeof(dtap_attach_req));
3119
3120 dump_peers(stdout, 0, 0, &gbcfg);
3121
Alexander Couzens82182d02020-09-22 13:21:46 +02003122 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003123 foreign_bss_tlli3, &rai_bss, cell_id,
3124 GPRS_SAPI_GMM, bss_nu++,
3125 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3126
3127 dump_peers(stdout, 0, 0, &gbcfg);
3128
Alexander Couzens82182d02020-09-22 13:21:46 +02003129 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003130 random_sgsn_tlli3, 0, NULL, 0,
3131 GPRS_SAPI_GMM, sgsn_nu++,
3132 dtap_identity_req, sizeof(dtap_identity_req));
3133
3134 dump_peers(stdout, 0, 0, &gbcfg);
3135
Alexander Couzens82182d02020-09-22 13:21:46 +02003136 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003137 foreign_bss_tlli3, &rai_bss, cell_id,
3138 GPRS_SAPI_GMM, bss_nu++,
3139 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3140
3141 dump_peers(stdout, 0, 0, &gbcfg);
3142
Alexander Couzens82182d02020-09-22 13:21:46 +02003143 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003144 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
3145 GPRS_SAPI_GMM, sgsn_nu++,
3146 dtap_attach_acc, sizeof(dtap_attach_acc));
3147
3148 dump_peers(stdout, 0, 0, &gbcfg);
3149
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003150 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
3151 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
3152 OSMO_ASSERT(link_info);
3153 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3154 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3155 OSMO_ASSERT(!link_info->tlli.bss_validated);
3156 OSMO_ASSERT(!link_info->tlli.net_validated);
3157 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
3158 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3159 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3160 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3161 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3162 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003163
Alexander Couzens82182d02020-09-22 13:21:46 +02003164 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003165 local_bss_tlli3, &rai_bss, cell_id,
3166 GPRS_SAPI_GMM, bss_nu++,
3167 dtap_attach_complete, sizeof(dtap_attach_complete));
3168
3169 dump_peers(stdout, 0, 0, &gbcfg);
3170
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003171 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003172 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003173 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3174 OSMO_ASSERT(link_info);
3175 OSMO_ASSERT(link_info != other_info);
3176 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3177 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3178 OSMO_ASSERT(link_info->tlli.bss_validated);
3179 OSMO_ASSERT(!link_info->tlli.net_validated);
3180 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3181 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3182 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3183 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003184
Alexander Couzens82182d02020-09-22 13:21:46 +02003185 send_llc_dl_ui(nsi, "GMM INFO", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003186 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3187 GPRS_SAPI_GMM, sgsn_nu++,
3188 dtap_gmm_information, sizeof(dtap_gmm_information));
3189
3190 dump_peers(stdout, 0, 0, &gbcfg);
3191
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003192 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003193 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003194 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3195 OSMO_ASSERT(link_info);
3196 OSMO_ASSERT(link_info != other_info);
3197 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
3198 OSMO_ASSERT(link_info->tlli.assigned == 0);
3199 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3200 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003201
3202
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003203 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
3204
3205 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003206 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003207 local_bss_tlli, &rai_bss, cell_id,
3208 GPRS_SAPI_GMM, bss_nu++,
3209 dtap_detach_req, sizeof(dtap_detach_req));
3210
3211 dump_peers(stdout, 0, 0, &gbcfg);
3212
Alexander Couzens82182d02020-09-22 13:21:46 +02003213 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003214 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3215 GPRS_SAPI_GMM, sgsn_nu++,
3216 dtap_detach_acc, sizeof(dtap_detach_acc));
3217
3218 dump_peers(stdout, 0, 0, &gbcfg);
3219
3220 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
3221
Alexander Couzens82182d02020-09-22 13:21:46 +02003222 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003223 local_bss_tlli2, &rai_bss, cell_id,
3224 GPRS_SAPI_GMM, bss_nu++,
3225 dtap_detach_req, sizeof(dtap_detach_req));
3226
3227 dump_peers(stdout, 0, 0, &gbcfg);
3228
Alexander Couzens82182d02020-09-22 13:21:46 +02003229 send_llc_dl_ui(nsi, "DETACH ACC", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003230 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3231 GPRS_SAPI_GMM, sgsn_nu++,
3232 dtap_detach_acc, sizeof(dtap_detach_acc));
3233
3234 dump_peers(stdout, 0, 0, &gbcfg);
3235
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003236 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
3237
Alexander Couzens82182d02020-09-22 13:21:46 +02003238 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003239 local_bss_tlli3, &rai_bss, cell_id,
3240 GPRS_SAPI_GMM, bss_nu++,
3241 dtap_detach_req, sizeof(dtap_detach_req));
3242
3243 dump_peers(stdout, 0, 0, &gbcfg);
3244
Alexander Couzens82182d02020-09-22 13:21:46 +02003245 send_llc_dl_ui(nsi, "DETACH ACC", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003246 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3247 GPRS_SAPI_GMM, sgsn_nu++,
3248 dtap_detach_acc, sizeof(dtap_detach_acc));
3249
3250 dump_peers(stdout, 0, 0, &gbcfg);
3251
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003252 dump_global(stdout, 0);
3253
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02003254 talloc_free(gbcfg.core_apn);
3255 gbcfg.core_apn = NULL;
3256
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003257 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING]);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003258 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02003259 gprs_ns2_free(nsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003260 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003261
3262 cleanup_test();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003263}
3264
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003265static void test_gbproxy_keep_info()
3266{
Alexander Couzens82182d02020-09-22 13:21:46 +02003267 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003268 struct gprs_ra_id rai_bss =
3269 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3270 uint16_t cell_id = 0x1234;
3271
3272 const uint32_t ptmsi = 0xefe2b700;
3273 const uint32_t local_tlli = 0xefe2b700;
3274 const uint32_t foreign_tlli = 0xafe2b700;
3275
Neels Hofmeyr7369d442020-05-29 17:05:40 +02003276 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003277 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003278 struct gbproxy_peer *peer;
3279 unsigned bss_nu = 0;
3280 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02003281 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003282
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003283 LLIST_HEAD(rcv_list);
3284
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003285 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3286
Alexander Couzens82182d02020-09-22 13:21:46 +02003287 gbcfg.nsi = nsi;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003288 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3289 gbcfg.patch_ptmsi = 0;
3290 gbcfg.acquire_imsi = 1;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01003291 gbcfg.core_plmn = (struct osmo_plmn_id){};
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003292 gbcfg.core_apn = NULL;
3293 gbcfg.core_apn_size = 0;
3294 gbcfg.route_to_sgsn2 = 0;
3295 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003296 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003297
Alexander Couzens82182d02020-09-22 13:21:46 +02003298 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003299
3300 printf("=== %s ===\n", __func__);
3301 printf("--- Initialise SGSN ---\n\n");
3302
Alexander Couzens82182d02020-09-22 13:21:46 +02003303 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003304
3305 printf("--- Initialise BSS 1 ---\n\n");
3306
Alexander Couzens82182d02020-09-22 13:21:46 +02003307 setup_ns(nsi, bss_nsei[0]);
3308 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003309
3310 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3311 OSMO_ASSERT(peer != NULL);
3312
Alexander Couzens82182d02020-09-22 13:21:46 +02003313 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003314
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003315 dump_global(stdout, 0);
3316 dump_peers(stdout, 0, 0, &gbcfg);
3317
3318 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3319
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003320 received_messages = &rcv_list;
3321
Alexander Couzens82182d02020-09-22 13:21:46 +02003322 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003323 foreign_tlli, &rai_bss, cell_id,
3324 GPRS_SAPI_GMM, bss_nu++,
3325 dtap_attach_req, sizeof(dtap_attach_req));
3326
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003327 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3328
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003329 dump_peers(stdout, 0, 0, &gbcfg);
3330
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003331 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3332 OSMO_ASSERT(link_info);
3333 OSMO_ASSERT(link_info->imsi_len == 0);
3334 OSMO_ASSERT(!link_info->is_deregistered);
3335 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003336
Alexander Couzens82182d02020-09-22 13:21:46 +02003337 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003338 foreign_tlli, &rai_bss, cell_id,
3339 GPRS_SAPI_GMM, bss_nu++,
3340 dtap_identity_resp, sizeof(dtap_identity_resp));
3341
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003342 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3343
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003344 dump_peers(stdout, 0, 0, &gbcfg);
3345
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003346 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3347 OSMO_ASSERT(link_info);
3348 OSMO_ASSERT(link_info->imsi_len > 0);
3349 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003350 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003351
Alexander Couzens82182d02020-09-22 13:21:46 +02003352 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003353 foreign_tlli, 0, NULL, 0,
3354 GPRS_SAPI_GMM, sgsn_nu++,
3355 dtap_identity_req, sizeof(dtap_identity_req));
3356
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003357 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3358
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003359 dump_peers(stdout, 0, 0, &gbcfg);
3360
Alexander Couzens82182d02020-09-22 13:21:46 +02003361 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003362 foreign_tlli, &rai_bss, cell_id,
3363 GPRS_SAPI_GMM, bss_nu++,
3364 dtap_identity_resp, sizeof(dtap_identity_resp));
3365
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003366 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
3367
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003368 dump_peers(stdout, 0, 0, &gbcfg);
3369
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003370 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3371 OSMO_ASSERT(link_info);
3372 OSMO_ASSERT(link_info->imsi_len > 0);
3373 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003374
Alexander Couzens82182d02020-09-22 13:21:46 +02003375 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003376 foreign_tlli, 1, imsi, sizeof(imsi),
3377 GPRS_SAPI_GMM, sgsn_nu++,
3378 dtap_attach_acc, sizeof(dtap_attach_acc));
3379
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003380 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3381
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003382 dump_peers(stdout, 0, 0, &gbcfg);
3383
Alexander Couzens82182d02020-09-22 13:21:46 +02003384 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003385 local_tlli, &rai_bss, cell_id,
3386 GPRS_SAPI_GMM, bss_nu++,
3387 dtap_attach_complete, sizeof(dtap_attach_complete));
3388
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003389 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3390
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003391 dump_peers(stdout, 0, 0, &gbcfg);
3392
Alexander Couzens82182d02020-09-22 13:21:46 +02003393 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003394 local_tlli, 1, imsi, sizeof(imsi),
3395 GPRS_SAPI_GMM, sgsn_nu++,
3396 dtap_gmm_information, sizeof(dtap_gmm_information));
3397
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003398 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3399
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003400 dump_peers(stdout, 0, 0, &gbcfg);
3401
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003402 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3403 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003404
3405 /* Detach (MO) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003406 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003407 local_tlli, &rai_bss, cell_id,
3408 GPRS_SAPI_GMM, bss_nu++,
3409 dtap_detach_req, sizeof(dtap_detach_req));
3410
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003411 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3412
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003413 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3414 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003415
3416 dump_peers(stdout, 0, 0, &gbcfg);
3417
Alexander Couzens82182d02020-09-22 13:21:46 +02003418 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003419 local_tlli, 1, imsi, sizeof(imsi),
3420 GPRS_SAPI_GMM, sgsn_nu++,
3421 dtap_detach_acc, sizeof(dtap_detach_acc));
3422
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003423 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3424
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003425 dump_peers(stdout, 0, 0, &gbcfg);
3426
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003427 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3428 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3429 OSMO_ASSERT(link_info);
3430 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003431
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003432 OSMO_ASSERT(!expect_msg());
3433
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003434 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003435 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003436 foreign_tlli, &rai_bss, cell_id,
3437 GPRS_SAPI_GMM, bss_nu++,
3438 dtap_attach_req3, sizeof(dtap_attach_req3));
3439
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003440 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3441
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003442 dump_peers(stdout, 0, 0, &gbcfg);
3443
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003444 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3445 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3446 OSMO_ASSERT(link_info);
3447 OSMO_ASSERT(link_info == link_info2);
3448 OSMO_ASSERT(link_info->imsi_len != 0);
3449 OSMO_ASSERT(!link_info->is_deregistered);
3450 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003451 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003452
Alexander Couzens82182d02020-09-22 13:21:46 +02003453 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003454 foreign_tlli, 1, imsi, sizeof(imsi),
3455 GPRS_SAPI_GMM, sgsn_nu++,
3456 dtap_attach_acc, sizeof(dtap_attach_acc));
3457
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003458 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3459
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003460 dump_peers(stdout, 0, 0, &gbcfg);
3461
Alexander Couzens82182d02020-09-22 13:21:46 +02003462 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003463 local_tlli, &rai_bss, cell_id,
3464 GPRS_SAPI_GMM, bss_nu++,
3465 dtap_attach_complete, sizeof(dtap_attach_complete));
3466
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003467 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3468
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003469 dump_peers(stdout, 0, 0, &gbcfg);
3470
3471 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003472 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003473 local_tlli, 1, imsi, sizeof(imsi),
3474 GPRS_SAPI_GMM, sgsn_nu++,
3475 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3476
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003477 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3478
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003479 dump_peers(stdout, 0, 0, &gbcfg);
3480
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003481 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3482 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003483
Alexander Couzens82182d02020-09-22 13:21:46 +02003484 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003485 local_tlli, &rai_bss, cell_id,
3486 GPRS_SAPI_GMM, bss_nu++,
3487 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3488
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003489 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3490 OSMO_ASSERT(!expect_msg());
3491
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003492 dump_peers(stdout, 0, 0, &gbcfg);
3493
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003494 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3495 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3496 OSMO_ASSERT(link_info);
3497 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003498
3499 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003500 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003501 foreign_tlli, &rai_bss, cell_id,
3502 GPRS_SAPI_GMM, bss_nu++,
3503 dtap_attach_req3, sizeof(dtap_attach_req3));
3504
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003505 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3506
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003507 dump_peers(stdout, 0, 0, &gbcfg);
3508
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003509 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3510 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3511 OSMO_ASSERT(link_info);
3512 OSMO_ASSERT(link_info == link_info2);
3513 OSMO_ASSERT(link_info->imsi_len != 0);
3514 OSMO_ASSERT(!link_info->is_deregistered);
3515 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003516
Alexander Couzens82182d02020-09-22 13:21:46 +02003517 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003518 foreign_tlli, 1, imsi, sizeof(imsi),
3519 GPRS_SAPI_GMM, sgsn_nu++,
3520 dtap_attach_acc, sizeof(dtap_attach_acc));
3521
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003522 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3523
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003524 dump_peers(stdout, 0, 0, &gbcfg);
3525
Alexander Couzens82182d02020-09-22 13:21:46 +02003526 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003527 local_tlli, &rai_bss, cell_id,
3528 GPRS_SAPI_GMM, bss_nu++,
3529 dtap_attach_complete, sizeof(dtap_attach_complete));
3530
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003531 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3532
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003533 dump_peers(stdout, 0, 0, &gbcfg);
3534
3535 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003536 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003537 local_tlli, 1, imsi, sizeof(imsi),
3538 GPRS_SAPI_GMM, sgsn_nu++,
3539 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3540
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003541 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3542
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003543 dump_peers(stdout, 0, 0, &gbcfg);
3544
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003545 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3546 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003547
Alexander Couzens82182d02020-09-22 13:21:46 +02003548 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003549 local_tlli, &rai_bss, cell_id,
3550 GPRS_SAPI_GMM, bss_nu++,
3551 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3552
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003553 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3554 OSMO_ASSERT(!expect_msg());
3555
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003556 dump_peers(stdout, 0, 0, &gbcfg);
3557
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003558 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3559 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3560 OSMO_ASSERT(link_info);
3561 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003562
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003563 /* Re-Attach with IMSI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003564 send_llc_ul_ui(nsi, "ATTACH REQUEST (IMSI)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003565 foreign_tlli, &rai_bss, cell_id,
3566 GPRS_SAPI_GMM, bss_nu++,
3567 dtap_attach_req4, sizeof(dtap_attach_req4));
3568
3569 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3570
3571 dump_peers(stdout, 0, 0, &gbcfg);
3572
3573 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3574 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3575 OSMO_ASSERT(link_info);
3576 OSMO_ASSERT(link_info == link_info2);
3577 OSMO_ASSERT(link_info->imsi_len != 0);
3578 OSMO_ASSERT(!link_info->is_deregistered);
3579 OSMO_ASSERT(!link_info->imsi_acq_pending);
3580 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
3581
Alexander Couzens82182d02020-09-22 13:21:46 +02003582 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003583 foreign_tlli, 1, imsi, sizeof(imsi),
3584 GPRS_SAPI_GMM, sgsn_nu++,
3585 dtap_attach_acc, sizeof(dtap_attach_acc));
3586
3587 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3588
3589 dump_peers(stdout, 0, 0, &gbcfg);
3590
Alexander Couzens82182d02020-09-22 13:21:46 +02003591 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003592 local_tlli, &rai_bss, cell_id,
3593 GPRS_SAPI_GMM, bss_nu++,
3594 dtap_attach_complete, sizeof(dtap_attach_complete));
3595
3596 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3597
3598 dump_peers(stdout, 0, 0, &gbcfg);
3599
3600 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003601 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003602 local_tlli, 1, imsi, sizeof(imsi),
3603 GPRS_SAPI_GMM, sgsn_nu++,
3604 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3605
3606 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3607
3608 dump_peers(stdout, 0, 0, &gbcfg);
3609
3610 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3611 OSMO_ASSERT(link_info);
3612
Alexander Couzens82182d02020-09-22 13:21:46 +02003613 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003614 local_tlli, &rai_bss, cell_id,
3615 GPRS_SAPI_GMM, bss_nu++,
3616 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3617
3618 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3619 OSMO_ASSERT(!expect_msg());
3620
3621 dump_peers(stdout, 0, 0, &gbcfg);
3622
3623 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3624 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3625 OSMO_ASSERT(link_info);
3626 OSMO_ASSERT(link_info->is_deregistered);
3627
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003628 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003629 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003630 foreign_tlli, &rai_bss, cell_id,
3631 GPRS_SAPI_GMM, bss_nu++,
3632 dtap_attach_req3, sizeof(dtap_attach_req3));
3633
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003634 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3635
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003636 dump_peers(stdout, 0, 0, &gbcfg);
3637
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003638 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3639 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3640 OSMO_ASSERT(link_info);
3641 OSMO_ASSERT(link_info == link_info2);
3642 OSMO_ASSERT(link_info->imsi_len != 0);
3643 OSMO_ASSERT(!link_info->is_deregistered);
3644 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003645
Alexander Couzens82182d02020-09-22 13:21:46 +02003646 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003647 foreign_tlli, 1, imsi, sizeof(imsi),
3648 GPRS_SAPI_GMM, sgsn_nu++,
3649 dtap_attach_acc, sizeof(dtap_attach_acc));
3650
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003651 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3652
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003653 dump_peers(stdout, 0, 0, &gbcfg);
3654
Alexander Couzens82182d02020-09-22 13:21:46 +02003655 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003656 local_tlli, &rai_bss, cell_id,
3657 GPRS_SAPI_GMM, bss_nu++,
3658 dtap_attach_complete, sizeof(dtap_attach_complete));
3659
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003660 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3661
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003662 dump_peers(stdout, 0, 0, &gbcfg);
3663
3664 /* RA update procedure (reject -> Detach) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003665 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003666 local_tlli, &rai_bss, 0x7080,
3667 GPRS_SAPI_GMM, bss_nu++,
3668 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3669
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003670 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
3671
Alexander Couzens82182d02020-09-22 13:21:46 +02003672 send_llc_dl_ui(nsi, "RA UDP REJ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003673 local_tlli, 1, imsi, sizeof(imsi),
3674 GPRS_SAPI_GMM, sgsn_nu++,
3675 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3676
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003677 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
3678 OSMO_ASSERT(!expect_msg());
3679
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003680 dump_peers(stdout, 0, 0, &gbcfg);
3681
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003682 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3683 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3684 OSMO_ASSERT(link_info);
3685 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003686
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003687 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003688 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003689 foreign_tlli, &rai_bss, cell_id,
3690 GPRS_SAPI_GMM, bss_nu++,
3691 dtap_attach_req, sizeof(dtap_attach_req));
3692
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003693 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3694
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003695 dump_peers(stdout, 0, 0, &gbcfg);
3696
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003697 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3698 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3699 OSMO_ASSERT(link_info);
3700 OSMO_ASSERT(link_info != link_info2);
3701 OSMO_ASSERT(link_info->imsi_len == 0);
3702 OSMO_ASSERT(!link_info->is_deregistered);
3703 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003704
Alexander Couzens82182d02020-09-22 13:21:46 +02003705 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003706 foreign_tlli, &rai_bss, cell_id,
3707 GPRS_SAPI_GMM, bss_nu++,
3708 dtap_identity_resp, sizeof(dtap_identity_resp));
3709
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003710 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3711
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003712 dump_peers(stdout, 0, 0, &gbcfg);
3713
3714 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3715 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3716 OSMO_ASSERT(link_info);
3717 OSMO_ASSERT(link_info == link_info2);
3718 OSMO_ASSERT(link_info->imsi_len != 0);
3719 OSMO_ASSERT(!link_info->is_deregistered);
3720 OSMO_ASSERT(!link_info->imsi_acq_pending);
3721
Alexander Couzens82182d02020-09-22 13:21:46 +02003722 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003723 foreign_tlli, 1, imsi, sizeof(imsi),
3724 GPRS_SAPI_GMM, sgsn_nu++,
3725 dtap_attach_acc, sizeof(dtap_attach_acc));
3726
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003727 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3728
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003729 dump_peers(stdout, 0, 0, &gbcfg);
3730
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003731 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3732 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3733 OSMO_ASSERT(link_info);
3734 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeckea71b482014-09-22 09:28:27 +02003735 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003736
Alexander Couzens82182d02020-09-22 13:21:46 +02003737 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003738 local_tlli, &rai_bss, cell_id,
3739 GPRS_SAPI_GMM, bss_nu++,
3740 dtap_attach_complete, sizeof(dtap_attach_complete));
3741
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003742 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3743
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003744 dump_peers(stdout, 0, 0, &gbcfg);
3745
3746 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003747 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003748 local_tlli, 1, imsi, sizeof(imsi),
3749 GPRS_SAPI_GMM, sgsn_nu++,
3750 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3751
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003752 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3753
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003754 dump_peers(stdout, 0, 0, &gbcfg);
3755
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003756 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3757 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003758
Alexander Couzens82182d02020-09-22 13:21:46 +02003759 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003760 local_tlli, &rai_bss, cell_id,
3761 GPRS_SAPI_GMM, bss_nu++,
3762 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3763
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003764 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3765
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003766 dump_peers(stdout, 0, 0, &gbcfg);
3767
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003768 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3769 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3770 OSMO_ASSERT(link_info);
3771 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003772
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003773 OSMO_ASSERT(!expect_msg());
3774
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003775 /* Bad case: Re-Attach with local TLLI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003776 send_llc_ul_ui(nsi, "ATTACH REQUEST (local TLLI)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003777 local_tlli, &rai_bss, cell_id,
3778 GPRS_SAPI_GMM, bss_nu++,
3779 dtap_attach_req3, sizeof(dtap_attach_req3));
3780
3781 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3782
3783 dump_peers(stdout, 0, 0, &gbcfg);
3784
3785 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3786 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3787 OSMO_ASSERT(link_info);
3788 OSMO_ASSERT(link_info == link_info2);
3789 OSMO_ASSERT(link_info->imsi_len != 0);
3790 OSMO_ASSERT(!link_info->is_deregistered);
3791 OSMO_ASSERT(!link_info->imsi_acq_pending);
3792 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
3793
Alexander Couzens82182d02020-09-22 13:21:46 +02003794 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003795 local_tlli, 1, imsi, sizeof(imsi),
3796 GPRS_SAPI_GMM, sgsn_nu++,
3797 dtap_attach_acc, sizeof(dtap_attach_acc));
3798
3799 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3800
3801 dump_peers(stdout, 0, 0, &gbcfg);
3802
Alexander Couzens82182d02020-09-22 13:21:46 +02003803 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003804 local_tlli, &rai_bss, cell_id,
3805 GPRS_SAPI_GMM, bss_nu++,
3806 dtap_attach_complete, sizeof(dtap_attach_complete));
3807
3808 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3809
3810 dump_peers(stdout, 0, 0, &gbcfg);
3811
3812 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003813 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003814 local_tlli, 1, imsi, sizeof(imsi),
3815 GPRS_SAPI_GMM, sgsn_nu++,
3816 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3817
3818 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3819
3820 dump_peers(stdout, 0, 0, &gbcfg);
3821
3822 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3823 OSMO_ASSERT(link_info);
3824
Alexander Couzens82182d02020-09-22 13:21:46 +02003825 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003826 local_tlli, &rai_bss, cell_id,
3827 GPRS_SAPI_GMM, bss_nu++,
3828 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3829
3830 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3831 OSMO_ASSERT(!expect_msg());
3832
3833 dump_peers(stdout, 0, 0, &gbcfg);
3834
3835 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3836 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3837 OSMO_ASSERT(link_info);
3838 OSMO_ASSERT(link_info->is_deregistered);
3839
3840 /* Bad case: Unexpected Re-Attach with IMSI after completed attachment
3841 * procedure */
Alexander Couzens82182d02020-09-22 13:21:46 +02003842 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003843 foreign_tlli, &rai_bss, cell_id,
3844 GPRS_SAPI_GMM, bss_nu++,
3845 dtap_attach_req3, sizeof(dtap_attach_req3));
3846
3847 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3848
3849 dump_peers(stdout, 0, 0, &gbcfg);
3850
3851 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3852 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3853 OSMO_ASSERT(link_info);
3854 OSMO_ASSERT(link_info == link_info2);
3855 OSMO_ASSERT(link_info->imsi_len != 0);
3856 OSMO_ASSERT(!link_info->is_deregistered);
3857 OSMO_ASSERT(!link_info->imsi_acq_pending);
3858
Alexander Couzens82182d02020-09-22 13:21:46 +02003859 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003860 foreign_tlli, 1, imsi, sizeof(imsi),
3861 GPRS_SAPI_GMM, sgsn_nu++,
3862 dtap_attach_acc, sizeof(dtap_attach_acc));
3863
3864 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3865
3866 dump_peers(stdout, 0, 0, &gbcfg);
3867
Alexander Couzens82182d02020-09-22 13:21:46 +02003868 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003869 local_tlli, &rai_bss, cell_id,
3870 GPRS_SAPI_GMM, bss_nu++,
3871 dtap_attach_complete, sizeof(dtap_attach_complete));
3872
3873 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3874
3875 dump_peers(stdout, 0, 0, &gbcfg);
3876
Alexander Couzens82182d02020-09-22 13:21:46 +02003877 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003878 local_tlli, 1, imsi, sizeof(imsi),
3879 GPRS_SAPI_GMM, sgsn_nu++,
3880 dtap_gmm_information, sizeof(dtap_gmm_information));
3881
3882 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3883
3884 dump_peers(stdout, 0, 0, &gbcfg);
3885
3886 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected, IMSI)",
Alexander Couzens82182d02020-09-22 13:21:46 +02003887 bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003888 foreign_tlli, &rai_bss, cell_id,
3889 GPRS_SAPI_GMM, bss_nu++,
3890 dtap_attach_req4, sizeof(dtap_attach_req4));
3891
3892 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3893
3894 dump_peers(stdout, 0, 0, &gbcfg);
3895
3896 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3897 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01003898 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003899 OSMO_ASSERT(link_info == link_info2);
3900 OSMO_ASSERT(link_info->imsi_len != 0);
3901 OSMO_ASSERT(!link_info->is_deregistered);
3902 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01003903 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003904 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
3905
Alexander Couzens82182d02020-09-22 13:21:46 +02003906 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003907 foreign_tlli, 1, imsi, sizeof(imsi),
3908 GPRS_SAPI_GMM, sgsn_nu++,
3909 dtap_attach_acc, sizeof(dtap_attach_acc));
3910
3911 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3912
3913 dump_peers(stdout, 0, 0, &gbcfg);
3914
Alexander Couzens82182d02020-09-22 13:21:46 +02003915 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003916 local_tlli, &rai_bss, cell_id,
3917 GPRS_SAPI_GMM, bss_nu++,
3918 dtap_attach_complete, sizeof(dtap_attach_complete));
3919
3920 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3921
3922 dump_peers(stdout, 0, 0, &gbcfg);
3923
3924 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003925 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003926 local_tlli, 1, imsi, sizeof(imsi),
3927 GPRS_SAPI_GMM, sgsn_nu++,
3928 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3929
3930 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3931
3932 dump_peers(stdout, 0, 0, &gbcfg);
3933
3934 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3935 OSMO_ASSERT(link_info);
3936
Alexander Couzens82182d02020-09-22 13:21:46 +02003937 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003938 local_tlli, &rai_bss, cell_id,
3939 GPRS_SAPI_GMM, bss_nu++,
3940 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3941
3942 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3943 OSMO_ASSERT(!expect_msg());
3944
3945 dump_peers(stdout, 0, 0, &gbcfg);
3946
3947 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3948 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3949 OSMO_ASSERT(link_info);
3950 OSMO_ASSERT(link_info->is_deregistered);
3951
3952 /* Bad case: Unexpected Re-Attach with P-TMSI after completed attachment
3953 * procedure */
Alexander Couzens82182d02020-09-22 13:21:46 +02003954 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003955 foreign_tlli, &rai_bss, cell_id,
3956 GPRS_SAPI_GMM, bss_nu++,
3957 dtap_attach_req3, sizeof(dtap_attach_req3));
3958
3959 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3960
3961 dump_peers(stdout, 0, 0, &gbcfg);
3962
3963 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3964 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3965 OSMO_ASSERT(link_info);
3966 OSMO_ASSERT(link_info == link_info2);
3967 OSMO_ASSERT(link_info->imsi_len != 0);
3968 OSMO_ASSERT(!link_info->is_deregistered);
3969 OSMO_ASSERT(!link_info->imsi_acq_pending);
3970
Alexander Couzens82182d02020-09-22 13:21:46 +02003971 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003972 foreign_tlli, 1, imsi, sizeof(imsi),
3973 GPRS_SAPI_GMM, sgsn_nu++,
3974 dtap_attach_acc, sizeof(dtap_attach_acc));
3975
3976 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3977
3978 dump_peers(stdout, 0, 0, &gbcfg);
3979
Alexander Couzens82182d02020-09-22 13:21:46 +02003980 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003981 local_tlli, &rai_bss, cell_id,
3982 GPRS_SAPI_GMM, bss_nu++,
3983 dtap_attach_complete, sizeof(dtap_attach_complete));
3984
3985 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3986
3987 dump_peers(stdout, 0, 0, &gbcfg);
3988
Alexander Couzens82182d02020-09-22 13:21:46 +02003989 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003990 local_tlli, 1, imsi, sizeof(imsi),
3991 GPRS_SAPI_GMM, sgsn_nu++,
3992 dtap_gmm_information, sizeof(dtap_gmm_information));
3993
3994 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3995
3996 dump_peers(stdout, 0, 0, &gbcfg);
3997
Alexander Couzens82182d02020-09-22 13:21:46 +02003998 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003999 foreign_tlli, &rai_bss, cell_id,
4000 GPRS_SAPI_GMM, bss_nu++,
4001 dtap_attach_req3, sizeof(dtap_attach_req3));
4002
4003 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4004
4005 dump_peers(stdout, 0, 0, &gbcfg);
4006
4007 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4008 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004009 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004010 OSMO_ASSERT(link_info == link_info2);
4011 OSMO_ASSERT(link_info->imsi_len != 0);
4012 OSMO_ASSERT(!link_info->is_deregistered);
4013 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004014 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004015 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4016
Alexander Couzens82182d02020-09-22 13:21:46 +02004017 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004018 foreign_tlli, 1, imsi, sizeof(imsi),
4019 GPRS_SAPI_GMM, sgsn_nu++,
4020 dtap_attach_acc, sizeof(dtap_attach_acc));
4021
4022 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4023
4024 dump_peers(stdout, 0, 0, &gbcfg);
4025
Alexander Couzens82182d02020-09-22 13:21:46 +02004026 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004027 local_tlli, &rai_bss, cell_id,
4028 GPRS_SAPI_GMM, bss_nu++,
4029 dtap_attach_complete, sizeof(dtap_attach_complete));
4030
4031 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4032
4033 dump_peers(stdout, 0, 0, &gbcfg);
4034
4035 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02004036 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004037 local_tlli, 1, imsi, sizeof(imsi),
4038 GPRS_SAPI_GMM, sgsn_nu++,
4039 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4040
4041 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4042
4043 dump_peers(stdout, 0, 0, &gbcfg);
4044
4045 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4046 OSMO_ASSERT(link_info);
4047
Alexander Couzens82182d02020-09-22 13:21:46 +02004048 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004049 local_tlli, &rai_bss, cell_id,
4050 GPRS_SAPI_GMM, bss_nu++,
4051 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4052
4053 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4054 OSMO_ASSERT(!expect_msg());
4055
4056 dump_peers(stdout, 0, 0, &gbcfg);
4057
4058 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4059 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4060 OSMO_ASSERT(link_info);
4061 OSMO_ASSERT(link_info->is_deregistered);
4062
4063
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004064 /* Attach rejected */
4065
4066 gbproxy_delete_link_infos(peer);
4067
Alexander Couzens82182d02020-09-22 13:21:46 +02004068 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004069 foreign_tlli, &rai_bss, cell_id,
4070 GPRS_SAPI_GMM, bss_nu++,
4071 dtap_attach_req, sizeof(dtap_attach_req));
4072
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004073 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4074
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004075 dump_peers(stdout, 0, 0, &gbcfg);
4076
4077 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4078 OSMO_ASSERT(link_info);
4079 OSMO_ASSERT(link_info->imsi_len == 0);
4080 OSMO_ASSERT(!link_info->is_deregistered);
4081 OSMO_ASSERT(link_info->imsi_acq_pending);
4082
Alexander Couzens82182d02020-09-22 13:21:46 +02004083 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004084 foreign_tlli, &rai_bss, cell_id,
4085 GPRS_SAPI_GMM, bss_nu++,
4086 dtap_identity_resp, sizeof(dtap_identity_resp));
4087
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004088 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4089
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004090 dump_peers(stdout, 0, 0, &gbcfg);
4091
4092 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4093 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4094 OSMO_ASSERT(link_info);
4095 OSMO_ASSERT(link_info == link_info2);
4096 OSMO_ASSERT(link_info->imsi_len != 0);
4097 OSMO_ASSERT(!link_info->is_deregistered);
4098 OSMO_ASSERT(!link_info->imsi_acq_pending);
4099
Alexander Couzens82182d02020-09-22 13:21:46 +02004100 send_llc_dl_ui(nsi, "ATTACH REJECT", SGSN_NSEI, 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004101 foreign_tlli, 1, imsi, sizeof(imsi),
4102 GPRS_SAPI_GMM, sgsn_nu++,
4103 dtap_attach_rej7, sizeof(dtap_attach_rej7));
4104
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004105 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
4106
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004107 dump_peers(stdout, 0, 0, &gbcfg);
4108
Jacob Erlbeck9c65c812014-09-22 10:42:05 +02004109 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4110
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004111 OSMO_ASSERT(!expect_msg());
4112
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004113 /* Attach (incomplete) and Detach (MO) */
4114
4115 gbproxy_delete_link_infos(peer);
4116
Alexander Couzens82182d02020-09-22 13:21:46 +02004117 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004118 foreign_tlli, &rai_bss, cell_id,
4119 GPRS_SAPI_GMM, bss_nu++,
4120 dtap_attach_req, sizeof(dtap_attach_req));
4121
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004122 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4123
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004124 dump_peers(stdout, 0, 0, &gbcfg);
4125
4126 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4127 OSMO_ASSERT(link_info);
4128 OSMO_ASSERT(link_info->imsi_len == 0);
4129 OSMO_ASSERT(!link_info->is_deregistered);
4130 OSMO_ASSERT(link_info->imsi_acq_pending);
4131
Alexander Couzens82182d02020-09-22 13:21:46 +02004132 send_llc_ul_ui(nsi, "DETACH REQ (MO)", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004133 foreign_tlli, &rai_bss, cell_id,
4134 GPRS_SAPI_GMM, bss_nu++,
4135 dtap_detach_req, sizeof(dtap_detach_req));
4136
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004137 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4138
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004139 dump_peers(stdout, 0, 0, &gbcfg);
4140
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004141 OSMO_ASSERT(!expect_msg());
4142
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004143 /* Attach (incomplete) and Detach (MT) */
4144
4145 gbproxy_delete_link_infos(peer);
4146
Alexander Couzens82182d02020-09-22 13:21:46 +02004147 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004148 foreign_tlli, &rai_bss, cell_id,
4149 GPRS_SAPI_GMM, bss_nu++,
4150 dtap_attach_req, sizeof(dtap_attach_req));
4151
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004152 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4153
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004154 dump_peers(stdout, 0, 0, &gbcfg);
4155
4156 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4157 OSMO_ASSERT(link_info);
4158 OSMO_ASSERT(link_info->imsi_len == 0);
4159 OSMO_ASSERT(!link_info->is_deregistered);
4160 OSMO_ASSERT(link_info->imsi_acq_pending);
4161
Alexander Couzens82182d02020-09-22 13:21:46 +02004162 send_llc_dl_ui(nsi, "DETACH REQ (MT)", SGSN_NSEI, 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004163 foreign_tlli, 1, imsi, sizeof(imsi),
4164 GPRS_SAPI_GMM, sgsn_nu++,
4165 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4166
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004167 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4168
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004169 dump_peers(stdout, 0, 0, &gbcfg);
4170
4171 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4172 OSMO_ASSERT(link_info);
4173
Alexander Couzens82182d02020-09-22 13:21:46 +02004174 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004175 foreign_tlli, &rai_bss, cell_id,
4176 GPRS_SAPI_GMM, bss_nu++,
4177 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4178
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004179 /* TODO: The stored messaged should be cleaned when receiving a Detach
4180 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
4181 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4182 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4183
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004184 dump_peers(stdout, 0, 0, &gbcfg);
4185
4186 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4187 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4188 OSMO_ASSERT(link_info);
4189 OSMO_ASSERT(link_info->is_deregistered);
4190
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004191 OSMO_ASSERT(!expect_msg());
4192 received_messages = NULL;
4193
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004194 dump_global(stdout, 0);
4195
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004196 talloc_free(gbcfg.core_apn);
4197 gbcfg.core_apn = NULL;
4198
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004199 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02004200 gprs_ns2_free(nsi);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004201 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004202
4203 cleanup_test();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004204}
4205
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004206struct gbproxy_link_info *register_tlli(
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004207 struct gbproxy_peer *peer, uint32_t tlli,
4208 const uint8_t *imsi, size_t imsi_len, time_t now)
4209{
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004210 struct gbproxy_link_info *link_info;
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004211 int imsi_matches = -1;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004212 int tlli_already_known = 0;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004213 struct gbproxy_config *cfg = peer->cfg;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004214
4215 /* Check, whether the IMSI matches */
4216 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004217 imsi_matches = gbproxy_check_imsi(
4218 &cfg->matches[GBPROX_MATCH_PATCHING], imsi, imsi_len);
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004219 if (imsi_matches < 0)
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004220 return NULL;
4221 }
4222
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004223 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004224
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004225 if (!link_info) {
4226 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004227
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004228 if (link_info) {
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004229 /* TLLI has changed somehow, adjust it */
4230 LOGP(DGPRS, LOGL_INFO,
4231 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004232 link_info->tlli.current, tlli);
4233 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004234 }
4235 }
4236
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004237 if (!link_info) {
4238 link_info = gbproxy_link_info_alloc(peer);
4239 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004240 } else {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004241 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004242 tlli_already_known = 1;
4243 }
4244
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004245 OSMO_ASSERT(link_info != NULL);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004246
4247 if (!tlli_already_known)
4248 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
4249
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004250 gbproxy_attach_link_info(peer, now, link_info);
4251 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004252
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004253 if (imsi_matches >= 0)
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004254 link_info->is_matching[GBPROX_MATCH_PATCHING] = imsi_matches;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004255
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004256 return link_info;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004257}
4258
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004259static void test_gbproxy_tlli_expire(void)
4260{
4261 struct gbproxy_config cfg = {0};
4262 struct gbproxy_peer *peer;
4263 const char *err_msg = NULL;
Neels Hofmeyr7369d442020-05-29 17:05:40 +02004264 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0xf6 };
4265 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0xf9 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004266 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004267 const uint32_t tlli1 = 1234 | 0xc0000000;
4268 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004269 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004270 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004271 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004272
4273 printf("Test TLLI info expiry\n\n");
4274
4275 gbproxy_init_config(&cfg);
4276
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004277 if (gbproxy_set_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING],
4278 filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004279 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
4280 err_msg);
4281 OSMO_ASSERT(err_msg == NULL);
4282 }
4283
4284 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004285 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004286
4287 printf("Test TLLI replacement:\n");
4288
4289 cfg.tlli_max_len = 0;
4290 cfg.tlli_max_age = 0;
4291 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004292 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004293
4294 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004295 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004296 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004297 OSMO_ASSERT(link_info);
4298 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004299 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004300
4301 /* replace the old entry */
4302 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004303 link_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004304 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004305 OSMO_ASSERT(link_info);
4306 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004307 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004308
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004309 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004310
4311 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004312 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4313 OSMO_ASSERT(link_info);
4314 OSMO_ASSERT(link_info->tlli.current == tlli2);
4315 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4316 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004317
4318 printf("\n");
4319
4320 gbproxy_peer_free(peer);
4321 }
4322
4323 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004324 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004325
4326 printf("Test IMSI replacement:\n");
4327
4328 cfg.tlli_max_len = 0;
4329 cfg.tlli_max_age = 0;
4330 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004331 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004332
4333 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004334 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004335 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004336 OSMO_ASSERT(link_info);
4337 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004338 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004339
4340 /* try to replace the old entry */
4341 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004342 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004343 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004344 OSMO_ASSERT(link_info);
4345 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004346 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004347
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004348 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004349
4350 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004351 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4352 OSMO_ASSERT(!link_info);
4353 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4354 OSMO_ASSERT(link_info);
4355 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004356
4357 printf("\n");
4358
4359 gbproxy_peer_free(peer);
4360 }
4361
4362 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004363 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004364 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004365
4366 printf("Test TLLI expiry, max_len == 1:\n");
4367
4368 cfg.tlli_max_len = 1;
4369 cfg.tlli_max_age = 0;
4370 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004371 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004372
4373 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004374 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004375 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004376
4377 /* replace the old entry */
4378 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004379 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004380 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004381
Jacob Erlbeck51fde082014-09-19 16:40:21 +02004382 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004383 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004384 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004385
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004386 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004387
4388 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004389 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4390 OSMO_ASSERT(!link_info);
4391 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4392 OSMO_ASSERT(link_info);
4393 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004394
4395 printf("\n");
4396
4397 gbproxy_peer_free(peer);
4398 }
4399
4400 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004401 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004402 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004403
4404 printf("Test TLLI expiry, max_age == 1:\n");
4405
4406 cfg.tlli_max_len = 0;
4407 cfg.tlli_max_age = 1;
4408 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004409 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004410
4411 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004412 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004413 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004414
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004415 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004416 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004417 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004418 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004419
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004420 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004421 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004422 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004423
4424 dump_peers(stdout, 2, now + 2, &cfg);
4425
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004426 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004427 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4428 OSMO_ASSERT(!link_info);
4429 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4430 OSMO_ASSERT(link_info);
4431 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004432
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004433 printf("\n");
4434
4435 gbproxy_peer_free(peer);
4436 }
4437
4438 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004439 struct gbproxy_link_info *link_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004440 int num_removed;
4441
4442 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
4443
4444 cfg.tlli_max_len = 0;
4445 cfg.tlli_max_age = 1;
4446 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004447 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004448
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004449 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004450 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004451 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004452
4453 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004454 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004455 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004456 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004457
4458 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004459 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004460 now + 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004461 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004462
4463 dump_peers(stdout, 2, now + 2, &cfg);
4464
4465 printf(" Remove stale TLLIs\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004466 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004467 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004468 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004469
4470 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004471
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004472 /* verify that tlli3 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004473 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4474 OSMO_ASSERT(!link_info);
4475 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4476 OSMO_ASSERT(!link_info);
4477 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
4478 OSMO_ASSERT(link_info);
4479 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004480
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004481 printf("\n");
4482
4483 gbproxy_peer_free(peer);
4484 }
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004485 gbproxy_clear_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING]);
4486 gbprox_reset(&cfg);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004487 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
4488 rate_ctr_group_free(cfg.ctrg);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004489
4490 cleanup_test();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004491}
4492
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004493static void test_gbproxy_imsi_matching(void)
4494{
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004495 const char *err_msg = NULL;
4496 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4497 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4498 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4499 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4500 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4501 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4502 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4503 const char *filter_re1 = ".*";
4504 const char *filter_re2 = "^1234";
4505 const char *filter_re3 = "^4321";
4506 const char *filter_re4_bad = "^12[";
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004507 struct gbproxy_match match = {0,};
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004508
4509 printf("=== Test IMSI/TMSI matching ===\n\n");
4510
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004511 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004512
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004513 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re1, &err_msg) == 0);
4514 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004515
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004516 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4517 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004518
4519 err_msg = NULL;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004520 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004521 OSMO_ASSERT(err_msg != NULL);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004522 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004523
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004524 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4525 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004526
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004527 OSMO_ASSERT(gbproxy_set_patch_filter(&match, NULL, &err_msg) == 0);
4528 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004529
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004530 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4531 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004532
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004533 gbproxy_clear_patch_filter(&match);
4534 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004535
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004536 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4537 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004538
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004539 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 1);
4540 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 1);
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +02004541 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == -1);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004542 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4543 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4544 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4545 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004546
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004547 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re3, &err_msg) == 0);
4548 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004549
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004550 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 0);
4551 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 0);
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +02004552 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == -1);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004553 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4554 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4555 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4556 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004557
4558 /* TODO: Check correct length but wrong type with is_mi_tmsi */
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004559
4560 gbproxy_clear_patch_filter(&match);
4561 OSMO_ASSERT(match.enable == 0);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004562
4563 cleanup_test();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004564}
4565
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004566static void test_gbproxy_stored_messages()
4567{
Alexander Couzens82182d02020-09-22 13:21:46 +02004568 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004569 struct gprs_ra_id rai_bss =
4570 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
4571 struct gprs_ra_id rai_unknown =
4572 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
4573 uint16_t cell_id = 0x1234;
4574
4575 const uint32_t ptmsi = 0xefe2b700;
4576 const uint32_t local_tlli = 0xefe2b700;
4577
4578 const uint32_t foreign_tlli1 = 0x8000dead;
4579
4580 struct gbproxy_peer *peer;
4581 unsigned bss_nu = 0;
4582 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02004583 uint16_t bss_nsei[] = { 0x1000 };
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004584
4585 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
4586
Alexander Couzens82182d02020-09-22 13:21:46 +02004587 gbcfg.nsi = nsi;
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004588 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01004589 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004590 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004591 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
4592 gbcfg.patch_ptmsi = 0;
4593 gbcfg.acquire_imsi = 1;
4594 gbcfg.keep_link_infos = 0;
4595
Alexander Couzens82182d02020-09-22 13:21:46 +02004596 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004597
4598 printf("=== %s ===\n", __func__);
4599 printf("--- Initialise SGSN ---\n\n");
4600
Alexander Couzens82182d02020-09-22 13:21:46 +02004601 connect_sgsn(nsi, SGSN_NSEI);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004602
4603 printf("--- Initialise BSS 1 ---\n\n");
4604
Alexander Couzens82182d02020-09-22 13:21:46 +02004605 setup_ns(nsi, bss_nsei[0]);
4606 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004607
4608 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
4609 OSMO_ASSERT(peer != NULL);
4610
Alexander Couzens82182d02020-09-22 13:21:46 +02004611 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004612
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004613 dump_global(stdout, 0);
4614 dump_peers(stdout, 0, 0, &gbcfg);
4615
4616 printf("--- Establish first LLC connection ---\n\n");
4617
Alexander Couzens82182d02020-09-22 13:21:46 +02004618 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004619 foreign_tlli1, &rai_unknown, cell_id,
4620 GPRS_SAPI_GMM, bss_nu++,
4621 dtap_attach_req, sizeof(dtap_attach_req));
4622
4623 dump_peers(stdout, 0, 0, &gbcfg);
4624
Alexander Couzens82182d02020-09-22 13:21:46 +02004625 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004626 foreign_tlli1, 0, NULL, 0,
4627 GPRS_SAPI_GMM, sgsn_nu++,
4628 dtap_identity_req, sizeof(dtap_identity_req));
4629
4630 dump_peers(stdout, 0, 0, &gbcfg);
4631
Alexander Couzens82182d02020-09-22 13:21:46 +02004632 send_llc_ul_ui(nsi, "DETACH ACCEPT", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004633 foreign_tlli1, &rai_bss, cell_id,
4634 GPRS_SAPI_GMM, bss_nu++,
4635 dtap_detach_acc, sizeof(dtap_detach_acc));
4636
4637 dump_peers(stdout, 0, 0, &gbcfg);
4638
Alexander Couzens82182d02020-09-22 13:21:46 +02004639 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004640 foreign_tlli1, &rai_bss, cell_id,
4641 GPRS_SAPI_GMM, bss_nu++,
4642 dtap_identity_resp, sizeof(dtap_identity_resp));
4643
4644 dump_peers(stdout, 0, 0, &gbcfg);
4645
4646 dump_global(stdout, 0);
4647
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004648 talloc_free(gbcfg.core_apn);
4649 gbcfg.core_apn = NULL;
4650
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004651 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02004652 gprs_ns2_free(nsi);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004653 nsi = NULL;
4654
4655 cleanup_test();
4656}
4657
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004658/* See OS#3178 "gbproxy: failed to parse invalid BSSGP-UNITDATA message" */
4659static void test_gbproxy_parse_bssgp_unitdata()
4660{
4661 const char *hex = "0000239401e155cfea000004088872f4801018009c4000800e000601c0416c4338";
4662 struct msgb *msg = msgb_alloc(1034, "bssgp_unitdata");
4663 struct gprs_gb_parse_context parse_ctx;
4664 int rc;
4665
4666 memset(&parse_ctx, 0, sizeof(parse_ctx));
4667
4668 OSMO_ASSERT(msg);
4669 msgb_bssgph(msg) = msg->head;
4670 msgb_put(msg, osmo_hexparse(hex, msg->head, msgb_tailroom(msg)));
4671
4672 parse_ctx.to_bss = 0;
4673 parse_ctx.peer_nsei = msgb_nsei(msg);
4674
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004675 rc = gprs_gb_parse_bssgp(msg->data, msg->len, &parse_ctx);
Stefan Sperling322643f2018-06-23 16:50:06 +02004676 if (!rc)
4677 fprintf(stderr, "%s: Test passed; Failed to parse invalid message %s\n", __func__, msgb_hexdump(msg));
4678 else
4679 fprintf(stderr, "%s: Test failed; invalid message was accepted by parser: %s\n", __func__, msgb_hexdump(msg));
4680
4681 OSMO_ASSERT(!rc);
4682
4683 /* Manually decoded message according to:
4684 ETSI TS 148 018 V10.6.0 (2012 07) 96
4685 3GPP TS 48.018 version 10.6.0 Release 10
4686 Table 10.2.2: UL-UNITDATA PDU content
4687
4688 00 - PDU type UL-UNITDATA (ok)
4689
4690 11.3.35 Temporary logical link Identity (TLLI)
4691 00 - TLLI[0]
4692 23 - TLLI[1]
4693 94 - TLLI[2]
4694 01 - TLLI[3]
4695 TLLI == "00239401"
4696
4697 e1 - QOS[0] (bit rate MSB)
4698 55 - QOS[1] (bit rate LSB)
4699 bit rate = "57685" (57685*100000 bit/s per PBRG)
4700 cf - QOS[2] PBRG = 11 (bit rate is expressed in 100000 bit/s increments),
4701 C/R 0 (contains LLC ACK/SACK),
4702 T 0 (contains signalling),
4703 A 1 (radio if uses MAC/UNITDATA,
4704 Precedence 111 (reserved value)
4705
4706 ea - CELL_ID[0] (TLV IEI: wrong, should be 0x08)
4707 00 - CELL_ID[1] (length 1)
4708 00 - CELL_ID[2] (length 2)
4709 lenth == 0
4710 04 -- CELL_ID[3]
4711 08 -- CELL_ID[4]
4712 88 -- CELL_ID[5]
4713 72 -- CELL_ID[6]
4714 f4 -- CELL_ID[7]
4715 80 -- CELL_ID[8]
4716 10 -- CELL_DI[9]
4717
4718 18 -- QOSP[0] OoS Profile IEI
4719 not allowed in BSSGP Userdata
4720 00 -- QOSP[1]
4721 9c -- QOSP[2]
4722 40 -- QOSP[3]
4723 00 -- QOSP[4]
4724
4725 80 -- IEI for "E-UTRAN Inter RAT Handover Info"
4726 not allowed in BSSGP Userdata
4727 0e -- length (14 bytes -- only 8 bytes remain)
4728 00 06 01 c0 41 6c 43 38 */
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004729
4730 msgb_free(msg);
Stefan Sperling322643f2018-06-23 16:50:06 +02004731
4732 cleanup_test();
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004733}
4734
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004735static struct log_info_cat gprs_categories[] = {
4736 [DGPRS] = {
4737 .name = "DGPRS",
4738 .description = "GPRS Packet Service",
4739 .enabled = 1, .loglevel = LOGL_DEBUG,
4740 },
4741 [DNS] = {
4742 .name = "DNS",
4743 .description = "GPRS Network Service (NS)",
4744 .enabled = 1, .loglevel = LOGL_INFO,
4745 },
4746 [DBSSGP] = {
4747 .name = "DBSSGP",
4748 .description = "GPRS BSS Gateway Protocol (BSSGP)",
4749 .enabled = 1, .loglevel = LOGL_DEBUG,
4750 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004751};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004752
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004753static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004754 .cat = gprs_categories,
4755 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004756};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004757
4758int main(int argc, char **argv)
4759{
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004760 talloc_enable_leak_report();
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004761 tall_sgsn_ctx = talloc_named_const(NULL, 0, "gbproxy_test");
4762 void *log_ctx = talloc_named_const(tall_sgsn_ctx, 0, "log");
Neels Hofmeyr4c2d4ab2016-09-16 02:31:17 +02004763
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004764 msgb_talloc_ctx_init(tall_sgsn_ctx, 0);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004765
4766 osmo_init_logging2(log_ctx, &info);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004767 log_set_use_color(osmo_stderr_target, 0);
4768 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004769 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
4770 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004771
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004772 rate_ctr_init(tall_sgsn_ctx);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004773
4774 setlinebuf(stdout);
4775
4776 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02004777 gbproxy_init_config(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004778 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004779 test_gbproxy_ident_changes();
Alexander Couzens82182d02020-09-22 13:21:46 +02004780 test_gbproxy_ra_patching();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004781 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02004782 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02004783 test_gbproxy_ptmsi_patching();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02004784 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02004785 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02004786 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004787 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004788 test_gbproxy_tlli_expire();
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004789 test_gbproxy_stored_messages();
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004790 test_gbproxy_parse_bssgp_unitdata();
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004791 gbprox_reset(&gbcfg);
4792 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
4793 rate_ctr_group_free(gbcfg.ctrg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004794 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004795
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004796 talloc_free(log_ctx);
4797 /* expecting root and msgb ctx, empty */
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004798 OSMO_ASSERT(talloc_total_blocks(tall_sgsn_ctx) == 2);
4799 talloc_free(tall_sgsn_ctx);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004800
4801 return 0;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004802}