blob: fec5914d8695979a66b1dadcc8e30d0085621baf [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{
Daniel Willmann447ad442020-11-26 18:19:21 +0100121 struct gbproxy_nse *nse;
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 Freytherb9004592014-08-04 11:26:54 +0200131
Daniel Willmann447ad442020-11-26 18:19:21 +0100132 llist_for_each_entry(nse, &cfg->nse_peers, list) {
133 struct gbproxy_peer *peer;
134 llist_for_each_entry(peer, &nse->bts_peers, list) {
135 struct gbproxy_link_info *link_info;
136 struct gbproxy_patch_state *state = &peer->patch_state;
137 gsm48_parse_ra(&raid, peer->ra);
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200138
Daniel Willmann447ad442020-11-26 18:19:21 +0100139 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, RAI %s\n",
140 indent, "",
141 nse->nsei, peer->bvci,
142 peer->blocked ? "" : "not ",
143 osmo_rai_name(&raid));
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200144
Daniel Willmann447ad442020-11-26 18:19:21 +0100145 if (rc < 0)
146 return rc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200147
Daniel Willmann447ad442020-11-26 18:19:21 +0100148 desc = peer->ctrg->desc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200149
Daniel Willmann447ad442020-11-26 18:19:21 +0100150 for (i = 0; i < desc->num_ctr; i++) {
151 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
152 if (ctr->current) {
153 rc = fprintf(stream, "%*s %s: %llu\n",
154 indent, "",
155 desc->ctr_desc[i].description,
156 (long long)ctr->current);
157
158 if (rc < 0)
159 return rc;
160 }
161 }
162
163 fprintf(stream, "%*s TLLI-Cache: %d\n",
164 indent, "", state->logical_link_count);
165 llist_for_each_entry(link_info, &state->logical_links, list) {
166 struct osmo_mobile_identity mi;
167 const char *imsi_str;
168 time_t age = now ? now - link_info->timestamp : 0;
169 int stored_msgs = 0;
170 struct llist_head *iter;
171 enum gbproxy_match_id match_id;
172 llist_for_each(iter, &link_info->stored_msgs)
173 stored_msgs++;
174
175 if (link_info->imsi > 0) {
176 if (osmo_mobile_identity_decode(&mi, link_info->imsi, link_info->imsi_len, false)
177 || mi.type != GSM_MI_TYPE_IMSI)
178 imsi_str = "(invalid)";
179 else
180 imsi_str = mi.imsi;
181 } else {
182 imsi_str = "(none)";
183 }
184 fprintf(stream, "%*s TLLI %08x",
185 indent, "", link_info->tlli.current);
186 if (link_info->tlli.assigned)
187 fprintf(stream, "/%08x", link_info->tlli.assigned);
188 if (link_info->sgsn_tlli.current) {
189 fprintf(stream, " -> %08x",
190 link_info->sgsn_tlli.current);
191 if (link_info->sgsn_tlli.assigned)
192 fprintf(stream, "/%08x",
193 link_info->sgsn_tlli.assigned);
194 }
195 fprintf(stream, ", IMSI %s, AGE %d",
196 imsi_str, (int)age);
197
198 if (stored_msgs)
199 fprintf(stream, ", STORED %d", stored_msgs);
200
201 for (match_id = 0; match_id < ARRAY_SIZE(cfg->matches);
202 ++match_id) {
203 if (cfg->matches[match_id].enable &&
204 link_info->is_matching[match_id]) {
205 fprintf(stream, ", IMSI matches");
206 break;
207 }
208 }
209
210 if (link_info->imsi_acq_pending)
211 fprintf(stream, ", IMSI acquisition in progress");
212
213 if (cfg->route_to_sgsn2)
214 fprintf(stream, ", SGSN NSEI %d",
215 link_info->sgsn_nsei);
216
217 if (link_info->is_deregistered)
218 fprintf(stream, ", DE-REGISTERED");
219
220 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200221 if (rc < 0)
222 return rc;
223 }
224 }
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200225 }
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200226 return 0;
227}
228
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200229const uint8_t *convert_ra(struct gprs_ra_id *raid)
230{
Max25c65c32018-01-08 14:43:53 +0100231 static struct gsm48_ra_id r;
232 gsm48_encode_ra(&r, raid);
233 return (const uint8_t *)&r;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200234}
235
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200236/* DTAP - Attach Request */
237static const unsigned char dtap_attach_req[] = {
238 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
239 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
240 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
241 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
242 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
243 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200244};
245
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200246/* DTAP - Attach Request (invalid RAI) */
247static const unsigned char dtap_attach_req2[] = {
248 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
249 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
250 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
251 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
252 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
253 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
254};
255
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200256/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
257static const unsigned char dtap_attach_req3[] = {
258 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
259 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
260 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
261 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
262 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
263 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
264};
265
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100266/* DTAP - Attach Request (IMSI 12131415161718) */
267static const unsigned char dtap_attach_req4[] = {
268 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
269 0x08, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200270 0xf8, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100271 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00,
272 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60,
273 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80,
274 0x00,
275};
276
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200277/* DTAP - Identity Request */
278static const unsigned char dtap_identity_req[] = {
279 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200280};
281
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200282/* DTAP - Identity Response */
283static const unsigned char dtap_identity_resp[] = {
284 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200285 0x16, 0x17, 0xf8
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200286};
287
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200288/* DTAP - Identity Response, IMSI 2 */
289static const unsigned char dtap_identity2_resp[] = {
290 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200291 0x16, 0x17, 0xf8
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200292};
293
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200294/* DTAP - Identity Response, IMSI 3 */
295static const unsigned char dtap_identity3_resp[] = {
296 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200297 0x26, 0x27, 0xf8
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200298};
299
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200300/* DTAP - Attach Accept */
301static const unsigned char dtap_attach_acc[] = {
302 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
303 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
304 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200305};
306
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200307/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200308static const unsigned char dtap_attach_acc2[] = {
309 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
310 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
311 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
312};
313
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200314/* DTAP - Attach Complete */
315static const unsigned char dtap_attach_complete[] = {
316 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200317};
318
Jacob Erlbeck2bf32612014-09-22 11:26:58 +0200319/* DTAP - Attach Reject (GPRS services not allowed) */
320static const unsigned char dtap_attach_rej7[] = {
321 0x08, 0x04, 0x07
322};
323
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200324/* DTAP - GMM Information */
325static const unsigned char dtap_gmm_information[] = {
326 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200327};
328
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200329/* DTAP - Routing Area Update Request */
330static const unsigned char dtap_ra_upd_req[] = {
331 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
332 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
333 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
334 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
335 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
336 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
337 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200338};
339
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200340/* DTAP - Routing Area Update Accept */
341static const unsigned char dtap_ra_upd_acc[] = {
342 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
343 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
344 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200345};
346
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200347/* DTAP - Routing Area Update Accept, P-TMSI 2 */
348static const unsigned char dtap_ra_upd_acc2[] = {
349 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
350 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
351 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
352};
353
354/* DTAP - Routing Area Update Accept, P-TMSI 3 */
355static const unsigned char dtap_ra_upd_acc3[] = {
356 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
357 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
358 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
359};
360
361/* DTAP - Routing Area Update Complete */
362static const unsigned char dtap_ra_upd_complete[] = {
363 0x08, 0x0a
364};
365
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200366/* DTAP - Routing Area Update Reject */
367/* cause = 10 ("Implicitly detached"), force_standby = 0 */
368static const unsigned char dtap_ra_upd_rej[] = {
369 0x08, 0x0b, 0x0a, 0x00,
370};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200371
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200372/* DTAP - Activate PDP Context Request */
373static const unsigned char dtap_act_pdp_ctx_req[] = {
374 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200375 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
377 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
378 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
379 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200380 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200381};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200382
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200383/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200384/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200385static const unsigned char dtap_detach_po_req[] = {
386 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
387 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200388};
389
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200390/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200391/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200392static const unsigned char dtap_detach_req[] = {
393 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
394 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200395};
396
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200397/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200398static const unsigned char dtap_detach_acc[] = {
399 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200400};
401
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200402/* DTAP - Detach Request (MT) */
403/* normal detach, reattach required, implicitly detached */
404static const unsigned char dtap_mt_detach_rea_req[] = {
405 0x08, 0x05, 0x01, 0x25, 0x0a
406};
407
408/* DTAP - Detach Request (MT) */
409/* normal detach, reattach not required, implicitly detached */
410static const unsigned char dtap_mt_detach_req[] = {
411 0x08, 0x05, 0x02, 0x25, 0x0a
412};
413
414/* DTAP - Detach Accept (MT) */
415static const unsigned char dtap_mt_detach_acc[] = {
416 0x08, 0x06
417};
418
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200419/* GPRS-LLC - SAPI: LLGMM, U, XID */
420static const unsigned char llc_u_xid_ul[] = {
421 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
422 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
423};
424
425/* GPRS-LLC - SAPI: LLGMM, U, XID */
426static const unsigned char llc_u_xid_dl[] = {
427 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
428 0xe4, 0xa9, 0x1a, 0x9e
429};
430
431/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
432static const unsigned char llc_ui_ll11_dns_query_ul[] = {
433 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
434 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
435 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
436 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
437 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
438 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
439 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
440 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
441 0x8f, 0x07
442};
443
444/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
445static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
446 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
447 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
448 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
449 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
450 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
451 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
452 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
453 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
454 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
455 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
456 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
457 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
458 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
459 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
460 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
461 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
462 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
463 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
464 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
465 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
466 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
467 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
468 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
469 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
470 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
471 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
472};
473
Alexander Couzens82182d02020-09-22 13:21:46 +0200474#define NS_ALLOC_HEADROOM 128
475#define NS_ALLOC_SIZE 3072
476static int gprs_ns2_callback(struct osmo_prim_hdr *oph, void *ctx);
477static void send_ns_unitdata(struct gprs_ns2_inst *nsi, const char *text,
478 uint16_t nsei, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200479 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
480{
Alexander Couzens82182d02020-09-22 13:21:46 +0200481 struct msgb *msg;
482 struct osmo_gprs_ns2_prim nsp = {};
483 nsp.nsei = nsei;
484 nsp.bvci = nsbvci;
485 //nsp.u.unitdata.change
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200486
Alexander Couzens82182d02020-09-22 13:21:46 +0200487 if (bssgp_msg_size > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
488 fprintf(stderr, "message too long: %zu\n", bssgp_msg_size);
489 return;
490 }
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200491
Alexander Couzens82182d02020-09-22 13:21:46 +0200492 msg = msgb_alloc_headroom(NS_ALLOC_SIZE, NS_ALLOC_HEADROOM,
493 "GPRS/NS");
494 OSMO_ASSERT(msg);
495 memmove(msg->data, bssgp_msg, bssgp_msg_size);
496 msgb_bssgph(msg) = msg->data;
497 msg->l2h = msg->data;
498 msg->l3h = msg->data;
499 msgb_put(msg, bssgp_msg_size);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200500
Alexander Couzens82182d02020-09-22 13:21:46 +0200501 printf("PROCESSING %s from NSEI %d\n%s\n\n",
502 text, nsei,
503 osmo_hexdump(bssgp_msg, bssgp_msg_size));
504
505
506 //gprs_process_message(nsi, text ? text : "UNITDATA", nsei, msg, bssgp_msg_size + 4);
507 osmo_prim_init(&nsp.oph, SAP_NS, PRIM_NS_UNIT_DATA,
508 PRIM_OP_INDICATION, msg);
509
510 gprs_ns2_callback(&nsp.oph, &gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +0200511}
512static int gbprox_test_bssgp_send_cb(void *ctx, struct msgb *msg);
513
514/* wrap */
515int gprs_ns2_recv_prim(struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph)
516{
517 struct osmo_gprs_ns2_prim *nsp;
518
519 if (oph->sap != SAP_NS)
520 return 0;
521
522 nsp = container_of(oph, struct osmo_gprs_ns2_prim, oph);
523
524 if (oph->operation != PRIM_OP_REQUEST) {
525 LOGP(DPCU, LOGL_NOTICE, "NS: %s Unknown prim %d from NS\n",
526 get_value_string(osmo_prim_op_names, oph->operation),
527 oph->operation);
528 return 0;
529 }
530
531 switch (oph->primitive) {
532 case PRIM_NS_UNIT_DATA:
533 /* hand the message into the BSSGP implementation */
534 msgb_bssgph(oph->msg) = oph->msg->l3h;
535 msgb_bvci(oph->msg) = nsp->bvci;
536 msgb_nsei(oph->msg) = nsp->nsei;
537 printf("NS2 UD REQUEST, prim %d, msg length %zu, bvci 0x%04x\n%s\n\n",
538 oph->primitive, msgb_bssgp_len(oph->msg), nsp->bvci,
539 osmo_hexdump(msgb_l3(oph->msg), msgb_l3len(oph->msg)));
540 return gbprox_test_bssgp_send_cb(&gbcfg, oph->msg);
541 break;
542 default:
543 printf("NS2 REQUEST, prim %d, bvci 0x%04x\n\n",
544 oph->primitive, nsp->bvci);
545
546 break;
547 }
548 return 0;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200549}
550
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200551static void send_bssgp_ul_unitdata(
Alexander Couzens82182d02020-09-22 13:21:46 +0200552 struct gprs_ns2_inst *nsi, const char *text,
553 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200554 struct gprs_ra_id *raid, uint16_t cell_id,
555 const uint8_t *llc_msg, size_t llc_msg_size)
556{
557 /* GPRS Network Service, PDU type: NS_UNITDATA */
558 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
559 unsigned char msg[4096] = {
560 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
561 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
562 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
563 };
564
565 size_t bssgp_msg_size = 23 + llc_msg_size;
566
567 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
568
Max25c65c32018-01-08 14:43:53 +0100569 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 10), raid);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200570 msg[1] = (uint8_t)(tlli >> 24);
571 msg[2] = (uint8_t)(tlli >> 16);
572 msg[3] = (uint8_t)(tlli >> 8);
573 msg[4] = (uint8_t)(tlli >> 0);
574 msg[16] = cell_id / 256;
575 msg[17] = cell_id % 256;
576 msg[21] = llc_msg_size / 256;
577 msg[22] = llc_msg_size % 256;
578 memcpy(msg + 23, llc_msg, llc_msg_size);
579
580 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
Alexander Couzens82182d02020-09-22 13:21:46 +0200581 nsei, nsbvci, msg, bssgp_msg_size);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200582}
583
584static void send_bssgp_dl_unitdata(
Alexander Couzens82182d02020-09-22 13:21:46 +0200585 struct gprs_ns2_inst *nsi, const char *text,
586 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200587 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
588 const uint8_t *llc_msg, size_t llc_msg_size)
589{
590 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
591 unsigned char msg[4096] = {
592 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
593 0x16, 0x82, 0x02, 0x58,
594 };
595 unsigned char racap_drx[] = {
596 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
597 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
598 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
599 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
600 };
601
602 size_t bssgp_msg_size = 0;
603
604 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
605
606 msg[1] = (uint8_t)(tlli >> 24);
607 msg[2] = (uint8_t)(tlli >> 16);
608 msg[3] = (uint8_t)(tlli >> 8);
609 msg[4] = (uint8_t)(tlli >> 0);
610
611 bssgp_msg_size = 12;
612
613 if (with_racap_drx) {
614 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
615 bssgp_msg_size += sizeof(racap_drx);
616 }
617
618 if (imsi) {
619 OSMO_ASSERT(imsi_size <= 127);
620 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
621 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
622 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
623 bssgp_msg_size += 2 + imsi_size;
624 }
625
626 if ((bssgp_msg_size % 4) != 0) {
627 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
628 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
629 msg[bssgp_msg_size + 1] = 0x80 | abytes;
630 memset(msg + bssgp_msg_size + 2, 0, abytes);
631 bssgp_msg_size += 2 + abytes;
632 }
633
634 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
635 if (llc_msg_size < 128) {
636 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
637 bssgp_msg_size += 2;
638 } else {
639 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
640 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
641 bssgp_msg_size += 3;
642 }
643 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
644 bssgp_msg_size += llc_msg_size;
645
646
647 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
Alexander Couzens82182d02020-09-22 13:21:46 +0200648 nsei, nsbvci, msg, bssgp_msg_size);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200649}
650
Alexander Couzens82182d02020-09-22 13:21:46 +0200651static void send_bssgp_reset(struct gprs_ns2_inst *nsi,
652 uint16_t nsei, uint16_t bvci)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200653{
654 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
655 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200656 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200657 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200658 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
659 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200660 };
661
662 msg[3] = bvci / 256;
663 msg[4] = bvci % 256;
664
Alexander Couzens82182d02020-09-22 13:21:46 +0200665 send_ns_unitdata(nsi, "BVC_RESET", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200666}
667
Alexander Couzens82182d02020-09-22 13:21:46 +0200668static void send_bssgp_reset_ack(struct gprs_ns2_inst *nsi,
669 uint16_t nsei, uint16_t bvci)
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200670{
671 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
672 * BSSGP RESET_ACK */
673 static unsigned char msg[5] = {
674 0x23, 0x04, 0x82, 0x00,
675 0x00
676 };
677
678 msg[3] = bvci / 256;
679 msg[4] = bvci % 256;
680
Alexander Couzens82182d02020-09-22 13:21:46 +0200681 send_ns_unitdata(nsi, "BVC_RESET_ACK", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200682}
683
Alexander Couzens82182d02020-09-22 13:21:46 +0200684static void send_bssgp_suspend(struct gprs_ns2_inst *nsi,
685 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200686 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200687 struct gprs_ra_id *raid)
688{
689 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
690 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200691 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
692 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200693 };
694
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200695 msg[3] = (uint8_t)(tlli >> 24);
696 msg[4] = (uint8_t)(tlli >> 16);
697 msg[5] = (uint8_t)(tlli >> 8);
698 msg[6] = (uint8_t)(tlli >> 0);
699
Max25c65c32018-01-08 14:43:53 +0100700 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200701
Alexander Couzens82182d02020-09-22 13:21:46 +0200702 send_ns_unitdata(nsi, "BVC_SUSPEND", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200703}
704
Alexander Couzens82182d02020-09-22 13:21:46 +0200705static void send_bssgp_suspend_ack(struct gprs_ns2_inst *nsi,
706 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200707 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200708 struct gprs_ra_id *raid)
709{
710 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
711 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200712 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
713 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200714 0x81, 0x01
715 };
716
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200717 msg[3] = (uint8_t)(tlli >> 24);
718 msg[4] = (uint8_t)(tlli >> 16);
719 msg[5] = (uint8_t)(tlli >> 8);
720 msg[6] = (uint8_t)(tlli >> 0);
721
Max25c65c32018-01-08 14:43:53 +0100722 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200723
Alexander Couzens82182d02020-09-22 13:21:46 +0200724 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200725}
726
Alexander Couzens82182d02020-09-22 13:21:46 +0200727static void send_bssgp_llc_discarded(struct gprs_ns2_inst *nsi,
728 uint16_t nsei,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200729 uint16_t bvci, uint32_t tlli,
730 unsigned n_frames, unsigned n_octets)
731{
732 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
733 unsigned char msg[] = {
734 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
735 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
736 /* n octets */ 0xff, 0xff, 0xff
737 };
738
739 msg[3] = (uint8_t)(tlli >> 24);
740 msg[4] = (uint8_t)(tlli >> 16);
741 msg[5] = (uint8_t)(tlli >> 8);
742 msg[6] = (uint8_t)(tlli >> 0);
743 msg[9] = (uint8_t)(n_frames);
744 msg[12] = (uint8_t)(bvci >> 8);
745 msg[13] = (uint8_t)(bvci >> 0);
746 msg[16] = (uint8_t)(n_octets >> 16);
747 msg[17] = (uint8_t)(n_octets >> 8);
748 msg[18] = (uint8_t)(n_octets >> 0);
749
Alexander Couzens82182d02020-09-22 13:21:46 +0200750 send_ns_unitdata(nsi, "LLC_DISCARDED", nsei, 0, msg, sizeof(msg));
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200751}
752
Alexander Couzens82182d02020-09-22 13:21:46 +0200753static void send_bssgp_paging(struct gprs_ns2_inst *nsi,
754 uint16_t nsei,
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200755 const uint8_t *imsi, size_t imsi_size,
756 struct gprs_ra_id *raid, uint32_t ptmsi)
757{
758 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
759 unsigned char msg[100] = {
760 0x06,
761 };
762
763 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
764 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
765
766 size_t bssgp_msg_size = 1;
767
768 if (imsi) {
769 OSMO_ASSERT(imsi_size <= 127);
770 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
771 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
772 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
773 bssgp_msg_size += 2 + imsi_size;
774 }
775
776 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
777 bssgp_msg_size += sizeof(drx_ie);
778
779 if (raid) {
780 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
781 msg[bssgp_msg_size+1] = 0x86;
Max25c65c32018-01-08 14:43:53 +0100782 gsm48_encode_ra((struct gsm48_ra_id *)(msg + bssgp_msg_size + 2), raid);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200783 bssgp_msg_size += 8;
784 }
785
786 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
787 bssgp_msg_size += sizeof(qos_ie);
788
789 if (ptmsi != GSM_RESERVED_TMSI) {
790 const uint32_t ptmsi_be = htonl(ptmsi);
791 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
792 msg[bssgp_msg_size+1] = 0x84;
793 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
794 bssgp_msg_size += 6;
795 }
796
Alexander Couzens82182d02020-09-22 13:21:46 +0200797 send_ns_unitdata(nsi, "PAGING_PS", nsei, 0, msg, bssgp_msg_size);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200798}
799
Alexander Couzens82182d02020-09-22 13:21:46 +0200800static void send_bssgp_flow_control_bvc(struct gprs_ns2_inst *nsi,
801 uint16_t nsei,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200802 uint16_t bvci, uint8_t tag)
803{
804 /* GPRS Network Service, PDU type: NS_UNITDATA,
805 * BSSGP FLOW_CONTROL_BVC */
806 unsigned char msg[] = {
807 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
808 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
809 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
810 };
811
812 msg[3] = tag;
813
Alexander Couzens82182d02020-09-22 13:21:46 +0200814 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", nsei, bvci,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200815 msg, sizeof(msg));
816}
817
Alexander Couzens82182d02020-09-22 13:21:46 +0200818static void send_bssgp_flow_control_bvc_ack(struct gprs_ns2_inst *nsi,
819 uint16_t nsei,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200820 uint16_t bvci, uint8_t tag)
821{
822 /* GPRS Network Service, PDU type: NS_UNITDATA,
823 * BSSGP FLOW_CONTROL_BVC_ACK */
824 unsigned char msg[] = {
825 0x27, 0x1e, 0x81, /* Tag */ 0xce
826 };
827
828 msg[3] = tag;
829
Alexander Couzens82182d02020-09-22 13:21:46 +0200830 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", nsei, bvci,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200831 msg, sizeof(msg));
832}
833
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200834static void send_llc_ul_ui(
Alexander Couzens82182d02020-09-22 13:21:46 +0200835 struct gprs_ns2_inst *nsi, const char *text,
836 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200837 struct gprs_ra_id *raid, uint16_t cell_id,
838 unsigned sapi, unsigned nu,
839 const uint8_t *msg, size_t msg_size)
840{
841 unsigned char llc_msg[4096] = {
842 0x00, 0xc0, 0x01
843 };
844
845 size_t llc_msg_size = 3 + msg_size + 3;
846 uint8_t e_bit = 0;
847 uint8_t pm_bit = 1;
848 unsigned fcs;
849
850 nu &= 0x01ff;
851
852 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
853
854 llc_msg[0] = (sapi & 0x0f);
855 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
856 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
857
858 memcpy(llc_msg + 3, msg, msg_size);
859
860 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
861 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
862 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
863 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
864
865 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
Alexander Couzens82182d02020-09-22 13:21:46 +0200866 nsei, nsbvci, tlli, raid, cell_id,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200867 llc_msg, llc_msg_size);
868}
869
870static void send_llc_dl_ui(
Alexander Couzens82182d02020-09-22 13:21:46 +0200871 struct gprs_ns2_inst *nsi, const char *text,
872 uint16_t nsei, uint16_t nsbvci, uint32_t tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200873 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
874 unsigned sapi, unsigned nu,
875 const uint8_t *msg, size_t msg_size)
876{
877 /* GPRS Network Service, PDU type: NS_UNITDATA */
878 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
879 unsigned char llc_msg[4096] = {
880 0x00, 0x00, 0x01
881 };
882
883 size_t llc_msg_size = 3 + msg_size + 3;
884 uint8_t e_bit = 0;
885 uint8_t pm_bit = 1;
886 unsigned fcs;
887
888 nu &= 0x01ff;
889
890 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
891
892 llc_msg[0] = 0x40 | (sapi & 0x0f);
893 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
894 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
895
896 memcpy(llc_msg + 3, msg, msg_size);
897
898 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
899 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
900 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
901 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
902
903 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
Alexander Couzens82182d02020-09-22 13:21:46 +0200904 nsei, nsbvci, tlli,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200905 with_racap_drx, imsi, imsi_size,
906 llc_msg, llc_msg_size);
907}
908
909
Alexander Couzens82182d02020-09-22 13:21:46 +0200910/* STATUS indications */
911static void send_ns_avail(struct gprs_ns2_inst *nsi,
912 uint16_t sgsn_nsei)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200913{
Alexander Couzens82182d02020-09-22 13:21:46 +0200914 struct osmo_gprs_ns2_prim nsp = {};
915 nsp.nsei = sgsn_nsei;
916 nsp.bvci = 0;
917 nsp.u.status.cause = NS_AFF_CAUSE_RECOVERY;
918 nsp.u.status.transfer = -1;
919 nsp.u.status.first = true;
920 osmo_prim_init(&nsp.oph, SAP_NS, PRIM_NS_STATUS,
921 PRIM_OP_INDICATION, NULL);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200922
Alexander Couzens82182d02020-09-22 13:21:46 +0200923 gprs_ns2_callback(&nsp.oph, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200924}
925
Alexander Couzens82182d02020-09-22 13:21:46 +0200926static void setup_ns(struct gprs_ns2_inst *nsi,
927 uint16_t nsei)
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200928{
Alexander Couzens82182d02020-09-22 13:21:46 +0200929 printf("Setup NS-VC: "
930 "NSEI 0x%04x(%d)\n\n",
931 nsei, nsei);
932 send_ns_avail(nsi, nsei);
Daniel Willmanncafa3882020-11-30 14:28:52 +0100933 send_bssgp_reset(nsi, nsei, 0);
Alexander Couzens82182d02020-09-22 13:21:46 +0200934}
935
936static void setup_bssgp(struct gprs_ns2_inst *nsi,
937 uint16_t nsei, uint16_t bvci)
938{
939 printf("Setup BSSGP: "
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200940 "BVCI 0x%04x(%d)\n\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200941 bvci, bvci);
942
Alexander Couzens82182d02020-09-22 13:21:46 +0200943 send_bssgp_reset(nsi, nsei, bvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200944}
945
Alexander Couzens82182d02020-09-22 13:21:46 +0200946static void connect_sgsn(struct gprs_ns2_inst *nsi,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200947 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200948{
Alexander Couzens82182d02020-09-22 13:21:46 +0200949 send_ns_avail(nsi, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200950}
951
Alexander Couzens82182d02020-09-22 13:21:46 +0200952/* Function used to send a BSSGP message through NS */
953static int gbprox_test_bssgp_send_cb(void *ctx, struct msgb *msg)
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200954{
Alexander Couzens82182d02020-09-22 13:21:46 +0200955 int rc;
956 struct gbproxy_config *cfg = (struct gbproxy_config *) ctx;
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200957
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200958 uint16_t nsei = msgb_nsei(msg);
Alexander Couzens82182d02020-09-22 13:21:46 +0200959 uint16_t bvci = msgb_bvci(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200960
Jacob Erlbeckacfaff32014-09-22 18:54:34 +0200961 if (received_messages) {
962 struct msgb *msg_copy;
Pau Espin Pedrol816a67d2018-08-15 13:53:48 +0200963 msg_copy = bssgp_msgb_copy(msg, "received_messages");
Jacob Erlbeckacfaff32014-09-22 18:54:34 +0200964 llist_add_tail(&msg_copy->list, received_messages);
965 }
966
Alexander Couzens82182d02020-09-22 13:21:46 +0200967 if (nsei == cfg->nsip_sgsn_nsei)
968 printf("Message for SGSN");
969 else if (nsei == cfg->nsip_sgsn2_nsei)
970 printf("Message for SGSN2");
971 else
972 printf("Message for BSS");
973 printf(" (NSEI=%d BVCI=%d):\n%s\n\n", nsei, bvci, msgb_hexdump(msg));
974
975 rc = msgb_length(msg);
976 msgb_free(msg);
977
978 return rc;
979}
980
981static void gprs_ns2_test_prim_status_cb(struct gbproxy_config *cfg, struct osmo_gprs_ns2_prim *nsp)
982{
983 enum gprs_ns2_affecting_cause cause = nsp->u.status.cause;
984
985 switch (cause) {
986 case NS_AFF_CAUSE_RECOVERY:
987 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d became available\n", nsp->nsei);
988 break;
989 case NS_AFF_CAUSE_FAILURE:
990 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d became unavailable\n", nsp->nsei);
991 break;
992 case NS_AFF_CAUSE_VC_RECOVERY:
993 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d NS-VC %s became available\n", nsp->nsei, nsp->u.status.nsvc);
994 break;
995 case NS_AFF_CAUSE_VC_FAILURE:
996 LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d NS-VC %s became unavailable\n", nsp->nsei, nsp->u.status.nsvc);
997 break;
998 default:
999 LOGP(DPCU, LOGL_NOTICE, "Unhandled status %d (NS-NSE %d)\n", cause, nsp->nsei);
1000 break;
1001 }
1002}
1003
1004int gprs_ns2_prim_cb(struct osmo_prim_hdr *oph, void *ctx);
1005
1006/* override */
1007static int gprs_ns2_callback(struct osmo_prim_hdr *oph, void *ctx)
1008{
1009 struct osmo_gprs_ns2_prim *nsp;
1010 struct gbproxy_config *cfg = (struct gbproxy_config *) ctx;
1011
1012 if (oph->sap != SAP_NS)
1013 return 0;
1014
1015 nsp = container_of(oph, struct osmo_gprs_ns2_prim, oph);
1016
1017 if (oph->operation != PRIM_OP_INDICATION) {
1018 LOGP(DPCU, LOGL_NOTICE, "NS: %s Unknown prim %d from NS\n",
1019 get_value_string(osmo_prim_op_names, oph->operation),
1020 oph->operation);
1021 return 0;
1022 }
1023
1024 switch (oph->primitive) {
1025 case PRIM_NS_UNIT_DATA:
1026 /* hand the message into the BSSGP implementation */
1027 msgb_bssgph(oph->msg) = oph->msg->l3h;
1028 msgb_bvci(oph->msg) = nsp->bvci;
1029 msgb_nsei(oph->msg) = nsp->nsei;
1030 printf("NS2 CALLBACK, prim %d, msg length %zu, bvci 0x%04x\n%s\n\n",
1031 oph->primitive, msgb_bssgp_len(oph->msg), nsp->bvci,
1032 osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));
1033 break;
1034 case PRIM_NS_STATUS:
1035 gprs_ns2_test_prim_status_cb(cfg, nsp);
1036 default:
1037 printf("NS2 CALLBACK, prim %d, bvci 0x%04x\n\n",
1038 oph->primitive, nsp->bvci);
1039
1040 break;
1041 }
1042
Daniel Willmann02f2c342020-11-04 17:32:56 +01001043 /* Hand off to gbproxy which will free the msg */
Alexander Couzens82182d02020-09-22 13:21:46 +02001044 return gprs_ns2_prim_cb(oph, ctx);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001045}
1046
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001047/* Get the next message from the receive FIFO
1048 *
1049 * \returns a pointer to the message which will be invalidated at the next call
1050 * to expect_msg. Returns NULL, if there is no message left.
1051 */
1052static struct msgb *expect_msg(void)
1053{
1054 static struct msgb *msg = NULL;
1055
1056 msgb_free(msg);
1057 msg = NULL;
1058
1059 if (!received_messages)
1060 return NULL;
1061
1062 if (llist_empty(received_messages))
1063 return NULL;
1064
1065 msg = llist_entry(received_messages->next, struct msgb, list);
1066 llist_del(&msg->list);
1067
1068 return msg;
1069}
1070
1071struct expect_result {
1072 struct msgb *msg;
1073 struct gprs_gb_parse_context parse_ctx;
1074};
1075
1076static struct expect_result *expect_bssgp_msg(
1077 int match_nsei, int match_bvci, int match_pdu_type)
1078{
1079 static struct expect_result result;
1080 static const struct expect_result empty_result = {0,};
1081 static struct msgb *msg;
1082 uint16_t nsei;
1083 int rc;
1084
1085 memcpy(&result, &empty_result, sizeof(result));
1086
1087 msg = expect_msg();
1088 if (!msg)
1089 return NULL;
1090
1091 nsei = msgb_nsei(msg);
1092
1093 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1094 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1095 __func__, match_nsei, nsei);
1096 return NULL;
1097 }
1098
1099 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1100 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1101 __func__, match_bvci, msgb_bvci(msg));
1102 return NULL;
1103 }
1104
1105 result.msg = msg;
1106
1107 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1108 result.parse_ctx.peer_nsei = nsei;
1109
1110 if (!msgb_bssgph(msg)) {
1111 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1112 return NULL;
1113 }
1114
1115 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1116 &result.parse_ctx);
1117
1118 if (!rc) {
1119 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1120 return NULL;
1121 }
1122
1123 if (match_pdu_type != MATCH_ANY &&
1124 match_pdu_type != result.parse_ctx.pdu_type) {
1125 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1126 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1127 return NULL;
1128 }
1129
1130 return &result;
1131}
1132
1133static struct expect_result *expect_llc_msg(
1134 int match_nsei, int match_bvci, int match_sapi, int match_type)
1135{
1136 static struct expect_result *result;
1137
1138 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1139 if (!result)
1140 return NULL;
1141
1142 if (!result->parse_ctx.llc) {
1143 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1144 return NULL;
1145 }
1146
1147 if (match_sapi != MATCH_ANY &&
1148 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1149 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1150 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1151 return NULL;
1152 }
1153
1154 if (match_type != MATCH_ANY &&
1155 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1156 fprintf(stderr,
1157 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1158 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1159 return NULL;
1160 }
1161
1162 return result;
1163}
1164
1165static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1166 int match_type)
1167{
1168 static struct expect_result *result;
1169
1170 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1171 if (!result)
1172 return NULL;
1173
1174 if (!result->parse_ctx.g48_hdr) {
1175 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1176 return NULL;
1177 }
1178
1179 if (match_type != MATCH_ANY &&
1180 match_type != result->parse_ctx.g48_hdr->msg_type) {
1181 fprintf(stderr,
1182 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1183 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1184 return NULL;
1185 }
1186
1187 return result;
1188}
1189
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001190static void test_gbproxy()
1191{
Alexander Couzens82182d02020-09-22 13:21:46 +02001192 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
1193 uint16_t bss_nsei[2] = {0x1000, 0x2000};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001194
Alexander Couzens82182d02020-09-22 13:21:46 +02001195 gbcfg.nsi = nsi;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001196 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1197
Alexander Couzens82182d02020-09-22 13:21:46 +02001198 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001199
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001200 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001201 printf("--- Initialise SGSN ---\n\n");
1202
Alexander Couzens82182d02020-09-22 13:21:46 +02001203 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001204
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001205 printf("--- Initialise BSS 1 ---\n\n");
1206
Alexander Couzens82182d02020-09-22 13:21:46 +02001207 setup_ns(nsi, bss_nsei[0]);
1208 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001209 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001210
Alexander Couzens82182d02020-09-22 13:21:46 +02001211 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001212
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001213 printf("--- Initialise BSS 2 ---\n\n");
1214
Alexander Couzens82182d02020-09-22 13:21:46 +02001215 setup_ns(nsi, bss_nsei[1]);
1216 setup_bssgp(nsi, bss_nsei[1], 0x2002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001217 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001218
Alexander Couzens82182d02020-09-22 13:21:46 +02001219 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x2002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001220
1221 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1222
Alexander Couzens82182d02020-09-22 13:21:46 +02001223 setup_bssgp(nsi, bss_nsei[0], 0x1012);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001224 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001225
Alexander Couzens82182d02020-09-22 13:21:46 +02001226 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1012);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001227
1228 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1229
Alexander Couzens82182d02020-09-22 13:21:46 +02001230 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001231 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001232
Alexander Couzens82182d02020-09-22 13:21:46 +02001233 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001234
1235 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1236
Alexander Couzens82182d02020-09-22 13:21:46 +02001237 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001238 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001239
Alexander Couzens82182d02020-09-22 13:21:46 +02001240 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001241
1242 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1243
Alexander Couzens82182d02020-09-22 13:21:46 +02001244 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001245
1246 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1247
Alexander Couzens82182d02020-09-22 13:21:46 +02001248 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001249
1250 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1251
Alexander Couzens82182d02020-09-22 13:21:46 +02001252 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001253
1254 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1255
Alexander Couzens82182d02020-09-22 13:21:46 +02001256 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001257
1258 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1259
Alexander Couzens82182d02020-09-22 13:21:46 +02001260 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x2002, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001261
1262 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1263
Alexander Couzens82182d02020-09-22 13:21:46 +02001264 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x2002, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001265
1266 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1267
Alexander Couzens82182d02020-09-22 13:21:46 +02001268 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001269 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001270
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001271 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001272
Alexander Couzens82182d02020-09-22 13:21:46 +02001273 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001274
1275 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1276
Alexander Couzens82182d02020-09-22 13:21:46 +02001277 send_ns_unitdata(nsi, NULL, bss_nsei[0], 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001278
1279 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1280
Alexander Couzens82182d02020-09-22 13:21:46 +02001281 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x1012, (uint8_t *)"", 0);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001282
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001283 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1284
Alexander Couzens82182d02020-09-22 13:21:46 +02001285 send_ns_unitdata(nsi, NULL, SGSN_NSEI, 0x10ff, (uint8_t *)"", 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001286
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001287 /* Find peer */
1288 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1289 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1290 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1291 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1292 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1293 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1294
1295
1296 /* Cleanup */
1297 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1298 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1299 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1300 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1301 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1302
1303 dump_peers(stdout, 0, 0, &gbcfg);
1304
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001305 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001306
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001307 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001308 gprs_ns2_free(nsi);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001309 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001310}
1311
1312static void test_gbproxy_ident_changes()
1313{
Alexander Couzens82182d02020-09-22 13:21:46 +02001314 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
1315 uint16_t bss_nsei[2] = {0x1000, 0x2000};
Daniel Willmannf7a1aed2020-11-30 15:15:23 +01001316 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002};
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001317
Alexander Couzens82182d02020-09-22 13:21:46 +02001318 gbcfg.nsi = nsi;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001319 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1320
Alexander Couzens82182d02020-09-22 13:21:46 +02001321 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001322
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001323 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001324 printf("--- Initialise SGSN ---\n\n");
1325
Alexander Couzens82182d02020-09-22 13:21:46 +02001326 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001327
1328 printf("--- Initialise BSS 1 ---\n\n");
1329
Alexander Couzens82182d02020-09-22 13:21:46 +02001330 setup_ns(nsi, bss_nsei[0]);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001331
1332 printf("--- Setup BVCI 1 ---\n\n");
1333
Alexander Couzens82182d02020-09-22 13:21:46 +02001334 setup_bssgp(nsi, bss_nsei[0], bvci[0]);
1335 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001336 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001337
1338 printf("--- Setup BVCI 2 ---\n\n");
1339
Alexander Couzens82182d02020-09-22 13:21:46 +02001340 setup_bssgp(nsi, bss_nsei[0], bvci[1]);
1341 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001342 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001343
1344 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1345
Alexander Couzens82182d02020-09-22 13:21:46 +02001346 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[0], (uint8_t *)"", 0);
1347 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[0], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001348
1349 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1350
Alexander Couzens82182d02020-09-22 13:21:46 +02001351 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[1], (uint8_t *)"", 0);
1352 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001353
1354 printf("--- Change NSEI ---\n\n");
1355
Alexander Couzens82182d02020-09-22 13:21:46 +02001356 setup_ns(nsi, bss_nsei[1]);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001357
1358 printf("--- Setup BVCI 1 ---\n\n");
1359
Alexander Couzens82182d02020-09-22 13:21:46 +02001360 setup_bssgp(nsi, bss_nsei[1], bvci[0]);
1361 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001362 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001363
1364 printf("--- Setup BVCI 3 ---\n\n");
1365
Alexander Couzens82182d02020-09-22 13:21:46 +02001366 setup_bssgp(nsi, bss_nsei[1], bvci[2]);
1367 send_bssgp_reset_ack(nsi, SGSN_NSEI, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001368 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001369
1370 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1371
Alexander Couzens82182d02020-09-22 13:21:46 +02001372 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[0], (uint8_t *)"", 0);
1373 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[0], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001374
1375 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1376 " (should fail) ---\n\n");
1377
Alexander Couzens82182d02020-09-22 13:21:46 +02001378 send_ns_unitdata(nsi, NULL, bss_nsei[1], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001379 dump_peers(stdout, 0, 0, &gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001380 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001381 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001382
1383 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1384
Alexander Couzens82182d02020-09-22 13:21:46 +02001385 send_ns_unitdata(nsi, NULL, bss_nsei[0], bvci[2], (uint8_t *)"", 0);
1386 send_ns_unitdata(nsi, NULL, SGSN_NSEI, bvci[2], (uint8_t *)"", 0);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001387
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001388 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001389 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001390
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001391 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001392 gprs_ns2_free(nsi);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001393 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001394}
1395
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001396static void test_gbproxy_ra_patching()
1397{
Alexander Couzens82182d02020-09-22 13:21:46 +02001398 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001399 struct gprs_ra_id rai_bss =
1400 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1401 struct gprs_ra_id rai_sgsn =
1402 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1403 struct gprs_ra_id rai_unknown =
1404 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001405 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001406 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001407 const uint32_t ptmsi = 0xefe2b700;
1408 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001409 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001410 const uint32_t foreign_tlli2 = 0xbb00beef;
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001411 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001412 const char *patch_re = "^9898|^121314";
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001413 struct gbproxy_link_info *link_info;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001414 struct gbproxy_peer *peer;
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001415 LLIST_HEAD(rcv_list);
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001416 struct expect_result *expect_res;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001417
Alexander Couzens82182d02020-09-22 13:21:46 +02001418 uint16_t bss_nsei[1] = { 0x1000 };
1419
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001420 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001421
Alexander Couzens82182d02020-09-22 13:21:46 +02001422 gbcfg.nsi = nsi;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001423 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001424 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001425 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001426 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001427 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001428
Alexander Couzens82182d02020-09-22 13:21:46 +02001429 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001430
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001431 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING],
1432 patch_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001433 fprintf(stderr, "Failed to compile RE '%s': %s\n",
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001434 patch_re, err_msg);
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001435 exit(1);
1436 }
1437
1438
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001439 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001440 printf("--- Initialise SGSN ---\n\n");
1441
Alexander Couzens82182d02020-09-22 13:21:46 +02001442 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001443
1444 printf("--- Initialise BSS 1 ---\n\n");
1445
Alexander Couzens82182d02020-09-22 13:21:46 +02001446 setup_ns(nsi, bss_nsei[0]);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001447
1448 received_messages = &rcv_list;
1449
Alexander Couzens82182d02020-09-22 13:21:46 +02001450 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001451 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001452
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001453 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001454 OSMO_ASSERT(peer != NULL);
1455
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001456 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_BVC_RESET));
1457
Alexander Couzens82182d02020-09-22 13:21:46 +02001458 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001459
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001460 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_BVC_RESET_ACK));
1461
Alexander Couzens82182d02020-09-22 13:21:46 +02001462 send_bssgp_suspend(nsi, bss_nsei[0], 0xccd1758b, &rai_bss);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001463
1464 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_SUSPEND));
1465
Alexander Couzens82182d02020-09-22 13:21:46 +02001466 send_bssgp_suspend_ack(nsi, SGSN_NSEI, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001467
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001468 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_SUSPEND_ACK));
1469
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001470 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001471 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001472
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001473 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1474 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1475
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001476 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1477
Alexander Couzens82182d02020-09-22 13:21:46 +02001478 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001479 foreign_tlli, &rai_bss, cell_id,
1480 GPRS_SAPI_GMM, 0,
1481 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001482
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001483 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001484 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001485
Alexander Couzens82182d02020-09-22 13:21:46 +02001486 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001487 foreign_tlli, 0, NULL, 0,
1488 GPRS_SAPI_GMM, 0,
1489 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001490
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001491 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
1492
Alexander Couzens82182d02020-09-22 13:21:46 +02001493 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001494 foreign_tlli, &rai_bss, cell_id,
1495 GPRS_SAPI_GMM, 3,
1496 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001497
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001498 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
1499
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001500 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1501 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1502
Alexander Couzens82182d02020-09-22 13:21:46 +02001503 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001504 foreign_tlli, 1, imsi, sizeof(imsi),
1505 GPRS_SAPI_GMM, 1,
1506 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001507
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001508 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
1509
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001510 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1511
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001512 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1513 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1514 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1515
1516 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1517 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1518 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1519
1520 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1521 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1522 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1523
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001524 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1525 OSMO_ASSERT(link_info);
1526 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1527 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1528 OSMO_ASSERT(!link_info->tlli.bss_validated);
1529 OSMO_ASSERT(!link_info->tlli.net_validated);
1530 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1531 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1532 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1533 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001534
Alexander Couzens82182d02020-09-22 13:21:46 +02001535 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001536 local_tlli, &rai_bss, cell_id,
1537 GPRS_SAPI_GMM, 4,
1538 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001539
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001540 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
1541
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001542 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1543
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001544 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1545 OSMO_ASSERT(link_info);
1546 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1547 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1548 OSMO_ASSERT(link_info->tlli.bss_validated);
1549 OSMO_ASSERT(!link_info->tlli.net_validated);
1550 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1551 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1552 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1553 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001554
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001555 /* Replace APN (1) */
Alexander Couzens82182d02020-09-22 13:21:46 +02001556 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001557 local_tlli, &rai_bss, cell_id,
1558 GPRS_SAPI_GMM, 3,
1559 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001560
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001561 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1562
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001563 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1564
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001565 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1566 OSMO_ASSERT(link_info);
1567 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1568 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1569 OSMO_ASSERT(link_info->tlli.bss_validated);
1570 OSMO_ASSERT(!link_info->tlli.net_validated);
1571 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1572 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1573 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1574 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001575
Alexander Couzens82182d02020-09-22 13:21:46 +02001576 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001577 local_tlli, 1, imsi, sizeof(imsi),
1578 GPRS_SAPI_GMM, 2,
1579 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001580
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001581 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
1582
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001583 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1584
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001585 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1586 OSMO_ASSERT(link_info);
1587 OSMO_ASSERT(link_info->tlli.assigned == 0);
1588 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1589 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1590 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001591
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001592 /* Replace APN (2) */
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 Erlbeckc79beec2014-10-10 09:48:12 +02001598 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1599 OSMO_ASSERT(expect_res != NULL);
1600 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == gbcfg.core_apn_size + 2);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001601
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001602 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1603
Jacob Erlbeck73685282014-05-23 20:48:07 +02001604 gbcfg.core_apn[0] = 0;
1605 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001606
1607 /* Remove APN */
Alexander Couzens82182d02020-09-22 13:21:46 +02001608 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001609 local_tlli, &rai_bss, cell_id,
1610 GPRS_SAPI_GMM, 3,
1611 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001612
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001613 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1614 OSMO_ASSERT(expect_res != NULL);
1615 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001616
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001617 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1618
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001619 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001620
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001621 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02001622 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001623 local_tlli, &rai_bss, cell_id,
1624 GPRS_SAPI_GMM, 6,
1625 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001626
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001627 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1628
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001629 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1630 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1631
Alexander Couzens82182d02020-09-22 13:21:46 +02001632 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001633 local_tlli, 1, imsi, sizeof(imsi),
1634 GPRS_SAPI_GMM, 5,
1635 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001636
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001637 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
1638
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001639 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001640
1641 printf("--- RA update ---\n\n");
1642
Alexander Couzens82182d02020-09-22 13:21:46 +02001643 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001644 foreign_tlli, &rai_bss, 0x7080,
1645 GPRS_SAPI_GMM, 5,
1646 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001647
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001648 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
1649
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001650 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1651
Alexander Couzens82182d02020-09-22 13:21:46 +02001652 send_llc_dl_ui(nsi, "RA UPD ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001653 foreign_tlli, 1, imsi, sizeof(imsi),
1654 GPRS_SAPI_GMM, 6,
1655 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001656
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001657 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_ACK));
1658
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001659 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1660
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001661 /* Remove APN */
Alexander Couzens82182d02020-09-22 13:21:46 +02001662 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001663 local_tlli, &rai_bss, cell_id,
1664 GPRS_SAPI_GMM, 3,
1665 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001666
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001667 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1668 OSMO_ASSERT(expect_res != NULL);
1669 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001670
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001671 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1672
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001673 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001674
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001675 /* Detach (power off -> no Detach Accept) */
Alexander Couzens82182d02020-09-22 13:21:46 +02001676 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001677 local_tlli, &rai_bss, cell_id,
1678 GPRS_SAPI_GMM, 6,
1679 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001680
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001681 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1682
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001683 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1684
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001685 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001686 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001687
1688 printf("--- Bad cases ---\n\n");
1689
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001690 /* The RAI in the Attach Request message differs from the RAI in the
1691 * BSSGP message, only patch the latter */
1692
Alexander Couzens82182d02020-09-22 13:21:46 +02001693 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001694 foreign_tlli2, &rai_bss, cell_id,
1695 GPRS_SAPI_GMM, 0,
1696 dtap_attach_req2, sizeof(dtap_attach_req2));
1697
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001698 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
1699
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001700 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1701
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001702 printf("TLLI is already detached, shouldn't patch\n");
Alexander Couzens82182d02020-09-22 13:21:46 +02001703 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001704 local_tlli, &rai_bss, cell_id,
1705 GPRS_SAPI_GMM, 3,
1706 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001707
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001708 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1709
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001710 printf("Invalid RAI, shouldn't patch\n");
Alexander Couzens82182d02020-09-22 13:21:46 +02001711 send_bssgp_suspend_ack(nsi, SGSN_NSEI, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001712
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001713 /* TODO: The following breaks with the current libosmocore, enable it
1714 * again (and remove the plain expect_msg), when the msgb_bssgph patch
1715 * is integrated */
1716 /* OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_STATUS)); */
1717 OSMO_ASSERT(expect_msg());
1718
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001719 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001720 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001721
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001722 OSMO_ASSERT(!expect_msg());
1723 received_messages = NULL;
1724
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02001725 talloc_free(gbcfg.core_apn);
1726 gbcfg.core_apn = NULL;
1727
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02001728 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING]);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001729 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001730 gprs_ns2_free(nsi);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001731 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001732}
1733
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001734static void test_gbproxy_ptmsi_assignment()
1735{
Alexander Couzens82182d02020-09-22 13:21:46 +02001736 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001737 struct gprs_ra_id rai_bss =
1738 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1739 struct gprs_ra_id rai_unknown =
1740 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1741 uint16_t cell_id = 0x1234;
1742
1743 const uint32_t ptmsi = 0xefe2b700;
1744 const uint32_t local_tlli = 0xefe2b700;
1745
1746 const uint32_t foreign_tlli1 = 0x8000dead;
1747 const uint32_t foreign_tlli2 = 0x8000beef;
1748
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001749 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
1750 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0xf8};
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001751
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001752 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001753 struct gbproxy_peer *peer;
1754 unsigned bss_nu = 0;
1755 unsigned sgsn_nu = 0;
1756
Alexander Couzens82182d02020-09-22 13:21:46 +02001757 uint16_t bss_nsei[1] = { 0x1000 };
1758
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001759 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
1760
Alexander Couzens82182d02020-09-22 13:21:46 +02001761 gbcfg.nsi = nsi;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001762 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001763 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001764 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001765 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1766 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001767
Alexander Couzens82182d02020-09-22 13:21:46 +02001768 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001769
1770 printf("=== %s ===\n", __func__);
1771 printf("--- Initialise SGSN ---\n\n");
1772
Alexander Couzens82182d02020-09-22 13:21:46 +02001773 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001774
1775 printf("--- Initialise BSS 1 ---\n\n");
1776
Alexander Couzens82182d02020-09-22 13:21:46 +02001777 setup_ns(nsi, bss_nsei[0]);
1778 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001779
1780 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
1781 OSMO_ASSERT(peer != NULL);
1782
Alexander Couzens82182d02020-09-22 13:21:46 +02001783 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001784
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001785 dump_global(stdout, 0);
1786 dump_peers(stdout, 0, 0, &gbcfg);
1787
1788 printf("--- Establish first LLC connection ---\n\n");
1789
Alexander Couzens82182d02020-09-22 13:21:46 +02001790 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001791 foreign_tlli1, &rai_unknown, cell_id,
1792 GPRS_SAPI_GMM, bss_nu++,
1793 dtap_attach_req, sizeof(dtap_attach_req));
1794
1795 dump_peers(stdout, 0, 0, &gbcfg);
1796
Alexander Couzens82182d02020-09-22 13:21:46 +02001797 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001798 foreign_tlli1, 0, NULL, 0,
1799 GPRS_SAPI_GMM, sgsn_nu++,
1800 dtap_identity_req, sizeof(dtap_identity_req));
1801
1802 dump_peers(stdout, 0, 0, &gbcfg);
1803
Alexander Couzens82182d02020-09-22 13:21:46 +02001804 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001805 foreign_tlli1, &rai_bss, cell_id,
1806 GPRS_SAPI_GMM, bss_nu++,
1807 dtap_identity_resp, sizeof(dtap_identity_resp));
1808
1809 dump_peers(stdout, 0, 0, &gbcfg);
1810
Alexander Couzens82182d02020-09-22 13:21:46 +02001811 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001812 foreign_tlli1, 1, imsi1, sizeof(imsi1),
1813 GPRS_SAPI_GMM, sgsn_nu++,
1814 dtap_attach_acc, sizeof(dtap_attach_acc));
1815
1816 dump_peers(stdout, 0, 0, &gbcfg);
1817
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001818 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
1819 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1820 OSMO_ASSERT(link_info);
1821 OSMO_ASSERT(link_info == link_info2);
1822 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1823 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
1824 OSMO_ASSERT(!link_info->tlli.bss_validated);
1825 OSMO_ASSERT(!link_info->tlli.net_validated);
1826 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001827
Alexander Couzens82182d02020-09-22 13:21:46 +02001828 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001829 local_tlli, &rai_bss, cell_id,
1830 GPRS_SAPI_GMM, bss_nu++,
1831 dtap_attach_complete, sizeof(dtap_attach_complete));
1832
1833 dump_peers(stdout, 0, 0, &gbcfg);
1834
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001835 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
1836 OSMO_ASSERT(link_info);
1837 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1838 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
1839 OSMO_ASSERT(link_info->tlli.bss_validated);
1840 OSMO_ASSERT(!link_info->tlli.net_validated);
1841 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001842
1843
Alexander Couzens82182d02020-09-22 13:21:46 +02001844 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001845 local_tlli, 1, imsi1, sizeof(imsi1),
1846 GPRS_SAPI_GMM, sgsn_nu++,
1847 dtap_gmm_information, sizeof(dtap_gmm_information));
1848
1849 dump_peers(stdout, 0, 0, &gbcfg);
1850
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001851 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
1852 OSMO_ASSERT(link_info);
1853 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
1854 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001855
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001856 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1857 OSMO_ASSERT(link_info == link_info2);
1858 OSMO_ASSERT(link_info->tlli.assigned == 0);
1859 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1860 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001861
1862 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
1863
Alexander Couzens82182d02020-09-22 13:21:46 +02001864 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001865 foreign_tlli2, &rai_unknown, cell_id,
1866 GPRS_SAPI_GMM, bss_nu++,
1867 dtap_attach_req, sizeof(dtap_attach_req));
1868
1869 dump_peers(stdout, 0, 0, &gbcfg);
1870
Alexander Couzens82182d02020-09-22 13:21:46 +02001871 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001872 foreign_tlli2, 0, NULL, 0,
1873 GPRS_SAPI_GMM, sgsn_nu++,
1874 dtap_identity_req, sizeof(dtap_identity_req));
1875
1876 dump_peers(stdout, 0, 0, &gbcfg);
1877
Alexander Couzens82182d02020-09-22 13:21:46 +02001878 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001879 foreign_tlli2, &rai_bss, cell_id,
1880 GPRS_SAPI_GMM, bss_nu++,
1881 dtap_identity2_resp, sizeof(dtap_identity2_resp));
1882
1883 dump_peers(stdout, 0, 0, &gbcfg);
1884
Alexander Couzens82182d02020-09-22 13:21:46 +02001885 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001886 foreign_tlli2, 1, imsi2, sizeof(imsi2),
1887 GPRS_SAPI_GMM, sgsn_nu++,
1888 dtap_attach_acc, sizeof(dtap_attach_acc));
1889
1890 dump_peers(stdout, 0, 0, &gbcfg);
1891
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001892 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
1893 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1894 OSMO_ASSERT(link_info);
1895 OSMO_ASSERT(link_info == link_info2);
1896 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1897 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
1898 OSMO_ASSERT(!link_info->tlli.bss_validated);
1899 OSMO_ASSERT(!link_info->tlli.net_validated);
1900 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001901
Alexander Couzens82182d02020-09-22 13:21:46 +02001902 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001903 local_tlli, &rai_bss, cell_id,
1904 GPRS_SAPI_GMM, bss_nu++,
1905 dtap_attach_complete, sizeof(dtap_attach_complete));
1906
1907 dump_peers(stdout, 0, 0, &gbcfg);
1908
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001909 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
1910 OSMO_ASSERT(link_info);
1911 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1912 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
1913 OSMO_ASSERT(link_info->tlli.bss_validated);
1914 OSMO_ASSERT(!link_info->tlli.net_validated);
1915 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001916
Alexander Couzens82182d02020-09-22 13:21:46 +02001917 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001918 local_tlli, 1, imsi2, sizeof(imsi2),
1919 GPRS_SAPI_GMM, sgsn_nu++,
1920 dtap_gmm_information, sizeof(dtap_gmm_information));
1921
1922 dump_peers(stdout, 0, 0, &gbcfg);
1923
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001924 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
1925 OSMO_ASSERT(link_info);
1926 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
1927 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001928
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001929 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
1930 OSMO_ASSERT(link_info == link_info2);
1931 OSMO_ASSERT(link_info->tlli.assigned == 0);
1932 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1933 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001934
1935 dump_global(stdout, 0);
1936
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02001937 talloc_free(gbcfg.core_apn);
1938 gbcfg.core_apn = NULL;
1939
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001940 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02001941 gprs_ns2_free(nsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001942 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02001943
1944 cleanup_test();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001945}
1946
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001947static void test_gbproxy_ptmsi_patching()
1948{
Alexander Couzens82182d02020-09-22 13:21:46 +02001949 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001950 struct gprs_ra_id rai_bss =
1951 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1952 struct gprs_ra_id rai_sgsn =
1953 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001954 struct gprs_ra_id rai_wrong_mcc_sgsn =
1955 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001956 struct gprs_ra_id rai_unknown =
1957 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1958 uint16_t cell_id = 0x1234;
1959
1960 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001961 const uint32_t sgsn_ptmsi2 = 0xe0987654;
1962 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001963 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001964 const uint32_t local_sgsn_tlli2 = 0xe0987654;
1965 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Daniel Willmann537d4802015-10-12 19:36:35 +02001966 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001967 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001968
Daniel Willmann537d4802015-10-12 19:36:35 +02001969 const uint32_t bss_ptmsi = 0xc0dead01;
1970 const uint32_t bss_ptmsi2 = 0xc0dead02;
1971 const uint32_t bss_ptmsi3 = 0xc0dead03;
1972 const uint32_t local_bss_tlli = 0xc0dead01;
1973 const uint32_t local_bss_tlli2 = 0xc0dead02;
1974 const uint32_t local_bss_tlli3 = 0xc0dead03;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001975 const uint32_t foreign_bss_tlli = 0x8000dead;
1976
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001977
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001978 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001979 struct gbproxy_link_info *link_info;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001980 struct gbproxy_peer *peer;
1981 unsigned bss_nu = 0;
1982 unsigned sgsn_nu = 0;
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02001983 int old_ctr;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001984
Alexander Couzens82182d02020-09-22 13:21:46 +02001985 uint16_t bss_nsei[1] = { 0x1000 };
1986
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001987 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02001988 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
1989 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
1990 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
1991 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
1992 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001993
Alexander Couzens82182d02020-09-22 13:21:46 +02001994 gbcfg.nsi = nsi;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001995 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001996 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001997 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02001998 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
1999 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002000
Alexander Couzens82182d02020-09-22 13:21:46 +02002001 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002002
2003 printf("=== %s ===\n", __func__);
2004 printf("--- Initialise SGSN ---\n\n");
2005
Alexander Couzens82182d02020-09-22 13:21:46 +02002006 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002007
2008 printf("--- Initialise BSS 1 ---\n\n");
2009
Alexander Couzens82182d02020-09-22 13:21:46 +02002010 setup_ns(nsi, bss_nsei[0]);
2011 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002012
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02002013 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002014 OSMO_ASSERT(peer != NULL);
2015
Alexander Couzens82182d02020-09-22 13:21:46 +02002016 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002017
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002018 dump_global(stdout, 0);
2019 dump_peers(stdout, 0, 0, &gbcfg);
2020
2021 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2022
Alexander Couzens82182d02020-09-22 13:21:46 +02002023 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002024 foreign_bss_tlli, &rai_unknown, cell_id,
2025 GPRS_SAPI_GMM, bss_nu++,
2026 dtap_attach_req, sizeof(dtap_attach_req));
2027
2028 dump_peers(stdout, 0, 0, &gbcfg);
2029
Alexander Couzens82182d02020-09-22 13:21:46 +02002030 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002031 random_sgsn_tlli, 0, NULL, 0,
2032 GPRS_SAPI_GMM, sgsn_nu++,
2033 dtap_identity_req, sizeof(dtap_identity_req));
2034
2035 dump_peers(stdout, 0, 0, &gbcfg);
2036
Alexander Couzens82182d02020-09-22 13:21:46 +02002037 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002038 foreign_bss_tlli, &rai_bss, cell_id,
2039 GPRS_SAPI_GMM, bss_nu++,
2040 dtap_identity_resp, sizeof(dtap_identity_resp));
2041
2042 dump_peers(stdout, 0, 0, &gbcfg);
2043
Alexander Couzens82182d02020-09-22 13:21:46 +02002044 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002045 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2046 GPRS_SAPI_GMM, sgsn_nu++,
2047 dtap_attach_acc, sizeof(dtap_attach_acc));
2048
2049 dump_peers(stdout, 0, 0, &gbcfg);
2050
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002051 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2052 OSMO_ASSERT(link_info);
2053 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2054 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2055 OSMO_ASSERT(!link_info->tlli.bss_validated);
2056 OSMO_ASSERT(!link_info->tlli.net_validated);
2057 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2058 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2059 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2060 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2061 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2062 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002063
Alexander Couzens82182d02020-09-22 13:21:46 +02002064 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002065 local_bss_tlli, &rai_bss, cell_id,
2066 GPRS_SAPI_GMM, bss_nu++,
2067 dtap_attach_complete, sizeof(dtap_attach_complete));
2068
2069 dump_peers(stdout, 0, 0, &gbcfg);
2070
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002071 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2072 OSMO_ASSERT(link_info);
2073 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2074 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2075 OSMO_ASSERT(link_info->tlli.bss_validated);
2076 OSMO_ASSERT(!link_info->tlli.net_validated);
2077 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2078 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2079 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2080 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002081
Alexander Couzens82182d02020-09-22 13:21:46 +02002082 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002083 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2084 GPRS_SAPI_GMM, sgsn_nu++,
2085 dtap_gmm_information, sizeof(dtap_gmm_information));
2086
2087 dump_peers(stdout, 0, 0, &gbcfg);
2088
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002089 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2090 OSMO_ASSERT(link_info);
2091 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2092 OSMO_ASSERT(link_info->tlli.assigned == 0);
2093 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2094 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002095
Alexander Couzens82182d02020-09-22 13:21:46 +02002096 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", bss_nsei[0], 0x1002,
Jacob Erlbeck82add782014-09-05 18:08:12 +02002097 local_bss_tlli, &rai_bss, cell_id,
2098 GPRS_SAPI_GMM, bss_nu++,
2099 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2100
2101 dump_peers(stdout, 0, 0, &gbcfg);
2102
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002103 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002104 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002105 local_bss_tlli, &rai_bss, cell_id,
2106 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2107
Alexander Couzens82182d02020-09-22 13:21:46 +02002108 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002109 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2110 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2111
Alexander Couzens82182d02020-09-22 13:21:46 +02002112 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002113 local_bss_tlli, &rai_bss, cell_id,
2114 llc_ui_ll11_dns_query_ul,
2115 sizeof(llc_ui_ll11_dns_query_ul));
2116
Alexander Couzens82182d02020-09-22 13:21:46 +02002117 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002118 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2119 llc_ui_ll11_dns_resp_dl,
2120 sizeof(llc_ui_ll11_dns_resp_dl));
2121
2122 dump_peers(stdout, 0, 0, &gbcfg);
2123
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002124 /* Repeated RA Update Requests */
Alexander Couzens82182d02020-09-22 13:21:46 +02002125 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002126 local_bss_tlli, &rai_bss, 0x7080,
2127 GPRS_SAPI_GMM, bss_nu++,
2128 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2129
Alexander Couzens82182d02020-09-22 13:21:46 +02002130 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002131 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2132 GPRS_SAPI_GMM, sgsn_nu++,
2133 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2134
2135 dump_peers(stdout, 0, 0, &gbcfg);
2136
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002137 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2138 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2139 OSMO_ASSERT(link_info);
2140 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2141 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2142 OSMO_ASSERT(!link_info->tlli.bss_validated);
2143 OSMO_ASSERT(!link_info->tlli.net_validated);
2144 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2145 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2146 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2147 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2148 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2149 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002150
Alexander Couzens82182d02020-09-22 13:21:46 +02002151 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002152 local_bss_tlli2, &rai_bss, 0x7080,
2153 GPRS_SAPI_GMM, bss_nu++,
2154 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2155
Alexander Couzens82182d02020-09-22 13:21:46 +02002156 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002157 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2158 GPRS_SAPI_GMM, sgsn_nu++,
2159 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2160
2161 dump_peers(stdout, 0, 0, &gbcfg);
2162
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002163 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2164 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI) != NULL);
2165 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2166 OSMO_ASSERT(link_info);
2167 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2168 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2169 OSMO_ASSERT(!link_info->tlli.bss_validated);
2170 OSMO_ASSERT(!link_info->tlli.net_validated);
2171 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2172 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2173 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2174 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2175 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2176 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002177
Alexander Couzens82182d02020-09-22 13:21:46 +02002178 send_llc_ul_ui(nsi, "RA UPD COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002179 local_bss_tlli3, &rai_bss, 0x7080,
2180 GPRS_SAPI_GMM, bss_nu++,
2181 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2182
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002183 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002184
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002185 OSMO_ASSERT(link_info);
2186 OSMO_ASSERT(link_info->tlli.bss_validated);
2187 OSMO_ASSERT(!link_info->tlli.net_validated);
2188 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2189 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002190
Alexander Couzens82182d02020-09-22 13:21:46 +02002191 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002192 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2193 GPRS_SAPI_GMM, sgsn_nu++,
2194 dtap_gmm_information, sizeof(dtap_gmm_information));
2195
2196 dump_peers(stdout, 0, 0, &gbcfg);
2197
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002198 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2199 OSMO_ASSERT(link_info);
2200 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2201 OSMO_ASSERT(link_info->tlli.assigned == 0);
2202 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2203 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002204
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002205 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02002206 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002207 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002208
2209 dump_peers(stdout, 0, 0, &gbcfg);
2210
Alexander Couzens82182d02020-09-22 13:21:46 +02002211 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002212
2213 dump_peers(stdout, 0, 0, &gbcfg);
2214
Alexander Couzens82182d02020-09-22 13:21:46 +02002215 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002216
2217 dump_peers(stdout, 0, 0, &gbcfg);
2218
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002219 old_ctr = peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current;
2220
Alexander Couzens82182d02020-09-22 13:21:46 +02002221 send_bssgp_paging(nsi, SGSN_NSEI, imsi, sizeof(imsi), &rai_bss, sgsn_ptmsi3);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002222
2223 dump_peers(stdout, 0, 0, &gbcfg);
2224
2225 OSMO_ASSERT(old_ctr + 1 ==
2226 peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current);
2227
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002228 /* Bad case: Invalid BVCI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002229 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002230 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002231 dump_global(stdout, 0);
2232
2233 /* Bad case: Invalid RAI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002234 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002235
2236 dump_global(stdout, 0);
2237
2238 /* Bad case: Invalid MCC (LAC ok) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002239 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002240 &rai_wrong_mcc_sgsn);
2241
2242 dump_global(stdout, 0);
2243
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002244 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002245 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002246 unknown_sgsn_tlli, 1, NULL, 0,
2247 GPRS_SAPI_GMM, 2,
2248 dtap_gmm_information, sizeof(dtap_gmm_information));
2249
2250 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002251 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002252 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2253 GPRS_SAPI_GMM, 3,
2254 dtap_gmm_information, sizeof(dtap_gmm_information));
2255
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002256 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002257 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002258 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002259 GPRS_SAPI_GMM, bss_nu++,
2260 dtap_detach_req, sizeof(dtap_detach_req));
2261
2262 dump_peers(stdout, 0, 0, &gbcfg);
2263
Alexander Couzens82182d02020-09-22 13:21:46 +02002264 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002265 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002266 GPRS_SAPI_GMM, sgsn_nu++,
2267 dtap_detach_acc, sizeof(dtap_detach_acc));
2268
2269 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002270
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002271 dump_global(stdout, 0);
2272
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002273 talloc_free(gbcfg.core_apn);
2274 gbcfg.core_apn = NULL;
2275
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002276 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002277 gprs_ns2_free(nsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002278 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002279
2280 cleanup_test();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002281}
2282
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002283static void test_gbproxy_ptmsi_patching_bad_cases()
2284{
Alexander Couzens82182d02020-09-22 13:21:46 +02002285 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002286 struct gprs_ra_id rai_bss =
2287 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2288 struct gprs_ra_id rai_unknown =
2289 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2290 uint16_t cell_id = 0x1234;
2291
2292 const uint32_t sgsn_ptmsi = 0xefe2b700;
2293 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002294 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002295
Daniel Willmann537d4802015-10-12 19:36:35 +02002296 const uint32_t bss_ptmsi = 0xc0dead01;
2297 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002298 const uint32_t foreign_bss_tlli = 0x8000dead;
2299
2300
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002301 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002302 struct gbproxy_link_info *link_info;
2303 struct gbproxy_peer *peer;
2304 unsigned bss_nu = 0;
2305 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02002306 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002307
2308 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2309 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2310
Alexander Couzens82182d02020-09-22 13:21:46 +02002311 gbcfg.nsi = nsi;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002312 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002313 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002314 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002315 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2316 gbcfg.patch_ptmsi = 1;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002317
Alexander Couzens82182d02020-09-22 13:21:46 +02002318 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002319
2320 printf("=== %s ===\n", __func__);
2321 printf("--- Initialise SGSN ---\n\n");
2322
Alexander Couzens82182d02020-09-22 13:21:46 +02002323 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002324
2325 printf("--- Initialise BSS 1 ---\n\n");
2326
Alexander Couzens82182d02020-09-22 13:21:46 +02002327 setup_ns(nsi, bss_nsei[0]);
2328 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002329
2330 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2331 OSMO_ASSERT(peer != NULL);
2332
Alexander Couzens82182d02020-09-22 13:21:46 +02002333 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002334
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002335 dump_global(stdout, 0);
2336 dump_peers(stdout, 0, 0, &gbcfg);
2337
2338 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2339
Alexander Couzens82182d02020-09-22 13:21:46 +02002340 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002341 foreign_bss_tlli, &rai_unknown, cell_id,
2342 GPRS_SAPI_GMM, bss_nu++,
2343 dtap_attach_req, sizeof(dtap_attach_req));
2344
2345 dump_peers(stdout, 0, 0, &gbcfg);
2346
Alexander Couzens82182d02020-09-22 13:21:46 +02002347 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002348 random_sgsn_tlli, 0, NULL, 0,
2349 GPRS_SAPI_GMM, sgsn_nu++,
2350 dtap_identity_req, sizeof(dtap_identity_req));
2351
2352 dump_peers(stdout, 0, 0, &gbcfg);
2353
Alexander Couzens82182d02020-09-22 13:21:46 +02002354 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002355 foreign_bss_tlli, &rai_bss, cell_id,
2356 GPRS_SAPI_GMM, bss_nu++,
2357 dtap_identity_resp, sizeof(dtap_identity_resp));
2358
2359 dump_peers(stdout, 0, 0, &gbcfg);
2360
Alexander Couzens82182d02020-09-22 13:21:46 +02002361 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002362 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2363 GPRS_SAPI_GMM, sgsn_nu++,
2364 dtap_attach_acc, sizeof(dtap_attach_acc));
2365
2366 dump_peers(stdout, 0, 0, &gbcfg);
2367
2368 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2369 OSMO_ASSERT(link_info);
2370 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2371 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2372 OSMO_ASSERT(!link_info->tlli.bss_validated);
2373 OSMO_ASSERT(!link_info->tlli.net_validated);
2374 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2375 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2376 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2377 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2378 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2379 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2380
Alexander Couzens82182d02020-09-22 13:21:46 +02002381 send_llc_dl_ui(nsi, "ATTACH ACCEPT (duplicated)", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002382 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2383 GPRS_SAPI_GMM, sgsn_nu++,
2384 dtap_attach_acc, sizeof(dtap_attach_acc));
2385
2386 dump_peers(stdout, 0, 0, &gbcfg);
2387
2388 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2389 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002390 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002391 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2392 OSMO_ASSERT(!link_info->tlli.bss_validated);
2393 OSMO_ASSERT(!link_info->tlli.net_validated);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002394 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002395 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2396 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2397 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2398 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2399 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2400
Alexander Couzens82182d02020-09-22 13:21:46 +02002401 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002402 local_bss_tlli, &rai_bss, cell_id,
2403 GPRS_SAPI_GMM, bss_nu++,
2404 dtap_attach_complete, sizeof(dtap_attach_complete));
2405
2406 dump_peers(stdout, 0, 0, &gbcfg);
2407
2408 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2409 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002410 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002411 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002412 OSMO_ASSERT(link_info->tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002413 OSMO_ASSERT(!link_info->tlli.net_validated);
2414 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2415 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002416 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002417 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2418
Alexander Couzens82182d02020-09-22 13:21:46 +02002419 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002420 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2421 GPRS_SAPI_GMM, sgsn_nu++,
2422 dtap_gmm_information, sizeof(dtap_gmm_information));
2423
2424 dump_peers(stdout, 0, 0, &gbcfg);
2425
2426 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2427 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002428 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2429 OSMO_ASSERT(link_info->tlli.assigned == 0);
2430 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2431 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002432
2433 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002434 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002435 local_bss_tlli, &rai_bss, cell_id,
2436 GPRS_SAPI_GMM, bss_nu++,
2437 dtap_detach_req, sizeof(dtap_detach_req));
2438
2439 dump_peers(stdout, 0, 0, &gbcfg);
2440
Alexander Couzens82182d02020-09-22 13:21:46 +02002441 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002442 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2443 GPRS_SAPI_GMM, sgsn_nu++,
2444 dtap_detach_acc, sizeof(dtap_detach_acc));
2445
2446 dump_peers(stdout, 0, 0, &gbcfg);
2447
2448 dump_global(stdout, 0);
2449
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002450 talloc_free(gbcfg.core_apn);
2451 gbcfg.core_apn = NULL;
2452
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002453 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002454 gprs_ns2_free(nsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002455 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002456
2457 cleanup_test();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002458}
2459
2460
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002461static void test_gbproxy_imsi_acquisition()
2462{
Alexander Couzens82182d02020-09-22 13:21:46 +02002463 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002464 struct gprs_ra_id rai_bss =
2465 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2466 struct gprs_ra_id rai_sgsn =
2467 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2468 struct gprs_ra_id rai_wrong_mcc_sgsn =
2469 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2470 struct gprs_ra_id rai_unknown =
2471 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2472 uint16_t cell_id = 0x1234;
2473
2474 const uint32_t sgsn_ptmsi = 0xefe2b700;
2475 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002476 const uint32_t random_sgsn_tlli = 0x78dead00;
2477 const uint32_t random_sgsn_tlli2 = 0x78dead02;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002478
Daniel Willmann537d4802015-10-12 19:36:35 +02002479 const uint32_t bss_ptmsi = 0xc0dead01;
2480 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002481 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002482 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002483
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002484 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002485 struct gbproxy_link_info *link_info;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002486 struct gbproxy_peer *peer;
2487 unsigned bss_nu = 0;
2488 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02002489 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002490
2491 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2492
Alexander Couzens82182d02020-09-22 13:21:46 +02002493 gbcfg.nsi = nsi;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002494 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002495 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002496 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002497 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2498 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002499 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002500
Alexander Couzens82182d02020-09-22 13:21:46 +02002501 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002502
2503 printf("=== %s ===\n", __func__);
2504 printf("--- Initialise SGSN ---\n\n");
2505
Alexander Couzens82182d02020-09-22 13:21:46 +02002506 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002507
2508 printf("--- Initialise BSS 1 ---\n\n");
2509
Alexander Couzens82182d02020-09-22 13:21:46 +02002510 setup_ns(nsi, bss_nsei[0]);
2511 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002512
2513 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2514 OSMO_ASSERT(peer != NULL);
2515
Alexander Couzens82182d02020-09-22 13:21:46 +02002516 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002517
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002518 dump_global(stdout, 0);
2519 dump_peers(stdout, 0, 0, &gbcfg);
2520
2521 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2522
Alexander Couzens82182d02020-09-22 13:21:46 +02002523 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002524 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002525 GPRS_SAPI_GMM, bss_nu++,
2526 dtap_attach_req, sizeof(dtap_attach_req));
2527
2528 dump_peers(stdout, 0, 0, &gbcfg);
2529
Alexander Couzens82182d02020-09-22 13:21:46 +02002530 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002531 foreign_bss_tlli, &rai_bss, cell_id,
2532 GPRS_SAPI_GMM, bss_nu++,
2533 dtap_identity_resp, sizeof(dtap_identity_resp));
2534
2535 dump_peers(stdout, 0, 0, &gbcfg);
2536
Alexander Couzens82182d02020-09-22 13:21:46 +02002537 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002538 random_sgsn_tlli, 0, NULL, 0,
2539 GPRS_SAPI_GMM, sgsn_nu++,
2540 dtap_identity_req, sizeof(dtap_identity_req));
2541
2542 dump_peers(stdout, 0, 0, &gbcfg);
2543
Alexander Couzens82182d02020-09-22 13:21:46 +02002544 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002545 foreign_bss_tlli, &rai_bss, cell_id,
2546 GPRS_SAPI_GMM, bss_nu++,
2547 dtap_identity_resp, sizeof(dtap_identity_resp));
2548
2549 dump_peers(stdout, 0, 0, &gbcfg);
2550
Alexander Couzens82182d02020-09-22 13:21:46 +02002551 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002552 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2553 GPRS_SAPI_GMM, sgsn_nu++,
2554 dtap_attach_acc, sizeof(dtap_attach_acc));
2555
2556 dump_peers(stdout, 0, 0, &gbcfg);
2557
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002558 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2559 OSMO_ASSERT(link_info);
2560 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2561 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2562 OSMO_ASSERT(!link_info->tlli.bss_validated);
2563 OSMO_ASSERT(!link_info->tlli.net_validated);
2564 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2565 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2566 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2567 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2568 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2569 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002570
Alexander Couzens82182d02020-09-22 13:21:46 +02002571 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002572 local_bss_tlli, &rai_bss, cell_id,
2573 GPRS_SAPI_GMM, bss_nu++,
2574 dtap_attach_complete, sizeof(dtap_attach_complete));
2575
2576 dump_peers(stdout, 0, 0, &gbcfg);
2577
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002578 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2579 OSMO_ASSERT(link_info);
2580 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2581 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2582 OSMO_ASSERT(link_info->tlli.bss_validated);
2583 OSMO_ASSERT(!link_info->tlli.net_validated);
2584 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2585 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2586 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2587 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002588
Alexander Couzens82182d02020-09-22 13:21:46 +02002589 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002590 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2591 GPRS_SAPI_GMM, sgsn_nu++,
2592 dtap_gmm_information, sizeof(dtap_gmm_information));
2593
2594 dump_peers(stdout, 0, 0, &gbcfg);
2595
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002596 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2597 OSMO_ASSERT(link_info);
2598 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2599 OSMO_ASSERT(link_info->tlli.assigned == 0);
2600 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2601 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002602
2603 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002604 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002605 local_bss_tlli, &rai_bss, cell_id,
2606 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2607
Alexander Couzens82182d02020-09-22 13:21:46 +02002608 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002609 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2610 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2611
Alexander Couzens82182d02020-09-22 13:21:46 +02002612 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002613 local_bss_tlli, &rai_bss, cell_id,
2614 llc_ui_ll11_dns_query_ul,
2615 sizeof(llc_ui_ll11_dns_query_ul));
2616
Alexander Couzens82182d02020-09-22 13:21:46 +02002617 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002618 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2619 llc_ui_ll11_dns_resp_dl,
2620 sizeof(llc_ui_ll11_dns_resp_dl));
2621
2622 dump_peers(stdout, 0, 0, &gbcfg);
2623
2624 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02002625 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002626 local_bss_tlli, 1, 12);
2627
2628 dump_peers(stdout, 0, 0, &gbcfg);
2629
Alexander Couzens82182d02020-09-22 13:21:46 +02002630 send_bssgp_llc_discarded(nsi, SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002631 local_sgsn_tlli, 1, 12);
2632
2633 dump_peers(stdout, 0, 0, &gbcfg);
2634
Alexander Couzens82182d02020-09-22 13:21:46 +02002635 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli, &rai_bss);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002636
2637 dump_peers(stdout, 0, 0, &gbcfg);
2638
Alexander Couzens82182d02020-09-22 13:21:46 +02002639 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_sgsn);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002640
2641 dump_peers(stdout, 0, 0, &gbcfg);
2642
2643 /* Bad case: Invalid BVCI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002644 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0xeee1,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002645 local_bss_tlli, 1, 12);
2646 dump_global(stdout, 0);
2647
2648 /* Bad case: Invalid RAI */
Alexander Couzens82182d02020-09-22 13:21:46 +02002649 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_unknown);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002650
2651 dump_global(stdout, 0);
2652
2653 /* Bad case: Invalid MCC (LAC ok) */
Alexander Couzens82182d02020-09-22 13:21:46 +02002654 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002655 &rai_wrong_mcc_sgsn);
2656
2657 dump_global(stdout, 0);
2658
2659 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02002660 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002661 local_bss_tlli, &rai_bss, cell_id,
2662 GPRS_SAPI_GMM, bss_nu++,
2663 dtap_detach_req, sizeof(dtap_detach_req));
2664
2665 dump_peers(stdout, 0, 0, &gbcfg);
2666
Alexander Couzens82182d02020-09-22 13:21:46 +02002667 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002668 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2669 GPRS_SAPI_GMM, sgsn_nu++,
2670 dtap_detach_acc, sizeof(dtap_detach_acc));
2671
2672 dump_peers(stdout, 0, 0, &gbcfg);
2673
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002674 /* RA Update request */
2675
Alexander Couzens82182d02020-09-22 13:21:46 +02002676 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002677 foreign_bss_tlli, &rai_unknown, 0x7080,
2678 GPRS_SAPI_GMM, bss_nu++,
2679 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2680
Alexander Couzens82182d02020-09-22 13:21:46 +02002681 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002682 foreign_bss_tlli, &rai_bss, cell_id,
2683 GPRS_SAPI_GMM, bss_nu++,
2684 dtap_identity_resp, sizeof(dtap_identity_resp));
2685
2686 dump_peers(stdout, 0, 0, &gbcfg);
2687
Alexander Couzens82182d02020-09-22 13:21:46 +02002688 send_llc_dl_ui(nsi, "RA UDP ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002689 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2690 GPRS_SAPI_GMM, sgsn_nu++,
2691 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2692
2693 dump_peers(stdout, 0, 0, &gbcfg);
2694
2695 /* Detach */
2696
Alexander Couzens82182d02020-09-22 13:21:46 +02002697 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +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 Erlbeck2ec27572014-09-18 09:57:47 +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 Erlbeckea1698e2014-09-02 14:40:11 +02002711 /* Special case: Repeated Attach Requests */
2712
Alexander Couzens82182d02020-09-22 13:21:46 +02002713 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002714 foreign_bss_tlli, &rai_unknown, cell_id,
2715 GPRS_SAPI_GMM, bss_nu++,
2716 dtap_attach_req, sizeof(dtap_attach_req));
2717
Alexander Couzens82182d02020-09-22 13:21:46 +02002718 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002719 foreign_bss_tlli, &rai_unknown, cell_id,
2720 GPRS_SAPI_GMM, bss_nu++,
2721 dtap_attach_req, sizeof(dtap_attach_req));
2722
Alexander Couzens82182d02020-09-22 13:21:46 +02002723 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002724 foreign_bss_tlli, &rai_bss, cell_id,
2725 GPRS_SAPI_GMM, bss_nu++,
2726 dtap_detach_req, sizeof(dtap_detach_req));
2727
2728 dump_peers(stdout, 0, 0, &gbcfg);
2729
2730 /* Special case: Detach from an unknown TLLI */
2731
Alexander Couzens82182d02020-09-22 13:21:46 +02002732 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", bss_nsei[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002733 other_bss_tlli, &rai_bss, cell_id,
2734 GPRS_SAPI_GMM, bss_nu++,
2735 dtap_detach_req, sizeof(dtap_detach_req));
2736
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002737 dump_peers(stdout, 0, 0, &gbcfg);
2738
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002739 /* Special case: Repeated RA Update Requests */
2740
Alexander Couzens82182d02020-09-22 13:21:46 +02002741 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002742 foreign_bss_tlli, &rai_unknown, 0x7080,
2743 GPRS_SAPI_GMM, bss_nu++,
2744 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2745
Alexander Couzens82182d02020-09-22 13:21:46 +02002746 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002747 foreign_bss_tlli, &rai_unknown, 0x7080,
2748 GPRS_SAPI_GMM, bss_nu++,
2749 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2750
Alexander Couzens82182d02020-09-22 13:21:46 +02002751 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002752 foreign_bss_tlli, &rai_bss, cell_id,
2753 GPRS_SAPI_GMM, bss_nu++,
2754 dtap_detach_req, sizeof(dtap_detach_req));
2755
2756 dump_peers(stdout, 0, 0, &gbcfg);
2757
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002758 dump_global(stdout, 0);
2759
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002760 talloc_free(gbcfg.core_apn);
2761 gbcfg.core_apn = NULL;
2762
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002763 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02002764 gprs_ns2_free(nsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002765 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002766
2767 cleanup_test();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002768}
2769
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002770static void test_gbproxy_secondary_sgsn()
2771{
Alexander Couzens82182d02020-09-22 13:21:46 +02002772 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002773 struct gprs_ra_id rai_bss =
2774 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2775 struct gprs_ra_id rai_sgsn =
2776 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2777 struct gprs_ra_id rai_unknown =
2778 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2779 uint16_t cell_id = 0x1234;
2780
2781 const uint32_t sgsn_ptmsi = 0xefe2b700;
2782 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002783 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002784
Daniel Willmann537d4802015-10-12 19:36:35 +02002785 const uint32_t bss_ptmsi = 0xc0dead01;
2786 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002787 const uint32_t foreign_bss_tlli = 0x8000dead;
2788
2789 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2790 const uint32_t local_sgsn_tlli2 = 0xe0987654;
Daniel Willmann537d4802015-10-12 19:36:35 +02002791 const uint32_t random_sgsn_tlli2 = 0x78dead02;
2792 const uint32_t bss_ptmsi2 = 0xc0dead03;
2793 const uint32_t local_bss_tlli2 = 0xc0dead03;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002794 const uint32_t foreign_bss_tlli2 = 0x8000beef;
2795
Daniel Willmann537d4802015-10-12 19:36:35 +02002796 const uint32_t random_sgsn_tlli3 = 0x78dead04;
2797 const uint32_t bss_ptmsi3 = 0xc0dead05;
2798 const uint32_t local_bss_tlli3 = 0xc0dead05;
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02002799 const uint32_t foreign_bss_tlli3 = 0x8000feed;
2800
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002801 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
2802 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0xf8};
2803 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002804 struct gbproxy_link_info *link_info;
2805 struct gbproxy_link_info *other_info;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002806 struct gbproxy_peer *peer;
2807 unsigned bss_nu = 0;
2808 unsigned sgsn_nu = 0;
2809
2810 const char *err_msg = NULL;
2811 const char *filter_re = "999999";
Alexander Couzens82182d02020-09-22 13:21:46 +02002812 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002813
2814 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2815 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2816
Alexander Couzens82182d02020-09-22 13:21:46 +02002817 gbcfg.nsi = nsi;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002818 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002819 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002820 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002821 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2822 gbcfg.patch_ptmsi = 1;
2823 gbcfg.acquire_imsi = 1;
Daniel Willmann537d4802015-10-12 19:36:35 +02002824
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002825 gbcfg.route_to_sgsn2 = 1;
2826 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
2827
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02002828 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING],
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02002829 filter_re, &err_msg) != 0) {
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002830 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
2831 err_msg);
2832 OSMO_ASSERT(err_msg == NULL);
2833 }
2834
Alexander Couzens82182d02020-09-22 13:21:46 +02002835 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002836
2837 printf("=== %s ===\n", __func__);
2838 printf("--- Initialise SGSN 1 ---\n\n");
2839
Alexander Couzens82182d02020-09-22 13:21:46 +02002840 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002841
2842 printf("--- Initialise SGSN 2 ---\n\n");
2843
Alexander Couzens82182d02020-09-22 13:21:46 +02002844 connect_sgsn(nsi, SGSN2_NSEI);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002845
2846 printf("--- Initialise BSS 1 ---\n\n");
2847
Alexander Couzens82182d02020-09-22 13:21:46 +02002848 setup_ns(nsi, bss_nsei[0]);
2849 setup_bssgp(nsi, bss_nsei[0], 0x0);
2850 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x0);
2851 setup_bssgp(nsi, bss_nsei[0], 0x1002);
2852 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
2853 send_bssgp_reset_ack(nsi, SGSN2_NSEI, 0x1002);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002854
2855 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2856 OSMO_ASSERT(peer != NULL);
2857
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002858 dump_global(stdout, 0);
2859 dump_peers(stdout, 0, 0, &gbcfg);
2860
2861 printf("--- Flow control ---\n\n");
2862
Alexander Couzens82182d02020-09-22 13:21:46 +02002863 send_bssgp_flow_control_bvc(nsi, bss_nsei[0], 0x1002, 1);
2864 send_bssgp_flow_control_bvc_ack(nsi, SGSN_NSEI, 0x1002, 1);
2865 send_bssgp_flow_control_bvc_ack(nsi, SGSN2_NSEI, 0x1002, 1);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002866
2867 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
2868
Alexander Couzens82182d02020-09-22 13:21:46 +02002869 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002870 foreign_bss_tlli, &rai_unknown, cell_id,
2871 GPRS_SAPI_GMM, bss_nu++,
2872 dtap_attach_req, sizeof(dtap_attach_req));
2873
2874 dump_peers(stdout, 0, 0, &gbcfg);
2875
Alexander Couzens82182d02020-09-22 13:21:46 +02002876 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002877 foreign_bss_tlli, &rai_bss, cell_id,
2878 GPRS_SAPI_GMM, bss_nu++,
2879 dtap_identity_resp, sizeof(dtap_identity_resp));
2880
2881 dump_peers(stdout, 0, 0, &gbcfg);
2882
Alexander Couzens82182d02020-09-22 13:21:46 +02002883 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002884 random_sgsn_tlli, 0, NULL, 0,
2885 GPRS_SAPI_GMM, sgsn_nu++,
2886 dtap_identity_req, sizeof(dtap_identity_req));
2887
2888 dump_peers(stdout, 0, 0, &gbcfg);
2889
Alexander Couzens82182d02020-09-22 13:21:46 +02002890 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002891 foreign_bss_tlli, &rai_bss, cell_id,
2892 GPRS_SAPI_GMM, bss_nu++,
2893 dtap_identity_resp, sizeof(dtap_identity_resp));
2894
2895 dump_peers(stdout, 0, 0, &gbcfg);
2896
Alexander Couzens82182d02020-09-22 13:21:46 +02002897 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002898 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2899 GPRS_SAPI_GMM, sgsn_nu++,
2900 dtap_attach_acc, sizeof(dtap_attach_acc));
2901
2902 dump_peers(stdout, 0, 0, &gbcfg);
2903
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002904 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2905 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2906 OSMO_ASSERT(link_info);
2907 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2908 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2909 OSMO_ASSERT(!link_info->tlli.bss_validated);
2910 OSMO_ASSERT(!link_info->tlli.net_validated);
2911 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2912 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2913 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2914 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2915 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2916 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002917
Alexander Couzens82182d02020-09-22 13:21:46 +02002918 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002919 local_bss_tlli, &rai_bss, cell_id,
2920 GPRS_SAPI_GMM, bss_nu++,
2921 dtap_attach_complete, sizeof(dtap_attach_complete));
2922
2923 dump_peers(stdout, 0, 0, &gbcfg);
2924
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002925 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2926 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2927 OSMO_ASSERT(link_info);
2928 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2929 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2930 OSMO_ASSERT(link_info->tlli.bss_validated);
2931 OSMO_ASSERT(!link_info->tlli.net_validated);
2932 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2933 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2934 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2935 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002936
Alexander Couzens82182d02020-09-22 13:21:46 +02002937 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002938 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2939 GPRS_SAPI_GMM, sgsn_nu++,
2940 dtap_gmm_information, sizeof(dtap_gmm_information));
2941
2942 dump_peers(stdout, 0, 0, &gbcfg);
2943
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002944 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
2945 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2946 OSMO_ASSERT(link_info);
2947 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2948 OSMO_ASSERT(link_info->tlli.assigned == 0);
2949 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2950 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002951
2952 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02002953 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002954 local_bss_tlli, &rai_bss, cell_id,
2955 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2956
Alexander Couzens82182d02020-09-22 13:21:46 +02002957 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002958 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2959 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2960
Alexander Couzens82182d02020-09-22 13:21:46 +02002961 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002962 local_bss_tlli, &rai_bss, cell_id,
2963 llc_ui_ll11_dns_query_ul,
2964 sizeof(llc_ui_ll11_dns_query_ul));
2965
Alexander Couzens82182d02020-09-22 13:21:46 +02002966 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002967 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
2968 llc_ui_ll11_dns_resp_dl,
2969 sizeof(llc_ui_ll11_dns_resp_dl));
2970
2971 dump_peers(stdout, 0, 0, &gbcfg);
2972
2973 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02002974 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002975 local_bss_tlli, 1, 12);
2976
2977 dump_peers(stdout, 0, 0, &gbcfg);
2978
Alexander Couzens82182d02020-09-22 13:21:46 +02002979 send_bssgp_llc_discarded(nsi, SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002980 local_sgsn_tlli, 1, 12);
2981
2982 dump_peers(stdout, 0, 0, &gbcfg);
2983
Alexander Couzens82182d02020-09-22 13:21:46 +02002984 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli, &rai_bss);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002985
2986 dump_peers(stdout, 0, 0, &gbcfg);
2987
Alexander Couzens82182d02020-09-22 13:21:46 +02002988 send_bssgp_suspend_ack(nsi, SGSN_NSEI, local_sgsn_tlli, &rai_sgsn);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002989
2990 dump_peers(stdout, 0, 0, &gbcfg);
2991
2992 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
2993
Alexander Couzens82182d02020-09-22 13:21:46 +02002994 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002995 foreign_bss_tlli2, &rai_unknown, cell_id,
2996 GPRS_SAPI_GMM, bss_nu++,
2997 dtap_attach_req, sizeof(dtap_attach_req));
2998
2999 dump_peers(stdout, 0, 0, &gbcfg);
3000
Alexander Couzens82182d02020-09-22 13:21:46 +02003001 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003002 foreign_bss_tlli2, &rai_bss, cell_id,
3003 GPRS_SAPI_GMM, bss_nu++,
3004 dtap_identity2_resp, sizeof(dtap_identity2_resp));
3005
3006 dump_peers(stdout, 0, 0, &gbcfg);
3007
Alexander Couzens82182d02020-09-22 13:21:46 +02003008 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003009 random_sgsn_tlli2, 0, NULL, 0,
3010 GPRS_SAPI_GMM, sgsn_nu++,
3011 dtap_identity_req, sizeof(dtap_identity_req));
3012
3013 dump_peers(stdout, 0, 0, &gbcfg);
3014
Alexander Couzens82182d02020-09-22 13:21:46 +02003015 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003016 foreign_bss_tlli2, &rai_bss, cell_id,
3017 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02003018 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003019
3020 dump_peers(stdout, 0, 0, &gbcfg);
3021
Alexander Couzens82182d02020-09-22 13:21:46 +02003022 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003023 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3024 GPRS_SAPI_GMM, sgsn_nu++,
3025 dtap_attach_acc2, sizeof(dtap_attach_acc2));
3026
3027 dump_peers(stdout, 0, 0, &gbcfg);
3028
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003029 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
3030 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
3031 OSMO_ASSERT(link_info);
3032 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3033 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3034 OSMO_ASSERT(!link_info->tlli.bss_validated);
3035 OSMO_ASSERT(!link_info->tlli.net_validated);
3036 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
3037 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3038 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3039 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3040 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3041 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003042
Alexander Couzens82182d02020-09-22 13:21:46 +02003043 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003044 local_bss_tlli2, &rai_bss, cell_id,
3045 GPRS_SAPI_GMM, bss_nu++,
3046 dtap_attach_complete, sizeof(dtap_attach_complete));
3047
3048 dump_peers(stdout, 0, 0, &gbcfg);
3049
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003050 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3051 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3052 OSMO_ASSERT(link_info);
3053 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3054 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3055 OSMO_ASSERT(link_info->tlli.bss_validated);
3056 OSMO_ASSERT(!link_info->tlli.net_validated);
3057 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3058 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3059 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3060 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003061
Alexander Couzens82182d02020-09-22 13:21:46 +02003062 send_llc_dl_ui(nsi, "GMM INFO", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003063 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3064 GPRS_SAPI_GMM, sgsn_nu++,
3065 dtap_gmm_information, sizeof(dtap_gmm_information));
3066
3067 dump_peers(stdout, 0, 0, &gbcfg);
3068
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003069 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3070 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3071 OSMO_ASSERT(link_info);
3072 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
3073 OSMO_ASSERT(link_info->tlli.assigned == 0);
3074 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
3075 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003076
3077 /* Non-DTAP */
Alexander Couzens82182d02020-09-22 13:21:46 +02003078 send_bssgp_ul_unitdata(nsi, "XID (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003079 local_bss_tlli2, &rai_bss, cell_id,
3080 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3081
Alexander Couzens82182d02020-09-22 13:21:46 +02003082 send_bssgp_dl_unitdata(nsi, "XID (DL)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003083 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3084 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3085
Alexander Couzens82182d02020-09-22 13:21:46 +02003086 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003087 local_bss_tlli2, &rai_bss, cell_id,
3088 llc_ui_ll11_dns_query_ul,
3089 sizeof(llc_ui_ll11_dns_query_ul));
3090
Alexander Couzens82182d02020-09-22 13:21:46 +02003091 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003092 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3093 llc_ui_ll11_dns_resp_dl,
3094 sizeof(llc_ui_ll11_dns_resp_dl));
3095
3096 dump_peers(stdout, 0, 0, &gbcfg);
3097
3098 /* Other messages */
Alexander Couzens82182d02020-09-22 13:21:46 +02003099 send_bssgp_llc_discarded(nsi, bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003100 local_bss_tlli2, 1, 12);
3101
3102 dump_peers(stdout, 0, 0, &gbcfg);
3103
Alexander Couzens82182d02020-09-22 13:21:46 +02003104 send_bssgp_llc_discarded(nsi, SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003105 local_sgsn_tlli2, 1, 12);
3106
3107 dump_peers(stdout, 0, 0, &gbcfg);
3108
Alexander Couzens82182d02020-09-22 13:21:46 +02003109 send_bssgp_suspend(nsi, bss_nsei[0], local_bss_tlli2, &rai_bss);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003110
3111 dump_peers(stdout, 0, 0, &gbcfg);
3112
Alexander Couzens82182d02020-09-22 13:21:46 +02003113 send_bssgp_suspend_ack(nsi, SGSN2_NSEI, local_sgsn_tlli2, &rai_sgsn);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003114
3115 dump_peers(stdout, 0, 0, &gbcfg);
3116
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003117 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
3118
Alexander Couzens82182d02020-09-22 13:21:46 +02003119 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003120 foreign_bss_tlli3, &rai_unknown, cell_id,
3121 GPRS_SAPI_GMM, bss_nu++,
3122 dtap_attach_req, sizeof(dtap_attach_req));
3123
3124 dump_peers(stdout, 0, 0, &gbcfg);
3125
Alexander Couzens82182d02020-09-22 13:21:46 +02003126 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003127 foreign_bss_tlli3, &rai_bss, cell_id,
3128 GPRS_SAPI_GMM, bss_nu++,
3129 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3130
3131 dump_peers(stdout, 0, 0, &gbcfg);
3132
Alexander Couzens82182d02020-09-22 13:21:46 +02003133 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003134 random_sgsn_tlli3, 0, NULL, 0,
3135 GPRS_SAPI_GMM, sgsn_nu++,
3136 dtap_identity_req, sizeof(dtap_identity_req));
3137
3138 dump_peers(stdout, 0, 0, &gbcfg);
3139
Alexander Couzens82182d02020-09-22 13:21:46 +02003140 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003141 foreign_bss_tlli3, &rai_bss, cell_id,
3142 GPRS_SAPI_GMM, bss_nu++,
3143 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3144
3145 dump_peers(stdout, 0, 0, &gbcfg);
3146
Alexander Couzens82182d02020-09-22 13:21:46 +02003147 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003148 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
3149 GPRS_SAPI_GMM, sgsn_nu++,
3150 dtap_attach_acc, sizeof(dtap_attach_acc));
3151
3152 dump_peers(stdout, 0, 0, &gbcfg);
3153
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003154 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
3155 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
3156 OSMO_ASSERT(link_info);
3157 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3158 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3159 OSMO_ASSERT(!link_info->tlli.bss_validated);
3160 OSMO_ASSERT(!link_info->tlli.net_validated);
3161 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
3162 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3163 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3164 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3165 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3166 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003167
Alexander Couzens82182d02020-09-22 13:21:46 +02003168 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003169 local_bss_tlli3, &rai_bss, cell_id,
3170 GPRS_SAPI_GMM, bss_nu++,
3171 dtap_attach_complete, sizeof(dtap_attach_complete));
3172
3173 dump_peers(stdout, 0, 0, &gbcfg);
3174
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003175 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003176 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003177 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3178 OSMO_ASSERT(link_info);
3179 OSMO_ASSERT(link_info != other_info);
3180 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3181 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3182 OSMO_ASSERT(link_info->tlli.bss_validated);
3183 OSMO_ASSERT(!link_info->tlli.net_validated);
3184 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3185 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3186 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3187 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003188
Alexander Couzens82182d02020-09-22 13:21:46 +02003189 send_llc_dl_ui(nsi, "GMM INFO", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003190 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3191 GPRS_SAPI_GMM, sgsn_nu++,
3192 dtap_gmm_information, sizeof(dtap_gmm_information));
3193
3194 dump_peers(stdout, 0, 0, &gbcfg);
3195
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003196 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003197 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003198 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3199 OSMO_ASSERT(link_info);
3200 OSMO_ASSERT(link_info != other_info);
3201 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
3202 OSMO_ASSERT(link_info->tlli.assigned == 0);
3203 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3204 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003205
3206
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003207 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
3208
3209 /* Detach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003210 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003211 local_bss_tlli, &rai_bss, cell_id,
3212 GPRS_SAPI_GMM, bss_nu++,
3213 dtap_detach_req, sizeof(dtap_detach_req));
3214
3215 dump_peers(stdout, 0, 0, &gbcfg);
3216
Alexander Couzens82182d02020-09-22 13:21:46 +02003217 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003218 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3219 GPRS_SAPI_GMM, sgsn_nu++,
3220 dtap_detach_acc, sizeof(dtap_detach_acc));
3221
3222 dump_peers(stdout, 0, 0, &gbcfg);
3223
3224 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
3225
Alexander Couzens82182d02020-09-22 13:21:46 +02003226 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003227 local_bss_tlli2, &rai_bss, cell_id,
3228 GPRS_SAPI_GMM, bss_nu++,
3229 dtap_detach_req, sizeof(dtap_detach_req));
3230
3231 dump_peers(stdout, 0, 0, &gbcfg);
3232
Alexander Couzens82182d02020-09-22 13:21:46 +02003233 send_llc_dl_ui(nsi, "DETACH ACC", SGSN2_NSEI, 0x1002,
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003234 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3235 GPRS_SAPI_GMM, sgsn_nu++,
3236 dtap_detach_acc, sizeof(dtap_detach_acc));
3237
3238 dump_peers(stdout, 0, 0, &gbcfg);
3239
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003240 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
3241
Alexander Couzens82182d02020-09-22 13:21:46 +02003242 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003243 local_bss_tlli3, &rai_bss, cell_id,
3244 GPRS_SAPI_GMM, bss_nu++,
3245 dtap_detach_req, sizeof(dtap_detach_req));
3246
3247 dump_peers(stdout, 0, 0, &gbcfg);
3248
Alexander Couzens82182d02020-09-22 13:21:46 +02003249 send_llc_dl_ui(nsi, "DETACH ACC", SGSN2_NSEI, 0x1002,
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003250 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3251 GPRS_SAPI_GMM, sgsn_nu++,
3252 dtap_detach_acc, sizeof(dtap_detach_acc));
3253
3254 dump_peers(stdout, 0, 0, &gbcfg);
3255
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003256 dump_global(stdout, 0);
3257
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02003258 talloc_free(gbcfg.core_apn);
3259 gbcfg.core_apn = NULL;
3260
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003261 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING]);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003262 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02003263 gprs_ns2_free(nsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003264 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003265
3266 cleanup_test();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003267}
3268
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003269static void test_gbproxy_keep_info()
3270{
Alexander Couzens82182d02020-09-22 13:21:46 +02003271 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003272 struct gprs_ra_id rai_bss =
3273 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3274 uint16_t cell_id = 0x1234;
3275
3276 const uint32_t ptmsi = 0xefe2b700;
3277 const uint32_t local_tlli = 0xefe2b700;
3278 const uint32_t foreign_tlli = 0xafe2b700;
3279
Neels Hofmeyr7369d442020-05-29 17:05:40 +02003280 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003281 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003282 struct gbproxy_peer *peer;
3283 unsigned bss_nu = 0;
3284 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02003285 uint16_t bss_nsei[] = { 0x1000 };
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003286
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003287 LLIST_HEAD(rcv_list);
3288
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003289 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3290
Alexander Couzens82182d02020-09-22 13:21:46 +02003291 gbcfg.nsi = nsi;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003292 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3293 gbcfg.patch_ptmsi = 0;
3294 gbcfg.acquire_imsi = 1;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01003295 gbcfg.core_plmn = (struct osmo_plmn_id){};
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003296 gbcfg.core_apn = NULL;
3297 gbcfg.core_apn_size = 0;
3298 gbcfg.route_to_sgsn2 = 0;
3299 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003300 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003301
Alexander Couzens82182d02020-09-22 13:21:46 +02003302 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003303
3304 printf("=== %s ===\n", __func__);
3305 printf("--- Initialise SGSN ---\n\n");
3306
Alexander Couzens82182d02020-09-22 13:21:46 +02003307 connect_sgsn(nsi, SGSN_NSEI);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003308
3309 printf("--- Initialise BSS 1 ---\n\n");
3310
Alexander Couzens82182d02020-09-22 13:21:46 +02003311 setup_ns(nsi, bss_nsei[0]);
3312 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003313
3314 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3315 OSMO_ASSERT(peer != NULL);
3316
Alexander Couzens82182d02020-09-22 13:21:46 +02003317 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003318
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003319 dump_global(stdout, 0);
3320 dump_peers(stdout, 0, 0, &gbcfg);
3321
3322 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3323
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003324 received_messages = &rcv_list;
3325
Alexander Couzens82182d02020-09-22 13:21:46 +02003326 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003327 foreign_tlli, &rai_bss, cell_id,
3328 GPRS_SAPI_GMM, bss_nu++,
3329 dtap_attach_req, sizeof(dtap_attach_req));
3330
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003331 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3332
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003333 dump_peers(stdout, 0, 0, &gbcfg);
3334
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003335 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3336 OSMO_ASSERT(link_info);
3337 OSMO_ASSERT(link_info->imsi_len == 0);
3338 OSMO_ASSERT(!link_info->is_deregistered);
3339 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003340
Alexander Couzens82182d02020-09-22 13:21:46 +02003341 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003342 foreign_tlli, &rai_bss, cell_id,
3343 GPRS_SAPI_GMM, bss_nu++,
3344 dtap_identity_resp, sizeof(dtap_identity_resp));
3345
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003346 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3347
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003348 dump_peers(stdout, 0, 0, &gbcfg);
3349
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003350 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3351 OSMO_ASSERT(link_info);
3352 OSMO_ASSERT(link_info->imsi_len > 0);
3353 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003354 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003355
Alexander Couzens82182d02020-09-22 13:21:46 +02003356 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003357 foreign_tlli, 0, NULL, 0,
3358 GPRS_SAPI_GMM, sgsn_nu++,
3359 dtap_identity_req, sizeof(dtap_identity_req));
3360
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003361 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3362
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003363 dump_peers(stdout, 0, 0, &gbcfg);
3364
Alexander Couzens82182d02020-09-22 13:21:46 +02003365 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003366 foreign_tlli, &rai_bss, cell_id,
3367 GPRS_SAPI_GMM, bss_nu++,
3368 dtap_identity_resp, sizeof(dtap_identity_resp));
3369
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003370 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
3371
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003372 dump_peers(stdout, 0, 0, &gbcfg);
3373
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003374 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3375 OSMO_ASSERT(link_info);
3376 OSMO_ASSERT(link_info->imsi_len > 0);
3377 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003378
Alexander Couzens82182d02020-09-22 13:21:46 +02003379 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003380 foreign_tlli, 1, imsi, sizeof(imsi),
3381 GPRS_SAPI_GMM, sgsn_nu++,
3382 dtap_attach_acc, sizeof(dtap_attach_acc));
3383
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003384 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3385
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003386 dump_peers(stdout, 0, 0, &gbcfg);
3387
Alexander Couzens82182d02020-09-22 13:21:46 +02003388 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003389 local_tlli, &rai_bss, cell_id,
3390 GPRS_SAPI_GMM, bss_nu++,
3391 dtap_attach_complete, sizeof(dtap_attach_complete));
3392
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003393 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3394
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003395 dump_peers(stdout, 0, 0, &gbcfg);
3396
Alexander Couzens82182d02020-09-22 13:21:46 +02003397 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003398 local_tlli, 1, imsi, sizeof(imsi),
3399 GPRS_SAPI_GMM, sgsn_nu++,
3400 dtap_gmm_information, sizeof(dtap_gmm_information));
3401
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003402 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3403
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003404 dump_peers(stdout, 0, 0, &gbcfg);
3405
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003406 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3407 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003408
3409 /* Detach (MO) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003410 send_llc_ul_ui(nsi, "DETACH REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003411 local_tlli, &rai_bss, cell_id,
3412 GPRS_SAPI_GMM, bss_nu++,
3413 dtap_detach_req, sizeof(dtap_detach_req));
3414
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003415 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3416
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003417 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3418 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003419
3420 dump_peers(stdout, 0, 0, &gbcfg);
3421
Alexander Couzens82182d02020-09-22 13:21:46 +02003422 send_llc_dl_ui(nsi, "DETACH ACC", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003423 local_tlli, 1, imsi, sizeof(imsi),
3424 GPRS_SAPI_GMM, sgsn_nu++,
3425 dtap_detach_acc, sizeof(dtap_detach_acc));
3426
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003427 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3428
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003429 dump_peers(stdout, 0, 0, &gbcfg);
3430
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003431 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3432 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3433 OSMO_ASSERT(link_info);
3434 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003435
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003436 OSMO_ASSERT(!expect_msg());
3437
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003438 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003439 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003440 foreign_tlli, &rai_bss, cell_id,
3441 GPRS_SAPI_GMM, bss_nu++,
3442 dtap_attach_req3, sizeof(dtap_attach_req3));
3443
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003444 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3445
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003446 dump_peers(stdout, 0, 0, &gbcfg);
3447
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003448 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3449 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3450 OSMO_ASSERT(link_info);
3451 OSMO_ASSERT(link_info == link_info2);
3452 OSMO_ASSERT(link_info->imsi_len != 0);
3453 OSMO_ASSERT(!link_info->is_deregistered);
3454 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003455 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003456
Alexander Couzens82182d02020-09-22 13:21:46 +02003457 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003458 foreign_tlli, 1, imsi, sizeof(imsi),
3459 GPRS_SAPI_GMM, sgsn_nu++,
3460 dtap_attach_acc, sizeof(dtap_attach_acc));
3461
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003462 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3463
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003464 dump_peers(stdout, 0, 0, &gbcfg);
3465
Alexander Couzens82182d02020-09-22 13:21:46 +02003466 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003467 local_tlli, &rai_bss, cell_id,
3468 GPRS_SAPI_GMM, bss_nu++,
3469 dtap_attach_complete, sizeof(dtap_attach_complete));
3470
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003471 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3472
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003473 dump_peers(stdout, 0, 0, &gbcfg);
3474
3475 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003476 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003477 local_tlli, 1, imsi, sizeof(imsi),
3478 GPRS_SAPI_GMM, sgsn_nu++,
3479 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3480
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003481 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_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_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3486 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003487
Alexander Couzens82182d02020-09-22 13:21:46 +02003488 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003489 local_tlli, &rai_bss, cell_id,
3490 GPRS_SAPI_GMM, bss_nu++,
3491 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3492
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003493 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3494 OSMO_ASSERT(!expect_msg());
3495
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003496 dump_peers(stdout, 0, 0, &gbcfg);
3497
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003498 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3499 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3500 OSMO_ASSERT(link_info);
3501 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003502
3503 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003504 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003505 foreign_tlli, &rai_bss, cell_id,
3506 GPRS_SAPI_GMM, bss_nu++,
3507 dtap_attach_req3, sizeof(dtap_attach_req3));
3508
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003509 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3510
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003511 dump_peers(stdout, 0, 0, &gbcfg);
3512
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003513 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3514 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3515 OSMO_ASSERT(link_info);
3516 OSMO_ASSERT(link_info == link_info2);
3517 OSMO_ASSERT(link_info->imsi_len != 0);
3518 OSMO_ASSERT(!link_info->is_deregistered);
3519 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003520
Alexander Couzens82182d02020-09-22 13:21:46 +02003521 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003522 foreign_tlli, 1, imsi, sizeof(imsi),
3523 GPRS_SAPI_GMM, sgsn_nu++,
3524 dtap_attach_acc, sizeof(dtap_attach_acc));
3525
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003526 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3527
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003528 dump_peers(stdout, 0, 0, &gbcfg);
3529
Alexander Couzens82182d02020-09-22 13:21:46 +02003530 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003531 local_tlli, &rai_bss, cell_id,
3532 GPRS_SAPI_GMM, bss_nu++,
3533 dtap_attach_complete, sizeof(dtap_attach_complete));
3534
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003535 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3536
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003537 dump_peers(stdout, 0, 0, &gbcfg);
3538
3539 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003540 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003541 local_tlli, 1, imsi, sizeof(imsi),
3542 GPRS_SAPI_GMM, sgsn_nu++,
3543 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3544
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003545 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3546
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003547 dump_peers(stdout, 0, 0, &gbcfg);
3548
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003549 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3550 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003551
Alexander Couzens82182d02020-09-22 13:21:46 +02003552 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003553 local_tlli, &rai_bss, cell_id,
3554 GPRS_SAPI_GMM, bss_nu++,
3555 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3556
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003557 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3558 OSMO_ASSERT(!expect_msg());
3559
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003560 dump_peers(stdout, 0, 0, &gbcfg);
3561
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003562 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3563 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3564 OSMO_ASSERT(link_info);
3565 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003566
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003567 /* Re-Attach with IMSI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003568 send_llc_ul_ui(nsi, "ATTACH REQUEST (IMSI)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003569 foreign_tlli, &rai_bss, cell_id,
3570 GPRS_SAPI_GMM, bss_nu++,
3571 dtap_attach_req4, sizeof(dtap_attach_req4));
3572
3573 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3574
3575 dump_peers(stdout, 0, 0, &gbcfg);
3576
3577 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3578 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3579 OSMO_ASSERT(link_info);
3580 OSMO_ASSERT(link_info == link_info2);
3581 OSMO_ASSERT(link_info->imsi_len != 0);
3582 OSMO_ASSERT(!link_info->is_deregistered);
3583 OSMO_ASSERT(!link_info->imsi_acq_pending);
3584 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
3585
Alexander Couzens82182d02020-09-22 13:21:46 +02003586 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003587 foreign_tlli, 1, imsi, sizeof(imsi),
3588 GPRS_SAPI_GMM, sgsn_nu++,
3589 dtap_attach_acc, sizeof(dtap_attach_acc));
3590
3591 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3592
3593 dump_peers(stdout, 0, 0, &gbcfg);
3594
Alexander Couzens82182d02020-09-22 13:21:46 +02003595 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003596 local_tlli, &rai_bss, cell_id,
3597 GPRS_SAPI_GMM, bss_nu++,
3598 dtap_attach_complete, sizeof(dtap_attach_complete));
3599
3600 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3601
3602 dump_peers(stdout, 0, 0, &gbcfg);
3603
3604 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003605 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003606 local_tlli, 1, imsi, sizeof(imsi),
3607 GPRS_SAPI_GMM, sgsn_nu++,
3608 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3609
3610 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3611
3612 dump_peers(stdout, 0, 0, &gbcfg);
3613
3614 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3615 OSMO_ASSERT(link_info);
3616
Alexander Couzens82182d02020-09-22 13:21:46 +02003617 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003618 local_tlli, &rai_bss, cell_id,
3619 GPRS_SAPI_GMM, bss_nu++,
3620 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3621
3622 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3623 OSMO_ASSERT(!expect_msg());
3624
3625 dump_peers(stdout, 0, 0, &gbcfg);
3626
3627 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3628 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3629 OSMO_ASSERT(link_info);
3630 OSMO_ASSERT(link_info->is_deregistered);
3631
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003632 /* Re-Attach */
Alexander Couzens82182d02020-09-22 13:21:46 +02003633 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003634 foreign_tlli, &rai_bss, cell_id,
3635 GPRS_SAPI_GMM, bss_nu++,
3636 dtap_attach_req3, sizeof(dtap_attach_req3));
3637
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003638 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3639
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003640 dump_peers(stdout, 0, 0, &gbcfg);
3641
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003642 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3643 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3644 OSMO_ASSERT(link_info);
3645 OSMO_ASSERT(link_info == link_info2);
3646 OSMO_ASSERT(link_info->imsi_len != 0);
3647 OSMO_ASSERT(!link_info->is_deregistered);
3648 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003649
Alexander Couzens82182d02020-09-22 13:21:46 +02003650 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003651 foreign_tlli, 1, imsi, sizeof(imsi),
3652 GPRS_SAPI_GMM, sgsn_nu++,
3653 dtap_attach_acc, sizeof(dtap_attach_acc));
3654
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003655 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3656
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003657 dump_peers(stdout, 0, 0, &gbcfg);
3658
Alexander Couzens82182d02020-09-22 13:21:46 +02003659 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003660 local_tlli, &rai_bss, cell_id,
3661 GPRS_SAPI_GMM, bss_nu++,
3662 dtap_attach_complete, sizeof(dtap_attach_complete));
3663
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003664 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3665
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003666 dump_peers(stdout, 0, 0, &gbcfg);
3667
3668 /* RA update procedure (reject -> Detach) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003669 send_llc_ul_ui(nsi, "RA UPD REQ", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003670 local_tlli, &rai_bss, 0x7080,
3671 GPRS_SAPI_GMM, bss_nu++,
3672 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3673
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003674 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
3675
Alexander Couzens82182d02020-09-22 13:21:46 +02003676 send_llc_dl_ui(nsi, "RA UDP REJ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003677 local_tlli, 1, imsi, sizeof(imsi),
3678 GPRS_SAPI_GMM, sgsn_nu++,
3679 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3680
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003681 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
3682 OSMO_ASSERT(!expect_msg());
3683
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003684 dump_peers(stdout, 0, 0, &gbcfg);
3685
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003686 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3687 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3688 OSMO_ASSERT(link_info);
3689 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003690
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003691 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003692 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003693 foreign_tlli, &rai_bss, cell_id,
3694 GPRS_SAPI_GMM, bss_nu++,
3695 dtap_attach_req, sizeof(dtap_attach_req));
3696
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003697 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3698
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003699 dump_peers(stdout, 0, 0, &gbcfg);
3700
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003701 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3702 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3703 OSMO_ASSERT(link_info);
3704 OSMO_ASSERT(link_info != link_info2);
3705 OSMO_ASSERT(link_info->imsi_len == 0);
3706 OSMO_ASSERT(!link_info->is_deregistered);
3707 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003708
Alexander Couzens82182d02020-09-22 13:21:46 +02003709 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003710 foreign_tlli, &rai_bss, cell_id,
3711 GPRS_SAPI_GMM, bss_nu++,
3712 dtap_identity_resp, sizeof(dtap_identity_resp));
3713
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003714 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3715
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003716 dump_peers(stdout, 0, 0, &gbcfg);
3717
3718 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3719 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3720 OSMO_ASSERT(link_info);
3721 OSMO_ASSERT(link_info == link_info2);
3722 OSMO_ASSERT(link_info->imsi_len != 0);
3723 OSMO_ASSERT(!link_info->is_deregistered);
3724 OSMO_ASSERT(!link_info->imsi_acq_pending);
3725
Alexander Couzens82182d02020-09-22 13:21:46 +02003726 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003727 foreign_tlli, 1, imsi, sizeof(imsi),
3728 GPRS_SAPI_GMM, sgsn_nu++,
3729 dtap_attach_acc, sizeof(dtap_attach_acc));
3730
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003731 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3732
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003733 dump_peers(stdout, 0, 0, &gbcfg);
3734
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003735 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3736 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3737 OSMO_ASSERT(link_info);
3738 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeckea71b482014-09-22 09:28:27 +02003739 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003740
Alexander Couzens82182d02020-09-22 13:21:46 +02003741 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003742 local_tlli, &rai_bss, cell_id,
3743 GPRS_SAPI_GMM, bss_nu++,
3744 dtap_attach_complete, sizeof(dtap_attach_complete));
3745
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003746 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3747
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003748 dump_peers(stdout, 0, 0, &gbcfg);
3749
3750 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003751 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003752 local_tlli, 1, imsi, sizeof(imsi),
3753 GPRS_SAPI_GMM, sgsn_nu++,
3754 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3755
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003756 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3757
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003758 dump_peers(stdout, 0, 0, &gbcfg);
3759
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003760 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3761 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003762
Alexander Couzens82182d02020-09-22 13:21:46 +02003763 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003764 local_tlli, &rai_bss, cell_id,
3765 GPRS_SAPI_GMM, bss_nu++,
3766 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3767
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003768 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_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 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3773 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3774 OSMO_ASSERT(link_info);
3775 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003776
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003777 OSMO_ASSERT(!expect_msg());
3778
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003779 /* Bad case: Re-Attach with local TLLI */
Alexander Couzens82182d02020-09-22 13:21:46 +02003780 send_llc_ul_ui(nsi, "ATTACH REQUEST (local TLLI)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003781 local_tlli, &rai_bss, cell_id,
3782 GPRS_SAPI_GMM, bss_nu++,
3783 dtap_attach_req3, sizeof(dtap_attach_req3));
3784
3785 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3786
3787 dump_peers(stdout, 0, 0, &gbcfg);
3788
3789 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3790 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3791 OSMO_ASSERT(link_info);
3792 OSMO_ASSERT(link_info == link_info2);
3793 OSMO_ASSERT(link_info->imsi_len != 0);
3794 OSMO_ASSERT(!link_info->is_deregistered);
3795 OSMO_ASSERT(!link_info->imsi_acq_pending);
3796 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
3797
Alexander Couzens82182d02020-09-22 13:21:46 +02003798 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003799 local_tlli, 1, imsi, sizeof(imsi),
3800 GPRS_SAPI_GMM, sgsn_nu++,
3801 dtap_attach_acc, sizeof(dtap_attach_acc));
3802
3803 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3804
3805 dump_peers(stdout, 0, 0, &gbcfg);
3806
Alexander Couzens82182d02020-09-22 13:21:46 +02003807 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003808 local_tlli, &rai_bss, cell_id,
3809 GPRS_SAPI_GMM, bss_nu++,
3810 dtap_attach_complete, sizeof(dtap_attach_complete));
3811
3812 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3813
3814 dump_peers(stdout, 0, 0, &gbcfg);
3815
3816 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003817 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003818 local_tlli, 1, imsi, sizeof(imsi),
3819 GPRS_SAPI_GMM, sgsn_nu++,
3820 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3821
3822 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3823
3824 dump_peers(stdout, 0, 0, &gbcfg);
3825
3826 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3827 OSMO_ASSERT(link_info);
3828
Alexander Couzens82182d02020-09-22 13:21:46 +02003829 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003830 local_tlli, &rai_bss, cell_id,
3831 GPRS_SAPI_GMM, bss_nu++,
3832 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3833
3834 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3835 OSMO_ASSERT(!expect_msg());
3836
3837 dump_peers(stdout, 0, 0, &gbcfg);
3838
3839 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3840 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3841 OSMO_ASSERT(link_info);
3842 OSMO_ASSERT(link_info->is_deregistered);
3843
3844 /* Bad case: Unexpected Re-Attach with IMSI after completed attachment
3845 * procedure */
Alexander Couzens82182d02020-09-22 13:21:46 +02003846 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003847 foreign_tlli, &rai_bss, cell_id,
3848 GPRS_SAPI_GMM, bss_nu++,
3849 dtap_attach_req3, sizeof(dtap_attach_req3));
3850
3851 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3852
3853 dump_peers(stdout, 0, 0, &gbcfg);
3854
3855 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3856 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3857 OSMO_ASSERT(link_info);
3858 OSMO_ASSERT(link_info == link_info2);
3859 OSMO_ASSERT(link_info->imsi_len != 0);
3860 OSMO_ASSERT(!link_info->is_deregistered);
3861 OSMO_ASSERT(!link_info->imsi_acq_pending);
3862
Alexander Couzens82182d02020-09-22 13:21:46 +02003863 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003864 foreign_tlli, 1, imsi, sizeof(imsi),
3865 GPRS_SAPI_GMM, sgsn_nu++,
3866 dtap_attach_acc, sizeof(dtap_attach_acc));
3867
3868 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3869
3870 dump_peers(stdout, 0, 0, &gbcfg);
3871
Alexander Couzens82182d02020-09-22 13:21:46 +02003872 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003873 local_tlli, &rai_bss, cell_id,
3874 GPRS_SAPI_GMM, bss_nu++,
3875 dtap_attach_complete, sizeof(dtap_attach_complete));
3876
3877 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3878
3879 dump_peers(stdout, 0, 0, &gbcfg);
3880
Alexander Couzens82182d02020-09-22 13:21:46 +02003881 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003882 local_tlli, 1, imsi, sizeof(imsi),
3883 GPRS_SAPI_GMM, sgsn_nu++,
3884 dtap_gmm_information, sizeof(dtap_gmm_information));
3885
3886 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3887
3888 dump_peers(stdout, 0, 0, &gbcfg);
3889
3890 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected, IMSI)",
Alexander Couzens82182d02020-09-22 13:21:46 +02003891 bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003892 foreign_tlli, &rai_bss, cell_id,
3893 GPRS_SAPI_GMM, bss_nu++,
3894 dtap_attach_req4, sizeof(dtap_attach_req4));
3895
3896 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3897
3898 dump_peers(stdout, 0, 0, &gbcfg);
3899
3900 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3901 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01003902 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003903 OSMO_ASSERT(link_info == link_info2);
3904 OSMO_ASSERT(link_info->imsi_len != 0);
3905 OSMO_ASSERT(!link_info->is_deregistered);
3906 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01003907 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003908 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
3909
Alexander Couzens82182d02020-09-22 13:21:46 +02003910 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003911 foreign_tlli, 1, imsi, sizeof(imsi),
3912 GPRS_SAPI_GMM, sgsn_nu++,
3913 dtap_attach_acc, sizeof(dtap_attach_acc));
3914
3915 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3916
3917 dump_peers(stdout, 0, 0, &gbcfg);
3918
Alexander Couzens82182d02020-09-22 13:21:46 +02003919 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003920 local_tlli, &rai_bss, cell_id,
3921 GPRS_SAPI_GMM, bss_nu++,
3922 dtap_attach_complete, sizeof(dtap_attach_complete));
3923
3924 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3925
3926 dump_peers(stdout, 0, 0, &gbcfg);
3927
3928 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02003929 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003930 local_tlli, 1, imsi, sizeof(imsi),
3931 GPRS_SAPI_GMM, sgsn_nu++,
3932 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3933
3934 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3935
3936 dump_peers(stdout, 0, 0, &gbcfg);
3937
3938 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3939 OSMO_ASSERT(link_info);
3940
Alexander Couzens82182d02020-09-22 13:21:46 +02003941 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003942 local_tlli, &rai_bss, cell_id,
3943 GPRS_SAPI_GMM, bss_nu++,
3944 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3945
3946 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3947 OSMO_ASSERT(!expect_msg());
3948
3949 dump_peers(stdout, 0, 0, &gbcfg);
3950
3951 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3952 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3953 OSMO_ASSERT(link_info);
3954 OSMO_ASSERT(link_info->is_deregistered);
3955
3956 /* Bad case: Unexpected Re-Attach with P-TMSI after completed attachment
3957 * procedure */
Alexander Couzens82182d02020-09-22 13:21:46 +02003958 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003959 foreign_tlli, &rai_bss, cell_id,
3960 GPRS_SAPI_GMM, bss_nu++,
3961 dtap_attach_req3, sizeof(dtap_attach_req3));
3962
3963 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3964
3965 dump_peers(stdout, 0, 0, &gbcfg);
3966
3967 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3968 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3969 OSMO_ASSERT(link_info);
3970 OSMO_ASSERT(link_info == link_info2);
3971 OSMO_ASSERT(link_info->imsi_len != 0);
3972 OSMO_ASSERT(!link_info->is_deregistered);
3973 OSMO_ASSERT(!link_info->imsi_acq_pending);
3974
Alexander Couzens82182d02020-09-22 13:21:46 +02003975 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003976 foreign_tlli, 1, imsi, sizeof(imsi),
3977 GPRS_SAPI_GMM, sgsn_nu++,
3978 dtap_attach_acc, sizeof(dtap_attach_acc));
3979
3980 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3981
3982 dump_peers(stdout, 0, 0, &gbcfg);
3983
Alexander Couzens82182d02020-09-22 13:21:46 +02003984 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003985 local_tlli, &rai_bss, cell_id,
3986 GPRS_SAPI_GMM, bss_nu++,
3987 dtap_attach_complete, sizeof(dtap_attach_complete));
3988
3989 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3990
3991 dump_peers(stdout, 0, 0, &gbcfg);
3992
Alexander Couzens82182d02020-09-22 13:21:46 +02003993 send_llc_dl_ui(nsi, "GMM INFO", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003994 local_tlli, 1, imsi, sizeof(imsi),
3995 GPRS_SAPI_GMM, sgsn_nu++,
3996 dtap_gmm_information, sizeof(dtap_gmm_information));
3997
3998 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3999
4000 dump_peers(stdout, 0, 0, &gbcfg);
4001
Alexander Couzens82182d02020-09-22 13:21:46 +02004002 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected)", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004003 foreign_tlli, &rai_bss, cell_id,
4004 GPRS_SAPI_GMM, bss_nu++,
4005 dtap_attach_req3, sizeof(dtap_attach_req3));
4006
4007 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4008
4009 dump_peers(stdout, 0, 0, &gbcfg);
4010
4011 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4012 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004013 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004014 OSMO_ASSERT(link_info == link_info2);
4015 OSMO_ASSERT(link_info->imsi_len != 0);
4016 OSMO_ASSERT(!link_info->is_deregistered);
4017 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004018 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004019 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4020
Alexander Couzens82182d02020-09-22 13:21:46 +02004021 send_llc_dl_ui(nsi, "ATTACH ACCEPT", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004022 foreign_tlli, 1, imsi, sizeof(imsi),
4023 GPRS_SAPI_GMM, sgsn_nu++,
4024 dtap_attach_acc, sizeof(dtap_attach_acc));
4025
4026 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4027
4028 dump_peers(stdout, 0, 0, &gbcfg);
4029
Alexander Couzens82182d02020-09-22 13:21:46 +02004030 send_llc_ul_ui(nsi, "ATTACH COMPLETE", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004031 local_tlli, &rai_bss, cell_id,
4032 GPRS_SAPI_GMM, bss_nu++,
4033 dtap_attach_complete, sizeof(dtap_attach_complete));
4034
4035 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4036
4037 dump_peers(stdout, 0, 0, &gbcfg);
4038
4039 /* Detach (MT) */
Alexander Couzens82182d02020-09-22 13:21:46 +02004040 send_llc_dl_ui(nsi, "DETACH REQ", SGSN_NSEI, 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004041 local_tlli, 1, imsi, sizeof(imsi),
4042 GPRS_SAPI_GMM, sgsn_nu++,
4043 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4044
4045 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4046
4047 dump_peers(stdout, 0, 0, &gbcfg);
4048
4049 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4050 OSMO_ASSERT(link_info);
4051
Alexander Couzens82182d02020-09-22 13:21:46 +02004052 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004053 local_tlli, &rai_bss, cell_id,
4054 GPRS_SAPI_GMM, bss_nu++,
4055 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4056
4057 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4058 OSMO_ASSERT(!expect_msg());
4059
4060 dump_peers(stdout, 0, 0, &gbcfg);
4061
4062 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4063 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4064 OSMO_ASSERT(link_info);
4065 OSMO_ASSERT(link_info->is_deregistered);
4066
4067
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004068 /* Attach rejected */
4069
4070 gbproxy_delete_link_infos(peer);
4071
Alexander Couzens82182d02020-09-22 13:21:46 +02004072 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004073 foreign_tlli, &rai_bss, cell_id,
4074 GPRS_SAPI_GMM, bss_nu++,
4075 dtap_attach_req, sizeof(dtap_attach_req));
4076
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004077 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4078
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004079 dump_peers(stdout, 0, 0, &gbcfg);
4080
4081 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4082 OSMO_ASSERT(link_info);
4083 OSMO_ASSERT(link_info->imsi_len == 0);
4084 OSMO_ASSERT(!link_info->is_deregistered);
4085 OSMO_ASSERT(link_info->imsi_acq_pending);
4086
Alexander Couzens82182d02020-09-22 13:21:46 +02004087 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004088 foreign_tlli, &rai_bss, cell_id,
4089 GPRS_SAPI_GMM, bss_nu++,
4090 dtap_identity_resp, sizeof(dtap_identity_resp));
4091
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004092 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4093
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004094 dump_peers(stdout, 0, 0, &gbcfg);
4095
4096 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4097 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4098 OSMO_ASSERT(link_info);
4099 OSMO_ASSERT(link_info == link_info2);
4100 OSMO_ASSERT(link_info->imsi_len != 0);
4101 OSMO_ASSERT(!link_info->is_deregistered);
4102 OSMO_ASSERT(!link_info->imsi_acq_pending);
4103
Alexander Couzens82182d02020-09-22 13:21:46 +02004104 send_llc_dl_ui(nsi, "ATTACH REJECT", SGSN_NSEI, 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004105 foreign_tlli, 1, imsi, sizeof(imsi),
4106 GPRS_SAPI_GMM, sgsn_nu++,
4107 dtap_attach_rej7, sizeof(dtap_attach_rej7));
4108
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004109 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
4110
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004111 dump_peers(stdout, 0, 0, &gbcfg);
4112
Jacob Erlbeck9c65c812014-09-22 10:42:05 +02004113 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4114
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004115 OSMO_ASSERT(!expect_msg());
4116
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004117 /* Attach (incomplete) and Detach (MO) */
4118
4119 gbproxy_delete_link_infos(peer);
4120
Alexander Couzens82182d02020-09-22 13:21:46 +02004121 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004122 foreign_tlli, &rai_bss, cell_id,
4123 GPRS_SAPI_GMM, bss_nu++,
4124 dtap_attach_req, sizeof(dtap_attach_req));
4125
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004126 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4127
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004128 dump_peers(stdout, 0, 0, &gbcfg);
4129
4130 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4131 OSMO_ASSERT(link_info);
4132 OSMO_ASSERT(link_info->imsi_len == 0);
4133 OSMO_ASSERT(!link_info->is_deregistered);
4134 OSMO_ASSERT(link_info->imsi_acq_pending);
4135
Alexander Couzens82182d02020-09-22 13:21:46 +02004136 send_llc_ul_ui(nsi, "DETACH REQ (MO)", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004137 foreign_tlli, &rai_bss, cell_id,
4138 GPRS_SAPI_GMM, bss_nu++,
4139 dtap_detach_req, sizeof(dtap_detach_req));
4140
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004141 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4142
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004143 dump_peers(stdout, 0, 0, &gbcfg);
4144
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004145 OSMO_ASSERT(!expect_msg());
4146
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004147 /* Attach (incomplete) and Detach (MT) */
4148
4149 gbproxy_delete_link_infos(peer);
4150
Alexander Couzens82182d02020-09-22 13:21:46 +02004151 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004152 foreign_tlli, &rai_bss, cell_id,
4153 GPRS_SAPI_GMM, bss_nu++,
4154 dtap_attach_req, sizeof(dtap_attach_req));
4155
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004156 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4157
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004158 dump_peers(stdout, 0, 0, &gbcfg);
4159
4160 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4161 OSMO_ASSERT(link_info);
4162 OSMO_ASSERT(link_info->imsi_len == 0);
4163 OSMO_ASSERT(!link_info->is_deregistered);
4164 OSMO_ASSERT(link_info->imsi_acq_pending);
4165
Alexander Couzens82182d02020-09-22 13:21:46 +02004166 send_llc_dl_ui(nsi, "DETACH REQ (MT)", SGSN_NSEI, 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004167 foreign_tlli, 1, imsi, sizeof(imsi),
4168 GPRS_SAPI_GMM, sgsn_nu++,
4169 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4170
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004171 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4172
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004173 dump_peers(stdout, 0, 0, &gbcfg);
4174
4175 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4176 OSMO_ASSERT(link_info);
4177
Alexander Couzens82182d02020-09-22 13:21:46 +02004178 send_llc_ul_ui(nsi, "DETACH ACC", bss_nsei[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004179 foreign_tlli, &rai_bss, cell_id,
4180 GPRS_SAPI_GMM, bss_nu++,
4181 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4182
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004183 /* TODO: The stored messaged should be cleaned when receiving a Detach
4184 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
4185 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4186 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4187
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004188 dump_peers(stdout, 0, 0, &gbcfg);
4189
4190 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4191 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4192 OSMO_ASSERT(link_info);
4193 OSMO_ASSERT(link_info->is_deregistered);
4194
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004195 OSMO_ASSERT(!expect_msg());
4196 received_messages = NULL;
4197
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004198 dump_global(stdout, 0);
4199
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004200 talloc_free(gbcfg.core_apn);
4201 gbcfg.core_apn = NULL;
4202
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004203 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02004204 gprs_ns2_free(nsi);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004205 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004206
4207 cleanup_test();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004208}
4209
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004210struct gbproxy_link_info *register_tlli(
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004211 struct gbproxy_peer *peer, uint32_t tlli,
4212 const uint8_t *imsi, size_t imsi_len, time_t now)
4213{
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004214 struct gbproxy_link_info *link_info;
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004215 int imsi_matches = -1;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004216 int tlli_already_known = 0;
Daniel Willmann447ad442020-11-26 18:19:21 +01004217 struct gbproxy_config *cfg = peer->nse->cfg;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004218
4219 /* Check, whether the IMSI matches */
4220 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004221 imsi_matches = gbproxy_check_imsi(
4222 &cfg->matches[GBPROX_MATCH_PATCHING], imsi, imsi_len);
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004223 if (imsi_matches < 0)
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004224 return NULL;
4225 }
4226
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004227 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004228
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004229 if (!link_info) {
4230 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004231
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004232 if (link_info) {
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004233 /* TLLI has changed somehow, adjust it */
4234 LOGP(DGPRS, LOGL_INFO,
4235 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004236 link_info->tlli.current, tlli);
4237 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004238 }
4239 }
4240
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004241 if (!link_info) {
4242 link_info = gbproxy_link_info_alloc(peer);
4243 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004244 } else {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004245 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004246 tlli_already_known = 1;
4247 }
4248
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004249 OSMO_ASSERT(link_info != NULL);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004250
4251 if (!tlli_already_known)
4252 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
4253
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004254 gbproxy_attach_link_info(peer, now, link_info);
4255 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004256
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004257 if (imsi_matches >= 0)
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004258 link_info->is_matching[GBPROX_MATCH_PATCHING] = imsi_matches;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004259
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004260 return link_info;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004261}
4262
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004263static void test_gbproxy_tlli_expire(void)
4264{
4265 struct gbproxy_config cfg = {0};
Daniel Willmann447ad442020-11-26 18:19:21 +01004266 struct gbproxy_nse *nse;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004267 struct gbproxy_peer *peer;
4268 const char *err_msg = NULL;
Neels Hofmeyr7369d442020-05-29 17:05:40 +02004269 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0xf6 };
4270 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0xf9 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004271 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004272 const uint32_t tlli1 = 1234 | 0xc0000000;
4273 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004274 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004275 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004276 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004277
4278 printf("Test TLLI info expiry\n\n");
4279
4280 gbproxy_init_config(&cfg);
Daniel Willmann447ad442020-11-26 18:19:21 +01004281 nse = gbproxy_nse_by_nsei_or_new(&cfg, 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004282
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004283 if (gbproxy_set_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING],
4284 filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004285 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
4286 err_msg);
4287 OSMO_ASSERT(err_msg == NULL);
4288 }
4289
4290 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004291 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004292
4293 printf("Test TLLI replacement:\n");
4294
4295 cfg.tlli_max_len = 0;
4296 cfg.tlli_max_age = 0;
Daniel Willmann447ad442020-11-26 18:19:21 +01004297 peer = gbproxy_peer_alloc(nse, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004298 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004299
4300 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004301 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004302 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004303 OSMO_ASSERT(link_info);
4304 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004305 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004306
4307 /* replace the old entry */
4308 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004309 link_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004310 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004311 OSMO_ASSERT(link_info);
4312 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004313 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004314
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004315 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004316
4317 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004318 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4319 OSMO_ASSERT(link_info);
4320 OSMO_ASSERT(link_info->tlli.current == tlli2);
4321 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4322 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004323
4324 printf("\n");
4325
4326 gbproxy_peer_free(peer);
4327 }
4328
4329 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004330 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004331
4332 printf("Test IMSI replacement:\n");
4333
4334 cfg.tlli_max_len = 0;
4335 cfg.tlli_max_age = 0;
Daniel Willmann447ad442020-11-26 18:19:21 +01004336 peer = gbproxy_peer_alloc(nse, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004337 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004338
4339 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004340 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004341 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004342 OSMO_ASSERT(link_info);
4343 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004344 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004345
4346 /* try to replace the old entry */
4347 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004348 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004349 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004350 OSMO_ASSERT(link_info);
4351 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004352 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004353
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004354 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004355
4356 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004357 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4358 OSMO_ASSERT(!link_info);
4359 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4360 OSMO_ASSERT(link_info);
4361 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004362
4363 printf("\n");
4364
4365 gbproxy_peer_free(peer);
4366 }
4367
4368 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004369 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004370 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004371
4372 printf("Test TLLI expiry, max_len == 1:\n");
4373
4374 cfg.tlli_max_len = 1;
4375 cfg.tlli_max_age = 0;
Daniel Willmann447ad442020-11-26 18:19:21 +01004376 peer = gbproxy_peer_alloc(nse, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004377 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004378
4379 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004380 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004381 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004382
4383 /* replace the old entry */
4384 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004385 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004386 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004387
Jacob Erlbeck51fde082014-09-19 16:40:21 +02004388 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004389 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004390 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004391
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004392 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004393
4394 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004395 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4396 OSMO_ASSERT(!link_info);
4397 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4398 OSMO_ASSERT(link_info);
4399 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004400
4401 printf("\n");
4402
4403 gbproxy_peer_free(peer);
4404 }
4405
4406 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004407 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004408 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004409
4410 printf("Test TLLI expiry, max_age == 1:\n");
4411
4412 cfg.tlli_max_len = 0;
4413 cfg.tlli_max_age = 1;
Daniel Willmann447ad442020-11-26 18:19:21 +01004414 peer = gbproxy_peer_alloc(nse, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004415 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004416
4417 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004418 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004419 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004420
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004421 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004422 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004423 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004424 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004425
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004426 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004427 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004428 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004429
4430 dump_peers(stdout, 2, now + 2, &cfg);
4431
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004432 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004433 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4434 OSMO_ASSERT(!link_info);
4435 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4436 OSMO_ASSERT(link_info);
4437 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004438
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004439 printf("\n");
4440
4441 gbproxy_peer_free(peer);
4442 }
4443
4444 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004445 struct gbproxy_link_info *link_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004446 int num_removed;
4447
4448 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
4449
4450 cfg.tlli_max_len = 0;
4451 cfg.tlli_max_age = 1;
Daniel Willmann447ad442020-11-26 18:19:21 +01004452 peer = gbproxy_peer_alloc(nse, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004453 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004454
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004455 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004456 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004457 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004458
4459 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004460 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004461 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004462 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004463
4464 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004465 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004466 now + 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004467 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004468
4469 dump_peers(stdout, 2, now + 2, &cfg);
4470
4471 printf(" Remove stale TLLIs\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004472 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004473 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004474 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004475
4476 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004477
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004478 /* verify that tlli3 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004479 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4480 OSMO_ASSERT(!link_info);
4481 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4482 OSMO_ASSERT(!link_info);
4483 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
4484 OSMO_ASSERT(link_info);
4485 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004486
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004487 printf("\n");
4488
4489 gbproxy_peer_free(peer);
4490 }
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004491 gbproxy_clear_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING]);
4492 gbprox_reset(&cfg);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004493 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
4494 rate_ctr_group_free(cfg.ctrg);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004495
4496 cleanup_test();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004497}
4498
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004499static void test_gbproxy_imsi_matching(void)
4500{
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004501 const char *err_msg = NULL;
4502 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4503 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4504 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4505 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4506 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4507 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4508 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4509 const char *filter_re1 = ".*";
4510 const char *filter_re2 = "^1234";
4511 const char *filter_re3 = "^4321";
4512 const char *filter_re4_bad = "^12[";
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004513 struct gbproxy_match match = {0,};
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004514
4515 printf("=== Test IMSI/TMSI matching ===\n\n");
4516
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004517 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004518
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004519 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re1, &err_msg) == 0);
4520 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004521
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004522 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4523 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004524
4525 err_msg = NULL;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004526 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004527 OSMO_ASSERT(err_msg != NULL);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004528 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004529
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004530 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4531 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004532
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004533 OSMO_ASSERT(gbproxy_set_patch_filter(&match, NULL, &err_msg) == 0);
4534 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004535
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004536 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4537 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004538
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004539 gbproxy_clear_patch_filter(&match);
4540 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004541
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004542 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4543 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004544
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004545 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 1);
4546 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 1);
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +02004547 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == -1);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004548 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4549 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4550 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4551 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004552
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004553 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re3, &err_msg) == 0);
4554 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004555
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004556 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 0);
4557 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 0);
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +02004558 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == -1);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004559 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4560 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4561 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4562 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004563
4564 /* TODO: Check correct length but wrong type with is_mi_tmsi */
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004565
4566 gbproxy_clear_patch_filter(&match);
4567 OSMO_ASSERT(match.enable == 0);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004568
4569 cleanup_test();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004570}
4571
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004572static void test_gbproxy_stored_messages()
4573{
Alexander Couzens82182d02020-09-22 13:21:46 +02004574 struct gprs_ns2_inst *nsi = gprs_ns2_instantiate(tall_sgsn_ctx, gprs_ns2_callback, &gbcfg);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004575 struct gprs_ra_id rai_bss =
4576 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
4577 struct gprs_ra_id rai_unknown =
4578 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
4579 uint16_t cell_id = 0x1234;
4580
4581 const uint32_t ptmsi = 0xefe2b700;
4582 const uint32_t local_tlli = 0xefe2b700;
4583
4584 const uint32_t foreign_tlli1 = 0x8000dead;
4585
4586 struct gbproxy_peer *peer;
4587 unsigned bss_nu = 0;
4588 unsigned sgsn_nu = 0;
Alexander Couzens82182d02020-09-22 13:21:46 +02004589 uint16_t bss_nsei[] = { 0x1000 };
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004590
4591 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
4592
Alexander Couzens82182d02020-09-22 13:21:46 +02004593 gbcfg.nsi = nsi;
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004594 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01004595 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004596 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004597 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
4598 gbcfg.patch_ptmsi = 0;
4599 gbcfg.acquire_imsi = 1;
4600 gbcfg.keep_link_infos = 0;
4601
Alexander Couzens82182d02020-09-22 13:21:46 +02004602 bssgp_set_bssgp_callback(gbprox_test_bssgp_send_cb, &gbcfg);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004603
4604 printf("=== %s ===\n", __func__);
4605 printf("--- Initialise SGSN ---\n\n");
4606
Alexander Couzens82182d02020-09-22 13:21:46 +02004607 connect_sgsn(nsi, SGSN_NSEI);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004608
4609 printf("--- Initialise BSS 1 ---\n\n");
4610
Alexander Couzens82182d02020-09-22 13:21:46 +02004611 setup_ns(nsi, bss_nsei[0]);
4612 setup_bssgp(nsi, bss_nsei[0], 0x1002);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004613
4614 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
4615 OSMO_ASSERT(peer != NULL);
4616
Alexander Couzens82182d02020-09-22 13:21:46 +02004617 send_bssgp_reset_ack(nsi, SGSN_NSEI, 0x1002);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004618
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004619 dump_global(stdout, 0);
4620 dump_peers(stdout, 0, 0, &gbcfg);
4621
4622 printf("--- Establish first LLC connection ---\n\n");
4623
Alexander Couzens82182d02020-09-22 13:21:46 +02004624 send_llc_ul_ui(nsi, "ATTACH REQUEST", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004625 foreign_tlli1, &rai_unknown, cell_id,
4626 GPRS_SAPI_GMM, bss_nu++,
4627 dtap_attach_req, sizeof(dtap_attach_req));
4628
4629 dump_peers(stdout, 0, 0, &gbcfg);
4630
Alexander Couzens82182d02020-09-22 13:21:46 +02004631 send_llc_dl_ui(nsi, "IDENT REQUEST", SGSN_NSEI, 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004632 foreign_tlli1, 0, NULL, 0,
4633 GPRS_SAPI_GMM, sgsn_nu++,
4634 dtap_identity_req, sizeof(dtap_identity_req));
4635
4636 dump_peers(stdout, 0, 0, &gbcfg);
4637
Alexander Couzens82182d02020-09-22 13:21:46 +02004638 send_llc_ul_ui(nsi, "DETACH ACCEPT", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004639 foreign_tlli1, &rai_bss, cell_id,
4640 GPRS_SAPI_GMM, bss_nu++,
4641 dtap_detach_acc, sizeof(dtap_detach_acc));
4642
4643 dump_peers(stdout, 0, 0, &gbcfg);
4644
Alexander Couzens82182d02020-09-22 13:21:46 +02004645 send_llc_ul_ui(nsi, "IDENT RESPONSE", bss_nsei[0], 0x1002,
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004646 foreign_tlli1, &rai_bss, cell_id,
4647 GPRS_SAPI_GMM, bss_nu++,
4648 dtap_identity_resp, sizeof(dtap_identity_resp));
4649
4650 dump_peers(stdout, 0, 0, &gbcfg);
4651
4652 dump_global(stdout, 0);
4653
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004654 talloc_free(gbcfg.core_apn);
4655 gbcfg.core_apn = NULL;
4656
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004657 gbprox_reset(&gbcfg);
Alexander Couzens82182d02020-09-22 13:21:46 +02004658 gprs_ns2_free(nsi);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004659 nsi = NULL;
4660
4661 cleanup_test();
4662}
4663
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004664/* See OS#3178 "gbproxy: failed to parse invalid BSSGP-UNITDATA message" */
4665static void test_gbproxy_parse_bssgp_unitdata()
4666{
4667 const char *hex = "0000239401e155cfea000004088872f4801018009c4000800e000601c0416c4338";
4668 struct msgb *msg = msgb_alloc(1034, "bssgp_unitdata");
4669 struct gprs_gb_parse_context parse_ctx;
4670 int rc;
4671
4672 memset(&parse_ctx, 0, sizeof(parse_ctx));
4673
4674 OSMO_ASSERT(msg);
4675 msgb_bssgph(msg) = msg->head;
4676 msgb_put(msg, osmo_hexparse(hex, msg->head, msgb_tailroom(msg)));
4677
4678 parse_ctx.to_bss = 0;
4679 parse_ctx.peer_nsei = msgb_nsei(msg);
4680
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004681 rc = gprs_gb_parse_bssgp(msg->data, msg->len, &parse_ctx);
Stefan Sperling322643f2018-06-23 16:50:06 +02004682 if (!rc)
4683 fprintf(stderr, "%s: Test passed; Failed to parse invalid message %s\n", __func__, msgb_hexdump(msg));
4684 else
4685 fprintf(stderr, "%s: Test failed; invalid message was accepted by parser: %s\n", __func__, msgb_hexdump(msg));
4686
4687 OSMO_ASSERT(!rc);
4688
4689 /* Manually decoded message according to:
4690 ETSI TS 148 018 V10.6.0 (2012 07) 96
4691 3GPP TS 48.018 version 10.6.0 Release 10
4692 Table 10.2.2: UL-UNITDATA PDU content
4693
4694 00 - PDU type UL-UNITDATA (ok)
4695
4696 11.3.35 Temporary logical link Identity (TLLI)
4697 00 - TLLI[0]
4698 23 - TLLI[1]
4699 94 - TLLI[2]
4700 01 - TLLI[3]
4701 TLLI == "00239401"
4702
4703 e1 - QOS[0] (bit rate MSB)
4704 55 - QOS[1] (bit rate LSB)
4705 bit rate = "57685" (57685*100000 bit/s per PBRG)
4706 cf - QOS[2] PBRG = 11 (bit rate is expressed in 100000 bit/s increments),
4707 C/R 0 (contains LLC ACK/SACK),
4708 T 0 (contains signalling),
4709 A 1 (radio if uses MAC/UNITDATA,
4710 Precedence 111 (reserved value)
4711
4712 ea - CELL_ID[0] (TLV IEI: wrong, should be 0x08)
4713 00 - CELL_ID[1] (length 1)
4714 00 - CELL_ID[2] (length 2)
4715 lenth == 0
4716 04 -- CELL_ID[3]
4717 08 -- CELL_ID[4]
4718 88 -- CELL_ID[5]
4719 72 -- CELL_ID[6]
4720 f4 -- CELL_ID[7]
4721 80 -- CELL_ID[8]
4722 10 -- CELL_DI[9]
4723
4724 18 -- QOSP[0] OoS Profile IEI
4725 not allowed in BSSGP Userdata
4726 00 -- QOSP[1]
4727 9c -- QOSP[2]
4728 40 -- QOSP[3]
4729 00 -- QOSP[4]
4730
4731 80 -- IEI for "E-UTRAN Inter RAT Handover Info"
4732 not allowed in BSSGP Userdata
4733 0e -- length (14 bytes -- only 8 bytes remain)
4734 00 06 01 c0 41 6c 43 38 */
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004735
4736 msgb_free(msg);
Stefan Sperling322643f2018-06-23 16:50:06 +02004737
4738 cleanup_test();
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004739}
4740
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004741static struct log_info_cat gprs_categories[] = {
4742 [DGPRS] = {
4743 .name = "DGPRS",
4744 .description = "GPRS Packet Service",
4745 .enabled = 1, .loglevel = LOGL_DEBUG,
4746 },
4747 [DNS] = {
4748 .name = "DNS",
4749 .description = "GPRS Network Service (NS)",
4750 .enabled = 1, .loglevel = LOGL_INFO,
4751 },
4752 [DBSSGP] = {
4753 .name = "DBSSGP",
4754 .description = "GPRS BSS Gateway Protocol (BSSGP)",
4755 .enabled = 1, .loglevel = LOGL_DEBUG,
4756 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004757};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004758
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004759static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004760 .cat = gprs_categories,
4761 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02004762};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004763
4764int main(int argc, char **argv)
4765{
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004766 talloc_enable_leak_report();
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004767 tall_sgsn_ctx = talloc_named_const(NULL, 0, "gbproxy_test");
4768 void *log_ctx = talloc_named_const(tall_sgsn_ctx, 0, "log");
Neels Hofmeyr4c2d4ab2016-09-16 02:31:17 +02004769
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004770 msgb_talloc_ctx_init(tall_sgsn_ctx, 0);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004771
4772 osmo_init_logging2(log_ctx, &info);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004773 log_set_use_color(osmo_stderr_target, 0);
4774 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02004775 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
4776 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004777
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004778 rate_ctr_init(tall_sgsn_ctx);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004779
4780 setlinebuf(stdout);
4781
4782 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02004783 gbproxy_init_config(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004784 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004785 test_gbproxy_ident_changes();
Alexander Couzens82182d02020-09-22 13:21:46 +02004786 test_gbproxy_ra_patching();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004787 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02004788 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02004789 test_gbproxy_ptmsi_patching();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02004790 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02004791 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02004792 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004793 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004794 test_gbproxy_tlli_expire();
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004795 test_gbproxy_stored_messages();
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004796 test_gbproxy_parse_bssgp_unitdata();
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004797 gbprox_reset(&gbcfg);
4798 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
4799 rate_ctr_group_free(gbcfg.ctrg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02004800 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004801
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004802 talloc_free(log_ctx);
4803 /* expecting root and msgb ctx, empty */
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004804 OSMO_ASSERT(talloc_total_blocks(tall_sgsn_ctx) == 2);
4805 talloc_free(tall_sgsn_ctx);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004806
4807 return 0;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02004808}