blob: 166298007e2268c857aa3cdb4c242192c63d6b26 [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);
508 talloc_free(msg);
509}
510static int gbprox_test_bssgp_send_cb(void *ctx, struct msgb *msg);
511
512/* wrap */
513int gprs_ns2_recv_prim(struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph)
514{
515 struct osmo_gprs_ns2_prim *nsp;
516
517 if (oph->sap != SAP_NS)
518 return 0;
519
520 nsp = container_of(oph, struct osmo_gprs_ns2_prim, oph);
521
522 if (oph->operation != PRIM_OP_REQUEST) {
523 LOGP(DPCU, LOGL_NOTICE, "NS: %s Unknown prim %d from NS\n",
524 get_value_string(osmo_prim_op_names, oph->operation),
525 oph->operation);
526 return 0;
527 }
528
529 switch (oph->primitive) {
530 case PRIM_NS_UNIT_DATA:
531 /* hand the message into the BSSGP implementation */
532 msgb_bssgph(oph->msg) = oph->msg->l3h;
533 msgb_bvci(oph->msg) = nsp->bvci;
534 msgb_nsei(oph->msg) = nsp->nsei;
535 printf("NS2 UD REQUEST, prim %d, msg length %zu, bvci 0x%04x\n%s\n\n",
536 oph->primitive, msgb_bssgp_len(oph->msg), nsp->bvci,
537 osmo_hexdump(msgb_l3(oph->msg), msgb_l3len(oph->msg)));
538 return gbprox_test_bssgp_send_cb(&gbcfg, oph->msg);
539 break;
540 default:
541 printf("NS2 REQUEST, prim %d, bvci 0x%04x\n\n",
542 oph->primitive, nsp->bvci);
543
544 break;
545 }
546 return 0;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200547}
548
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200549static void send_bssgp_ul_unitdata(
Alexander Couzens82182d02020-09-22 13:21:46 +0200550 struct gprs_ns2_inst *nsi, const char *text,
551 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200552 struct gprs_ra_id *raid, uint16_t cell_id,
553 const uint8_t *llc_msg, size_t llc_msg_size)
554{
555 /* GPRS Network Service, PDU type: NS_UNITDATA */
556 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
557 unsigned char msg[4096] = {
558 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
559 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
560 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
561 };
562
563 size_t bssgp_msg_size = 23 + llc_msg_size;
564
565 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
566
Max25c65c32018-01-08 14:43:53 +0100567 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 10), raid);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200568 msg[1] = (uint8_t)(tlli >> 24);
569 msg[2] = (uint8_t)(tlli >> 16);
570 msg[3] = (uint8_t)(tlli >> 8);
571 msg[4] = (uint8_t)(tlli >> 0);
572 msg[16] = cell_id / 256;
573 msg[17] = cell_id % 256;
574 msg[21] = llc_msg_size / 256;
575 msg[22] = llc_msg_size % 256;
576 memcpy(msg + 23, llc_msg, llc_msg_size);
577
578 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
Alexander Couzens82182d02020-09-22 13:21:46 +0200579 nsei, nsbvci, msg, bssgp_msg_size);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200580}
581
582static void send_bssgp_dl_unitdata(
Alexander Couzens82182d02020-09-22 13:21:46 +0200583 struct gprs_ns2_inst *nsi, const char *text,
584 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200585 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
586 const uint8_t *llc_msg, size_t llc_msg_size)
587{
588 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
589 unsigned char msg[4096] = {
590 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
591 0x16, 0x82, 0x02, 0x58,
592 };
593 unsigned char racap_drx[] = {
594 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
595 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
596 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
597 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
598 };
599
600 size_t bssgp_msg_size = 0;
601
602 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
603
604 msg[1] = (uint8_t)(tlli >> 24);
605 msg[2] = (uint8_t)(tlli >> 16);
606 msg[3] = (uint8_t)(tlli >> 8);
607 msg[4] = (uint8_t)(tlli >> 0);
608
609 bssgp_msg_size = 12;
610
611 if (with_racap_drx) {
612 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
613 bssgp_msg_size += sizeof(racap_drx);
614 }
615
616 if (imsi) {
617 OSMO_ASSERT(imsi_size <= 127);
618 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
619 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
620 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
621 bssgp_msg_size += 2 + imsi_size;
622 }
623
624 if ((bssgp_msg_size % 4) != 0) {
625 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
626 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
627 msg[bssgp_msg_size + 1] = 0x80 | abytes;
628 memset(msg + bssgp_msg_size + 2, 0, abytes);
629 bssgp_msg_size += 2 + abytes;
630 }
631
632 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
633 if (llc_msg_size < 128) {
634 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
635 bssgp_msg_size += 2;
636 } else {
637 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
638 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
639 bssgp_msg_size += 3;
640 }
641 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
642 bssgp_msg_size += llc_msg_size;
643
644
645 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
Alexander Couzens82182d02020-09-22 13:21:46 +0200646 nsei, nsbvci, msg, bssgp_msg_size);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200647}
648
Alexander Couzens82182d02020-09-22 13:21:46 +0200649static void send_bssgp_reset(struct gprs_ns2_inst *nsi,
650 uint16_t nsei, uint16_t bvci)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200651{
652 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
653 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200654 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200655 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200656 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
657 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200658 };
659
660 msg[3] = bvci / 256;
661 msg[4] = bvci % 256;
662
Alexander Couzens82182d02020-09-22 13:21:46 +0200663 send_ns_unitdata(nsi, "BVC_RESET", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200664}
665
Alexander Couzens82182d02020-09-22 13:21:46 +0200666static void send_bssgp_reset_ack(struct gprs_ns2_inst *nsi,
667 uint16_t nsei, uint16_t bvci)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200668{
669 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
670 * BSSGP RESET_ACK */
671 static unsigned char msg[5] = {
672 0x23, 0x04, 0x82, 0x00,
673 0x00
674 };
675
676 msg[3] = bvci / 256;
677 msg[4] = bvci % 256;
678
Alexander Couzens82182d02020-09-22 13:21:46 +0200679 send_ns_unitdata(nsi, "BVC_RESET_ACK", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200680}
681
Alexander Couzens82182d02020-09-22 13:21:46 +0200682static void send_bssgp_suspend(struct gprs_ns2_inst *nsi,
683 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200684 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200685 struct gprs_ra_id *raid)
686{
687 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
688 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200689 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
690 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200691 };
692
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200693 msg[3] = (uint8_t)(tlli >> 24);
694 msg[4] = (uint8_t)(tlli >> 16);
695 msg[5] = (uint8_t)(tlli >> 8);
696 msg[6] = (uint8_t)(tlli >> 0);
697
Max25c65c32018-01-08 14:43:53 +0100698 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200699
Alexander Couzens82182d02020-09-22 13:21:46 +0200700 send_ns_unitdata(nsi, "BVC_SUSPEND", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200701}
702
Alexander Couzens82182d02020-09-22 13:21:46 +0200703static void send_bssgp_suspend_ack(struct gprs_ns2_inst *nsi,
704 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200705 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200706 struct gprs_ra_id *raid)
707{
708 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
709 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200710 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
711 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200712 0x81, 0x01
713 };
714
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200715 msg[3] = (uint8_t)(tlli >> 24);
716 msg[4] = (uint8_t)(tlli >> 16);
717 msg[5] = (uint8_t)(tlli >> 8);
718 msg[6] = (uint8_t)(tlli >> 0);
719
Max25c65c32018-01-08 14:43:53 +0100720 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200721
Alexander Couzens82182d02020-09-22 13:21:46 +0200722 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200723}
724
Alexander Couzens82182d02020-09-22 13:21:46 +0200725static void send_bssgp_llc_discarded(struct gprs_ns2_inst *nsi,
726 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200727 uint16_t bvci, uint32_t tlli,
728 unsigned n_frames, unsigned n_octets)
729{
730 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
731 unsigned char msg[] = {
732 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
733 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
734 /* n octets */ 0xff, 0xff, 0xff
735 };
736
737 msg[3] = (uint8_t)(tlli >> 24);
738 msg[4] = (uint8_t)(tlli >> 16);
739 msg[5] = (uint8_t)(tlli >> 8);
740 msg[6] = (uint8_t)(tlli >> 0);
741 msg[9] = (uint8_t)(n_frames);
742 msg[12] = (uint8_t)(bvci >> 8);
743 msg[13] = (uint8_t)(bvci >> 0);
744 msg[16] = (uint8_t)(n_octets >> 16);
745 msg[17] = (uint8_t)(n_octets >> 8);
746 msg[18] = (uint8_t)(n_octets >> 0);
747
Alexander Couzens82182d02020-09-22 13:21:46 +0200748 send_ns_unitdata(nsi, "LLC_DISCARDED", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200749}
750
Alexander Couzens82182d02020-09-22 13:21:46 +0200751static void send_bssgp_paging(struct gprs_ns2_inst *nsi,
752 uint16_t nsei,
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200753 const uint8_t *imsi, size_t imsi_size,
754 struct gprs_ra_id *raid, uint32_t ptmsi)
755{
756 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
757 unsigned char msg[100] = {
758 0x06,
759 };
760
761 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
762 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
763
764 size_t bssgp_msg_size = 1;
765
766 if (imsi) {
767 OSMO_ASSERT(imsi_size <= 127);
768 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
769 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
770 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
771 bssgp_msg_size += 2 + imsi_size;
772 }
773
774 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
775 bssgp_msg_size += sizeof(drx_ie);
776
777 if (raid) {
778 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
779 msg[bssgp_msg_size+1] = 0x86;
Max25c65c32018-01-08 14:43:53 +0100780 gsm48_encode_ra((struct gsm48_ra_id *)(msg + bssgp_msg_size + 2), raid);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200781 bssgp_msg_size += 8;
782 }
783
784 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
785 bssgp_msg_size += sizeof(qos_ie);
786
787 if (ptmsi != GSM_RESERVED_TMSI) {
788 const uint32_t ptmsi_be = htonl(ptmsi);
789 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
790 msg[bssgp_msg_size+1] = 0x84;
791 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
792 bssgp_msg_size += 6;
793 }
794
Alexander Couzens82182d02020-09-22 13:21:46 +0200795 send_ns_unitdata(nsi, "PAGING_PS", nsei, 0, msg, bssgp_msg_size);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200796}
797
Alexander Couzens82182d02020-09-22 13:21:46 +0200798static void send_bssgp_flow_control_bvc(struct gprs_ns2_inst *nsi,
799 uint16_t nsei,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200800 uint16_t bvci, uint8_t tag)
801{
802 /* GPRS Network Service, PDU type: NS_UNITDATA,
803 * BSSGP FLOW_CONTROL_BVC */
804 unsigned char msg[] = {
805 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
806 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
807 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
808 };
809
810 msg[3] = tag;
811
Alexander Couzens82182d02020-09-22 13:21:46 +0200812 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", nsei, bvci,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200813 msg, sizeof(msg));
814}
815
Alexander Couzens82182d02020-09-22 13:21:46 +0200816static void send_bssgp_flow_control_bvc_ack(struct gprs_ns2_inst *nsi,
817 uint16_t nsei,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200818 uint16_t bvci, uint8_t tag)
819{
820 /* GPRS Network Service, PDU type: NS_UNITDATA,
821 * BSSGP FLOW_CONTROL_BVC_ACK */
822 unsigned char msg[] = {
823 0x27, 0x1e, 0x81, /* Tag */ 0xce
824 };
825
826 msg[3] = tag;
827
Alexander Couzens82182d02020-09-22 13:21:46 +0200828 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", nsei, bvci,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200829 msg, sizeof(msg));
830}
831
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200832static void send_llc_ul_ui(
Alexander Couzens82182d02020-09-22 13:21:46 +0200833 struct gprs_ns2_inst *nsi, const char *text,
834 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200835 struct gprs_ra_id *raid, uint16_t cell_id,
836 unsigned sapi, unsigned nu,
837 const uint8_t *msg, size_t msg_size)
838{
839 unsigned char llc_msg[4096] = {
840 0x00, 0xc0, 0x01
841 };
842
843 size_t llc_msg_size = 3 + msg_size + 3;
844 uint8_t e_bit = 0;
845 uint8_t pm_bit = 1;
846 unsigned fcs;
847
848 nu &= 0x01ff;
849
850 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
851
852 llc_msg[0] = (sapi & 0x0f);
853 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
854 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
855
856 memcpy(llc_msg + 3, msg, msg_size);
857
858 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
859 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
860 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
861 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
862
863 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
Alexander Couzens82182d02020-09-22 13:21:46 +0200864 nsei, nsbvci, tlli, raid, cell_id,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200865 llc_msg, llc_msg_size);
866}
867
868static void send_llc_dl_ui(
Alexander Couzens82182d02020-09-22 13:21:46 +0200869 struct gprs_ns2_inst *nsi, const char *text,
870 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200871 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
872 unsigned sapi, unsigned nu,
873 const uint8_t *msg, size_t msg_size)
874{
875 /* GPRS Network Service, PDU type: NS_UNITDATA */
876 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
877 unsigned char llc_msg[4096] = {
878 0x00, 0x00, 0x01
879 };
880
881 size_t llc_msg_size = 3 + msg_size + 3;
882 uint8_t e_bit = 0;
883 uint8_t pm_bit = 1;
884 unsigned fcs;
885
886 nu &= 0x01ff;
887
888 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
889
890 llc_msg[0] = 0x40 | (sapi & 0x0f);
891 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
892 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
893
894 memcpy(llc_msg + 3, msg, msg_size);
895
896 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
897 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
898 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
899 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
900
901 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
Alexander Couzens82182d02020-09-22 13:21:46 +0200902 nsei, nsbvci, tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200903 with_racap_drx, imsi, imsi_size,
904 llc_msg, llc_msg_size);
905}
906
907
Alexander Couzens82182d02020-09-22 13:21:46 +0200908/* STATUS indications */
909static void send_ns_avail(struct gprs_ns2_inst *nsi,
910 uint16_t sgsn_nsei)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200911{
Alexander Couzens82182d02020-09-22 13:21:46 +0200912 struct osmo_gprs_ns2_prim nsp = {};
913 nsp.nsei = sgsn_nsei;
914 nsp.bvci = 0;
915 nsp.u.status.cause = NS_AFF_CAUSE_RECOVERY;
916 nsp.u.status.transfer = -1;
917 nsp.u.status.first = true;
918 osmo_prim_init(&nsp.oph, SAP_NS, PRIM_NS_STATUS,
919 PRIM_OP_INDICATION, NULL);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200920
Alexander Couzens82182d02020-09-22 13:21:46 +0200921 gprs_ns2_callback(&nsp.oph, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200922}
923
Alexander Couzens82182d02020-09-22 13:21:46 +0200924static void setup_ns(struct gprs_ns2_inst *nsi,
925 uint16_t nsei)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200926{
Alexander Couzens82182d02020-09-22 13:21:46 +0200927 printf("Setup NS-VC: "
928 "NSEI 0x%04x(%d)\n\n",
929 nsei, nsei);
930 send_ns_avail(nsi, nsei);
931}
932
933static void setup_bssgp(struct gprs_ns2_inst *nsi,
934 uint16_t nsei, uint16_t bvci)
935{
936 printf("Setup BSSGP: "
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200937 "BVCI 0x%04x(%d)\n\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200938 bvci, bvci);
939
Alexander Couzens82182d02020-09-22 13:21:46 +0200940 send_bssgp_reset(nsi, nsei, bvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200941}
942
Alexander Couzens82182d02020-09-22 13:21:46 +0200943static void connect_sgsn(struct gprs_ns2_inst *nsi,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200944 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200945{
Alexander Couzens82182d02020-09-22 13:21:46 +0200946 send_ns_avail(nsi, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200947}
948
Alexander Couzens82182d02020-09-22 13:21:46 +0200949/* Function used to send a BSSGP message through NS */
950static int gbprox_test_bssgp_send_cb(void *ctx, struct msgb *msg)
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200951{
Alexander Couzens82182d02020-09-22 13:21:46 +0200952 int rc;
953 struct gbproxy_config *cfg = (struct gbproxy_config *) ctx;
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200954
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200955 uint16_t nsei = msgb_nsei(msg);
Alexander Couzens82182d02020-09-22 13:21:46 +0200956 uint16_t bvci = msgb_bvci(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200957
Jacob Erlbeckacfaff32014-09-22 18:54:34 +0200958 if (received_messages) {
959 struct msgb *msg_copy;
Pau Espin Pedrol816a67d2018-08-15 13:53:48 +0200960 msg_copy = bssgp_msgb_copy(msg, "received_messages");
Jacob Erlbeckacfaff32014-09-22 18:54:34 +0200961 llist_add_tail(&msg_copy->list, received_messages);
962 }
963
Alexander Couzens82182d02020-09-22 13:21:46 +0200964 if (nsei == cfg->nsip_sgsn_nsei)
965 printf("Message for SGSN");
966 else if (nsei == cfg->nsip_sgsn2_nsei)
967 printf("Message for SGSN2");
968 else
969 printf("Message for BSS");
970 printf(" (NSEI=%d BVCI=%d):\n%s\n\n", nsei, bvci, msgb_hexdump(msg));
971
972 rc = msgb_length(msg);
973 msgb_free(msg);
974
975 return rc;
976}
977
978static void gprs_ns2_test_prim_status_cb(struct gbproxy_config *cfg, struct osmo_gprs_ns2_prim *nsp)
979{
980 enum gprs_ns2_affecting_cause cause = nsp->u.status.cause;
981
982 switch (cause) {
983 case NS_AFF_CAUSE_RECOVERY:
984 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d became available\n", nsp->nsei);
985 break;
986 case NS_AFF_CAUSE_FAILURE:
987 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d became unavailable\n", nsp->nsei);
988 break;
989 case NS_AFF_CAUSE_VC_RECOVERY:
990 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d NS-VC %s became available\n", nsp->nsei, nsp->u.status.nsvc);
991 break;
992 case NS_AFF_CAUSE_VC_FAILURE:
993 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d NS-VC %s became unavailable\n", nsp->nsei, nsp->u.status.nsvc);
994 break;
995 default:
996 LOGP(DPCU, LOGL_NOTICE, "Unhandled status %d (NS-NSE %d)\n", cause, nsp->nsei);
997 break;
998 }
999}
1000
1001int gprs_ns2_prim_cb(struct osmo_prim_hdr *oph, void *ctx);
1002
1003/* override */
1004static int gprs_ns2_callback(struct osmo_prim_hdr *oph, void *ctx)
1005{
1006 struct osmo_gprs_ns2_prim *nsp;
1007 struct gbproxy_config *cfg = (struct gbproxy_config *) ctx;
1008
1009 if (oph->sap != SAP_NS)
1010 return 0;
1011
1012 nsp = container_of(oph, struct osmo_gprs_ns2_prim, oph);
1013
1014 if (oph->operation != PRIM_OP_INDICATION) {
1015 LOGP(DPCU, LOGL_NOTICE, "NS: %s Unknown prim %d from NS\n",
1016 get_value_string(osmo_prim_op_names, oph->operation),
1017 oph->operation);
1018 return 0;
1019 }
1020
1021 switch (oph->primitive) {
1022 case PRIM_NS_UNIT_DATA:
1023 /* hand the message into the BSSGP implementation */
1024 msgb_bssgph(oph->msg) = oph->msg->l3h;
1025 msgb_bvci(oph->msg) = nsp->bvci;
1026 msgb_nsei(oph->msg) = nsp->nsei;
1027 printf("NS2 CALLBACK, prim %d, msg length %zu, bvci 0x%04x\n%s\n\n",
1028 oph->primitive, msgb_bssgp_len(oph->msg), nsp->bvci,
1029 osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));
1030 break;
1031 case PRIM_NS_STATUS:
1032 gprs_ns2_test_prim_status_cb(cfg, nsp);
1033 default:
1034 printf("NS2 CALLBACK, prim %d, bvci 0x%04x\n\n",
1035 oph->primitive, nsp->bvci);
1036
1037 break;
1038 }
1039
1040 /* Hand off to gbproxy */
1041 return gprs_ns2_prim_cb(oph, ctx);
1042
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001043}
1044
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001045/* Get the next message from the receive FIFO
1046 *
1047 * \returns a pointer to the message which will be invalidated at the next call
1048 * to expect_msg. Returns NULL, if there is no message left.
1049 */
1050static struct msgb *expect_msg(void)
1051{
1052 static struct msgb *msg = NULL;
1053
1054 msgb_free(msg);
1055 msg = NULL;
1056
1057 if (!received_messages)
1058 return NULL;
1059
1060 if (llist_empty(received_messages))
1061 return NULL;
1062
1063 msg = llist_entry(received_messages->next, struct msgb, list);
1064 llist_del(&msg->list);
1065
1066 return msg;
1067}
1068
1069struct expect_result {
1070 struct msgb *msg;
1071 struct gprs_gb_parse_context parse_ctx;
1072};
1073
1074static struct expect_result *expect_bssgp_msg(
1075 int match_nsei, int match_bvci, int match_pdu_type)
1076{
1077 static struct expect_result result;
1078 static const struct expect_result empty_result = {0,};
1079 static struct msgb *msg;
1080 uint16_t nsei;
1081 int rc;
1082
1083 memcpy(&result, &empty_result, sizeof(result));
1084
1085 msg = expect_msg();
1086 if (!msg)
1087 return NULL;
1088
1089 nsei = msgb_nsei(msg);
1090
1091 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1092 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1093 __func__, match_nsei, nsei);
1094 return NULL;
1095 }
1096
1097 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1098 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1099 __func__, match_bvci, msgb_bvci(msg));
1100 return NULL;
1101 }
1102
1103 result.msg = msg;
1104
1105 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1106 result.parse_ctx.peer_nsei = nsei;
1107
1108 if (!msgb_bssgph(msg)) {
1109 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1110 return NULL;
1111 }
1112
1113 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1114 &result.parse_ctx);
1115
1116 if (!rc) {
1117 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1118 return NULL;
1119 }
1120
1121 if (match_pdu_type != MATCH_ANY &&
1122 match_pdu_type != result.parse_ctx.pdu_type) {
1123 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1124 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1125 return NULL;
1126 }
1127
1128 return &result;
1129}
1130
1131static struct expect_result *expect_llc_msg(
1132 int match_nsei, int match_bvci, int match_sapi, int match_type)
1133{
1134 static struct expect_result *result;
1135
1136 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1137 if (!result)
1138 return NULL;
1139
1140 if (!result->parse_ctx.llc) {
1141 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1142 return NULL;
1143 }
1144
1145 if (match_sapi != MATCH_ANY &&
1146 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1147 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1148 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1149 return NULL;
1150 }
1151
1152 if (match_type != MATCH_ANY &&
1153 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1154 fprintf(stderr,
1155 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1156 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1157 return NULL;
1158 }
1159
1160 return result;
1161}
1162
1163static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1164 int match_type)
1165{
1166 static struct expect_result *result;
1167
1168 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1169 if (!result)
1170 return NULL;
1171
1172 if (!result->parse_ctx.g48_hdr) {
1173 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1174 return NULL;
1175 }
1176
1177 if (match_type != MATCH_ANY &&
1178 match_type != result->parse_ctx.g48_hdr->msg_type) {
1179 fprintf(stderr,
1180 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1181 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1182 return NULL;
1183 }
1184
1185 return result;
1186}
1187
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001188static void test_gbproxy()
1189{
Alexander Couzens82182d02020-09-22 13:21:46 +02001190 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
1191 uint16_t bss_nsei[2] = {0x1000, 0x2000};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001192
Alexander Couzens82182d02020-09-22 13:21:46 +02001193 gbcfg.nsi = nsi;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001194 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1195
Alexander Couzens82182d02020-09-22 13:21:46 +02001196 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001197
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001198 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001199 printf("--- Initialise SGSN ---\n\n");
1200
Alexander Couzens82182d02020-09-22 13:21:46 +02001201 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001202
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001203 printf("--- Initialise BSS 1 ---\n\n");
1204
Alexander Couzens82182d02020-09-22 13:21:46 +02001205 setup_ns(nsi, bss_nsei[0]);
1206 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001207 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001208
Alexander Couzens82182d02020-09-22 13:21:46 +02001209 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001210
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001211 printf("--- Initialise BSS 2 ---\n\n");
1212
Alexander Couzens82182d02020-09-22 13:21:46 +02001213 setup_ns(nsi, bss_nsei[1]);
1214 setup_bssgp(nsi, bss_nsei[1], 0x2002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001215 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001216
Alexander Couzens82182d02020-09-22 13:21:46 +02001217 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x2002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001218
1219 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1220
Alexander Couzens82182d02020-09-22 13:21:46 +02001221 setup_bssgp(nsi, bss_nsei[0], 0x1012);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001222 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001223
Alexander Couzens82182d02020-09-22 13:21:46 +02001224 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1012);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001225
1226 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1227
Alexander Couzens82182d02020-09-22 13:21:46 +02001228 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001229 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001230
Alexander Couzens82182d02020-09-22 13:21:46 +02001231 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001232
1233 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1234
Alexander Couzens82182d02020-09-22 13:21:46 +02001235 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001236 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001237
Alexander Couzens82182d02020-09-22 13:21:46 +02001238 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001239
1240 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1241
Alexander Couzens82182d02020-09-22 13:21:46 +02001242 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001243
1244 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1245
Alexander Couzens82182d02020-09-22 13:21:46 +02001246 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001247
1248 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1249
Alexander Couzens82182d02020-09-22 13:21:46 +02001250 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001251
1252 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1253
Alexander Couzens82182d02020-09-22 13:21:46 +02001254 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001255
1256 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1257
Alexander Couzens82182d02020-09-22 13:21:46 +02001258 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x2002, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001259
1260 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1261
Alexander Couzens82182d02020-09-22 13:21:46 +02001262 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x2002, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001263
1264 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1265
Alexander Couzens82182d02020-09-22 13:21:46 +02001266 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001267 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001268
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001269 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001270
Alexander Couzens82182d02020-09-22 13:21:46 +02001271 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001272
1273 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1274
Alexander Couzens82182d02020-09-22 13:21:46 +02001275 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001276
1277 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1278
Alexander Couzens82182d02020-09-22 13:21:46 +02001279 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001280
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001281 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1282
Alexander Couzens82182d02020-09-22 13:21:46 +02001283 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x10ff, (uint8_t *)"", 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001284
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001285 /* Find peer */
1286 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1287 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1288 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1289 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1290 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1291 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1292
1293
1294 /* Cleanup */
1295 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1296 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1297 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1298 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1299 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1300
1301 dump_peers(stdout, 0, 0, &gbcfg);
1302
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001303 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001304
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001305 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001306 gprs_ns2_free(nsi);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001307 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001308}
1309
1310static void test_gbproxy_ident_changes()
1311{
Alexander Couzens82182d02020-09-22 13:21:46 +02001312 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
1313 uint16_t bss_nsei[2] = {0x1000, 0x2000};
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001314 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
1315
Alexander Couzens82182d02020-09-22 13:21:46 +02001316 gbcfg.nsi = nsi;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001317 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1318
Alexander Couzens82182d02020-09-22 13:21:46 +02001319 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001320
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001321 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001322 printf("--- Initialise SGSN ---\n\n");
1323
Alexander Couzens82182d02020-09-22 13:21:46 +02001324 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001325
1326 printf("--- Initialise BSS 1 ---\n\n");
1327
Alexander Couzens82182d02020-09-22 13:21:46 +02001328 setup_ns(nsi, bss_nsei[0]);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001329
1330 printf("--- Setup BVCI 1 ---\n\n");
1331
Alexander Couzens82182d02020-09-22 13:21:46 +02001332 setup_bssgp(nsi, bss_nsei[0], bvci[0]);
1333 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001334 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001335
1336 printf("--- Setup BVCI 2 ---\n\n");
1337
Alexander Couzens82182d02020-09-22 13:21:46 +02001338 setup_bssgp(nsi, bss_nsei[0], bvci[1]);
1339 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001340 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001341
1342 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1343
Alexander Couzens82182d02020-09-22 13:21:46 +02001344 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[0], (uint8_t *)"", 0);
1345 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[0], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001346
1347 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1348
Alexander Couzens82182d02020-09-22 13:21:46 +02001349 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[1], (uint8_t *)"", 0);
1350 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001351
1352 printf("--- Change NSEI ---\n\n");
1353
Alexander Couzens82182d02020-09-22 13:21:46 +02001354 setup_ns(nsi, bss_nsei[1]);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001355
1356 printf("--- Setup BVCI 1 ---\n\n");
1357
Alexander Couzens82182d02020-09-22 13:21:46 +02001358 setup_bssgp(nsi, bss_nsei[1], bvci[0]);
1359 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001360 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001361
1362 printf("--- Setup BVCI 3 ---\n\n");
1363
Alexander Couzens82182d02020-09-22 13:21:46 +02001364 setup_bssgp(nsi, bss_nsei[1], bvci[2]);
1365 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001366 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001367
1368 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1369
Alexander Couzens82182d02020-09-22 13:21:46 +02001370 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[0], (uint8_t *)"", 0);
1371 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[0], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001372
1373 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1374 " (should fail) ---\n\n");
1375
Alexander Couzens82182d02020-09-22 13:21:46 +02001376 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001377 dump_peers(stdout, 0, 0, &gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001378 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001379 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001380
1381 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1382
Alexander Couzens82182d02020-09-22 13:21:46 +02001383 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[2], (uint8_t *)"", 0);
1384 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[2], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001385
1386 printf("--- Change NSVCI ---\n\n");
1387
Alexander Couzens82182d02020-09-22 13:21:46 +02001388 setup_ns(nsi, bss_nsei[1]);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001389
1390 printf("--- Setup BVCI 1 ---\n\n");
1391
Alexander Couzens82182d02020-09-22 13:21:46 +02001392 setup_bssgp(nsi, bss_nsei[1], bvci[0]);
1393 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001394 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001395
1396 printf("--- Setup BVCI 4 ---\n\n");
1397
Alexander Couzens82182d02020-09-22 13:21:46 +02001398 setup_bssgp(nsi, bss_nsei[1], bvci[3]);
1399 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[3]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001400 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001401
1402 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1403
Alexander Couzens82182d02020-09-22 13:21:46 +02001404 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[0], (uint8_t *)"", 0);
1405 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[0], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001406
1407 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1408 " (should fail) ---\n\n");
1409
Alexander Couzens82182d02020-09-22 13:21:46 +02001410 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001411 dump_peers(stdout, 0, 0, &gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001412 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001413 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001414
1415 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1416
Alexander Couzens82182d02020-09-22 13:21:46 +02001417 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[2], (uint8_t *)"", 0);
1418 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[2], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001419
1420 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
1421
Alexander Couzens82182d02020-09-22 13:21:46 +02001422 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[3], (uint8_t *)"", 0);
1423 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[3], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001424
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001425 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001426 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001427
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001428 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001429 gprs_ns2_free(nsi);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001430 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001431}
1432
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001433static void test_gbproxy_ra_patching()
1434{
Alexander Couzens82182d02020-09-22 13:21:46 +02001435 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001436 struct gprs_ra_id rai_bss =
1437 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1438 struct gprs_ra_id rai_sgsn =
1439 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1440 struct gprs_ra_id rai_unknown =
1441 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001442 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001443 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001444 const uint32_t ptmsi = 0xefe2b700;
1445 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001446 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001447 const uint32_t foreign_tlli2 = 0xbb00beef;
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001448 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001449 const char *patch_re = "^9898|^121314";
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001450 struct gbproxy_link_info *link_info;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001451 struct gbproxy_peer *peer;
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001452 LLIST_HEAD(rcv_list);
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001453 struct expect_result *expect_res;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001454
Alexander Couzens82182d02020-09-22 13:21:46 +02001455 uint16_t bss_nsei[1] = { 0x1000 };
1456
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001457 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001458
Alexander Couzens82182d02020-09-22 13:21:46 +02001459 gbcfg.nsi = nsi;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001460 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001461 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001462 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001463 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001464 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001465
Alexander Couzens82182d02020-09-22 13:21:46 +02001466 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001467
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001468 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING],
1469 patch_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001470 fprintf(stderr, "Failed to compile RE '%s': %s\n",
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001471 patch_re, err_msg);
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001472 exit(1);
1473 }
1474
1475
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001476 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001477 printf("--- Initialise SGSN ---\n\n");
1478
Alexander Couzens82182d02020-09-22 13:21:46 +02001479 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001480
1481 printf("--- Initialise BSS 1 ---\n\n");
1482
Alexander Couzens82182d02020-09-22 13:21:46 +02001483 setup_ns(nsi, bss_nsei[0]);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001484
1485 received_messages = &rcv_list;
1486
Alexander Couzens82182d02020-09-22 13:21:46 +02001487 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001488 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001489
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001490 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001491 OSMO_ASSERT(peer != NULL);
1492
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001493 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_BVC_RESET));
1494
Alexander Couzens82182d02020-09-22 13:21:46 +02001495 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001496
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001497 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_BVC_RESET_ACK));
1498
Alexander Couzens82182d02020-09-22 13:21:46 +02001499 send_bssgp_suspend(nsi, bss_nsei[0], 0xccd1758b, &rai_bss);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001500
1501 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_SUSPEND));
1502
Alexander Couzens82182d02020-09-22 13:21:46 +02001503 send_bssgp_suspend_ack(nsi, SGSN_NSEI, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001504
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001505 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_SUSPEND_ACK));
1506
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001507 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001508 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001509
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001510 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1511 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1512
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001513 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1514
Alexander Couzens82182d02020-09-22 13:21:46 +02001515 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001516 foreign_tlli, &rai_bss, cell_id,
1517 GPRS_SAPI_GMM, 0,
1518 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001519
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001520 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001521 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001522
Alexander Couzens82182d02020-09-22 13:21:46 +02001523 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001524 foreign_tlli, 0, NULL, 0,
1525 GPRS_SAPI_GMM, 0,
1526 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001527
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001528 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
1529
Alexander Couzens82182d02020-09-22 13:21:46 +02001530 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001531 foreign_tlli, &rai_bss, cell_id,
1532 GPRS_SAPI_GMM, 3,
1533 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001534
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001535 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
1536
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001537 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1538 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1539
Alexander Couzens82182d02020-09-22 13:21:46 +02001540 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001541 foreign_tlli, 1, imsi, sizeof(imsi),
1542 GPRS_SAPI_GMM, 1,
1543 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001544
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001545 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
1546
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001547 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1548
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001549 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1550 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1551 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1552
1553 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1554 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1555 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1556
1557 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1558 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1559 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
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_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001573 local_tlli, &rai_bss, cell_id,
1574 GPRS_SAPI_GMM, 4,
1575 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001576
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001577 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
1578
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001579 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].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 == local_tlli);
1584 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1585 OSMO_ASSERT(link_info->tlli.bss_validated);
1586 OSMO_ASSERT(!link_info->tlli.net_validated);
1587 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1588 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1589 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1590 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001591
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001592 /* Replace APN (1) */
Alexander Couzens82182d02020-09-22 13:21:46 +02001593 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001594 local_tlli, &rai_bss, cell_id,
1595 GPRS_SAPI_GMM, 3,
1596 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001597
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001598 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1599
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001600 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1601
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001602 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1603 OSMO_ASSERT(link_info);
1604 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1605 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1606 OSMO_ASSERT(link_info->tlli.bss_validated);
1607 OSMO_ASSERT(!link_info->tlli.net_validated);
1608 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1609 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1610 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1611 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001612
Alexander Couzens82182d02020-09-22 13:21:46 +02001613 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001614 local_tlli, 1, imsi, sizeof(imsi),
1615 GPRS_SAPI_GMM, 2,
1616 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001617
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001618 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
1619
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001620 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1621
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001622 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1623 OSMO_ASSERT(link_info);
1624 OSMO_ASSERT(link_info->tlli.assigned == 0);
1625 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1626 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1627 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001628
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001629 /* Replace APN (2) */
Alexander Couzens82182d02020-09-22 13:21:46 +02001630 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001631 local_tlli, &rai_bss, cell_id,
1632 GPRS_SAPI_GMM, 3,
1633 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001634
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001635 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1636 OSMO_ASSERT(expect_res != NULL);
1637 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == gbcfg.core_apn_size + 2);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001638
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001639 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1640
Jacob Erlbeck73685282014-05-23 20:48:07 +02001641 gbcfg.core_apn[0] = 0;
1642 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001643
1644 /* Remove APN */
Alexander Couzens82182d02020-09-22 13:21:46 +02001645 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001646 local_tlli, &rai_bss, cell_id,
1647 GPRS_SAPI_GMM, 3,
1648 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001649
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001650 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1651 OSMO_ASSERT(expect_res != NULL);
1652 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001653
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001654 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1655
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001656 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001657
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001658 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02001659 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001660 local_tlli, &rai_bss, cell_id,
1661 GPRS_SAPI_GMM, 6,
1662 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001663
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001664 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1665
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001666 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1667 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1668
Alexander Couzens82182d02020-09-22 13:21:46 +02001669 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001670 local_tlli, 1, imsi, sizeof(imsi),
1671 GPRS_SAPI_GMM, 5,
1672 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001673
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001674 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
1675
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001676 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001677
1678 printf("--- RA update ---\n\n");
1679
Alexander Couzens82182d02020-09-22 13:21:46 +02001680 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001681 foreign_tlli, &rai_bss, 0x7080,
1682 GPRS_SAPI_GMM, 5,
1683 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001684
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001685 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
1686
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001687 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1688
Alexander Couzens82182d02020-09-22 13:21:46 +02001689 send_llc_dl_ui(nsi, "RA UPD ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001690 foreign_tlli, 1, imsi, sizeof(imsi),
1691 GPRS_SAPI_GMM, 6,
1692 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001693
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001694 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_ACK));
1695
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001696 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1697
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001698 /* Remove APN */
Alexander Couzens82182d02020-09-22 13:21:46 +02001699 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", 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 Erlbeckaa3e3342014-06-27 11:55:04 +02001703
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001704 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1705 OSMO_ASSERT(expect_res != NULL);
1706 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001707
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001708 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1709
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001710 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001711
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001712 /* Detach (power off -> no Detach Accept) */
Alexander Couzens82182d02020-09-22 13:21:46 +02001713 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001714 local_tlli, &rai_bss, cell_id,
1715 GPRS_SAPI_GMM, 6,
1716 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001717
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001718 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1719
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001720 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1721
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001722 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001723 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001724
1725 printf("--- Bad cases ---\n\n");
1726
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001727 /* The RAI in the Attach Request message differs from the RAI in the
1728 * BSSGP message, only patch the latter */
1729
Alexander Couzens82182d02020-09-22 13:21:46 +02001730 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001731 foreign_tlli2, &rai_bss, cell_id,
1732 GPRS_SAPI_GMM, 0,
1733 dtap_attach_req2, sizeof(dtap_attach_req2));
1734
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001735 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
1736
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001737 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1738
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001739 printf("TLLI is already detached, shouldn't patch\n");
Alexander Couzens82182d02020-09-22 13:21:46 +02001740 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001741 local_tlli, &rai_bss, cell_id,
1742 GPRS_SAPI_GMM, 3,
1743 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001744
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001745 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1746
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001747 printf("Invalid RAI, shouldn't patch\n");
Alexander Couzens82182d02020-09-22 13:21:46 +02001748 send_bssgp_suspend_ack(nsi, SGSN_NSEI, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001749
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001750 /* TODO: The following breaks with the current libosmocore, enable it
1751 * again (and remove the plain expect_msg), when the msgb_bssgph patch
1752 * is integrated */
1753 /* OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_STATUS)); */
1754 OSMO_ASSERT(expect_msg());
1755
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001756 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001757 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001758
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001759 OSMO_ASSERT(!expect_msg());
1760 received_messages = NULL;
1761
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02001762 talloc_free(gbcfg.core_apn);
1763 gbcfg.core_apn = NULL;
1764
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02001765 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING]);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001766 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001767 gprs_ns2_free(nsi);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001768 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001769}
1770
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001771static void test_gbproxy_ptmsi_assignment()
1772{
Alexander Couzens82182d02020-09-22 13:21:46 +02001773 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001774 struct gprs_ra_id rai_bss =
1775 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1776 struct gprs_ra_id rai_unknown =
1777 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1778 uint16_t cell_id = 0x1234;
1779
1780 const uint32_t ptmsi = 0xefe2b700;
1781 const uint32_t local_tlli = 0xefe2b700;
1782
1783 const uint32_t foreign_tlli1 = 0x8000dead;
1784 const uint32_t foreign_tlli2 = 0x8000beef;
1785
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001786 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
1787 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0xf8};
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001788
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001789 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001790 struct gbproxy_peer *peer;
1791 unsigned bss_nu = 0;
1792 unsigned sgsn_nu = 0;
1793
Alexander Couzens82182d02020-09-22 13:21:46 +02001794 uint16_t bss_nsei[1] = { 0x1000 };
1795
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001796 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
1797
Alexander Couzens82182d02020-09-22 13:21:46 +02001798 gbcfg.nsi = nsi;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001799 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001800 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001801 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001802 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1803 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001804
Alexander Couzens82182d02020-09-22 13:21:46 +02001805 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001806
1807 printf("=== %s ===\n", __func__);
1808 printf("--- Initialise SGSN ---\n\n");
1809
Alexander Couzens82182d02020-09-22 13:21:46 +02001810 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001811
1812 printf("--- Initialise BSS 1 ---\n\n");
1813
Alexander Couzens82182d02020-09-22 13:21:46 +02001814 setup_ns(nsi, bss_nsei[0]);
1815 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001816
1817 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
1818 OSMO_ASSERT(peer != NULL);
1819
Alexander Couzens82182d02020-09-22 13:21:46 +02001820 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001821
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001822 dump_global(stdout, 0);
1823 dump_peers(stdout, 0, 0, &gbcfg);
1824
1825 printf("--- Establish first LLC connection ---\n\n");
1826
Alexander Couzens82182d02020-09-22 13:21:46 +02001827 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001828 foreign_tlli1, &rai_unknown, cell_id,
1829 GPRS_SAPI_GMM, bss_nu++,
1830 dtap_attach_req, sizeof(dtap_attach_req));
1831
1832 dump_peers(stdout, 0, 0, &gbcfg);
1833
Alexander Couzens82182d02020-09-22 13:21:46 +02001834 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001835 foreign_tlli1, 0, NULL, 0,
1836 GPRS_SAPI_GMM, sgsn_nu++,
1837 dtap_identity_req, sizeof(dtap_identity_req));
1838
1839 dump_peers(stdout, 0, 0, &gbcfg);
1840
Alexander Couzens82182d02020-09-22 13:21:46 +02001841 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001842 foreign_tlli1, &rai_bss, cell_id,
1843 GPRS_SAPI_GMM, bss_nu++,
1844 dtap_identity_resp, sizeof(dtap_identity_resp));
1845
1846 dump_peers(stdout, 0, 0, &gbcfg);
1847
Alexander Couzens82182d02020-09-22 13:21:46 +02001848 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001849 foreign_tlli1, 1, imsi1, sizeof(imsi1),
1850 GPRS_SAPI_GMM, sgsn_nu++,
1851 dtap_attach_acc, sizeof(dtap_attach_acc));
1852
1853 dump_peers(stdout, 0, 0, &gbcfg);
1854
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001855 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
1856 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1857 OSMO_ASSERT(link_info);
1858 OSMO_ASSERT(link_info == link_info2);
1859 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1860 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
1861 OSMO_ASSERT(!link_info->tlli.bss_validated);
1862 OSMO_ASSERT(!link_info->tlli.net_validated);
1863 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001864
Alexander Couzens82182d02020-09-22 13:21:46 +02001865 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001866 local_tlli, &rai_bss, cell_id,
1867 GPRS_SAPI_GMM, bss_nu++,
1868 dtap_attach_complete, sizeof(dtap_attach_complete));
1869
1870 dump_peers(stdout, 0, 0, &gbcfg);
1871
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001872 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
1873 OSMO_ASSERT(link_info);
1874 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1875 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
1876 OSMO_ASSERT(link_info->tlli.bss_validated);
1877 OSMO_ASSERT(!link_info->tlli.net_validated);
1878 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001879
1880
Alexander Couzens82182d02020-09-22 13:21:46 +02001881 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001882 local_tlli, 1, imsi1, sizeof(imsi1),
1883 GPRS_SAPI_GMM, sgsn_nu++,
1884 dtap_gmm_information, sizeof(dtap_gmm_information));
1885
1886 dump_peers(stdout, 0, 0, &gbcfg);
1887
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001888 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
1889 OSMO_ASSERT(link_info);
1890 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
1891 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001892
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001893 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1894 OSMO_ASSERT(link_info == link_info2);
1895 OSMO_ASSERT(link_info->tlli.assigned == 0);
1896 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1897 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001898
1899 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
1900
Alexander Couzens82182d02020-09-22 13:21:46 +02001901 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001902 foreign_tlli2, &rai_unknown, cell_id,
1903 GPRS_SAPI_GMM, bss_nu++,
1904 dtap_attach_req, sizeof(dtap_attach_req));
1905
1906 dump_peers(stdout, 0, 0, &gbcfg);
1907
Alexander Couzens82182d02020-09-22 13:21:46 +02001908 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001909 foreign_tlli2, 0, NULL, 0,
1910 GPRS_SAPI_GMM, sgsn_nu++,
1911 dtap_identity_req, sizeof(dtap_identity_req));
1912
1913 dump_peers(stdout, 0, 0, &gbcfg);
1914
Alexander Couzens82182d02020-09-22 13:21:46 +02001915 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001916 foreign_tlli2, &rai_bss, cell_id,
1917 GPRS_SAPI_GMM, bss_nu++,
1918 dtap_identity2_resp, sizeof(dtap_identity2_resp));
1919
1920 dump_peers(stdout, 0, 0, &gbcfg);
1921
Alexander Couzens82182d02020-09-22 13:21:46 +02001922 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001923 foreign_tlli2, 1, imsi2, sizeof(imsi2),
1924 GPRS_SAPI_GMM, sgsn_nu++,
1925 dtap_attach_acc, sizeof(dtap_attach_acc));
1926
1927 dump_peers(stdout, 0, 0, &gbcfg);
1928
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001929 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
1930 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1931 OSMO_ASSERT(link_info);
1932 OSMO_ASSERT(link_info == link_info2);
1933 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1934 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
1935 OSMO_ASSERT(!link_info->tlli.bss_validated);
1936 OSMO_ASSERT(!link_info->tlli.net_validated);
1937 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001938
Alexander Couzens82182d02020-09-22 13:21:46 +02001939 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001940 local_tlli, &rai_bss, cell_id,
1941 GPRS_SAPI_GMM, bss_nu++,
1942 dtap_attach_complete, sizeof(dtap_attach_complete));
1943
1944 dump_peers(stdout, 0, 0, &gbcfg);
1945
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001946 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
1947 OSMO_ASSERT(link_info);
1948 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1949 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
1950 OSMO_ASSERT(link_info->tlli.bss_validated);
1951 OSMO_ASSERT(!link_info->tlli.net_validated);
1952 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001953
Alexander Couzens82182d02020-09-22 13:21:46 +02001954 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001955 local_tlli, 1, imsi2, sizeof(imsi2),
1956 GPRS_SAPI_GMM, sgsn_nu++,
1957 dtap_gmm_information, sizeof(dtap_gmm_information));
1958
1959 dump_peers(stdout, 0, 0, &gbcfg);
1960
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001961 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
1962 OSMO_ASSERT(link_info);
1963 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
1964 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001965
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001966 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1967 OSMO_ASSERT(link_info == link_info2);
1968 OSMO_ASSERT(link_info->tlli.assigned == 0);
1969 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1970 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001971
1972 dump_global(stdout, 0);
1973
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02001974 talloc_free(gbcfg.core_apn);
1975 gbcfg.core_apn = NULL;
1976
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001977 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001978 gprs_ns2_free(nsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001979 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02001980
1981 cleanup_test();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001982}
1983
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001984static void test_gbproxy_ptmsi_patching()
1985{
Alexander Couzens82182d02020-09-22 13:21:46 +02001986 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001987 struct gprs_ra_id rai_bss =
1988 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1989 struct gprs_ra_id rai_sgsn =
1990 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001991 struct gprs_ra_id rai_wrong_mcc_sgsn =
1992 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001993 struct gprs_ra_id rai_unknown =
1994 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1995 uint16_t cell_id = 0x1234;
1996
1997 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001998 const uint32_t sgsn_ptmsi2 = 0xe0987654;
1999 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002000 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002001 const uint32_t local_sgsn_tlli2 = 0xe0987654;
2002 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Daniel Willmann537d4802015-10-12 19:36:35 +02002003 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002004 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002005
Daniel Willmann537d4802015-10-12 19:36:35 +02002006 const uint32_t bss_ptmsi = 0xc0dead01;
2007 const uint32_t bss_ptmsi2 = 0xc0dead02;
2008 const uint32_t bss_ptmsi3 = 0xc0dead03;
2009 const uint32_t local_bss_tlli = 0xc0dead01;
2010 const uint32_t local_bss_tlli2 = 0xc0dead02;
2011 const uint32_t local_bss_tlli3 = 0xc0dead03;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002012 const uint32_t foreign_bss_tlli = 0x8000dead;
2013
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002014
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002015 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002016 struct gbproxy_link_info *link_info;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002017 struct gbproxy_peer *peer;
2018 unsigned bss_nu = 0;
2019 unsigned sgsn_nu = 0;
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002020 int old_ctr;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002021
Alexander Couzens82182d02020-09-22 13:21:46 +02002022 uint16_t bss_nsei[1] = { 0x1000 };
2023
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002024 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002025 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2026 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
2027 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2028 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
2029 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002030
Alexander Couzens82182d02020-09-22 13:21:46 +02002031 gbcfg.nsi = nsi;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002032 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002033 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002034 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002035 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2036 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002037
Alexander Couzens82182d02020-09-22 13:21:46 +02002038 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002039
2040 printf("=== %s ===\n", __func__);
2041 printf("--- Initialise SGSN ---\n\n");
2042
Alexander Couzens82182d02020-09-22 13:21:46 +02002043 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002044
2045 printf("--- Initialise BSS 1 ---\n\n");
2046
Alexander Couzens82182d02020-09-22 13:21:46 +02002047 setup_ns(nsi, bss_nsei[0]);
2048 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002049
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02002050 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002051 OSMO_ASSERT(peer != NULL);
2052
Alexander Couzens82182d02020-09-22 13:21:46 +02002053 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002054
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002055 dump_global(stdout, 0);
2056 dump_peers(stdout, 0, 0, &gbcfg);
2057
2058 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2059
Alexander Couzens82182d02020-09-22 13:21:46 +02002060 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002061 foreign_bss_tlli, &rai_unknown, cell_id,
2062 GPRS_SAPI_GMM, bss_nu++,
2063 dtap_attach_req, sizeof(dtap_attach_req));
2064
2065 dump_peers(stdout, 0, 0, &gbcfg);
2066
Alexander Couzens82182d02020-09-22 13:21:46 +02002067 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002068 random_sgsn_tlli, 0, NULL, 0,
2069 GPRS_SAPI_GMM, sgsn_nu++,
2070 dtap_identity_req, sizeof(dtap_identity_req));
2071
2072 dump_peers(stdout, 0, 0, &gbcfg);
2073
Alexander Couzens82182d02020-09-22 13:21:46 +02002074 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002075 foreign_bss_tlli, &rai_bss, cell_id,
2076 GPRS_SAPI_GMM, bss_nu++,
2077 dtap_identity_resp, sizeof(dtap_identity_resp));
2078
2079 dump_peers(stdout, 0, 0, &gbcfg);
2080
Alexander Couzens82182d02020-09-22 13:21:46 +02002081 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002082 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2083 GPRS_SAPI_GMM, sgsn_nu++,
2084 dtap_attach_acc, sizeof(dtap_attach_acc));
2085
2086 dump_peers(stdout, 0, 0, &gbcfg);
2087
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002088 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2089 OSMO_ASSERT(link_info);
2090 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2091 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2092 OSMO_ASSERT(!link_info->tlli.bss_validated);
2093 OSMO_ASSERT(!link_info->tlli.net_validated);
2094 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2095 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2096 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2097 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2098 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2099 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002100
Alexander Couzens82182d02020-09-22 13:21:46 +02002101 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002102 local_bss_tlli, &rai_bss, cell_id,
2103 GPRS_SAPI_GMM, bss_nu++,
2104 dtap_attach_complete, sizeof(dtap_attach_complete));
2105
2106 dump_peers(stdout, 0, 0, &gbcfg);
2107
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002108 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2109 OSMO_ASSERT(link_info);
2110 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2111 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2112 OSMO_ASSERT(link_info->tlli.bss_validated);
2113 OSMO_ASSERT(!link_info->tlli.net_validated);
2114 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2115 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2116 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2117 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002118
Alexander Couzens82182d02020-09-22 13:21:46 +02002119 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002120 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2121 GPRS_SAPI_GMM, sgsn_nu++,
2122 dtap_gmm_information, sizeof(dtap_gmm_information));
2123
2124 dump_peers(stdout, 0, 0, &gbcfg);
2125
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002126 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2127 OSMO_ASSERT(link_info);
2128 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2129 OSMO_ASSERT(link_info->tlli.assigned == 0);
2130 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2131 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002132
Alexander Couzens82182d02020-09-22 13:21:46 +02002133 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeck82add782014-09-05 18:08:12 +02002134 local_bss_tlli, &rai_bss, cell_id,
2135 GPRS_SAPI_GMM, bss_nu++,
2136 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2137
2138 dump_peers(stdout, 0, 0, &gbcfg);
2139
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002140 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002141 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002142 local_bss_tlli, &rai_bss, cell_id,
2143 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2144
Alexander Couzens82182d02020-09-22 13:21:46 +02002145 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002146 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2147 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2148
Alexander Couzens82182d02020-09-22 13:21:46 +02002149 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002150 local_bss_tlli, &rai_bss, cell_id,
2151 llc_ui_ll11_dns_query_ul,
2152 sizeof(llc_ui_ll11_dns_query_ul));
2153
Alexander Couzens82182d02020-09-22 13:21:46 +02002154 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002155 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2156 llc_ui_ll11_dns_resp_dl,
2157 sizeof(llc_ui_ll11_dns_resp_dl));
2158
2159 dump_peers(stdout, 0, 0, &gbcfg);
2160
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002161 /* Repeated RA Update Requests */
Alexander Couzens82182d02020-09-22 13:21:46 +02002162 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002163 local_bss_tlli, &rai_bss, 0x7080,
2164 GPRS_SAPI_GMM, bss_nu++,
2165 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2166
Alexander Couzens82182d02020-09-22 13:21:46 +02002167 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002168 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2169 GPRS_SAPI_GMM, sgsn_nu++,
2170 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2171
2172 dump_peers(stdout, 0, 0, &gbcfg);
2173
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002174 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2175 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2176 OSMO_ASSERT(link_info);
2177 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2178 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2179 OSMO_ASSERT(!link_info->tlli.bss_validated);
2180 OSMO_ASSERT(!link_info->tlli.net_validated);
2181 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2182 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2183 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2184 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2185 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2186 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002187
Alexander Couzens82182d02020-09-22 13:21:46 +02002188 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002189 local_bss_tlli2, &rai_bss, 0x7080,
2190 GPRS_SAPI_GMM, bss_nu++,
2191 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2192
Alexander Couzens82182d02020-09-22 13:21:46 +02002193 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002194 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2195 GPRS_SAPI_GMM, sgsn_nu++,
2196 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2197
2198 dump_peers(stdout, 0, 0, &gbcfg);
2199
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002200 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2201 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI) != NULL);
2202 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2203 OSMO_ASSERT(link_info);
2204 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2205 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2206 OSMO_ASSERT(!link_info->tlli.bss_validated);
2207 OSMO_ASSERT(!link_info->tlli.net_validated);
2208 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2209 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2210 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2211 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2212 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2213 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002214
Alexander Couzens82182d02020-09-22 13:21:46 +02002215 send_llc_ul_ui(nsi, "RA UPD COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002216 local_bss_tlli3, &rai_bss, 0x7080,
2217 GPRS_SAPI_GMM, bss_nu++,
2218 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2219
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002220 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002221
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002222 OSMO_ASSERT(link_info);
2223 OSMO_ASSERT(link_info->tlli.bss_validated);
2224 OSMO_ASSERT(!link_info->tlli.net_validated);
2225 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2226 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002227
Alexander Couzens82182d02020-09-22 13:21:46 +02002228 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002229 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2230 GPRS_SAPI_GMM, sgsn_nu++,
2231 dtap_gmm_information, sizeof(dtap_gmm_information));
2232
2233 dump_peers(stdout, 0, 0, &gbcfg);
2234
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002235 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2236 OSMO_ASSERT(link_info);
2237 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2238 OSMO_ASSERT(link_info->tlli.assigned == 0);
2239 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2240 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002241
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002242 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02002243 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002244 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002245
2246 dump_peers(stdout, 0, 0, &gbcfg);
2247
Alexander Couzens82182d02020-09-22 13:21:46 +02002248 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002249
2250 dump_peers(stdout, 0, 0, &gbcfg);
2251
Alexander Couzens82182d02020-09-22 13:21:46 +02002252 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002253
2254 dump_peers(stdout, 0, 0, &gbcfg);
2255
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002256 old_ctr = peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current;
2257
Alexander Couzens82182d02020-09-22 13:21:46 +02002258 send_bssgp_paging(nsi, SGSN_NSEI, imsi, sizeof(imsi), &rai_bss, sgsn_ptmsi3);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002259
2260 dump_peers(stdout, 0, 0, &gbcfg);
2261
2262 OSMO_ASSERT(old_ctr + 1 ==
2263 peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current);
2264
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002265 /* Bad case: Invalid BVCI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002266 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002267 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002268 dump_global(stdout, 0);
2269
2270 /* Bad case: Invalid RAI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002271 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002272
2273 dump_global(stdout, 0);
2274
2275 /* Bad case: Invalid MCC (LAC ok) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002276 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002277 &rai_wrong_mcc_sgsn);
2278
2279 dump_global(stdout, 0);
2280
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002281 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002282 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002283 unknown_sgsn_tlli, 1, NULL, 0,
2284 GPRS_SAPI_GMM, 2,
2285 dtap_gmm_information, sizeof(dtap_gmm_information));
2286
2287 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002288 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002289 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2290 GPRS_SAPI_GMM, 3,
2291 dtap_gmm_information, sizeof(dtap_gmm_information));
2292
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002293 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002294 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002295 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002296 GPRS_SAPI_GMM, bss_nu++,
2297 dtap_detach_req, sizeof(dtap_detach_req));
2298
2299 dump_peers(stdout, 0, 0, &gbcfg);
2300
Alexander Couzens82182d02020-09-22 13:21:46 +02002301 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002302 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002303 GPRS_SAPI_GMM, sgsn_nu++,
2304 dtap_detach_acc, sizeof(dtap_detach_acc));
2305
2306 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002307
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002308 dump_global(stdout, 0);
2309
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002310 talloc_free(gbcfg.core_apn);
2311 gbcfg.core_apn = NULL;
2312
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002313 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002314 gprs_ns2_free(nsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002315 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002316
2317 cleanup_test();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002318}
2319
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002320static void test_gbproxy_ptmsi_patching_bad_cases()
2321{
Alexander Couzens82182d02020-09-22 13:21:46 +02002322 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002323 struct gprs_ra_id rai_bss =
2324 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2325 struct gprs_ra_id rai_unknown =
2326 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2327 uint16_t cell_id = 0x1234;
2328
2329 const uint32_t sgsn_ptmsi = 0xefe2b700;
2330 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002331 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002332
Daniel Willmann537d4802015-10-12 19:36:35 +02002333 const uint32_t bss_ptmsi = 0xc0dead01;
2334 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002335 const uint32_t foreign_bss_tlli = 0x8000dead;
2336
2337
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002338 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002339 struct gbproxy_link_info *link_info;
2340 struct gbproxy_peer *peer;
2341 unsigned bss_nu = 0;
2342 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02002343 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002344
2345 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2346 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2347
Alexander Couzens82182d02020-09-22 13:21:46 +02002348 gbcfg.nsi = nsi;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002349 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002350 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002351 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002352 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2353 gbcfg.patch_ptmsi = 1;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002354
Alexander Couzens82182d02020-09-22 13:21:46 +02002355 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002356
2357 printf("=== %s ===\n", __func__);
2358 printf("--- Initialise SGSN ---\n\n");
2359
Alexander Couzens82182d02020-09-22 13:21:46 +02002360 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002361
2362 printf("--- Initialise BSS 1 ---\n\n");
2363
Alexander Couzens82182d02020-09-22 13:21:46 +02002364 setup_ns(nsi, bss_nsei[0]);
2365 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002366
2367 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2368 OSMO_ASSERT(peer != NULL);
2369
Alexander Couzens82182d02020-09-22 13:21:46 +02002370 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002371
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002372 dump_global(stdout, 0);
2373 dump_peers(stdout, 0, 0, &gbcfg);
2374
2375 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2376
Alexander Couzens82182d02020-09-22 13:21:46 +02002377 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002378 foreign_bss_tlli, &rai_unknown, cell_id,
2379 GPRS_SAPI_GMM, bss_nu++,
2380 dtap_attach_req, sizeof(dtap_attach_req));
2381
2382 dump_peers(stdout, 0, 0, &gbcfg);
2383
Alexander Couzens82182d02020-09-22 13:21:46 +02002384 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002385 random_sgsn_tlli, 0, NULL, 0,
2386 GPRS_SAPI_GMM, sgsn_nu++,
2387 dtap_identity_req, sizeof(dtap_identity_req));
2388
2389 dump_peers(stdout, 0, 0, &gbcfg);
2390
Alexander Couzens82182d02020-09-22 13:21:46 +02002391 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002392 foreign_bss_tlli, &rai_bss, cell_id,
2393 GPRS_SAPI_GMM, bss_nu++,
2394 dtap_identity_resp, sizeof(dtap_identity_resp));
2395
2396 dump_peers(stdout, 0, 0, &gbcfg);
2397
Alexander Couzens82182d02020-09-22 13:21:46 +02002398 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002399 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2400 GPRS_SAPI_GMM, sgsn_nu++,
2401 dtap_attach_acc, sizeof(dtap_attach_acc));
2402
2403 dump_peers(stdout, 0, 0, &gbcfg);
2404
2405 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2406 OSMO_ASSERT(link_info);
2407 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2408 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2409 OSMO_ASSERT(!link_info->tlli.bss_validated);
2410 OSMO_ASSERT(!link_info->tlli.net_validated);
2411 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2412 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2413 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2414 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2415 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2416 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2417
Alexander Couzens82182d02020-09-22 13:21:46 +02002418 send_llc_dl_ui(nsi, "ATTACH ACCEPT (duplicated)", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002419 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2420 GPRS_SAPI_GMM, sgsn_nu++,
2421 dtap_attach_acc, sizeof(dtap_attach_acc));
2422
2423 dump_peers(stdout, 0, 0, &gbcfg);
2424
2425 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2426 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002427 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002428 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2429 OSMO_ASSERT(!link_info->tlli.bss_validated);
2430 OSMO_ASSERT(!link_info->tlli.net_validated);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002431 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002432 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2433 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2434 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2435 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2436 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2437
Alexander Couzens82182d02020-09-22 13:21:46 +02002438 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002439 local_bss_tlli, &rai_bss, cell_id,
2440 GPRS_SAPI_GMM, bss_nu++,
2441 dtap_attach_complete, sizeof(dtap_attach_complete));
2442
2443 dump_peers(stdout, 0, 0, &gbcfg);
2444
2445 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2446 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002447 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002448 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002449 OSMO_ASSERT(link_info->tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002450 OSMO_ASSERT(!link_info->tlli.net_validated);
2451 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2452 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002453 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002454 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2455
Alexander Couzens82182d02020-09-22 13:21:46 +02002456 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002457 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2458 GPRS_SAPI_GMM, sgsn_nu++,
2459 dtap_gmm_information, sizeof(dtap_gmm_information));
2460
2461 dump_peers(stdout, 0, 0, &gbcfg);
2462
2463 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2464 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002465 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2466 OSMO_ASSERT(link_info->tlli.assigned == 0);
2467 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2468 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002469
2470 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002471 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002472 local_bss_tlli, &rai_bss, cell_id,
2473 GPRS_SAPI_GMM, bss_nu++,
2474 dtap_detach_req, sizeof(dtap_detach_req));
2475
2476 dump_peers(stdout, 0, 0, &gbcfg);
2477
Alexander Couzens82182d02020-09-22 13:21:46 +02002478 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002479 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2480 GPRS_SAPI_GMM, sgsn_nu++,
2481 dtap_detach_acc, sizeof(dtap_detach_acc));
2482
2483 dump_peers(stdout, 0, 0, &gbcfg);
2484
2485 dump_global(stdout, 0);
2486
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002487 talloc_free(gbcfg.core_apn);
2488 gbcfg.core_apn = NULL;
2489
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002490 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002491 gprs_ns2_free(nsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002492 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002493
2494 cleanup_test();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002495}
2496
2497
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002498static void test_gbproxy_imsi_acquisition()
2499{
Alexander Couzens82182d02020-09-22 13:21:46 +02002500 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002501 struct gprs_ra_id rai_bss =
2502 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2503 struct gprs_ra_id rai_sgsn =
2504 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2505 struct gprs_ra_id rai_wrong_mcc_sgsn =
2506 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2507 struct gprs_ra_id rai_unknown =
2508 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2509 uint16_t cell_id = 0x1234;
2510
2511 const uint32_t sgsn_ptmsi = 0xefe2b700;
2512 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002513 const uint32_t random_sgsn_tlli = 0x78dead00;
2514 const uint32_t random_sgsn_tlli2 = 0x78dead02;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002515
Daniel Willmann537d4802015-10-12 19:36:35 +02002516 const uint32_t bss_ptmsi = 0xc0dead01;
2517 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002518 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002519 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002520
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002521 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002522 struct gbproxy_link_info *link_info;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002523 struct gbproxy_peer *peer;
2524 unsigned bss_nu = 0;
2525 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02002526 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002527
2528 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2529
Alexander Couzens82182d02020-09-22 13:21:46 +02002530 gbcfg.nsi = nsi;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002531 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002532 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002533 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002534 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2535 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002536 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002537
Alexander Couzens82182d02020-09-22 13:21:46 +02002538 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002539
2540 printf("=== %s ===\n", __func__);
2541 printf("--- Initialise SGSN ---\n\n");
2542
Alexander Couzens82182d02020-09-22 13:21:46 +02002543 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002544
2545 printf("--- Initialise BSS 1 ---\n\n");
2546
Alexander Couzens82182d02020-09-22 13:21:46 +02002547 setup_ns(nsi, bss_nsei[0]);
2548 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002549
2550 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2551 OSMO_ASSERT(peer != NULL);
2552
Alexander Couzens82182d02020-09-22 13:21:46 +02002553 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002554
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002555 dump_global(stdout, 0);
2556 dump_peers(stdout, 0, 0, &gbcfg);
2557
2558 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2559
Alexander Couzens82182d02020-09-22 13:21:46 +02002560 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002561 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002562 GPRS_SAPI_GMM, bss_nu++,
2563 dtap_attach_req, sizeof(dtap_attach_req));
2564
2565 dump_peers(stdout, 0, 0, &gbcfg);
2566
Alexander Couzens82182d02020-09-22 13:21:46 +02002567 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002568 foreign_bss_tlli, &rai_bss, cell_id,
2569 GPRS_SAPI_GMM, bss_nu++,
2570 dtap_identity_resp, sizeof(dtap_identity_resp));
2571
2572 dump_peers(stdout, 0, 0, &gbcfg);
2573
Alexander Couzens82182d02020-09-22 13:21:46 +02002574 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002575 random_sgsn_tlli, 0, NULL, 0,
2576 GPRS_SAPI_GMM, sgsn_nu++,
2577 dtap_identity_req, sizeof(dtap_identity_req));
2578
2579 dump_peers(stdout, 0, 0, &gbcfg);
2580
Alexander Couzens82182d02020-09-22 13:21:46 +02002581 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002582 foreign_bss_tlli, &rai_bss, cell_id,
2583 GPRS_SAPI_GMM, bss_nu++,
2584 dtap_identity_resp, sizeof(dtap_identity_resp));
2585
2586 dump_peers(stdout, 0, 0, &gbcfg);
2587
Alexander Couzens82182d02020-09-22 13:21:46 +02002588 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002589 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2590 GPRS_SAPI_GMM, sgsn_nu++,
2591 dtap_attach_acc, sizeof(dtap_attach_acc));
2592
2593 dump_peers(stdout, 0, 0, &gbcfg);
2594
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002595 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2596 OSMO_ASSERT(link_info);
2597 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2598 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2599 OSMO_ASSERT(!link_info->tlli.bss_validated);
2600 OSMO_ASSERT(!link_info->tlli.net_validated);
2601 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2602 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2603 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2604 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2605 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2606 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002607
Alexander Couzens82182d02020-09-22 13:21:46 +02002608 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002609 local_bss_tlli, &rai_bss, cell_id,
2610 GPRS_SAPI_GMM, bss_nu++,
2611 dtap_attach_complete, sizeof(dtap_attach_complete));
2612
2613 dump_peers(stdout, 0, 0, &gbcfg);
2614
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002615 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2616 OSMO_ASSERT(link_info);
2617 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2618 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2619 OSMO_ASSERT(link_info->tlli.bss_validated);
2620 OSMO_ASSERT(!link_info->tlli.net_validated);
2621 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2622 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2623 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2624 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002625
Alexander Couzens82182d02020-09-22 13:21:46 +02002626 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002627 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2628 GPRS_SAPI_GMM, sgsn_nu++,
2629 dtap_gmm_information, sizeof(dtap_gmm_information));
2630
2631 dump_peers(stdout, 0, 0, &gbcfg);
2632
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002633 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2634 OSMO_ASSERT(link_info);
2635 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2636 OSMO_ASSERT(link_info->tlli.assigned == 0);
2637 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2638 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002639
2640 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002641 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002642 local_bss_tlli, &rai_bss, cell_id,
2643 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2644
Alexander Couzens82182d02020-09-22 13:21:46 +02002645 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002646 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2647 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2648
Alexander Couzens82182d02020-09-22 13:21:46 +02002649 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002650 local_bss_tlli, &rai_bss, cell_id,
2651 llc_ui_ll11_dns_query_ul,
2652 sizeof(llc_ui_ll11_dns_query_ul));
2653
Alexander Couzens82182d02020-09-22 13:21:46 +02002654 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002655 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2656 llc_ui_ll11_dns_resp_dl,
2657 sizeof(llc_ui_ll11_dns_resp_dl));
2658
2659 dump_peers(stdout, 0, 0, &gbcfg);
2660
2661 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02002662 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002663 local_bss_tlli, 1, 12);
2664
2665 dump_peers(stdout, 0, 0, &gbcfg);
2666
Alexander Couzens82182d02020-09-22 13:21:46 +02002667 send_bssgp_llc_discarded(nsi, SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002668 local_sgsn_tlli, 1, 12);
2669
2670 dump_peers(stdout, 0, 0, &gbcfg);
2671
Alexander Couzens82182d02020-09-22 13:21:46 +02002672 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli, &rai_bss);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002673
2674 dump_peers(stdout, 0, 0, &gbcfg);
2675
Alexander Couzens82182d02020-09-22 13:21:46 +02002676 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_sgsn);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002677
2678 dump_peers(stdout, 0, 0, &gbcfg);
2679
2680 /* Bad case: Invalid BVCI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002681 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0xeee1,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002682 local_bss_tlli, 1, 12);
2683 dump_global(stdout, 0);
2684
2685 /* Bad case: Invalid RAI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002686 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_unknown);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002687
2688 dump_global(stdout, 0);
2689
2690 /* Bad case: Invalid MCC (LAC ok) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002691 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002692 &rai_wrong_mcc_sgsn);
2693
2694 dump_global(stdout, 0);
2695
2696 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002697 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002698 local_bss_tlli, &rai_bss, cell_id,
2699 GPRS_SAPI_GMM, bss_nu++,
2700 dtap_detach_req, sizeof(dtap_detach_req));
2701
2702 dump_peers(stdout, 0, 0, &gbcfg);
2703
Alexander Couzens82182d02020-09-22 13:21:46 +02002704 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002705 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2706 GPRS_SAPI_GMM, sgsn_nu++,
2707 dtap_detach_acc, sizeof(dtap_detach_acc));
2708
2709 dump_peers(stdout, 0, 0, &gbcfg);
2710
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002711 /* RA Update request */
2712
Alexander Couzens82182d02020-09-22 13:21:46 +02002713 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002714 foreign_bss_tlli, &rai_unknown, 0x7080,
2715 GPRS_SAPI_GMM, bss_nu++,
2716 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2717
Alexander Couzens82182d02020-09-22 13:21:46 +02002718 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002719 foreign_bss_tlli, &rai_bss, cell_id,
2720 GPRS_SAPI_GMM, bss_nu++,
2721 dtap_identity_resp, sizeof(dtap_identity_resp));
2722
2723 dump_peers(stdout, 0, 0, &gbcfg);
2724
Alexander Couzens82182d02020-09-22 13:21:46 +02002725 send_llc_dl_ui(nsi, "RA UDP ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002726 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2727 GPRS_SAPI_GMM, sgsn_nu++,
2728 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2729
2730 dump_peers(stdout, 0, 0, &gbcfg);
2731
2732 /* Detach */
2733
Alexander Couzens82182d02020-09-22 13:21:46 +02002734 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002735 local_bss_tlli, &rai_bss, cell_id,
2736 GPRS_SAPI_GMM, bss_nu++,
2737 dtap_detach_req, sizeof(dtap_detach_req));
2738
2739 dump_peers(stdout, 0, 0, &gbcfg);
2740
Alexander Couzens82182d02020-09-22 13:21:46 +02002741 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002742 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2743 GPRS_SAPI_GMM, sgsn_nu++,
2744 dtap_detach_acc, sizeof(dtap_detach_acc));
2745
2746 dump_peers(stdout, 0, 0, &gbcfg);
2747
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002748 /* Special case: Repeated Attach Requests */
2749
Alexander Couzens82182d02020-09-22 13:21:46 +02002750 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002751 foreign_bss_tlli, &rai_unknown, cell_id,
2752 GPRS_SAPI_GMM, bss_nu++,
2753 dtap_attach_req, sizeof(dtap_attach_req));
2754
Alexander Couzens82182d02020-09-22 13:21:46 +02002755 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002756 foreign_bss_tlli, &rai_unknown, cell_id,
2757 GPRS_SAPI_GMM, bss_nu++,
2758 dtap_attach_req, sizeof(dtap_attach_req));
2759
Alexander Couzens82182d02020-09-22 13:21:46 +02002760 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002761 foreign_bss_tlli, &rai_bss, cell_id,
2762 GPRS_SAPI_GMM, bss_nu++,
2763 dtap_detach_req, sizeof(dtap_detach_req));
2764
2765 dump_peers(stdout, 0, 0, &gbcfg);
2766
2767 /* Special case: Detach from an unknown TLLI */
2768
Alexander Couzens82182d02020-09-22 13:21:46 +02002769 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002770 other_bss_tlli, &rai_bss, cell_id,
2771 GPRS_SAPI_GMM, bss_nu++,
2772 dtap_detach_req, sizeof(dtap_detach_req));
2773
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002774 dump_peers(stdout, 0, 0, &gbcfg);
2775
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002776 /* Special case: Repeated RA Update Requests */
2777
Alexander Couzens82182d02020-09-22 13:21:46 +02002778 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002779 foreign_bss_tlli, &rai_unknown, 0x7080,
2780 GPRS_SAPI_GMM, bss_nu++,
2781 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2782
Alexander Couzens82182d02020-09-22 13:21:46 +02002783 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002784 foreign_bss_tlli, &rai_unknown, 0x7080,
2785 GPRS_SAPI_GMM, bss_nu++,
2786 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2787
Alexander Couzens82182d02020-09-22 13:21:46 +02002788 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002789 foreign_bss_tlli, &rai_bss, cell_id,
2790 GPRS_SAPI_GMM, bss_nu++,
2791 dtap_detach_req, sizeof(dtap_detach_req));
2792
2793 dump_peers(stdout, 0, 0, &gbcfg);
2794
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002795 dump_global(stdout, 0);
2796
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002797 talloc_free(gbcfg.core_apn);
2798 gbcfg.core_apn = NULL;
2799
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002800 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002801 gprs_ns2_free(nsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002802 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002803
2804 cleanup_test();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002805}
2806
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002807static void test_gbproxy_secondary_sgsn()
2808{
Alexander Couzens82182d02020-09-22 13:21:46 +02002809 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002810 struct gprs_ra_id rai_bss =
2811 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2812 struct gprs_ra_id rai_sgsn =
2813 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2814 struct gprs_ra_id rai_unknown =
2815 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2816 uint16_t cell_id = 0x1234;
2817
2818 const uint32_t sgsn_ptmsi = 0xefe2b700;
2819 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002820 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002821
Daniel Willmann537d4802015-10-12 19:36:35 +02002822 const uint32_t bss_ptmsi = 0xc0dead01;
2823 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002824 const uint32_t foreign_bss_tlli = 0x8000dead;
2825
2826 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2827 const uint32_t local_sgsn_tlli2 = 0xe0987654;
Daniel Willmann537d4802015-10-12 19:36:35 +02002828 const uint32_t random_sgsn_tlli2 = 0x78dead02;
2829 const uint32_t bss_ptmsi2 = 0xc0dead03;
2830 const uint32_t local_bss_tlli2 = 0xc0dead03;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002831 const uint32_t foreign_bss_tlli2 = 0x8000beef;
2832
Daniel Willmann537d4802015-10-12 19:36:35 +02002833 const uint32_t random_sgsn_tlli3 = 0x78dead04;
2834 const uint32_t bss_ptmsi3 = 0xc0dead05;
2835 const uint32_t local_bss_tlli3 = 0xc0dead05;
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002836 const uint32_t foreign_bss_tlli3 = 0x8000feed;
2837
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002838 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
2839 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0xf8};
2840 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002841 struct gbproxy_link_info *link_info;
2842 struct gbproxy_link_info *other_info;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002843 struct gbproxy_peer *peer;
2844 unsigned bss_nu = 0;
2845 unsigned sgsn_nu = 0;
2846
2847 const char *err_msg = NULL;
2848 const char *filter_re = "999999";
Alexander Couzens82182d02020-09-22 13:21:46 +02002849 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002850
2851 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2852 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2853
Alexander Couzens82182d02020-09-22 13:21:46 +02002854 gbcfg.nsi = nsi;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002855 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002856 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002857 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002858 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2859 gbcfg.patch_ptmsi = 1;
2860 gbcfg.acquire_imsi = 1;
Daniel Willmann537d4802015-10-12 19:36:35 +02002861
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002862 gbcfg.route_to_sgsn2 = 1;
2863 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
2864
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02002865 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING],
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02002866 filter_re, &err_msg) != 0) {
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002867 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
2868 err_msg);
2869 OSMO_ASSERT(err_msg == NULL);
2870 }
2871
Alexander Couzens82182d02020-09-22 13:21:46 +02002872 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002873
2874 printf("=== %s ===\n", __func__);
2875 printf("--- Initialise SGSN 1 ---\n\n");
2876
Alexander Couzens82182d02020-09-22 13:21:46 +02002877 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002878
2879 printf("--- Initialise SGSN 2 ---\n\n");
2880
Alexander Couzens82182d02020-09-22 13:21:46 +02002881 connect_sgsn(nsi, SGSN2_NSEI);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002882
2883 printf("--- Initialise BSS 1 ---\n\n");
2884
Alexander Couzens82182d02020-09-22 13:21:46 +02002885 setup_ns(nsi, bss_nsei[0]);
2886 setup_bssgp(nsi, bss_nsei[0], 0x0);
2887 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x0);
2888 setup_bssgp(nsi, bss_nsei[0], 0x1002);
2889 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
2890 send_bssgp_reset_ack(nsi, SGSN2_NSEI, 0x1002);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002891
2892 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2893 OSMO_ASSERT(peer != NULL);
2894
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002895 dump_global(stdout, 0);
2896 dump_peers(stdout, 0, 0, &gbcfg);
2897
2898 printf("--- Flow control ---\n\n");
2899
Alexander Couzens82182d02020-09-22 13:21:46 +02002900 send_bssgp_flow_control_bvc(nsi, bss_nsei[0], 0x1002, 1);
2901 send_bssgp_flow_control_bvc_ack(nsi, SGSN_NSEI, 0x1002, 1);
2902 send_bssgp_flow_control_bvc_ack(nsi, SGSN2_NSEI, 0x1002, 1);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002903
2904 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
2905
Alexander Couzens82182d02020-09-22 13:21:46 +02002906 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002907 foreign_bss_tlli, &rai_unknown, cell_id,
2908 GPRS_SAPI_GMM, bss_nu++,
2909 dtap_attach_req, sizeof(dtap_attach_req));
2910
2911 dump_peers(stdout, 0, 0, &gbcfg);
2912
Alexander Couzens82182d02020-09-22 13:21:46 +02002913 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002914 foreign_bss_tlli, &rai_bss, cell_id,
2915 GPRS_SAPI_GMM, bss_nu++,
2916 dtap_identity_resp, sizeof(dtap_identity_resp));
2917
2918 dump_peers(stdout, 0, 0, &gbcfg);
2919
Alexander Couzens82182d02020-09-22 13:21:46 +02002920 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002921 random_sgsn_tlli, 0, NULL, 0,
2922 GPRS_SAPI_GMM, sgsn_nu++,
2923 dtap_identity_req, sizeof(dtap_identity_req));
2924
2925 dump_peers(stdout, 0, 0, &gbcfg);
2926
Alexander Couzens82182d02020-09-22 13:21:46 +02002927 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002928 foreign_bss_tlli, &rai_bss, cell_id,
2929 GPRS_SAPI_GMM, bss_nu++,
2930 dtap_identity_resp, sizeof(dtap_identity_resp));
2931
2932 dump_peers(stdout, 0, 0, &gbcfg);
2933
Alexander Couzens82182d02020-09-22 13:21:46 +02002934 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002935 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2936 GPRS_SAPI_GMM, sgsn_nu++,
2937 dtap_attach_acc, sizeof(dtap_attach_acc));
2938
2939 dump_peers(stdout, 0, 0, &gbcfg);
2940
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002941 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2942 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2943 OSMO_ASSERT(link_info);
2944 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2945 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2946 OSMO_ASSERT(!link_info->tlli.bss_validated);
2947 OSMO_ASSERT(!link_info->tlli.net_validated);
2948 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2949 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2950 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2951 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2952 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2953 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002954
Alexander Couzens82182d02020-09-22 13:21:46 +02002955 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002956 local_bss_tlli, &rai_bss, cell_id,
2957 GPRS_SAPI_GMM, bss_nu++,
2958 dtap_attach_complete, sizeof(dtap_attach_complete));
2959
2960 dump_peers(stdout, 0, 0, &gbcfg);
2961
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002962 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2963 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2964 OSMO_ASSERT(link_info);
2965 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2966 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2967 OSMO_ASSERT(link_info->tlli.bss_validated);
2968 OSMO_ASSERT(!link_info->tlli.net_validated);
2969 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2970 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2971 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2972 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002973
Alexander Couzens82182d02020-09-22 13:21:46 +02002974 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002975 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2976 GPRS_SAPI_GMM, sgsn_nu++,
2977 dtap_gmm_information, sizeof(dtap_gmm_information));
2978
2979 dump_peers(stdout, 0, 0, &gbcfg);
2980
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002981 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2982 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2983 OSMO_ASSERT(link_info);
2984 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2985 OSMO_ASSERT(link_info->tlli.assigned == 0);
2986 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2987 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002988
2989 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002990 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002991 local_bss_tlli, &rai_bss, cell_id,
2992 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2993
Alexander Couzens82182d02020-09-22 13:21:46 +02002994 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002995 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2996 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2997
Alexander Couzens82182d02020-09-22 13:21:46 +02002998 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002999 local_bss_tlli, &rai_bss, cell_id,
3000 llc_ui_ll11_dns_query_ul,
3001 sizeof(llc_ui_ll11_dns_query_ul));
3002
Alexander Couzens82182d02020-09-22 13:21:46 +02003003 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003004 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3005 llc_ui_ll11_dns_resp_dl,
3006 sizeof(llc_ui_ll11_dns_resp_dl));
3007
3008 dump_peers(stdout, 0, 0, &gbcfg);
3009
3010 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02003011 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003012 local_bss_tlli, 1, 12);
3013
3014 dump_peers(stdout, 0, 0, &gbcfg);
3015
Alexander Couzens82182d02020-09-22 13:21:46 +02003016 send_bssgp_llc_discarded(nsi, SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003017 local_sgsn_tlli, 1, 12);
3018
3019 dump_peers(stdout, 0, 0, &gbcfg);
3020
Alexander Couzens82182d02020-09-22 13:21:46 +02003021 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli, &rai_bss);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003022
3023 dump_peers(stdout, 0, 0, &gbcfg);
3024
Alexander Couzens82182d02020-09-22 13:21:46 +02003025 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_sgsn);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003026
3027 dump_peers(stdout, 0, 0, &gbcfg);
3028
3029 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
3030
Alexander Couzens82182d02020-09-22 13:21:46 +02003031 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003032 foreign_bss_tlli2, &rai_unknown, cell_id,
3033 GPRS_SAPI_GMM, bss_nu++,
3034 dtap_attach_req, sizeof(dtap_attach_req));
3035
3036 dump_peers(stdout, 0, 0, &gbcfg);
3037
Alexander Couzens82182d02020-09-22 13:21:46 +02003038 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003039 foreign_bss_tlli2, &rai_bss, cell_id,
3040 GPRS_SAPI_GMM, bss_nu++,
3041 dtap_identity2_resp, sizeof(dtap_identity2_resp));
3042
3043 dump_peers(stdout, 0, 0, &gbcfg);
3044
Alexander Couzens82182d02020-09-22 13:21:46 +02003045 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003046 random_sgsn_tlli2, 0, NULL, 0,
3047 GPRS_SAPI_GMM, sgsn_nu++,
3048 dtap_identity_req, sizeof(dtap_identity_req));
3049
3050 dump_peers(stdout, 0, 0, &gbcfg);
3051
Alexander Couzens82182d02020-09-22 13:21:46 +02003052 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003053 foreign_bss_tlli2, &rai_bss, cell_id,
3054 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02003055 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003056
3057 dump_peers(stdout, 0, 0, &gbcfg);
3058
Alexander Couzens82182d02020-09-22 13:21:46 +02003059 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003060 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3061 GPRS_SAPI_GMM, sgsn_nu++,
3062 dtap_attach_acc2, sizeof(dtap_attach_acc2));
3063
3064 dump_peers(stdout, 0, 0, &gbcfg);
3065
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003066 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
3067 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
3068 OSMO_ASSERT(link_info);
3069 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3070 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3071 OSMO_ASSERT(!link_info->tlli.bss_validated);
3072 OSMO_ASSERT(!link_info->tlli.net_validated);
3073 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
3074 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3075 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3076 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3077 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3078 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003079
Alexander Couzens82182d02020-09-22 13:21:46 +02003080 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003081 local_bss_tlli2, &rai_bss, cell_id,
3082 GPRS_SAPI_GMM, bss_nu++,
3083 dtap_attach_complete, sizeof(dtap_attach_complete));
3084
3085 dump_peers(stdout, 0, 0, &gbcfg);
3086
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003087 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3088 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3089 OSMO_ASSERT(link_info);
3090 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3091 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3092 OSMO_ASSERT(link_info->tlli.bss_validated);
3093 OSMO_ASSERT(!link_info->tlli.net_validated);
3094 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3095 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3096 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3097 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003098
Alexander Couzens82182d02020-09-22 13:21:46 +02003099 send_llc_dl_ui(nsi, "GMM INFO", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003100 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3101 GPRS_SAPI_GMM, sgsn_nu++,
3102 dtap_gmm_information, sizeof(dtap_gmm_information));
3103
3104 dump_peers(stdout, 0, 0, &gbcfg);
3105
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003106 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3107 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3108 OSMO_ASSERT(link_info);
3109 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
3110 OSMO_ASSERT(link_info->tlli.assigned == 0);
3111 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
3112 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003113
3114 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02003115 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003116 local_bss_tlli2, &rai_bss, cell_id,
3117 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3118
Alexander Couzens82182d02020-09-22 13:21:46 +02003119 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003120 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3121 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3122
Alexander Couzens82182d02020-09-22 13:21:46 +02003123 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003124 local_bss_tlli2, &rai_bss, cell_id,
3125 llc_ui_ll11_dns_query_ul,
3126 sizeof(llc_ui_ll11_dns_query_ul));
3127
Alexander Couzens82182d02020-09-22 13:21:46 +02003128 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003129 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3130 llc_ui_ll11_dns_resp_dl,
3131 sizeof(llc_ui_ll11_dns_resp_dl));
3132
3133 dump_peers(stdout, 0, 0, &gbcfg);
3134
3135 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02003136 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003137 local_bss_tlli2, 1, 12);
3138
3139 dump_peers(stdout, 0, 0, &gbcfg);
3140
Alexander Couzens82182d02020-09-22 13:21:46 +02003141 send_bssgp_llc_discarded(nsi, SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003142 local_sgsn_tlli2, 1, 12);
3143
3144 dump_peers(stdout, 0, 0, &gbcfg);
3145
Alexander Couzens82182d02020-09-22 13:21:46 +02003146 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli2, &rai_bss);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003147
3148 dump_peers(stdout, 0, 0, &gbcfg);
3149
Alexander Couzens82182d02020-09-22 13:21:46 +02003150 send_bssgp_suspend_ack(nsi, SGSN2_NSEI, local_sgsn_tlli2, &rai_sgsn);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003151
3152 dump_peers(stdout, 0, 0, &gbcfg);
3153
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003154 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
3155
Alexander Couzens82182d02020-09-22 13:21:46 +02003156 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003157 foreign_bss_tlli3, &rai_unknown, cell_id,
3158 GPRS_SAPI_GMM, bss_nu++,
3159 dtap_attach_req, sizeof(dtap_attach_req));
3160
3161 dump_peers(stdout, 0, 0, &gbcfg);
3162
Alexander Couzens82182d02020-09-22 13:21:46 +02003163 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003164 foreign_bss_tlli3, &rai_bss, cell_id,
3165 GPRS_SAPI_GMM, bss_nu++,
3166 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3167
3168 dump_peers(stdout, 0, 0, &gbcfg);
3169
Alexander Couzens82182d02020-09-22 13:21:46 +02003170 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003171 random_sgsn_tlli3, 0, NULL, 0,
3172 GPRS_SAPI_GMM, sgsn_nu++,
3173 dtap_identity_req, sizeof(dtap_identity_req));
3174
3175 dump_peers(stdout, 0, 0, &gbcfg);
3176
Alexander Couzens82182d02020-09-22 13:21:46 +02003177 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003178 foreign_bss_tlli3, &rai_bss, cell_id,
3179 GPRS_SAPI_GMM, bss_nu++,
3180 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3181
3182 dump_peers(stdout, 0, 0, &gbcfg);
3183
Alexander Couzens82182d02020-09-22 13:21:46 +02003184 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003185 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
3186 GPRS_SAPI_GMM, sgsn_nu++,
3187 dtap_attach_acc, sizeof(dtap_attach_acc));
3188
3189 dump_peers(stdout, 0, 0, &gbcfg);
3190
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003191 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
3192 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
3193 OSMO_ASSERT(link_info);
3194 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3195 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3196 OSMO_ASSERT(!link_info->tlli.bss_validated);
3197 OSMO_ASSERT(!link_info->tlli.net_validated);
3198 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
3199 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3200 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3201 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3202 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3203 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003204
Alexander Couzens82182d02020-09-22 13:21:46 +02003205 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003206 local_bss_tlli3, &rai_bss, cell_id,
3207 GPRS_SAPI_GMM, bss_nu++,
3208 dtap_attach_complete, sizeof(dtap_attach_complete));
3209
3210 dump_peers(stdout, 0, 0, &gbcfg);
3211
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003212 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003213 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003214 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3215 OSMO_ASSERT(link_info);
3216 OSMO_ASSERT(link_info != other_info);
3217 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3218 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3219 OSMO_ASSERT(link_info->tlli.bss_validated);
3220 OSMO_ASSERT(!link_info->tlli.net_validated);
3221 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3222 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3223 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3224 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003225
Alexander Couzens82182d02020-09-22 13:21:46 +02003226 send_llc_dl_ui(nsi, "GMM INFO", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003227 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3228 GPRS_SAPI_GMM, sgsn_nu++,
3229 dtap_gmm_information, sizeof(dtap_gmm_information));
3230
3231 dump_peers(stdout, 0, 0, &gbcfg);
3232
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003233 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003234 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003235 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3236 OSMO_ASSERT(link_info);
3237 OSMO_ASSERT(link_info != other_info);
3238 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
3239 OSMO_ASSERT(link_info->tlli.assigned == 0);
3240 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3241 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003242
3243
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003244 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
3245
3246 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003247 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003248 local_bss_tlli, &rai_bss, cell_id,
3249 GPRS_SAPI_GMM, bss_nu++,
3250 dtap_detach_req, sizeof(dtap_detach_req));
3251
3252 dump_peers(stdout, 0, 0, &gbcfg);
3253
Alexander Couzens82182d02020-09-22 13:21:46 +02003254 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003255 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3256 GPRS_SAPI_GMM, sgsn_nu++,
3257 dtap_detach_acc, sizeof(dtap_detach_acc));
3258
3259 dump_peers(stdout, 0, 0, &gbcfg);
3260
3261 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
3262
Alexander Couzens82182d02020-09-22 13:21:46 +02003263 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003264 local_bss_tlli2, &rai_bss, cell_id,
3265 GPRS_SAPI_GMM, bss_nu++,
3266 dtap_detach_req, sizeof(dtap_detach_req));
3267
3268 dump_peers(stdout, 0, 0, &gbcfg);
3269
Alexander Couzens82182d02020-09-22 13:21:46 +02003270 send_llc_dl_ui(nsi, "DETACH ACC", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003271 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3272 GPRS_SAPI_GMM, sgsn_nu++,
3273 dtap_detach_acc, sizeof(dtap_detach_acc));
3274
3275 dump_peers(stdout, 0, 0, &gbcfg);
3276
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003277 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
3278
Alexander Couzens82182d02020-09-22 13:21:46 +02003279 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003280 local_bss_tlli3, &rai_bss, cell_id,
3281 GPRS_SAPI_GMM, bss_nu++,
3282 dtap_detach_req, sizeof(dtap_detach_req));
3283
3284 dump_peers(stdout, 0, 0, &gbcfg);
3285
Alexander Couzens82182d02020-09-22 13:21:46 +02003286 send_llc_dl_ui(nsi, "DETACH ACC", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003287 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3288 GPRS_SAPI_GMM, sgsn_nu++,
3289 dtap_detach_acc, sizeof(dtap_detach_acc));
3290
3291 dump_peers(stdout, 0, 0, &gbcfg);
3292
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003293 dump_global(stdout, 0);
3294
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02003295 talloc_free(gbcfg.core_apn);
3296 gbcfg.core_apn = NULL;
3297
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003298 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING]);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003299 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02003300 gprs_ns2_free(nsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003301 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003302
3303 cleanup_test();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003304}
3305
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003306static void test_gbproxy_keep_info()
3307{
Alexander Couzens82182d02020-09-22 13:21:46 +02003308 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003309 struct gprs_ra_id rai_bss =
3310 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3311 uint16_t cell_id = 0x1234;
3312
3313 const uint32_t ptmsi = 0xefe2b700;
3314 const uint32_t local_tlli = 0xefe2b700;
3315 const uint32_t foreign_tlli = 0xafe2b700;
3316
Neels Hofmeyr7369d442020-05-29 17:05:40 +02003317 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003318 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003319 struct gbproxy_peer *peer;
3320 unsigned bss_nu = 0;
3321 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02003322 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003323
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003324 LLIST_HEAD(rcv_list);
3325
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003326 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3327
Alexander Couzens82182d02020-09-22 13:21:46 +02003328 gbcfg.nsi = nsi;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003329 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3330 gbcfg.patch_ptmsi = 0;
3331 gbcfg.acquire_imsi = 1;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01003332 gbcfg.core_plmn = (struct osmo_plmn_id){};
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003333 gbcfg.core_apn = NULL;
3334 gbcfg.core_apn_size = 0;
3335 gbcfg.route_to_sgsn2 = 0;
3336 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003337 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003338
Alexander Couzens82182d02020-09-22 13:21:46 +02003339 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003340
3341 printf("=== %s ===\n", __func__);
3342 printf("--- Initialise SGSN ---\n\n");
3343
Alexander Couzens82182d02020-09-22 13:21:46 +02003344 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003345
3346 printf("--- Initialise BSS 1 ---\n\n");
3347
Alexander Couzens82182d02020-09-22 13:21:46 +02003348 setup_ns(nsi, bss_nsei[0]);
3349 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003350
3351 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3352 OSMO_ASSERT(peer != NULL);
3353
Alexander Couzens82182d02020-09-22 13:21:46 +02003354 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003355
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003356 dump_global(stdout, 0);
3357 dump_peers(stdout, 0, 0, &gbcfg);
3358
3359 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3360
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003361 received_messages = &rcv_list;
3362
Alexander Couzens82182d02020-09-22 13:21:46 +02003363 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003364 foreign_tlli, &rai_bss, cell_id,
3365 GPRS_SAPI_GMM, bss_nu++,
3366 dtap_attach_req, sizeof(dtap_attach_req));
3367
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003368 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3369
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003370 dump_peers(stdout, 0, 0, &gbcfg);
3371
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003372 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3373 OSMO_ASSERT(link_info);
3374 OSMO_ASSERT(link_info->imsi_len == 0);
3375 OSMO_ASSERT(!link_info->is_deregistered);
3376 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003377
Alexander Couzens82182d02020-09-22 13:21:46 +02003378 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003379 foreign_tlli, &rai_bss, cell_id,
3380 GPRS_SAPI_GMM, bss_nu++,
3381 dtap_identity_resp, sizeof(dtap_identity_resp));
3382
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003383 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3384
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003385 dump_peers(stdout, 0, 0, &gbcfg);
3386
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003387 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3388 OSMO_ASSERT(link_info);
3389 OSMO_ASSERT(link_info->imsi_len > 0);
3390 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003391 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003392
Alexander Couzens82182d02020-09-22 13:21:46 +02003393 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003394 foreign_tlli, 0, NULL, 0,
3395 GPRS_SAPI_GMM, sgsn_nu++,
3396 dtap_identity_req, sizeof(dtap_identity_req));
3397
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003398 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3399
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003400 dump_peers(stdout, 0, 0, &gbcfg);
3401
Alexander Couzens82182d02020-09-22 13:21:46 +02003402 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003403 foreign_tlli, &rai_bss, cell_id,
3404 GPRS_SAPI_GMM, bss_nu++,
3405 dtap_identity_resp, sizeof(dtap_identity_resp));
3406
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003407 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
3408
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003409 dump_peers(stdout, 0, 0, &gbcfg);
3410
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003411 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3412 OSMO_ASSERT(link_info);
3413 OSMO_ASSERT(link_info->imsi_len > 0);
3414 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003415
Alexander Couzens82182d02020-09-22 13:21:46 +02003416 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003417 foreign_tlli, 1, imsi, sizeof(imsi),
3418 GPRS_SAPI_GMM, sgsn_nu++,
3419 dtap_attach_acc, sizeof(dtap_attach_acc));
3420
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003421 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3422
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003423 dump_peers(stdout, 0, 0, &gbcfg);
3424
Alexander Couzens82182d02020-09-22 13:21:46 +02003425 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003426 local_tlli, &rai_bss, cell_id,
3427 GPRS_SAPI_GMM, bss_nu++,
3428 dtap_attach_complete, sizeof(dtap_attach_complete));
3429
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003430 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3431
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003432 dump_peers(stdout, 0, 0, &gbcfg);
3433
Alexander Couzens82182d02020-09-22 13:21:46 +02003434 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003435 local_tlli, 1, imsi, sizeof(imsi),
3436 GPRS_SAPI_GMM, sgsn_nu++,
3437 dtap_gmm_information, sizeof(dtap_gmm_information));
3438
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003439 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3440
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003441 dump_peers(stdout, 0, 0, &gbcfg);
3442
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003443 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3444 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003445
3446 /* Detach (MO) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003447 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003448 local_tlli, &rai_bss, cell_id,
3449 GPRS_SAPI_GMM, bss_nu++,
3450 dtap_detach_req, sizeof(dtap_detach_req));
3451
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003452 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3453
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003454 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3455 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003456
3457 dump_peers(stdout, 0, 0, &gbcfg);
3458
Alexander Couzens82182d02020-09-22 13:21:46 +02003459 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003460 local_tlli, 1, imsi, sizeof(imsi),
3461 GPRS_SAPI_GMM, sgsn_nu++,
3462 dtap_detach_acc, sizeof(dtap_detach_acc));
3463
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003464 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3465
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003466 dump_peers(stdout, 0, 0, &gbcfg);
3467
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003468 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3469 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3470 OSMO_ASSERT(link_info);
3471 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003472
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003473 OSMO_ASSERT(!expect_msg());
3474
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003475 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003476 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003477 foreign_tlli, &rai_bss, cell_id,
3478 GPRS_SAPI_GMM, bss_nu++,
3479 dtap_attach_req3, sizeof(dtap_attach_req3));
3480
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003481 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3482
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003483 dump_peers(stdout, 0, 0, &gbcfg);
3484
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003485 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3486 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3487 OSMO_ASSERT(link_info);
3488 OSMO_ASSERT(link_info == link_info2);
3489 OSMO_ASSERT(link_info->imsi_len != 0);
3490 OSMO_ASSERT(!link_info->is_deregistered);
3491 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003492 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003493
Alexander Couzens82182d02020-09-22 13:21:46 +02003494 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003495 foreign_tlli, 1, imsi, sizeof(imsi),
3496 GPRS_SAPI_GMM, sgsn_nu++,
3497 dtap_attach_acc, sizeof(dtap_attach_acc));
3498
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003499 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3500
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003501 dump_peers(stdout, 0, 0, &gbcfg);
3502
Alexander Couzens82182d02020-09-22 13:21:46 +02003503 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003504 local_tlli, &rai_bss, cell_id,
3505 GPRS_SAPI_GMM, bss_nu++,
3506 dtap_attach_complete, sizeof(dtap_attach_complete));
3507
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003508 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3509
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003510 dump_peers(stdout, 0, 0, &gbcfg);
3511
3512 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003513 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003514 local_tlli, 1, imsi, sizeof(imsi),
3515 GPRS_SAPI_GMM, sgsn_nu++,
3516 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3517
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003518 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3519
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003520 dump_peers(stdout, 0, 0, &gbcfg);
3521
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003522 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3523 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003524
Alexander Couzens82182d02020-09-22 13:21:46 +02003525 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003526 local_tlli, &rai_bss, cell_id,
3527 GPRS_SAPI_GMM, bss_nu++,
3528 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3529
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003530 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3531 OSMO_ASSERT(!expect_msg());
3532
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003533 dump_peers(stdout, 0, 0, &gbcfg);
3534
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003535 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3536 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3537 OSMO_ASSERT(link_info);
3538 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003539
3540 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003541 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003542 foreign_tlli, &rai_bss, cell_id,
3543 GPRS_SAPI_GMM, bss_nu++,
3544 dtap_attach_req3, sizeof(dtap_attach_req3));
3545
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003546 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3547
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003548 dump_peers(stdout, 0, 0, &gbcfg);
3549
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003550 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3551 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3552 OSMO_ASSERT(link_info);
3553 OSMO_ASSERT(link_info == link_info2);
3554 OSMO_ASSERT(link_info->imsi_len != 0);
3555 OSMO_ASSERT(!link_info->is_deregistered);
3556 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003557
Alexander Couzens82182d02020-09-22 13:21:46 +02003558 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003559 foreign_tlli, 1, imsi, sizeof(imsi),
3560 GPRS_SAPI_GMM, sgsn_nu++,
3561 dtap_attach_acc, sizeof(dtap_attach_acc));
3562
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003563 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3564
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003565 dump_peers(stdout, 0, 0, &gbcfg);
3566
Alexander Couzens82182d02020-09-22 13:21:46 +02003567 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003568 local_tlli, &rai_bss, cell_id,
3569 GPRS_SAPI_GMM, bss_nu++,
3570 dtap_attach_complete, sizeof(dtap_attach_complete));
3571
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003572 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3573
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003574 dump_peers(stdout, 0, 0, &gbcfg);
3575
3576 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003577 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003578 local_tlli, 1, imsi, sizeof(imsi),
3579 GPRS_SAPI_GMM, sgsn_nu++,
3580 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3581
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003582 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3583
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003584 dump_peers(stdout, 0, 0, &gbcfg);
3585
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003586 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3587 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003588
Alexander Couzens82182d02020-09-22 13:21:46 +02003589 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003590 local_tlli, &rai_bss, cell_id,
3591 GPRS_SAPI_GMM, bss_nu++,
3592 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3593
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003594 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3595 OSMO_ASSERT(!expect_msg());
3596
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003597 dump_peers(stdout, 0, 0, &gbcfg);
3598
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003599 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3600 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3601 OSMO_ASSERT(link_info);
3602 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003603
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003604 /* Re-Attach with IMSI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003605 send_llc_ul_ui(nsi, "ATTACH REQUEST (IMSI)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003606 foreign_tlli, &rai_bss, cell_id,
3607 GPRS_SAPI_GMM, bss_nu++,
3608 dtap_attach_req4, sizeof(dtap_attach_req4));
3609
3610 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3611
3612 dump_peers(stdout, 0, 0, &gbcfg);
3613
3614 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3615 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3616 OSMO_ASSERT(link_info);
3617 OSMO_ASSERT(link_info == link_info2);
3618 OSMO_ASSERT(link_info->imsi_len != 0);
3619 OSMO_ASSERT(!link_info->is_deregistered);
3620 OSMO_ASSERT(!link_info->imsi_acq_pending);
3621 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
3622
Alexander Couzens82182d02020-09-22 13:21:46 +02003623 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003624 foreign_tlli, 1, imsi, sizeof(imsi),
3625 GPRS_SAPI_GMM, sgsn_nu++,
3626 dtap_attach_acc, sizeof(dtap_attach_acc));
3627
3628 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3629
3630 dump_peers(stdout, 0, 0, &gbcfg);
3631
Alexander Couzens82182d02020-09-22 13:21:46 +02003632 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003633 local_tlli, &rai_bss, cell_id,
3634 GPRS_SAPI_GMM, bss_nu++,
3635 dtap_attach_complete, sizeof(dtap_attach_complete));
3636
3637 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3638
3639 dump_peers(stdout, 0, 0, &gbcfg);
3640
3641 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003642 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003643 local_tlli, 1, imsi, sizeof(imsi),
3644 GPRS_SAPI_GMM, sgsn_nu++,
3645 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3646
3647 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3648
3649 dump_peers(stdout, 0, 0, &gbcfg);
3650
3651 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3652 OSMO_ASSERT(link_info);
3653
Alexander Couzens82182d02020-09-22 13:21:46 +02003654 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003655 local_tlli, &rai_bss, cell_id,
3656 GPRS_SAPI_GMM, bss_nu++,
3657 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3658
3659 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3660 OSMO_ASSERT(!expect_msg());
3661
3662 dump_peers(stdout, 0, 0, &gbcfg);
3663
3664 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3665 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3666 OSMO_ASSERT(link_info);
3667 OSMO_ASSERT(link_info->is_deregistered);
3668
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003669 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003670 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003671 foreign_tlli, &rai_bss, cell_id,
3672 GPRS_SAPI_GMM, bss_nu++,
3673 dtap_attach_req3, sizeof(dtap_attach_req3));
3674
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003675 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3676
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003677 dump_peers(stdout, 0, 0, &gbcfg);
3678
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003679 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3680 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3681 OSMO_ASSERT(link_info);
3682 OSMO_ASSERT(link_info == link_info2);
3683 OSMO_ASSERT(link_info->imsi_len != 0);
3684 OSMO_ASSERT(!link_info->is_deregistered);
3685 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003686
Alexander Couzens82182d02020-09-22 13:21:46 +02003687 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003688 foreign_tlli, 1, imsi, sizeof(imsi),
3689 GPRS_SAPI_GMM, sgsn_nu++,
3690 dtap_attach_acc, sizeof(dtap_attach_acc));
3691
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003692 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3693
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003694 dump_peers(stdout, 0, 0, &gbcfg);
3695
Alexander Couzens82182d02020-09-22 13:21:46 +02003696 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003697 local_tlli, &rai_bss, cell_id,
3698 GPRS_SAPI_GMM, bss_nu++,
3699 dtap_attach_complete, sizeof(dtap_attach_complete));
3700
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003701 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3702
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003703 dump_peers(stdout, 0, 0, &gbcfg);
3704
3705 /* RA update procedure (reject -> Detach) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003706 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003707 local_tlli, &rai_bss, 0x7080,
3708 GPRS_SAPI_GMM, bss_nu++,
3709 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3710
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003711 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
3712
Alexander Couzens82182d02020-09-22 13:21:46 +02003713 send_llc_dl_ui(nsi, "RA UDP REJ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003714 local_tlli, 1, imsi, sizeof(imsi),
3715 GPRS_SAPI_GMM, sgsn_nu++,
3716 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3717
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003718 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
3719 OSMO_ASSERT(!expect_msg());
3720
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003721 dump_peers(stdout, 0, 0, &gbcfg);
3722
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003723 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3724 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3725 OSMO_ASSERT(link_info);
3726 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003727
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003728 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003729 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003730 foreign_tlli, &rai_bss, cell_id,
3731 GPRS_SAPI_GMM, bss_nu++,
3732 dtap_attach_req, sizeof(dtap_attach_req));
3733
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003734 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3735
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003736 dump_peers(stdout, 0, 0, &gbcfg);
3737
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003738 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3739 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3740 OSMO_ASSERT(link_info);
3741 OSMO_ASSERT(link_info != link_info2);
3742 OSMO_ASSERT(link_info->imsi_len == 0);
3743 OSMO_ASSERT(!link_info->is_deregistered);
3744 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003745
Alexander Couzens82182d02020-09-22 13:21:46 +02003746 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003747 foreign_tlli, &rai_bss, cell_id,
3748 GPRS_SAPI_GMM, bss_nu++,
3749 dtap_identity_resp, sizeof(dtap_identity_resp));
3750
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003751 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3752
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003753 dump_peers(stdout, 0, 0, &gbcfg);
3754
3755 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3756 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3757 OSMO_ASSERT(link_info);
3758 OSMO_ASSERT(link_info == link_info2);
3759 OSMO_ASSERT(link_info->imsi_len != 0);
3760 OSMO_ASSERT(!link_info->is_deregistered);
3761 OSMO_ASSERT(!link_info->imsi_acq_pending);
3762
Alexander Couzens82182d02020-09-22 13:21:46 +02003763 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003764 foreign_tlli, 1, imsi, sizeof(imsi),
3765 GPRS_SAPI_GMM, sgsn_nu++,
3766 dtap_attach_acc, sizeof(dtap_attach_acc));
3767
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003768 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3769
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003770 dump_peers(stdout, 0, 0, &gbcfg);
3771
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003772 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3773 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3774 OSMO_ASSERT(link_info);
3775 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeckea71b482014-09-22 09:28:27 +02003776 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003777
Alexander Couzens82182d02020-09-22 13:21:46 +02003778 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003779 local_tlli, &rai_bss, cell_id,
3780 GPRS_SAPI_GMM, bss_nu++,
3781 dtap_attach_complete, sizeof(dtap_attach_complete));
3782
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003783 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3784
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003785 dump_peers(stdout, 0, 0, &gbcfg);
3786
3787 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003788 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003789 local_tlli, 1, imsi, sizeof(imsi),
3790 GPRS_SAPI_GMM, sgsn_nu++,
3791 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3792
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003793 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3794
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003795 dump_peers(stdout, 0, 0, &gbcfg);
3796
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003797 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3798 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003799
Alexander Couzens82182d02020-09-22 13:21:46 +02003800 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003801 local_tlli, &rai_bss, cell_id,
3802 GPRS_SAPI_GMM, bss_nu++,
3803 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3804
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003805 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3806
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003807 dump_peers(stdout, 0, 0, &gbcfg);
3808
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003809 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3810 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3811 OSMO_ASSERT(link_info);
3812 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003813
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003814 OSMO_ASSERT(!expect_msg());
3815
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003816 /* Bad case: Re-Attach with local TLLI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003817 send_llc_ul_ui(nsi, "ATTACH REQUEST (local TLLI)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003818 local_tlli, &rai_bss, cell_id,
3819 GPRS_SAPI_GMM, bss_nu++,
3820 dtap_attach_req3, sizeof(dtap_attach_req3));
3821
3822 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3823
3824 dump_peers(stdout, 0, 0, &gbcfg);
3825
3826 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3827 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3828 OSMO_ASSERT(link_info);
3829 OSMO_ASSERT(link_info == link_info2);
3830 OSMO_ASSERT(link_info->imsi_len != 0);
3831 OSMO_ASSERT(!link_info->is_deregistered);
3832 OSMO_ASSERT(!link_info->imsi_acq_pending);
3833 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
3834
Alexander Couzens82182d02020-09-22 13:21:46 +02003835 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003836 local_tlli, 1, imsi, sizeof(imsi),
3837 GPRS_SAPI_GMM, sgsn_nu++,
3838 dtap_attach_acc, sizeof(dtap_attach_acc));
3839
3840 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3841
3842 dump_peers(stdout, 0, 0, &gbcfg);
3843
Alexander Couzens82182d02020-09-22 13:21:46 +02003844 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003845 local_tlli, &rai_bss, cell_id,
3846 GPRS_SAPI_GMM, bss_nu++,
3847 dtap_attach_complete, sizeof(dtap_attach_complete));
3848
3849 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3850
3851 dump_peers(stdout, 0, 0, &gbcfg);
3852
3853 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003854 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003855 local_tlli, 1, imsi, sizeof(imsi),
3856 GPRS_SAPI_GMM, sgsn_nu++,
3857 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3858
3859 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3860
3861 dump_peers(stdout, 0, 0, &gbcfg);
3862
3863 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3864 OSMO_ASSERT(link_info);
3865
Alexander Couzens82182d02020-09-22 13:21:46 +02003866 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003867 local_tlli, &rai_bss, cell_id,
3868 GPRS_SAPI_GMM, bss_nu++,
3869 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3870
3871 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3872 OSMO_ASSERT(!expect_msg());
3873
3874 dump_peers(stdout, 0, 0, &gbcfg);
3875
3876 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3877 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3878 OSMO_ASSERT(link_info);
3879 OSMO_ASSERT(link_info->is_deregistered);
3880
3881 /* Bad case: Unexpected Re-Attach with IMSI after completed attachment
3882 * procedure */
Alexander Couzens82182d02020-09-22 13:21:46 +02003883 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003884 foreign_tlli, &rai_bss, cell_id,
3885 GPRS_SAPI_GMM, bss_nu++,
3886 dtap_attach_req3, sizeof(dtap_attach_req3));
3887
3888 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3889
3890 dump_peers(stdout, 0, 0, &gbcfg);
3891
3892 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3893 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3894 OSMO_ASSERT(link_info);
3895 OSMO_ASSERT(link_info == link_info2);
3896 OSMO_ASSERT(link_info->imsi_len != 0);
3897 OSMO_ASSERT(!link_info->is_deregistered);
3898 OSMO_ASSERT(!link_info->imsi_acq_pending);
3899
Alexander Couzens82182d02020-09-22 13:21:46 +02003900 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003901 foreign_tlli, 1, imsi, sizeof(imsi),
3902 GPRS_SAPI_GMM, sgsn_nu++,
3903 dtap_attach_acc, sizeof(dtap_attach_acc));
3904
3905 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3906
3907 dump_peers(stdout, 0, 0, &gbcfg);
3908
Alexander Couzens82182d02020-09-22 13:21:46 +02003909 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003910 local_tlli, &rai_bss, cell_id,
3911 GPRS_SAPI_GMM, bss_nu++,
3912 dtap_attach_complete, sizeof(dtap_attach_complete));
3913
3914 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3915
3916 dump_peers(stdout, 0, 0, &gbcfg);
3917
Alexander Couzens82182d02020-09-22 13:21:46 +02003918 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003919 local_tlli, 1, imsi, sizeof(imsi),
3920 GPRS_SAPI_GMM, sgsn_nu++,
3921 dtap_gmm_information, sizeof(dtap_gmm_information));
3922
3923 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3924
3925 dump_peers(stdout, 0, 0, &gbcfg);
3926
3927 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected, IMSI)",
Alexander Couzens82182d02020-09-22 13:21:46 +02003928 bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003929 foreign_tlli, &rai_bss, cell_id,
3930 GPRS_SAPI_GMM, bss_nu++,
3931 dtap_attach_req4, sizeof(dtap_attach_req4));
3932
3933 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3934
3935 dump_peers(stdout, 0, 0, &gbcfg);
3936
3937 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3938 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01003939 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003940 OSMO_ASSERT(link_info == link_info2);
3941 OSMO_ASSERT(link_info->imsi_len != 0);
3942 OSMO_ASSERT(!link_info->is_deregistered);
3943 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01003944 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003945 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
3946
Alexander Couzens82182d02020-09-22 13:21:46 +02003947 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003948 foreign_tlli, 1, imsi, sizeof(imsi),
3949 GPRS_SAPI_GMM, sgsn_nu++,
3950 dtap_attach_acc, sizeof(dtap_attach_acc));
3951
3952 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3953
3954 dump_peers(stdout, 0, 0, &gbcfg);
3955
Alexander Couzens82182d02020-09-22 13:21:46 +02003956 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003957 local_tlli, &rai_bss, cell_id,
3958 GPRS_SAPI_GMM, bss_nu++,
3959 dtap_attach_complete, sizeof(dtap_attach_complete));
3960
3961 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3962
3963 dump_peers(stdout, 0, 0, &gbcfg);
3964
3965 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003966 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003967 local_tlli, 1, imsi, sizeof(imsi),
3968 GPRS_SAPI_GMM, sgsn_nu++,
3969 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3970
3971 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3972
3973 dump_peers(stdout, 0, 0, &gbcfg);
3974
3975 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3976 OSMO_ASSERT(link_info);
3977
Alexander Couzens82182d02020-09-22 13:21:46 +02003978 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003979 local_tlli, &rai_bss, cell_id,
3980 GPRS_SAPI_GMM, bss_nu++,
3981 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3982
3983 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3984 OSMO_ASSERT(!expect_msg());
3985
3986 dump_peers(stdout, 0, 0, &gbcfg);
3987
3988 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3989 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3990 OSMO_ASSERT(link_info);
3991 OSMO_ASSERT(link_info->is_deregistered);
3992
3993 /* Bad case: Unexpected Re-Attach with P-TMSI after completed attachment
3994 * procedure */
Alexander Couzens82182d02020-09-22 13:21:46 +02003995 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003996 foreign_tlli, &rai_bss, cell_id,
3997 GPRS_SAPI_GMM, bss_nu++,
3998 dtap_attach_req3, sizeof(dtap_attach_req3));
3999
4000 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4001
4002 dump_peers(stdout, 0, 0, &gbcfg);
4003
4004 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4005 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4006 OSMO_ASSERT(link_info);
4007 OSMO_ASSERT(link_info == link_info2);
4008 OSMO_ASSERT(link_info->imsi_len != 0);
4009 OSMO_ASSERT(!link_info->is_deregistered);
4010 OSMO_ASSERT(!link_info->imsi_acq_pending);
4011
Alexander Couzens82182d02020-09-22 13:21:46 +02004012 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004013 foreign_tlli, 1, imsi, sizeof(imsi),
4014 GPRS_SAPI_GMM, sgsn_nu++,
4015 dtap_attach_acc, sizeof(dtap_attach_acc));
4016
4017 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4018
4019 dump_peers(stdout, 0, 0, &gbcfg);
4020
Alexander Couzens82182d02020-09-22 13:21:46 +02004021 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004022 local_tlli, &rai_bss, cell_id,
4023 GPRS_SAPI_GMM, bss_nu++,
4024 dtap_attach_complete, sizeof(dtap_attach_complete));
4025
4026 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4027
4028 dump_peers(stdout, 0, 0, &gbcfg);
4029
Alexander Couzens82182d02020-09-22 13:21:46 +02004030 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004031 local_tlli, 1, imsi, sizeof(imsi),
4032 GPRS_SAPI_GMM, sgsn_nu++,
4033 dtap_gmm_information, sizeof(dtap_gmm_information));
4034
4035 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4036
4037 dump_peers(stdout, 0, 0, &gbcfg);
4038
Alexander Couzens82182d02020-09-22 13:21:46 +02004039 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004040 foreign_tlli, &rai_bss, cell_id,
4041 GPRS_SAPI_GMM, bss_nu++,
4042 dtap_attach_req3, sizeof(dtap_attach_req3));
4043
4044 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4045
4046 dump_peers(stdout, 0, 0, &gbcfg);
4047
4048 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4049 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004050 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004051 OSMO_ASSERT(link_info == link_info2);
4052 OSMO_ASSERT(link_info->imsi_len != 0);
4053 OSMO_ASSERT(!link_info->is_deregistered);
4054 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004055 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004056 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4057
Alexander Couzens82182d02020-09-22 13:21:46 +02004058 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004059 foreign_tlli, 1, imsi, sizeof(imsi),
4060 GPRS_SAPI_GMM, sgsn_nu++,
4061 dtap_attach_acc, sizeof(dtap_attach_acc));
4062
4063 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4064
4065 dump_peers(stdout, 0, 0, &gbcfg);
4066
Alexander Couzens82182d02020-09-22 13:21:46 +02004067 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004068 local_tlli, &rai_bss, cell_id,
4069 GPRS_SAPI_GMM, bss_nu++,
4070 dtap_attach_complete, sizeof(dtap_attach_complete));
4071
4072 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4073
4074 dump_peers(stdout, 0, 0, &gbcfg);
4075
4076 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02004077 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004078 local_tlli, 1, imsi, sizeof(imsi),
4079 GPRS_SAPI_GMM, sgsn_nu++,
4080 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4081
4082 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4083
4084 dump_peers(stdout, 0, 0, &gbcfg);
4085
4086 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4087 OSMO_ASSERT(link_info);
4088
Alexander Couzens82182d02020-09-22 13:21:46 +02004089 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004090 local_tlli, &rai_bss, cell_id,
4091 GPRS_SAPI_GMM, bss_nu++,
4092 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4093
4094 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4095 OSMO_ASSERT(!expect_msg());
4096
4097 dump_peers(stdout, 0, 0, &gbcfg);
4098
4099 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4100 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4101 OSMO_ASSERT(link_info);
4102 OSMO_ASSERT(link_info->is_deregistered);
4103
4104
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004105 /* Attach rejected */
4106
4107 gbproxy_delete_link_infos(peer);
4108
Alexander Couzens82182d02020-09-22 13:21:46 +02004109 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004110 foreign_tlli, &rai_bss, cell_id,
4111 GPRS_SAPI_GMM, bss_nu++,
4112 dtap_attach_req, sizeof(dtap_attach_req));
4113
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004114 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4115
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004116 dump_peers(stdout, 0, 0, &gbcfg);
4117
4118 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4119 OSMO_ASSERT(link_info);
4120 OSMO_ASSERT(link_info->imsi_len == 0);
4121 OSMO_ASSERT(!link_info->is_deregistered);
4122 OSMO_ASSERT(link_info->imsi_acq_pending);
4123
Alexander Couzens82182d02020-09-22 13:21:46 +02004124 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004125 foreign_tlli, &rai_bss, cell_id,
4126 GPRS_SAPI_GMM, bss_nu++,
4127 dtap_identity_resp, sizeof(dtap_identity_resp));
4128
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004129 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4130
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004131 dump_peers(stdout, 0, 0, &gbcfg);
4132
4133 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4134 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4135 OSMO_ASSERT(link_info);
4136 OSMO_ASSERT(link_info == link_info2);
4137 OSMO_ASSERT(link_info->imsi_len != 0);
4138 OSMO_ASSERT(!link_info->is_deregistered);
4139 OSMO_ASSERT(!link_info->imsi_acq_pending);
4140
Alexander Couzens82182d02020-09-22 13:21:46 +02004141 send_llc_dl_ui(nsi, "ATTACH REJECT", SGSN_NSEI, 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004142 foreign_tlli, 1, imsi, sizeof(imsi),
4143 GPRS_SAPI_GMM, sgsn_nu++,
4144 dtap_attach_rej7, sizeof(dtap_attach_rej7));
4145
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004146 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
4147
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004148 dump_peers(stdout, 0, 0, &gbcfg);
4149
Jacob Erlbeck9c65c812014-09-22 10:42:05 +02004150 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4151
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004152 OSMO_ASSERT(!expect_msg());
4153
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004154 /* Attach (incomplete) and Detach (MO) */
4155
4156 gbproxy_delete_link_infos(peer);
4157
Alexander Couzens82182d02020-09-22 13:21:46 +02004158 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004159 foreign_tlli, &rai_bss, cell_id,
4160 GPRS_SAPI_GMM, bss_nu++,
4161 dtap_attach_req, sizeof(dtap_attach_req));
4162
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004163 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4164
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004165 dump_peers(stdout, 0, 0, &gbcfg);
4166
4167 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4168 OSMO_ASSERT(link_info);
4169 OSMO_ASSERT(link_info->imsi_len == 0);
4170 OSMO_ASSERT(!link_info->is_deregistered);
4171 OSMO_ASSERT(link_info->imsi_acq_pending);
4172
Alexander Couzens82182d02020-09-22 13:21:46 +02004173 send_llc_ul_ui(nsi, "DETACH REQ (MO)", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004174 foreign_tlli, &rai_bss, cell_id,
4175 GPRS_SAPI_GMM, bss_nu++,
4176 dtap_detach_req, sizeof(dtap_detach_req));
4177
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004178 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4179
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004180 dump_peers(stdout, 0, 0, &gbcfg);
4181
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004182 OSMO_ASSERT(!expect_msg());
4183
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004184 /* Attach (incomplete) and Detach (MT) */
4185
4186 gbproxy_delete_link_infos(peer);
4187
Alexander Couzens82182d02020-09-22 13:21:46 +02004188 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004189 foreign_tlli, &rai_bss, cell_id,
4190 GPRS_SAPI_GMM, bss_nu++,
4191 dtap_attach_req, sizeof(dtap_attach_req));
4192
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004193 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4194
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004195 dump_peers(stdout, 0, 0, &gbcfg);
4196
4197 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4198 OSMO_ASSERT(link_info);
4199 OSMO_ASSERT(link_info->imsi_len == 0);
4200 OSMO_ASSERT(!link_info->is_deregistered);
4201 OSMO_ASSERT(link_info->imsi_acq_pending);
4202
Alexander Couzens82182d02020-09-22 13:21:46 +02004203 send_llc_dl_ui(nsi, "DETACH REQ (MT)", SGSN_NSEI, 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004204 foreign_tlli, 1, imsi, sizeof(imsi),
4205 GPRS_SAPI_GMM, sgsn_nu++,
4206 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4207
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004208 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4209
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004210 dump_peers(stdout, 0, 0, &gbcfg);
4211
4212 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4213 OSMO_ASSERT(link_info);
4214
Alexander Couzens82182d02020-09-22 13:21:46 +02004215 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004216 foreign_tlli, &rai_bss, cell_id,
4217 GPRS_SAPI_GMM, bss_nu++,
4218 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4219
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004220 /* TODO: The stored messaged should be cleaned when receiving a Detach
4221 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
4222 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4223 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4224
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004225 dump_peers(stdout, 0, 0, &gbcfg);
4226
4227 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4228 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4229 OSMO_ASSERT(link_info);
4230 OSMO_ASSERT(link_info->is_deregistered);
4231
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004232 OSMO_ASSERT(!expect_msg());
4233 received_messages = NULL;
4234
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004235 dump_global(stdout, 0);
4236
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004237 talloc_free(gbcfg.core_apn);
4238 gbcfg.core_apn = NULL;
4239
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004240 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02004241 gprs_ns2_free(nsi);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004242 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004243
4244 cleanup_test();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004245}
4246
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004247struct gbproxy_link_info *register_tlli(
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004248 struct gbproxy_peer *peer, uint32_t tlli,
4249 const uint8_t *imsi, size_t imsi_len, time_t now)
4250{
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004251 struct gbproxy_link_info *link_info;
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004252 int imsi_matches = -1;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004253 int tlli_already_known = 0;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004254 struct gbproxy_config *cfg = peer->cfg;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004255
4256 /* Check, whether the IMSI matches */
4257 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004258 imsi_matches = gbproxy_check_imsi(
4259 &cfg->matches[GBPROX_MATCH_PATCHING], imsi, imsi_len);
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004260 if (imsi_matches < 0)
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004261 return NULL;
4262 }
4263
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004264 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004265
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004266 if (!link_info) {
4267 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004268
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004269 if (link_info) {
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004270 /* TLLI has changed somehow, adjust it */
4271 LOGP(DGPRS, LOGL_INFO,
4272 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004273 link_info->tlli.current, tlli);
4274 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004275 }
4276 }
4277
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004278 if (!link_info) {
4279 link_info = gbproxy_link_info_alloc(peer);
4280 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004281 } else {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004282 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004283 tlli_already_known = 1;
4284 }
4285
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004286 OSMO_ASSERT(link_info != NULL);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004287
4288 if (!tlli_already_known)
4289 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
4290
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004291 gbproxy_attach_link_info(peer, now, link_info);
4292 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004293
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004294 if (imsi_matches >= 0)
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004295 link_info->is_matching[GBPROX_MATCH_PATCHING] = imsi_matches;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004296
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004297 return link_info;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004298}
4299
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004300static void test_gbproxy_tlli_expire(void)
4301{
4302 struct gbproxy_config cfg = {0};
4303 struct gbproxy_peer *peer;
4304 const char *err_msg = NULL;
Neels Hofmeyr7369d442020-05-29 17:05:40 +02004305 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0xf6 };
4306 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0xf9 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004307 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004308 const uint32_t tlli1 = 1234 | 0xc0000000;
4309 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004310 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004311 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004312 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004313
4314 printf("Test TLLI info expiry\n\n");
4315
4316 gbproxy_init_config(&cfg);
4317
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004318 if (gbproxy_set_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING],
4319 filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004320 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
4321 err_msg);
4322 OSMO_ASSERT(err_msg == NULL);
4323 }
4324
4325 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004326 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004327
4328 printf("Test TLLI replacement:\n");
4329
4330 cfg.tlli_max_len = 0;
4331 cfg.tlli_max_age = 0;
4332 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004333 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004334
4335 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004336 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004337 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004338 OSMO_ASSERT(link_info);
4339 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004340 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004341
4342 /* replace the old entry */
4343 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004344 link_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004345 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004346 OSMO_ASSERT(link_info);
4347 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004348 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004349
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004350 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004351
4352 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004353 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4354 OSMO_ASSERT(link_info);
4355 OSMO_ASSERT(link_info->tlli.current == tlli2);
4356 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4357 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004358
4359 printf("\n");
4360
4361 gbproxy_peer_free(peer);
4362 }
4363
4364 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004365 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004366
4367 printf("Test IMSI replacement:\n");
4368
4369 cfg.tlli_max_len = 0;
4370 cfg.tlli_max_age = 0;
4371 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004372 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004373
4374 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004375 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004376 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004377 OSMO_ASSERT(link_info);
4378 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004379 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004380
4381 /* try to replace the old entry */
4382 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004383 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004384 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004385 OSMO_ASSERT(link_info);
4386 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004387 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004388
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004389 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004390
4391 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004392 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4393 OSMO_ASSERT(!link_info);
4394 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4395 OSMO_ASSERT(link_info);
4396 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004397
4398 printf("\n");
4399
4400 gbproxy_peer_free(peer);
4401 }
4402
4403 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004404 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004405 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004406
4407 printf("Test TLLI expiry, max_len == 1:\n");
4408
4409 cfg.tlli_max_len = 1;
4410 cfg.tlli_max_age = 0;
4411 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004412 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004413
4414 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004415 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004416 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004417
4418 /* replace the old entry */
4419 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004420 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004421 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004422
Jacob Erlbeck51fde082014-09-19 16:40:21 +02004423 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004424 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004425 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004426
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004427 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004428
4429 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004430 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4431 OSMO_ASSERT(!link_info);
4432 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4433 OSMO_ASSERT(link_info);
4434 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004435
4436 printf("\n");
4437
4438 gbproxy_peer_free(peer);
4439 }
4440
4441 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004442 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004443 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004444
4445 printf("Test TLLI expiry, max_age == 1:\n");
4446
4447 cfg.tlli_max_len = 0;
4448 cfg.tlli_max_age = 1;
4449 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004450 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004451
4452 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004453 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004454 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004455
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004456 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004457 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004458 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004459 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004460
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004461 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004462 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004463 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004464
4465 dump_peers(stdout, 2, now + 2, &cfg);
4466
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004467 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004468 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4469 OSMO_ASSERT(!link_info);
4470 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4471 OSMO_ASSERT(link_info);
4472 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004473
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004474 printf("\n");
4475
4476 gbproxy_peer_free(peer);
4477 }
4478
4479 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004480 struct gbproxy_link_info *link_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004481 int num_removed;
4482
4483 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
4484
4485 cfg.tlli_max_len = 0;
4486 cfg.tlli_max_age = 1;
4487 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004488 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004489
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004490 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004491 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004492 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004493
4494 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004495 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004496 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004497 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004498
4499 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004500 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004501 now + 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004502 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004503
4504 dump_peers(stdout, 2, now + 2, &cfg);
4505
4506 printf(" Remove stale TLLIs\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004507 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004508 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004509 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004510
4511 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004512
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004513 /* verify that tlli3 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004514 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4515 OSMO_ASSERT(!link_info);
4516 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4517 OSMO_ASSERT(!link_info);
4518 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
4519 OSMO_ASSERT(link_info);
4520 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004521
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004522 printf("\n");
4523
4524 gbproxy_peer_free(peer);
4525 }
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004526 gbproxy_clear_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING]);
4527 gbprox_reset(&cfg);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004528 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
4529 rate_ctr_group_free(cfg.ctrg);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004530
4531 cleanup_test();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004532}
4533
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004534static void test_gbproxy_imsi_matching(void)
4535{
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004536 const char *err_msg = NULL;
4537 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4538 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4539 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4540 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4541 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4542 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4543 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4544 const char *filter_re1 = ".*";
4545 const char *filter_re2 = "^1234";
4546 const char *filter_re3 = "^4321";
4547 const char *filter_re4_bad = "^12[";
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004548 struct gbproxy_match match = {0,};
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004549
4550 printf("=== Test IMSI/TMSI matching ===\n\n");
4551
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004552 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004553
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004554 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re1, &err_msg) == 0);
4555 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004556
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004557 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4558 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004559
4560 err_msg = NULL;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004561 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004562 OSMO_ASSERT(err_msg != NULL);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004563 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004564
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004565 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4566 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004567
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004568 OSMO_ASSERT(gbproxy_set_patch_filter(&match, NULL, &err_msg) == 0);
4569 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004570
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004571 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4572 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004573
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004574 gbproxy_clear_patch_filter(&match);
4575 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004576
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004577 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4578 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004579
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004580 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 1);
4581 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 1);
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +02004582 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == -1);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004583 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4584 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4585 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4586 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004587
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004588 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re3, &err_msg) == 0);
4589 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004590
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004591 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 0);
4592 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 0);
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +02004593 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == -1);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004594 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4595 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4596 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4597 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004598
4599 /* TODO: Check correct length but wrong type with is_mi_tmsi */
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004600
4601 gbproxy_clear_patch_filter(&match);
4602 OSMO_ASSERT(match.enable == 0);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004603
4604 cleanup_test();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004605}
4606
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004607static void test_gbproxy_stored_messages()
4608{
Alexander Couzens82182d02020-09-22 13:21:46 +02004609 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004610 struct gprs_ra_id rai_bss =
4611 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
4612 struct gprs_ra_id rai_unknown =
4613 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
4614 uint16_t cell_id = 0x1234;
4615
4616 const uint32_t ptmsi = 0xefe2b700;
4617 const uint32_t local_tlli = 0xefe2b700;
4618
4619 const uint32_t foreign_tlli1 = 0x8000dead;
4620
4621 struct gbproxy_peer *peer;
4622 unsigned bss_nu = 0;
4623 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02004624 uint16_t bss_nsei[] = { 0x1000 };
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004625
4626 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
4627
Alexander Couzens82182d02020-09-22 13:21:46 +02004628 gbcfg.nsi = nsi;
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004629 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01004630 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004631 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004632 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
4633 gbcfg.patch_ptmsi = 0;
4634 gbcfg.acquire_imsi = 1;
4635 gbcfg.keep_link_infos = 0;
4636
Alexander Couzens82182d02020-09-22 13:21:46 +02004637 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004638
4639 printf("=== %s ===\n", __func__);
4640 printf("--- Initialise SGSN ---\n\n");
4641
Alexander Couzens82182d02020-09-22 13:21:46 +02004642 connect_sgsn(nsi, SGSN_NSEI);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004643
4644 printf("--- Initialise BSS 1 ---\n\n");
4645
Alexander Couzens82182d02020-09-22 13:21:46 +02004646 setup_ns(nsi, bss_nsei[0]);
4647 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004648
4649 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
4650 OSMO_ASSERT(peer != NULL);
4651
Alexander Couzens82182d02020-09-22 13:21:46 +02004652 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004653
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004654 dump_global(stdout, 0);
4655 dump_peers(stdout, 0, 0, &gbcfg);
4656
4657 printf("--- Establish first LLC connection ---\n\n");
4658
Alexander Couzens82182d02020-09-22 13:21:46 +02004659 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004660 foreign_tlli1, &rai_unknown, cell_id,
4661 GPRS_SAPI_GMM, bss_nu++,
4662 dtap_attach_req, sizeof(dtap_attach_req));
4663
4664 dump_peers(stdout, 0, 0, &gbcfg);
4665
Alexander Couzens82182d02020-09-22 13:21:46 +02004666 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004667 foreign_tlli1, 0, NULL, 0,
4668 GPRS_SAPI_GMM, sgsn_nu++,
4669 dtap_identity_req, sizeof(dtap_identity_req));
4670
4671 dump_peers(stdout, 0, 0, &gbcfg);
4672
Alexander Couzens82182d02020-09-22 13:21:46 +02004673 send_llc_ul_ui(nsi, "DETACH ACCEPT", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004674 foreign_tlli1, &rai_bss, cell_id,
4675 GPRS_SAPI_GMM, bss_nu++,
4676 dtap_detach_acc, sizeof(dtap_detach_acc));
4677
4678 dump_peers(stdout, 0, 0, &gbcfg);
4679
Alexander Couzens82182d02020-09-22 13:21:46 +02004680 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004681 foreign_tlli1, &rai_bss, cell_id,
4682 GPRS_SAPI_GMM, bss_nu++,
4683 dtap_identity_resp, sizeof(dtap_identity_resp));
4684
4685 dump_peers(stdout, 0, 0, &gbcfg);
4686
4687 dump_global(stdout, 0);
4688
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004689 talloc_free(gbcfg.core_apn);
4690 gbcfg.core_apn = NULL;
4691
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004692 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02004693 gprs_ns2_free(nsi);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004694 nsi = NULL;
4695
4696 cleanup_test();
4697}
4698
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004699/* See OS#3178 "gbproxy: failed to parse invalid BSSGP-UNITDATA message" */
4700static void test_gbproxy_parse_bssgp_unitdata()
4701{
4702 const char *hex = "0000239401e155cfea000004088872f4801018009c4000800e000601c0416c4338";
4703 struct msgb *msg = msgb_alloc(1034, "bssgp_unitdata");
4704 struct gprs_gb_parse_context parse_ctx;
4705 int rc;
4706
4707 memset(&parse_ctx, 0, sizeof(parse_ctx));
4708
4709 OSMO_ASSERT(msg);
4710 msgb_bssgph(msg) = msg->head;
4711 msgb_put(msg, osmo_hexparse(hex, msg->head, msgb_tailroom(msg)));
4712
4713 parse_ctx.to_bss = 0;
4714 parse_ctx.peer_nsei = msgb_nsei(msg);
4715
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004716 rc = gprs_gb_parse_bssgp(msg->data, msg->len, &parse_ctx);
Stefan Sperling322643f2018-06-23 16:50:06 +02004717 if (!rc)
4718 fprintf(stderr, "%s: Test passed; Failed to parse invalid message %s\n", __func__, msgb_hexdump(msg));
4719 else
4720 fprintf(stderr, "%s: Test failed; invalid message was accepted by parser: %s\n", __func__, msgb_hexdump(msg));
4721
4722 OSMO_ASSERT(!rc);
4723
4724 /* Manually decoded message according to:
4725 ETSI TS 148 018 V10.6.0 (2012 07) 96
4726 3GPP TS 48.018 version 10.6.0 Release 10
4727 Table 10.2.2: UL-UNITDATA PDU content
4728
4729 00 - PDU type UL-UNITDATA (ok)
4730
4731 11.3.35 Temporary logical link Identity (TLLI)
4732 00 - TLLI[0]
4733 23 - TLLI[1]
4734 94 - TLLI[2]
4735 01 - TLLI[3]
4736 TLLI == "00239401"
4737
4738 e1 - QOS[0] (bit rate MSB)
4739 55 - QOS[1] (bit rate LSB)
4740 bit rate = "57685" (57685*100000 bit/s per PBRG)
4741 cf - QOS[2] PBRG = 11 (bit rate is expressed in 100000 bit/s increments),
4742 C/R 0 (contains LLC ACK/SACK),
4743 T 0 (contains signalling),
4744 A 1 (radio if uses MAC/UNITDATA,
4745 Precedence 111 (reserved value)
4746
4747 ea - CELL_ID[0] (TLV IEI: wrong, should be 0x08)
4748 00 - CELL_ID[1] (length 1)
4749 00 - CELL_ID[2] (length 2)
4750 lenth == 0
4751 04 -- CELL_ID[3]
4752 08 -- CELL_ID[4]
4753 88 -- CELL_ID[5]
4754 72 -- CELL_ID[6]
4755 f4 -- CELL_ID[7]
4756 80 -- CELL_ID[8]
4757 10 -- CELL_DI[9]
4758
4759 18 -- QOSP[0] OoS Profile IEI
4760 not allowed in BSSGP Userdata
4761 00 -- QOSP[1]
4762 9c -- QOSP[2]
4763 40 -- QOSP[3]
4764 00 -- QOSP[4]
4765
4766 80 -- IEI for "E-UTRAN Inter RAT Handover Info"
4767 not allowed in BSSGP Userdata
4768 0e -- length (14 bytes -- only 8 bytes remain)
4769 00 06 01 c0 41 6c 43 38 */
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004770
4771 msgb_free(msg);
Stefan Sperling322643f2018-06-23 16:50:06 +02004772
4773 cleanup_test();
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004774}
4775
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004776static struct log_info_cat gprs_categories[] = {
4777 [DGPRS] = {
4778 .name = "DGPRS",
4779 .description = "GPRS Packet Service",
4780 .enabled = 1, .loglevel = LOGL_DEBUG,
4781 },
4782 [DNS] = {
4783 .name = "DNS",
4784 .description = "GPRS Network Service (NS)",
4785 .enabled = 1, .loglevel = LOGL_INFO,
4786 },
4787 [DBSSGP] = {
4788 .name = "DBSSGP",
4789 .description = "GPRS BSS Gateway Protocol (BSSGP)",
4790 .enabled = 1, .loglevel = LOGL_DEBUG,
4791 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004792};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004793
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004794static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004795 .cat = gprs_categories,
4796 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004797};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004798
4799int main(int argc, char **argv)
4800{
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004801 talloc_enable_leak_report();
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004802 tall_sgsn_ctx = talloc_named_const(NULL, 0, "gbproxy_test");
4803 void *log_ctx = talloc_named_const(tall_sgsn_ctx, 0, "log");
Neels Hofmeyr4c2d4ab2016-09-16 02:31:17 +02004804
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004805 msgb_talloc_ctx_init(tall_sgsn_ctx, 0);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004806
4807 osmo_init_logging2(log_ctx, &info);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004808 log_set_use_color(osmo_stderr_target, 0);
4809 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004810 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
4811 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004812
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004813 rate_ctr_init(tall_sgsn_ctx);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004814
4815 setlinebuf(stdout);
4816
4817 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02004818 gbproxy_init_config(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004819 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004820 test_gbproxy_ident_changes();
Alexander Couzens82182d02020-09-22 13:21:46 +02004821 test_gbproxy_ra_patching();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004822 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02004823 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02004824 test_gbproxy_ptmsi_patching();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02004825 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02004826 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02004827 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004828 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004829 test_gbproxy_tlli_expire();
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004830 test_gbproxy_stored_messages();
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004831 test_gbproxy_parse_bssgp_unitdata();
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004832 gbprox_reset(&gbcfg);
4833 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
4834 rate_ctr_group_free(gbcfg.ctrg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004835 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004836
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004837 talloc_free(log_ctx);
4838 /* expecting root and msgb ctx, empty */
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004839 OSMO_ASSERT(talloc_total_blocks(tall_sgsn_ctx) == 2);
4840 talloc_free(tall_sgsn_ctx);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004841
4842 return 0;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004843}