blob: 6433eb6065dd1ae0bb6618bd74ac8b034f3204ea [file] [log] [blame]
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001/* test routines for gbproxy
2 * send NS messages to the gbproxy and dumps what happens
3 * (C) 2013 by sysmocom s.f.m.c. GmbH
4 * Author: Jacob Erlbeck <jerlbeck@sysmocom.de>
5 */
6
7#undef _GNU_SOURCE
8#define _GNU_SOURCE
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <stdint.h>
13#include <string.h>
14#include <getopt.h>
15#include <dlfcn.h>
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020016#include <time.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020017#include <sys/types.h>
18#include <sys/socket.h>
19
20#include <osmocom/core/msgb.h>
21#include <osmocom/core/application.h>
22#include <osmocom/core/utils.h>
23#include <osmocom/core/logging.h>
24#include <osmocom/core/talloc.h>
25#include <osmocom/core/signal.h>
26#include <osmocom/core/rate_ctr.h>
Jacob Erlbeckb1381062014-07-01 12:41:13 +020027#include <osmocom/gsm/tlv.h>
Jacob Erlbeck59748e62014-08-11 17:26:21 +020028#include <osmocom/gsm/gsm_utils.h>
Harald Welte53373bc2016-04-20 17:11:43 +020029#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020030#include <osmocom/gprs/gprs_msgb.h>
31#include <osmocom/gprs/gprs_ns.h>
32#include <osmocom/gprs/gprs_bssgp.h>
33
Neels Hofmeyr396f2e62017-09-04 15:13:25 +020034#include <osmocom/sgsn/gb_proxy.h>
35#include <osmocom/sgsn/gprs_utils.h>
36#include <osmocom/sgsn/gprs_llc.h>
37#include <osmocom/sgsn/gprs_gb_parse.h>
38#include <osmocom/sgsn/debug.h>
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020039
40#define REMOTE_BSS_ADDR 0x01020304
41#define REMOTE_SGSN_ADDR 0x05060708
42
Jacob Erlbeck2082afa2013-10-18 13:04:47 +020043#define SGSN_NSEI 0x0100
Jacob Erlbeck51a869c2013-10-15 12:00:26 +020044
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +020045#define REMOTE_SGSN2_ADDR 0x15161718
46#define SGSN2_NSEI 0x0102
47
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020048#define MATCH_ANY (-1)
49
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +010050void *tall_sgsn_ctx = NULL;
Neels Hofmeyree6cfdc2017-07-13 02:03:50 +020051
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +020052struct gbproxy_config gbcfg = {0};
53
Jacob Erlbeckacfaff32014-09-22 18:54:34 +020054struct llist_head *received_messages = NULL;
55
Max3b6332f2017-11-01 13:28:38 +010056/* override, requires '-Wl,--wrap=osmo_get_rand_id' */
57int __real_osmo_get_rand_id(uint8_t *data, size_t len);
58int mock_osmo_get_rand_id(uint8_t *data, size_t len);
59int (*osmo_get_rand_id_cb)(uint8_t *, size_t) =
60 &mock_osmo_get_rand_id;
Daniel Willmann537d4802015-10-12 19:36:35 +020061
Max3b6332f2017-11-01 13:28:38 +010062int __wrap_osmo_get_rand_id(uint8_t *buf, size_t num)
Daniel Willmann537d4802015-10-12 19:36:35 +020063{
Max3b6332f2017-11-01 13:28:38 +010064 return (*osmo_get_rand_id_cb)(buf, num);
Daniel Willmann537d4802015-10-12 19:36:35 +020065}
66
67static int rand_seq_num = 0;
Max3b6332f2017-11-01 13:28:38 +010068int mock_osmo_get_rand_id(uint8_t *buf, size_t num)
Daniel Willmann537d4802015-10-12 19:36:35 +020069{
70 uint32_t val;
71
72 OSMO_ASSERT(num == sizeof(val));
Daniel Willmann537d4802015-10-12 19:36:35 +020073
74 val = 0x00dead00 + rand_seq_num;
75
76 rand_seq_num++;
77
78 memcpy(buf, &val, num);
79
80 return 1;
81}
82
Daniel Willmannd1554ec2015-10-12 19:36:34 +020083static void cleanup_test()
84{
Daniel Willmann537d4802015-10-12 19:36:35 +020085 rand_seq_num = 0;
Daniel Willmannd1554ec2015-10-12 19:36:34 +020086}
87
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +020088static int dump_global(FILE *stream, int indent)
89{
90 unsigned int i;
91 const struct rate_ctr_group_desc *desc;
92 int rc;
93
94 rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
95 if (rc < 0)
96 return rc;
97
98 desc = gbcfg.ctrg->desc;
99
100 for (i = 0; i < desc->num_ctr; i++) {
101 struct rate_ctr *ctr = &gbcfg.ctrg->ctr[i];
102 if (ctr->current) {
103 rc = fprintf(stream, "%*s %s: %llu\n",
104 indent, "",
105 desc->ctr_desc[i].description,
106 (long long)ctr->current);
107
108 if (rc < 0)
109 return rc;
110 }
111 }
112
113 return 0;
114}
115
Jacob Erlbeck7b821d02014-08-08 08:37:37 +0200116static int dump_peers(FILE *stream, int indent, time_t now,
117 struct gbproxy_config *cfg)
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200118{
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200119 struct gbproxy_peer *peer;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200120 struct gprs_ra_id raid;
121 unsigned int i;
122 const struct rate_ctr_group_desc *desc;
123 int rc;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200124
125 rc = fprintf(stream, "%*sPeers:\n", indent, "");
126 if (rc < 0)
127 return rc;
128
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +0200129 llist_for_each_entry(peer, &cfg->bts_peers, list) {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200130 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther1ddd9e52014-08-04 11:35:32 +0200131 struct gbproxy_patch_state *state = &peer->patch_state;
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200132 gsm48_parse_ra(&raid, peer->ra);
133
Neels Hofmeyr10719b72018-02-21 00:39:36 +0100134 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, RAI %s\n",
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200135 indent, "",
136 peer->nsei, peer->bvci,
137 peer->blocked ? "" : "not ",
Neels Hofmeyr10719b72018-02-21 00:39:36 +0100138 osmo_rai_name(&raid));
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200139
140 if (rc < 0)
141 return rc;
142
143 desc = peer->ctrg->desc;
144
145 for (i = 0; i < desc->num_ctr; i++) {
146 struct rate_ctr *ctr = &peer->ctrg->ctr[i];
147 if (ctr->current) {
148 rc = fprintf(stream, "%*s %s: %llu\n",
149 indent, "",
150 desc->ctr_desc[i].description,
151 (long long)ctr->current);
152
153 if (rc < 0)
154 return rc;
155 }
156 }
157
158 fprintf(stream, "%*s TLLI-Cache: %d\n",
Jacob Erlbeckf8562e32014-09-19 16:03:07 +0200159 indent, "", state->logical_link_count);
160 llist_for_each_entry(link_info, &state->logical_links, list) {
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +0200161 struct osmo_mobile_identity mi;
162 const char *imsi_str;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200163 time_t age = now ? now - link_info->timestamp : 0;
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200164 int stored_msgs = 0;
165 struct llist_head *iter;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200166 enum gbproxy_match_id match_id;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200167 llist_for_each(iter, &link_info->stored_msgs)
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200168 stored_msgs++;
169
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +0200170 if (link_info->imsi > 0) {
171 if (osmo_mobile_identity_decode(&mi, link_info->imsi, link_info->imsi_len, false)
172 || mi.type != GSM_MI_TYPE_IMSI)
173 imsi_str = "(invalid)";
174 else
175 imsi_str = mi.imsi;
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200176 } else {
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +0200177 imsi_str = "(none)";
Jacob Erlbeck89d3d342014-08-06 18:55:15 +0200178 }
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200179 fprintf(stream, "%*s TLLI %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200180 indent, "", link_info->tlli.current);
181 if (link_info->tlli.assigned)
182 fprintf(stream, "/%08x", link_info->tlli.assigned);
183 if (link_info->sgsn_tlli.current) {
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200184 fprintf(stream, " -> %08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200185 link_info->sgsn_tlli.current);
186 if (link_info->sgsn_tlli.assigned)
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200187 fprintf(stream, "/%08x",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200188 link_info->sgsn_tlli.assigned);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +0200189 }
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200190 fprintf(stream, ", IMSI %s, AGE %d",
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +0200191 imsi_str, (int)age);
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200192
Jacob Erlbeckea1698e2014-09-02 14:40:11 +0200193 if (stored_msgs)
194 fprintf(stream, ", STORED %d", stored_msgs);
195
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +0200196 for (match_id = 0; match_id < ARRAY_SIZE(cfg->matches);
197 ++match_id) {
198 if (cfg->matches[match_id].enable &&
199 link_info->is_matching[match_id]) {
200 fprintf(stream, ", IMSI matches");
201 break;
202 }
203 }
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200204
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200205 if (link_info->imsi_acq_pending)
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200206 fprintf(stream, ", IMSI acquisition in progress");
207
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200208 if (cfg->route_to_sgsn2)
209 fprintf(stream, ", SGSN NSEI %d",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200210 link_info->sgsn_nsei);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +0200211
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +0200212 if (link_info->is_deregistered)
Jacob Erlbeck7430da62014-09-12 15:09:56 +0200213 fprintf(stream, ", DE-REGISTERED");
214
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +0200215 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +0200216 if (rc < 0)
217 return rc;
218 }
219 }
220
221 return 0;
222}
223
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200224const uint8_t *convert_ra(struct gprs_ra_id *raid)
225{
Max25c65c32018-01-08 14:43:53 +0100226 static struct gsm48_ra_id r;
227 gsm48_encode_ra(&r, raid);
228 return (const uint8_t *)&r;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +0200229}
230
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200231/* DTAP - Attach Request */
232static const unsigned char dtap_attach_req[] = {
233 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
234 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
235 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
236 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
237 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
238 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200239};
240
Jacob Erlbeck991606b2014-09-12 10:33:38 +0200241/* DTAP - Attach Request (invalid RAI) */
242static const unsigned char dtap_attach_req2[] = {
243 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
244 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
245 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
246 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
247 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
248 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
249};
250
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200251/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
252static const unsigned char dtap_attach_req3[] = {
253 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
254 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
255 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
256 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
257 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
258 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
259};
260
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100261/* DTAP - Attach Request (IMSI 12131415161718) */
262static const unsigned char dtap_attach_req4[] = {
263 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
264 0x08, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200265 0xf8, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19,
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +0100266 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00,
267 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60,
268 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80,
269 0x00,
270};
271
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200272/* DTAP - Identity Request */
273static const unsigned char dtap_identity_req[] = {
274 0x08, 0x15, 0x01
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200275};
276
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200277/* DTAP - Identity Response */
278static const unsigned char dtap_identity_resp[] = {
279 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200280 0x16, 0x17, 0xf8
Jacob Erlbeck690768a2014-08-06 15:16:45 +0200281};
282
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200283/* DTAP - Identity Response, IMSI 2 */
284static const unsigned char dtap_identity2_resp[] = {
285 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200286 0x16, 0x17, 0xf8
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200287};
288
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200289/* DTAP - Identity Response, IMSI 3 */
290static const unsigned char dtap_identity3_resp[] = {
291 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
Neels Hofmeyr7369d442020-05-29 17:05:40 +0200292 0x26, 0x27, 0xf8
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +0200293};
294
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200295/* DTAP - Attach Accept */
296static const unsigned char dtap_attach_acc[] = {
297 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
298 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
299 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200300};
301
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200302/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200303static const unsigned char dtap_attach_acc2[] = {
304 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
305 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
306 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
307};
308
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200309/* DTAP - Attach Complete */
310static const unsigned char dtap_attach_complete[] = {
311 0x08, 0x03
Jacob Erlbeck59748e62014-08-11 17:26:21 +0200312};
313
Jacob Erlbeck2bf32612014-09-22 11:26:58 +0200314/* DTAP - Attach Reject (GPRS services not allowed) */
315static const unsigned char dtap_attach_rej7[] = {
316 0x08, 0x04, 0x07
317};
318
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200319/* DTAP - GMM Information */
320static const unsigned char dtap_gmm_information[] = {
321 0x08, 0x21
Jacob Erlbeck11669742014-06-06 18:47:36 +0200322};
323
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200324/* DTAP - Routing Area Update Request */
325static const unsigned char dtap_ra_upd_req[] = {
326 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
327 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
328 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
329 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
330 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
331 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
332 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200333};
334
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200335/* DTAP - Routing Area Update Accept */
336static const unsigned char dtap_ra_upd_acc[] = {
337 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
338 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
339 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200340};
341
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200342/* DTAP - Routing Area Update Accept, P-TMSI 2 */
343static const unsigned char dtap_ra_upd_acc2[] = {
344 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
345 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
346 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
347};
348
349/* DTAP - Routing Area Update Accept, P-TMSI 3 */
350static const unsigned char dtap_ra_upd_acc3[] = {
351 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
352 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
353 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
354};
355
356/* DTAP - Routing Area Update Complete */
357static const unsigned char dtap_ra_upd_complete[] = {
358 0x08, 0x0a
359};
360
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200361/* DTAP - Routing Area Update Reject */
362/* cause = 10 ("Implicitly detached"), force_standby = 0 */
363static const unsigned char dtap_ra_upd_rej[] = {
364 0x08, 0x0b, 0x0a, 0x00,
365};
Jacob Erlbeck52f070a2014-09-04 13:45:56 +0200366
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200367/* DTAP - Activate PDP Context Request */
368static const unsigned char dtap_act_pdp_ctx_req[] = {
369 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200370 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
372 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
373 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
374 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200375 0x00
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200376};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200377
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200378/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200379/* normal detach, power_off = 1 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200380static const unsigned char dtap_detach_po_req[] = {
381 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
382 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200383};
384
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200385/* DTAP - Detach Request (MO) */
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +0200386/* normal detach, power_off = 0 */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200387static const unsigned char dtap_detach_req[] = {
388 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
389 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200390};
391
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200392/* DTAP - Detach Accept (MO) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200393static const unsigned char dtap_detach_acc[] = {
394 0x08, 0x06, 0x00
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +0200395};
396
Jacob Erlbeck772a22b2014-09-15 14:18:09 +0200397/* DTAP - Detach Request (MT) */
398/* normal detach, reattach required, implicitly detached */
399static const unsigned char dtap_mt_detach_rea_req[] = {
400 0x08, 0x05, 0x01, 0x25, 0x0a
401};
402
403/* DTAP - Detach Request (MT) */
404/* normal detach, reattach not required, implicitly detached */
405static const unsigned char dtap_mt_detach_req[] = {
406 0x08, 0x05, 0x02, 0x25, 0x0a
407};
408
409/* DTAP - Detach Accept (MT) */
410static const unsigned char dtap_mt_detach_acc[] = {
411 0x08, 0x06
412};
413
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +0200414/* GPRS-LLC - SAPI: LLGMM, U, XID */
415static const unsigned char llc_u_xid_ul[] = {
416 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
417 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
418};
419
420/* GPRS-LLC - SAPI: LLGMM, U, XID */
421static const unsigned char llc_u_xid_dl[] = {
422 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
423 0xe4, 0xa9, 0x1a, 0x9e
424};
425
426/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
427static const unsigned char llc_ui_ll11_dns_query_ul[] = {
428 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
429 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
430 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
431 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
432 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
433 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
434 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
435 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
436 0x8f, 0x07
437};
438
439/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
440static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
441 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
442 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
443 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
444 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
445 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
446 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
447 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
448 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
449 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
450 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
451 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
452 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
453 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
454 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
455 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
456 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
457 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
458 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
459 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
460 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
461 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
462 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
463 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
464 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
465 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
466 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
467};
468
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200469static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
470 struct sockaddr_in *peer, const unsigned char* data,
471 size_t data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200472
473static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
474 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
475{
476 /* GPRS Network Service, PDU type: NS_RESET,
477 */
478 unsigned char msg[12] = {
479 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
480 0x04, 0x82, 0x11, 0x22
481 };
482
483 msg[3] = cause;
484 msg[6] = nsvci / 256;
485 msg[7] = nsvci % 256;
486 msg[10] = nsei / 256;
487 msg[11] = nsei % 256;
488
489 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
490}
491
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200492static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
493 uint16_t nsvci, uint16_t nsei)
494{
495 /* GPRS Network Service, PDU type: NS_RESET_ACK,
496 */
497 unsigned char msg[9] = {
498 0x03, 0x01, 0x82, 0x11, 0x22,
499 0x04, 0x82, 0x11, 0x22
500 };
501
502 msg[3] = nsvci / 256;
503 msg[4] = nsvci % 256;
504 msg[7] = nsei / 256;
505 msg[8] = nsei % 256;
506
507 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
508}
509
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200510static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
511{
512 /* GPRS Network Service, PDU type: NS_ALIVE */
513 unsigned char msg[1] = {
514 0x0a
515 };
516
517 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
518}
519
520static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
521{
522 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
523 unsigned char msg[1] = {
524 0x0b
525 };
526
527 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
528}
529
530static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
531{
532 /* GPRS Network Service, PDU type: NS_UNBLOCK */
533 unsigned char msg[1] = {
534 0x06
535 };
536
537 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
538}
539
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200540static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
541{
542 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
543 unsigned char msg[1] = {
544 0x07
545 };
546
547 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
548}
549
550static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
551 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200552 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
553{
554 /* GPRS Network Service, PDU type: NS_UNITDATA */
555 unsigned char msg[4096] = {
556 0x00, 0x00, 0x00, 0x00
557 };
558
559 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
560
561 msg[2] = nsbvci / 256;
562 msg[3] = nsbvci % 256;
563 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
564
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200565 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200566}
567
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200568static void send_bssgp_ul_unitdata(
569 struct gprs_ns_inst *nsi, const char *text,
570 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
571 struct gprs_ra_id *raid, uint16_t cell_id,
572 const uint8_t *llc_msg, size_t llc_msg_size)
573{
574 /* GPRS Network Service, PDU type: NS_UNITDATA */
575 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
576 unsigned char msg[4096] = {
577 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
578 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
579 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
580 };
581
582 size_t bssgp_msg_size = 23 + llc_msg_size;
583
584 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
585
Max25c65c32018-01-08 14:43:53 +0100586 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 10), raid);
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200587 msg[1] = (uint8_t)(tlli >> 24);
588 msg[2] = (uint8_t)(tlli >> 16);
589 msg[3] = (uint8_t)(tlli >> 8);
590 msg[4] = (uint8_t)(tlli >> 0);
591 msg[16] = cell_id / 256;
592 msg[17] = cell_id % 256;
593 msg[21] = llc_msg_size / 256;
594 msg[22] = llc_msg_size % 256;
595 memcpy(msg + 23, llc_msg, llc_msg_size);
596
597 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
598 src_addr, nsbvci, msg, bssgp_msg_size);
599}
600
601static void send_bssgp_dl_unitdata(
602 struct gprs_ns_inst *nsi, const char *text,
603 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
604 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
605 const uint8_t *llc_msg, size_t llc_msg_size)
606{
607 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
608 unsigned char msg[4096] = {
609 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
610 0x16, 0x82, 0x02, 0x58,
611 };
612 unsigned char racap_drx[] = {
613 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
614 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
615 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
616 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
617 };
618
619 size_t bssgp_msg_size = 0;
620
621 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
622
623 msg[1] = (uint8_t)(tlli >> 24);
624 msg[2] = (uint8_t)(tlli >> 16);
625 msg[3] = (uint8_t)(tlli >> 8);
626 msg[4] = (uint8_t)(tlli >> 0);
627
628 bssgp_msg_size = 12;
629
630 if (with_racap_drx) {
631 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
632 bssgp_msg_size += sizeof(racap_drx);
633 }
634
635 if (imsi) {
636 OSMO_ASSERT(imsi_size <= 127);
637 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
638 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
639 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
640 bssgp_msg_size += 2 + imsi_size;
641 }
642
643 if ((bssgp_msg_size % 4) != 0) {
644 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
645 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
646 msg[bssgp_msg_size + 1] = 0x80 | abytes;
647 memset(msg + bssgp_msg_size + 2, 0, abytes);
648 bssgp_msg_size += 2 + abytes;
649 }
650
651 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
652 if (llc_msg_size < 128) {
653 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
654 bssgp_msg_size += 2;
655 } else {
656 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
657 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
658 bssgp_msg_size += 3;
659 }
660 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
661 bssgp_msg_size += llc_msg_size;
662
663
664 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
665 src_addr, nsbvci, msg, bssgp_msg_size);
666}
667
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200668static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
669 uint16_t bvci)
670{
671 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
672 * BSSGP RESET */
Jacob Erlbeckda4b4922014-08-06 12:38:10 +0200673 unsigned char msg[18] = {
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200674 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeckdef03912014-06-02 10:48:59 +0200675 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
676 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200677 };
678
679 msg[3] = bvci / 256;
680 msg[4] = bvci % 256;
681
Jacob Erlbeck2082afa2013-10-18 13:04:47 +0200682 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
683}
684
685static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
686 struct sockaddr_in *src_addr, uint16_t bvci)
687{
688 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
689 * BSSGP RESET_ACK */
690 static unsigned char msg[5] = {
691 0x23, 0x04, 0x82, 0x00,
692 0x00
693 };
694
695 msg[3] = bvci / 256;
696 msg[4] = bvci % 256;
697
698 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200699}
700
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200701static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
702 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200703 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200704 struct gprs_ra_id *raid)
705{
706 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
707 unsigned char msg[15] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200708 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
709 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200710 };
711
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200712 msg[3] = (uint8_t)(tlli >> 24);
713 msg[4] = (uint8_t)(tlli >> 16);
714 msg[5] = (uint8_t)(tlli >> 8);
715 msg[6] = (uint8_t)(tlli >> 0);
716
Max25c65c32018-01-08 14:43:53 +0100717 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200718
719 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
720}
721
722static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
723 struct sockaddr_in *src_addr,
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200724 uint32_t tlli,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200725 struct gprs_ra_id *raid)
726{
727 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
728 unsigned char msg[18] = {
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200729 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
730 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200731 0x81, 0x01
732 };
733
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200734 msg[3] = (uint8_t)(tlli >> 24);
735 msg[4] = (uint8_t)(tlli >> 16);
736 msg[5] = (uint8_t)(tlli >> 8);
737 msg[6] = (uint8_t)(tlli >> 0);
738
Max25c65c32018-01-08 14:43:53 +0100739 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +0200740
741 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
742}
743
Jacob Erlbeck299389a2014-08-21 16:34:18 +0200744static void send_bssgp_llc_discarded(struct gprs_ns_inst *nsi,
745 struct sockaddr_in *src_addr,
746 uint16_t bvci, uint32_t tlli,
747 unsigned n_frames, unsigned n_octets)
748{
749 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
750 unsigned char msg[] = {
751 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
752 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
753 /* n octets */ 0xff, 0xff, 0xff
754 };
755
756 msg[3] = (uint8_t)(tlli >> 24);
757 msg[4] = (uint8_t)(tlli >> 16);
758 msg[5] = (uint8_t)(tlli >> 8);
759 msg[6] = (uint8_t)(tlli >> 0);
760 msg[9] = (uint8_t)(n_frames);
761 msg[12] = (uint8_t)(bvci >> 8);
762 msg[13] = (uint8_t)(bvci >> 0);
763 msg[16] = (uint8_t)(n_octets >> 16);
764 msg[17] = (uint8_t)(n_octets >> 8);
765 msg[18] = (uint8_t)(n_octets >> 0);
766
767 send_ns_unitdata(nsi, "LLC_DISCARDED", src_addr, 0, msg, sizeof(msg));
768}
769
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200770static void send_bssgp_paging(struct gprs_ns_inst *nsi,
771 struct sockaddr_in *src_addr,
772 const uint8_t *imsi, size_t imsi_size,
773 struct gprs_ra_id *raid, uint32_t ptmsi)
774{
775 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
776 unsigned char msg[100] = {
777 0x06,
778 };
779
780 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
781 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
782
783 size_t bssgp_msg_size = 1;
784
785 if (imsi) {
786 OSMO_ASSERT(imsi_size <= 127);
787 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
788 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
789 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
790 bssgp_msg_size += 2 + imsi_size;
791 }
792
793 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
794 bssgp_msg_size += sizeof(drx_ie);
795
796 if (raid) {
797 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
798 msg[bssgp_msg_size+1] = 0x86;
Max25c65c32018-01-08 14:43:53 +0100799 gsm48_encode_ra((struct gsm48_ra_id *)(msg + bssgp_msg_size + 2), raid);
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +0200800 bssgp_msg_size += 8;
801 }
802
803 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
804 bssgp_msg_size += sizeof(qos_ie);
805
806 if (ptmsi != GSM_RESERVED_TMSI) {
807 const uint32_t ptmsi_be = htonl(ptmsi);
808 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
809 msg[bssgp_msg_size+1] = 0x84;
810 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
811 bssgp_msg_size += 6;
812 }
813
814 send_ns_unitdata(nsi, "PAGING_PS", src_addr, 0, msg, bssgp_msg_size);
815}
816
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200817static void send_bssgp_flow_control_bvc(struct gprs_ns_inst *nsi,
818 struct sockaddr_in *src_addr,
819 uint16_t bvci, uint8_t tag)
820{
821 /* GPRS Network Service, PDU type: NS_UNITDATA,
822 * BSSGP FLOW_CONTROL_BVC */
823 unsigned char msg[] = {
824 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
825 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
826 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
827 };
828
829 msg[3] = tag;
830
831 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", src_addr, bvci,
832 msg, sizeof(msg));
833}
834
835static void send_bssgp_flow_control_bvc_ack(struct gprs_ns_inst *nsi,
836 struct sockaddr_in *src_addr,
837 uint16_t bvci, uint8_t tag)
838{
839 /* GPRS Network Service, PDU type: NS_UNITDATA,
840 * BSSGP FLOW_CONTROL_BVC_ACK */
841 unsigned char msg[] = {
842 0x27, 0x1e, 0x81, /* Tag */ 0xce
843 };
844
845 msg[3] = tag;
846
847 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", src_addr, bvci,
848 msg, sizeof(msg));
849}
850
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +0200851static void send_llc_ul_ui(
852 struct gprs_ns_inst *nsi, const char *text,
853 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
854 struct gprs_ra_id *raid, uint16_t cell_id,
855 unsigned sapi, unsigned nu,
856 const uint8_t *msg, size_t msg_size)
857{
858 unsigned char llc_msg[4096] = {
859 0x00, 0xc0, 0x01
860 };
861
862 size_t llc_msg_size = 3 + msg_size + 3;
863 uint8_t e_bit = 0;
864 uint8_t pm_bit = 1;
865 unsigned fcs;
866
867 nu &= 0x01ff;
868
869 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
870
871 llc_msg[0] = (sapi & 0x0f);
872 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
873 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
874
875 memcpy(llc_msg + 3, msg, msg_size);
876
877 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
878 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
879 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
880 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
881
882 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
883 src_addr, nsbvci, tlli, raid, cell_id,
884 llc_msg, llc_msg_size);
885}
886
887static void send_llc_dl_ui(
888 struct gprs_ns_inst *nsi, const char *text,
889 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
890 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
891 unsigned sapi, unsigned nu,
892 const uint8_t *msg, size_t msg_size)
893{
894 /* GPRS Network Service, PDU type: NS_UNITDATA */
895 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
896 unsigned char llc_msg[4096] = {
897 0x00, 0x00, 0x01
898 };
899
900 size_t llc_msg_size = 3 + msg_size + 3;
901 uint8_t e_bit = 0;
902 uint8_t pm_bit = 1;
903 unsigned fcs;
904
905 nu &= 0x01ff;
906
907 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
908
909 llc_msg[0] = 0x40 | (sapi & 0x0f);
910 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
911 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
912
913 memcpy(llc_msg + 3, msg, msg_size);
914
915 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
916 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
917 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
918 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
919
920 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
921 src_addr, nsbvci, tlli,
922 with_racap_drx, imsi, imsi_size,
923 llc_msg, llc_msg_size);
924}
925
926
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200927static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
928 uint16_t nsvci, uint16_t nsei)
929{
930 printf("Setup NS-VC: remote 0x%08x:%d, "
931 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
932 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
933 nsvci, nsvci, nsei, nsei);
934
935 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
936 send_ns_alive(nsi, src_addr);
937 send_ns_unblock(nsi, src_addr);
938 send_ns_alive_ack(nsi, src_addr);
939}
940
941static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
942 uint16_t bvci)
943{
944 printf("Setup BSSGP: remote 0x%08x:%d, "
945 "BVCI 0x%04x(%d)\n\n",
946 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
947 bvci, bvci);
948
949 send_bssgp_reset(nsi, src_addr, bvci);
950}
951
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200952static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer,
953 uint32_t sgsn_nsei)
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200954{
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200955 gprs_ns_nsip_connect(nsi, sgsn_peer, sgsn_nsei, sgsn_nsei+1);
956 send_ns_reset_ack(nsi, sgsn_peer, sgsn_nsei+1, sgsn_nsei);
Jacob Erlbeck2e038f72014-07-07 10:46:00 +0200957 send_ns_alive_ack(nsi, sgsn_peer);
958 send_ns_unblock_ack(nsi, sgsn_peer);
959 send_ns_alive(nsi, sgsn_peer);
960}
961
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200962static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
963{
964 sgsn_peer->sin_family = AF_INET;
965 sgsn_peer->sin_port = htons(32000);
966 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
967}
968
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +0200969static void configure_sgsn2_peer(struct sockaddr_in *sgsn_peer)
970{
971 sgsn_peer->sin_family = AF_INET;
972 sgsn_peer->sin_port = htons(32001);
973 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN2_ADDR);
974}
975
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +0200976static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
977{
978 size_t i;
979
980 for (i = 0; i < size; ++i) {
981 bss_peers[i].sin_family = AF_INET;
982 bss_peers[i].sin_port = htons((i + 1) * 1111);
983 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
984 }
985}
986
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200987int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
988 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
989
990/* override */
991int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
992 struct msgb *msg, uint16_t bvci)
993{
Holger Hans Peter Freytherdaaea0c2015-08-03 09:28:41 +0200994 printf("CALLBACK, event %d, msg length %zu, bvci 0x%04x\n%s\n\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200995 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +0200996 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +0200997
998 switch (event) {
999 case GPRS_NS_EVT_UNIT_DATA:
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001000 return gbprox_rcvmsg(&gbcfg, msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001001 default:
1002 break;
1003 }
1004 return 0;
1005}
1006
1007/* override */
1008ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
1009 const struct sockaddr *dest_addr, socklen_t addrlen)
1010{
1011 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
1012 const struct sockaddr *, socklen_t);
1013 static sendto_t real_sendto = NULL;
1014 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001015 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001016
1017 if (!real_sendto)
1018 real_sendto = dlsym(RTLD_NEXT, "sendto");
1019
1020 if (dest_host == REMOTE_BSS_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001021 printf("MESSAGE to BSS at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001022 dest_host, dest_port,
1023 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001024 else if (dest_host == REMOTE_SGSN_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001025 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001026 dest_host, dest_port,
1027 len, osmo_hexdump(buf, len));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001028 else if (dest_host == REMOTE_SGSN2_ADDR)
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001029 printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001030 dest_host, dest_port,
1031 len, osmo_hexdump(buf, len));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001032 else
1033 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
1034
1035 return len;
1036}
1037
1038/* override */
1039int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
1040{
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001041 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
1042 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001043 uint16_t bvci = msgb_bvci(msg);
1044 uint16_t nsei = msgb_nsei(msg);
1045
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001046 size_t len = msgb_length(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001047
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001048 if (!real_gprs_ns_sendmsg)
1049 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
1050
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001051 if (nsei == SGSN_NSEI)
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001052 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001053 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001054 bvci, len, __func__);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001055 else if (nsei == SGSN2_NSEI)
1056 printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001057 "msg length %zu (%s)\n",
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001058 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001059 else
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001060 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001061 "msg length %zu (%s)\n",
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001062 bvci, len, __func__);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001063
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001064 if (received_messages) {
1065 struct msgb *msg_copy;
Pau Espin Pedrol816a67d2018-08-15 13:53:48 +02001066 msg_copy = bssgp_msgb_copy(msg, "received_messages");
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001067 llist_add_tail(&msg_copy->list, received_messages);
1068 }
1069
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001070 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001071}
1072
Jacob Erlbeckacfaff32014-09-22 18:54:34 +02001073/* Get the next message from the receive FIFO
1074 *
1075 * \returns a pointer to the message which will be invalidated at the next call
1076 * to expect_msg. Returns NULL, if there is no message left.
1077 */
1078static struct msgb *expect_msg(void)
1079{
1080 static struct msgb *msg = NULL;
1081
1082 msgb_free(msg);
1083 msg = NULL;
1084
1085 if (!received_messages)
1086 return NULL;
1087
1088 if (llist_empty(received_messages))
1089 return NULL;
1090
1091 msg = llist_entry(received_messages->next, struct msgb, list);
1092 llist_del(&msg->list);
1093
1094 return msg;
1095}
1096
1097struct expect_result {
1098 struct msgb *msg;
1099 struct gprs_gb_parse_context parse_ctx;
1100};
1101
1102static struct expect_result *expect_bssgp_msg(
1103 int match_nsei, int match_bvci, int match_pdu_type)
1104{
1105 static struct expect_result result;
1106 static const struct expect_result empty_result = {0,};
1107 static struct msgb *msg;
1108 uint16_t nsei;
1109 int rc;
1110
1111 memcpy(&result, &empty_result, sizeof(result));
1112
1113 msg = expect_msg();
1114 if (!msg)
1115 return NULL;
1116
1117 nsei = msgb_nsei(msg);
1118
1119 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1120 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1121 __func__, match_nsei, nsei);
1122 return NULL;
1123 }
1124
1125 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1126 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1127 __func__, match_bvci, msgb_bvci(msg));
1128 return NULL;
1129 }
1130
1131 result.msg = msg;
1132
1133 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1134 result.parse_ctx.peer_nsei = nsei;
1135
1136 if (!msgb_bssgph(msg)) {
1137 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1138 return NULL;
1139 }
1140
1141 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1142 &result.parse_ctx);
1143
1144 if (!rc) {
1145 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1146 return NULL;
1147 }
1148
1149 if (match_pdu_type != MATCH_ANY &&
1150 match_pdu_type != result.parse_ctx.pdu_type) {
1151 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1152 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1153 return NULL;
1154 }
1155
1156 return &result;
1157}
1158
1159static struct expect_result *expect_llc_msg(
1160 int match_nsei, int match_bvci, int match_sapi, int match_type)
1161{
1162 static struct expect_result *result;
1163
1164 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1165 if (!result)
1166 return NULL;
1167
1168 if (!result->parse_ctx.llc) {
1169 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1170 return NULL;
1171 }
1172
1173 if (match_sapi != MATCH_ANY &&
1174 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1175 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1176 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1177 return NULL;
1178 }
1179
1180 if (match_type != MATCH_ANY &&
1181 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1182 fprintf(stderr,
1183 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1184 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1185 return NULL;
1186 }
1187
1188 return result;
1189}
1190
1191static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1192 int match_type)
1193{
1194 static struct expect_result *result;
1195
1196 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1197 if (!result)
1198 return NULL;
1199
1200 if (!result->parse_ctx.g48_hdr) {
1201 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1202 return NULL;
1203 }
1204
1205 if (match_type != MATCH_ANY &&
1206 match_type != result->parse_ctx.g48_hdr->msg_type) {
1207 fprintf(stderr,
1208 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1209 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1210 return NULL;
1211 }
1212
1213 return result;
1214}
1215
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001216static void dump_rate_ctr_group(FILE *stream, const char *prefix,
1217 struct rate_ctr_group *ctrg)
1218{
1219 unsigned int i;
1220
1221 for (i = 0; i < ctrg->desc->num_ctr; i++) {
1222 struct rate_ctr *ctr = &ctrg->ctr[i];
1223 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
1224 fprintf(stream, " %s%s: %llu%s",
1225 prefix, ctrg->desc->ctr_desc[i].description,
1226 (long long)ctr->current,
1227 "\n");
1228 };
1229}
1230
1231/* Signal handler for signals from NS layer */
1232static int test_signal(unsigned int subsys, unsigned int signal,
1233 void *handler_data, void *signal_data)
1234{
1235 struct ns_signal_data *nssd = signal_data;
1236 int rc;
1237
1238 if (subsys != SS_L_NS)
1239 return 0;
1240
1241 switch (signal) {
1242 case S_NS_RESET:
1243 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
1244 nssd->nsvc->nsvci,
1245 gprs_ns_ll_str(nssd->nsvc));
1246 break;
1247
1248 case S_NS_ALIVE_EXP:
1249 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
1250 nssd->nsvc->nsvci,
1251 gprs_ns_ll_str(nssd->nsvc));
1252 break;
1253
1254 case S_NS_BLOCK:
1255 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
1256 nssd->nsvc->nsvci,
1257 gprs_ns_ll_str(nssd->nsvc));
1258 break;
1259
1260 case S_NS_UNBLOCK:
1261 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
1262 nssd->nsvc->nsvci,
1263 gprs_ns_ll_str(nssd->nsvc));
1264 break;
1265
1266 case S_NS_REPLACED:
1267 printf("==> got signal NS_REPLACED: 0x%04x/%s",
1268 nssd->nsvc->nsvci,
1269 gprs_ns_ll_str(nssd->nsvc));
1270 printf(" -> 0x%04x/%s\n",
1271 nssd->old_nsvc->nsvci,
1272 gprs_ns_ll_str(nssd->old_nsvc));
1273 break;
1274
1275 default:
1276 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
1277 nssd->nsvc->nsvci,
1278 gprs_ns_ll_str(nssd->nsvc));
1279 break;
1280 }
1281 printf("\n");
1282 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
1283 return rc;
1284}
1285
1286static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
1287{
1288 struct msgb *msg;
1289 int ret;
1290 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
Holger Hans Peter Freyther8e6ecc92015-04-23 11:55:23 -04001291 fprintf(stderr, "message too long: %zu\n", data_len);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001292 return -1;
1293 }
1294
1295 msg = gprs_ns_msgb_alloc();
Neels Hofmeyrc9ac20e2016-04-14 15:21:33 +02001296 OSMO_ASSERT(msg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001297 memmove(msg->data, data, data_len);
1298 msg->l2h = msg->data;
1299 msgb_put(msg, data_len);
1300
1301 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
1302 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1303 osmo_hexdump(data, data_len));
1304
1305 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
1306
Harald Welte313cf352019-02-26 22:36:11 +01001307 /* gprs_ns_rcvmsg() in old libosmocore returns "number of bytes
1308 * transmitted by any response PDU we sent as a result of the
1309 * received message", while modern libosmocore simply retunrs '0'
1310 * for any successfully received message. Let's make sure any
1311 * non-negative responses lead to a reproducible test output
1312 * with both old and new libosmocore. */
1313 printf("result (%s) = %d\n\n", text, ret < 0 ? ret : 0);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001314
1315 msgb_free(msg);
1316
1317 return ret;
1318}
1319
1320static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
1321{
1322 struct gprs_nsvc *nsvc;
1323
1324 printf("Current NS-VCIs:\n");
1325 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
1326 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001327 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001328 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001329 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1330 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
1331 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001332 );
1333 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
1334 }
1335 printf("\n");
1336}
1337
1338static void test_gbproxy()
1339{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001340 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001341 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001342 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001343
1344 bssgp_nsi = nsi;
1345 gbcfg.nsi = bssgp_nsi;
1346 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1347
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001348 configure_sgsn_peer(&sgsn_peer);
1349 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001350
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001351 printf("=== %s ===\n", __func__);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001352 printf("--- Initialise SGSN ---\n\n");
1353
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001354 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001355 gprs_dump_nsi(nsi);
1356
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001357 printf("--- Initialise BSS 1 ---\n\n");
1358
1359 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1360 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1361 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001362 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001363
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001364 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1365
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001366 printf("--- Initialise BSS 2 ---\n\n");
1367
1368 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
1369 setup_bssgp(nsi, &bss_peer[1], 0x2002);
1370 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001371 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001372
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001373 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
1374
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001375 printf("--- Move BSS 1 to new port ---\n\n");
1376
1377 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
1378 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001379 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001380
1381 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1382
1383 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1384 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001385 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001386
1387 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
1388
1389 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1390 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001391 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001392
1393 printf("--- Move BSS 2 to new port ---\n\n");
1394
1395 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
1396 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001397 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001398
1399 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1400
1401 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
1402 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001403 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001404
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001405 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
1406
1407 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1408 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001409 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001410
1411 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1412
1413 setup_bssgp(nsi, &bss_peer[0], 0x1012);
1414 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001415 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001416
1417 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
1418
1419 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1420
1421 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1422 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001423 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001424
1425 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1426
1427 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1428
1429 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1430 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001431 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001432
1433 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1434
1435 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1436
1437 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1438
1439 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1440
1441 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1442
1443 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1444
1445 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1446
1447 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1448
1449 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1450
1451 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1452
1453 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
1454
1455 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1456
1457 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
1458
1459 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1460
1461 setup_bssgp(nsi, &bss_peer[2], 0x1002);
1462 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001463 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001464
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001465 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001466
Jacob Erlbeck2082afa2013-10-18 13:04:47 +02001467 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1468
1469 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1470
1471 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1472
1473 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1474
1475 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1476
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001477 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1478
1479 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
1480
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001481 /* Find peer */
1482 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1483 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1484 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1485 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1486 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1487 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1488
1489
1490 /* Cleanup */
1491 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1492 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1493 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1494 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1495 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1496
1497 dump_peers(stdout, 0, 0, &gbcfg);
1498
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001499 dump_global(stdout, 0);
Jacob Erlbeckda890c72013-10-18 22:12:16 +02001500
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001501 gbprox_reset(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001502 gprs_ns_destroy(nsi);
1503 nsi = NULL;
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001504}
1505
1506static void test_gbproxy_ident_changes()
1507{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001508 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001509 struct sockaddr_in bss_peer[1] = {{0},};
1510 struct sockaddr_in sgsn_peer= {0};
1511 uint16_t nsei[2] = {0x1000, 0x2000};
1512 uint16_t nsvci[2] = {0x1001, 0x2001};
1513 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
1514
1515 bssgp_nsi = nsi;
1516 gbcfg.nsi = bssgp_nsi;
1517 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1518
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001519 configure_sgsn_peer(&sgsn_peer);
1520 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001521
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001522 printf("=== %s ===\n", __func__);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001523 printf("--- Initialise SGSN ---\n\n");
1524
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001525 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001526 gprs_dump_nsi(nsi);
1527
1528 printf("--- Initialise BSS 1 ---\n\n");
1529
1530 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
1531 gprs_dump_nsi(nsi);
1532
1533 printf("--- Setup BVCI 1 ---\n\n");
1534
1535 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1536 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001537 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001538
1539 printf("--- Setup BVCI 2 ---\n\n");
1540
1541 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
1542 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001543 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001544
1545 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1546
1547 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1548 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1549
1550 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1551
1552 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
1553 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
1554
1555 printf("--- Change NSEI ---\n\n");
1556
1557 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
1558 gprs_dump_nsi(nsi);
1559
1560 printf("--- Setup BVCI 1 ---\n\n");
1561
1562 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1563 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001564 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001565
1566 printf("--- Setup BVCI 3 ---\n\n");
1567
1568 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
1569 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001570 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001571
1572 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1573
1574 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1575 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1576
1577 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1578 " (should fail) ---\n\n");
1579
1580 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001581 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001582 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001583 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001584
1585 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1586
1587 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1588 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1589
1590 printf("--- Change NSVCI ---\n\n");
1591
1592 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
1593 gprs_dump_nsi(nsi);
1594
1595 printf("--- Setup BVCI 1 ---\n\n");
1596
1597 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1598 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001599 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001600
1601 printf("--- Setup BVCI 4 ---\n\n");
1602
1603 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
1604 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001605 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001606
1607 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1608
1609 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1610 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1611
1612 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1613 " (should fail) ---\n\n");
1614
1615 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001616 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001617 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001618 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001619
1620 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1621
1622 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1623 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1624
1625 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
1626
1627 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
1628 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
1629
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001630 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001631 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001632
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001633 gbprox_reset(&gbcfg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02001634 gprs_ns_destroy(nsi);
1635 nsi = NULL;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02001636}
1637
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001638static void test_gbproxy_ra_patching()
1639{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001640 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001641 struct sockaddr_in bss_peer[1] = {{0},};
1642 struct sockaddr_in sgsn_peer= {0};
1643 struct gprs_ra_id rai_bss =
1644 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1645 struct gprs_ra_id rai_sgsn =
1646 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1647 struct gprs_ra_id rai_unknown =
1648 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001649 uint16_t cell_id = 0x7530;
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001650 const char *err_msg = NULL;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001651 const uint32_t ptmsi = 0xefe2b700;
1652 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001653 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001654 const uint32_t foreign_tlli2 = 0xbb00beef;
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001655 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001656 const char *patch_re = "^9898|^121314";
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001657 struct gbproxy_link_info *link_info;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001658 struct gbproxy_peer *peer;
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001659 LLIST_HEAD(rcv_list);
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001660 struct expect_result *expect_res;
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001661
1662 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001663
1664 bssgp_nsi = nsi;
1665 gbcfg.nsi = bssgp_nsi;
1666 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01001667 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001668 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Holger Hans Peter Freytherce1b22e2014-08-04 14:22:13 +02001669 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02001670 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001671
Holger Hans Peter Freyther99a20d62014-07-07 14:19:10 +02001672 configure_sgsn_peer(&sgsn_peer);
1673 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001674
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001675 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING],
1676 patch_re, &err_msg) != 0) {
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001677 fprintf(stderr, "Failed to compile RE '%s': %s\n",
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02001678 patch_re, err_msg);
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001679 exit(1);
1680 }
1681
1682
Jacob Erlbeckff0d65a2014-07-09 23:19:11 +02001683 printf("=== %s ===\n", __func__);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001684 printf("--- Initialise SGSN ---\n\n");
1685
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02001686 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001687 gprs_dump_nsi(nsi);
1688
1689 printf("--- Initialise BSS 1 ---\n\n");
1690
1691 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001692
1693 received_messages = &rcv_list;
1694
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001695 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1696 gprs_dump_nsi(nsi);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001697 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001698
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02001699 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001700 OSMO_ASSERT(peer != NULL);
1701
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001702 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_BVC_RESET));
1703
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001704 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1705
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001706 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_BVC_RESET_ACK));
1707
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001708 send_bssgp_suspend(nsi, &bss_peer[0], 0xccd1758b, &rai_bss);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001709
1710 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_SUSPEND));
1711
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001712 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_sgsn);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001713
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001714 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_SUSPEND_ACK));
1715
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001716 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001717 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001718
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001719 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1720 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1721
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001722 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1723
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001724 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1725 foreign_tlli, &rai_bss, cell_id,
1726 GPRS_SAPI_GMM, 0,
1727 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001728
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001729 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001730 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001731
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001732 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1733 foreign_tlli, 0, NULL, 0,
1734 GPRS_SAPI_GMM, 0,
1735 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001736
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001737 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
1738
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001739 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1740 foreign_tlli, &rai_bss, cell_id,
1741 GPRS_SAPI_GMM, 3,
1742 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeck690768a2014-08-06 15:16:45 +02001743
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001744 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
1745
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001746 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1747 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1748
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001749 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1750 foreign_tlli, 1, imsi, sizeof(imsi),
1751 GPRS_SAPI_GMM, 1,
1752 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001753
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001754 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
1755
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001756 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1757
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02001758 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1759 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1760 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1761
1762 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1763 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1764 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1765
1766 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1767 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1768 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1769
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001770 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1771 OSMO_ASSERT(link_info);
1772 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1773 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1774 OSMO_ASSERT(!link_info->tlli.bss_validated);
1775 OSMO_ASSERT(!link_info->tlli.net_validated);
1776 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1777 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1778 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1779 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001780
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001781 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1782 local_tlli, &rai_bss, cell_id,
1783 GPRS_SAPI_GMM, 4,
1784 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001785
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001786 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
1787
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001788 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1789
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001790 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1791 OSMO_ASSERT(link_info);
1792 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1793 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1794 OSMO_ASSERT(link_info->tlli.bss_validated);
1795 OSMO_ASSERT(!link_info->tlli.net_validated);
1796 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1797 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1798 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1799 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001800
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001801 /* Replace APN (1) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001802 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1803 local_tlli, &rai_bss, cell_id,
1804 GPRS_SAPI_GMM, 3,
1805 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001806
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001807 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1808
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001809 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1810
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001811 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1812 OSMO_ASSERT(link_info);
1813 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1814 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1815 OSMO_ASSERT(link_info->tlli.bss_validated);
1816 OSMO_ASSERT(!link_info->tlli.net_validated);
1817 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1818 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1819 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1820 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001821
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001822 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1823 local_tlli, 1, imsi, sizeof(imsi),
1824 GPRS_SAPI_GMM, 2,
1825 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeck11669742014-06-06 18:47:36 +02001826
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001827 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
1828
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001829 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1830
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02001831 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1832 OSMO_ASSERT(link_info);
1833 OSMO_ASSERT(link_info->tlli.assigned == 0);
1834 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1835 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1836 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck59748e62014-08-11 17:26:21 +02001837
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001838 /* Replace APN (2) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001839 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1840 local_tlli, &rai_bss, cell_id,
1841 GPRS_SAPI_GMM, 3,
1842 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001843
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001844 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1845 OSMO_ASSERT(expect_res != NULL);
1846 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == gbcfg.core_apn_size + 2);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001847
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001848 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1849
Jacob Erlbeck73685282014-05-23 20:48:07 +02001850 gbcfg.core_apn[0] = 0;
1851 gbcfg.core_apn_size = 0;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001852
1853 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001854 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1855 local_tlli, &rai_bss, cell_id,
1856 GPRS_SAPI_GMM, 3,
1857 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001858
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001859 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1860 OSMO_ASSERT(expect_res != NULL);
1861 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001862
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001863 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1864
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001865 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001866
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001867 /* Detach */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001868 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1869 local_tlli, &rai_bss, cell_id,
1870 GPRS_SAPI_GMM, 6,
1871 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001872
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001873 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1874
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001875 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1876 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1877
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001878 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1879 local_tlli, 1, imsi, sizeof(imsi),
1880 GPRS_SAPI_GMM, 5,
1881 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001882
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001883 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
1884
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001885 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001886
1887 printf("--- RA update ---\n\n");
1888
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001889 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
1890 foreign_tlli, &rai_bss, 0x7080,
1891 GPRS_SAPI_GMM, 5,
1892 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001893
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001894 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
1895
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001896 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1897
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001898 send_llc_dl_ui(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
1899 foreign_tlli, 1, imsi, sizeof(imsi),
1900 GPRS_SAPI_GMM, 6,
1901 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001902
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001903 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_ACK));
1904
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001905 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1906
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001907 /* Remove APN */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001908 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1909 local_tlli, &rai_bss, cell_id,
1910 GPRS_SAPI_GMM, 3,
1911 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001912
Jacob Erlbeckc79beec2014-10-10 09:48:12 +02001913 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1914 OSMO_ASSERT(expect_res != NULL);
1915 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001916
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001917 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1918
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001919 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001920
Jacob Erlbeck3e23ddf2014-08-11 15:07:37 +02001921 /* Detach (power off -> no Detach Accept) */
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001922 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", &bss_peer[0], 0x1002,
1923 local_tlli, &rai_bss, cell_id,
1924 GPRS_SAPI_GMM, 6,
1925 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeckaa3e3342014-06-27 11:55:04 +02001926
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001927 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1928
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001929 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1930
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001931 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001932 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001933
1934 printf("--- Bad cases ---\n\n");
1935
Jacob Erlbeck991606b2014-09-12 10:33:38 +02001936 /* The RAI in the Attach Request message differs from the RAI in the
1937 * BSSGP message, only patch the latter */
1938
1939 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", &bss_peer[0], 0x1002,
1940 foreign_tlli2, &rai_bss, cell_id,
1941 GPRS_SAPI_GMM, 0,
1942 dtap_attach_req2, sizeof(dtap_attach_req2));
1943
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001944 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
1945
Jacob Erlbeck948c07f2014-09-11 15:22:18 +02001946 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1947
Jacob Erlbeck7c101d92014-06-06 18:49:23 +02001948 printf("TLLI is already detached, shouldn't patch\n");
Jacob Erlbeckc53f2a62014-08-15 14:56:28 +02001949 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", &bss_peer[0], 0x1002,
1950 local_tlli, &rai_bss, cell_id,
1951 GPRS_SAPI_GMM, 3,
1952 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckcf02eb12014-06-19 10:23:50 +02001953
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001954 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1955
Jacob Erlbeck006c0382014-05-27 13:49:04 +02001956 printf("Invalid RAI, shouldn't patch\n");
Jacob Erlbeck299389a2014-08-21 16:34:18 +02001957 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_unknown);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001958
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001959 /* TODO: The following breaks with the current libosmocore, enable it
1960 * again (and remove the plain expect_msg), when the msgb_bssgph patch
1961 * is integrated */
1962 /* OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_STATUS)); */
1963 OSMO_ASSERT(expect_msg());
1964
Holger Hans Peter Freytherb9004592014-08-04 11:26:54 +02001965 dump_global(stdout, 0);
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02001966 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001967
Jacob Erlbeck55ec2bf2014-09-23 14:56:38 +02001968 OSMO_ASSERT(!expect_msg());
1969 received_messages = NULL;
1970
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02001971 talloc_free(gbcfg.core_apn);
1972 gbcfg.core_apn = NULL;
1973
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02001974 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING]);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02001975 gbprox_reset(&gbcfg);
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001976 gprs_ns_destroy(nsi);
1977 nsi = NULL;
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02001978}
1979
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001980static void test_gbproxy_ptmsi_assignment()
1981{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01001982 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001983 struct sockaddr_in bss_peer[1] = {{0},};
1984 struct sockaddr_in sgsn_peer= {0};
1985 struct gprs_ra_id rai_bss =
1986 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1987 struct gprs_ra_id rai_unknown =
1988 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1989 uint16_t cell_id = 0x1234;
1990
1991 const uint32_t ptmsi = 0xefe2b700;
1992 const uint32_t local_tlli = 0xefe2b700;
1993
1994 const uint32_t foreign_tlli1 = 0x8000dead;
1995 const uint32_t foreign_tlli2 = 0x8000beef;
1996
Neels Hofmeyr7369d442020-05-29 17:05:40 +02001997 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
1998 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0xf8};
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02001999
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002000 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002001 struct gbproxy_peer *peer;
2002 unsigned bss_nu = 0;
2003 unsigned sgsn_nu = 0;
2004
2005 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
2006
2007 bssgp_nsi = nsi;
2008 gbcfg.nsi = bssgp_nsi;
2009 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002010 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002011 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002012 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2013 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002014
2015 configure_sgsn_peer(&sgsn_peer);
2016 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2017
2018 printf("=== %s ===\n", __func__);
2019 printf("--- Initialise SGSN ---\n\n");
2020
2021 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2022
2023 printf("--- Initialise BSS 1 ---\n\n");
2024
2025 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2026 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2027
2028 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2029 OSMO_ASSERT(peer != NULL);
2030
2031 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2032
2033 gprs_dump_nsi(nsi);
2034 dump_global(stdout, 0);
2035 dump_peers(stdout, 0, 0, &gbcfg);
2036
2037 printf("--- Establish first LLC connection ---\n\n");
2038
2039 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2040 foreign_tlli1, &rai_unknown, cell_id,
2041 GPRS_SAPI_GMM, bss_nu++,
2042 dtap_attach_req, sizeof(dtap_attach_req));
2043
2044 dump_peers(stdout, 0, 0, &gbcfg);
2045
2046 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2047 foreign_tlli1, 0, NULL, 0,
2048 GPRS_SAPI_GMM, sgsn_nu++,
2049 dtap_identity_req, sizeof(dtap_identity_req));
2050
2051 dump_peers(stdout, 0, 0, &gbcfg);
2052
2053 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2054 foreign_tlli1, &rai_bss, cell_id,
2055 GPRS_SAPI_GMM, bss_nu++,
2056 dtap_identity_resp, sizeof(dtap_identity_resp));
2057
2058 dump_peers(stdout, 0, 0, &gbcfg);
2059
2060 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2061 foreign_tlli1, 1, imsi1, sizeof(imsi1),
2062 GPRS_SAPI_GMM, sgsn_nu++,
2063 dtap_attach_acc, sizeof(dtap_attach_acc));
2064
2065 dump_peers(stdout, 0, 0, &gbcfg);
2066
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002067 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
2068 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2069 OSMO_ASSERT(link_info);
2070 OSMO_ASSERT(link_info == link_info2);
2071 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2072 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2073 OSMO_ASSERT(!link_info->tlli.bss_validated);
2074 OSMO_ASSERT(!link_info->tlli.net_validated);
2075 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002076
2077 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2078 local_tlli, &rai_bss, cell_id,
2079 GPRS_SAPI_GMM, bss_nu++,
2080 dtap_attach_complete, sizeof(dtap_attach_complete));
2081
2082 dump_peers(stdout, 0, 0, &gbcfg);
2083
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002084 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2085 OSMO_ASSERT(link_info);
2086 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2087 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2088 OSMO_ASSERT(link_info->tlli.bss_validated);
2089 OSMO_ASSERT(!link_info->tlli.net_validated);
2090 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002091
2092
2093 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2094 local_tlli, 1, imsi1, sizeof(imsi1),
2095 GPRS_SAPI_GMM, sgsn_nu++,
2096 dtap_gmm_information, sizeof(dtap_gmm_information));
2097
2098 dump_peers(stdout, 0, 0, &gbcfg);
2099
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002100 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
2101 OSMO_ASSERT(link_info);
2102 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2103 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002104
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002105 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2106 OSMO_ASSERT(link_info == link_info2);
2107 OSMO_ASSERT(link_info->tlli.assigned == 0);
2108 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2109 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002110
2111 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
2112
2113 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2114 foreign_tlli2, &rai_unknown, cell_id,
2115 GPRS_SAPI_GMM, bss_nu++,
2116 dtap_attach_req, sizeof(dtap_attach_req));
2117
2118 dump_peers(stdout, 0, 0, &gbcfg);
2119
2120 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2121 foreign_tlli2, 0, NULL, 0,
2122 GPRS_SAPI_GMM, sgsn_nu++,
2123 dtap_identity_req, sizeof(dtap_identity_req));
2124
2125 dump_peers(stdout, 0, 0, &gbcfg);
2126
2127 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2128 foreign_tlli2, &rai_bss, cell_id,
2129 GPRS_SAPI_GMM, bss_nu++,
2130 dtap_identity2_resp, sizeof(dtap_identity2_resp));
2131
2132 dump_peers(stdout, 0, 0, &gbcfg);
2133
2134 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2135 foreign_tlli2, 1, imsi2, sizeof(imsi2),
2136 GPRS_SAPI_GMM, sgsn_nu++,
2137 dtap_attach_acc, sizeof(dtap_attach_acc));
2138
2139 dump_peers(stdout, 0, 0, &gbcfg);
2140
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002141 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
2142 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2143 OSMO_ASSERT(link_info);
2144 OSMO_ASSERT(link_info == link_info2);
2145 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2146 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2147 OSMO_ASSERT(!link_info->tlli.bss_validated);
2148 OSMO_ASSERT(!link_info->tlli.net_validated);
2149 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002150
2151 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2152 local_tlli, &rai_bss, cell_id,
2153 GPRS_SAPI_GMM, bss_nu++,
2154 dtap_attach_complete, sizeof(dtap_attach_complete));
2155
2156 dump_peers(stdout, 0, 0, &gbcfg);
2157
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002158 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2159 OSMO_ASSERT(link_info);
2160 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2161 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2162 OSMO_ASSERT(link_info->tlli.bss_validated);
2163 OSMO_ASSERT(!link_info->tlli.net_validated);
2164 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002165
2166 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2167 local_tlli, 1, imsi2, sizeof(imsi2),
2168 GPRS_SAPI_GMM, sgsn_nu++,
2169 dtap_gmm_information, sizeof(dtap_gmm_information));
2170
2171 dump_peers(stdout, 0, 0, &gbcfg);
2172
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002173 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
2174 OSMO_ASSERT(link_info);
2175 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2176 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002177
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002178 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2179 OSMO_ASSERT(link_info == link_info2);
2180 OSMO_ASSERT(link_info->tlli.assigned == 0);
2181 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2182 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002183
2184 dump_global(stdout, 0);
2185
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002186 talloc_free(gbcfg.core_apn);
2187 gbcfg.core_apn = NULL;
2188
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002189 gbprox_reset(&gbcfg);
2190 gprs_ns_destroy(nsi);
2191 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002192
2193 cleanup_test();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02002194}
2195
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002196static void test_gbproxy_ptmsi_patching()
2197{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002198 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002199 struct sockaddr_in bss_peer[1] = {{0},};
2200 struct sockaddr_in sgsn_peer= {0};
2201 struct gprs_ra_id rai_bss =
2202 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2203 struct gprs_ra_id rai_sgsn =
2204 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002205 struct gprs_ra_id rai_wrong_mcc_sgsn =
2206 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002207 struct gprs_ra_id rai_unknown =
2208 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2209 uint16_t cell_id = 0x1234;
2210
2211 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002212 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2213 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002214 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002215 const uint32_t local_sgsn_tlli2 = 0xe0987654;
2216 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Daniel Willmann537d4802015-10-12 19:36:35 +02002217 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002218 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002219
Daniel Willmann537d4802015-10-12 19:36:35 +02002220 const uint32_t bss_ptmsi = 0xc0dead01;
2221 const uint32_t bss_ptmsi2 = 0xc0dead02;
2222 const uint32_t bss_ptmsi3 = 0xc0dead03;
2223 const uint32_t local_bss_tlli = 0xc0dead01;
2224 const uint32_t local_bss_tlli2 = 0xc0dead02;
2225 const uint32_t local_bss_tlli3 = 0xc0dead03;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002226 const uint32_t foreign_bss_tlli = 0x8000dead;
2227
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002228
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002229 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002230 struct gbproxy_link_info *link_info;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002231 struct gbproxy_peer *peer;
2232 unsigned bss_nu = 0;
2233 unsigned sgsn_nu = 0;
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002234 int old_ctr;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002235
2236 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002237 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2238 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
2239 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2240 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
2241 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002242
2243 bssgp_nsi = nsi;
2244 gbcfg.nsi = bssgp_nsi;
2245 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002246 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002247 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002248 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2249 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002250
2251 configure_sgsn_peer(&sgsn_peer);
2252 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2253
2254 printf("=== %s ===\n", __func__);
2255 printf("--- Initialise SGSN ---\n\n");
2256
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002257 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002258
2259 printf("--- Initialise BSS 1 ---\n\n");
2260
2261 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2262 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2263
Jacob Erlbeck5f1faa32014-08-21 10:01:30 +02002264 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002265 OSMO_ASSERT(peer != NULL);
2266
2267 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2268
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002269 gprs_dump_nsi(nsi);
2270 dump_global(stdout, 0);
2271 dump_peers(stdout, 0, 0, &gbcfg);
2272
2273 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2274
2275 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2276 foreign_bss_tlli, &rai_unknown, cell_id,
2277 GPRS_SAPI_GMM, bss_nu++,
2278 dtap_attach_req, sizeof(dtap_attach_req));
2279
2280 dump_peers(stdout, 0, 0, &gbcfg);
2281
2282 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2283 random_sgsn_tlli, 0, NULL, 0,
2284 GPRS_SAPI_GMM, sgsn_nu++,
2285 dtap_identity_req, sizeof(dtap_identity_req));
2286
2287 dump_peers(stdout, 0, 0, &gbcfg);
2288
2289 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2290 foreign_bss_tlli, &rai_bss, cell_id,
2291 GPRS_SAPI_GMM, bss_nu++,
2292 dtap_identity_resp, sizeof(dtap_identity_resp));
2293
2294 dump_peers(stdout, 0, 0, &gbcfg);
2295
2296 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2297 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2298 GPRS_SAPI_GMM, sgsn_nu++,
2299 dtap_attach_acc, sizeof(dtap_attach_acc));
2300
2301 dump_peers(stdout, 0, 0, &gbcfg);
2302
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002303 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2304 OSMO_ASSERT(link_info);
2305 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2306 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2307 OSMO_ASSERT(!link_info->tlli.bss_validated);
2308 OSMO_ASSERT(!link_info->tlli.net_validated);
2309 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2310 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2311 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2312 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2313 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2314 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002315
2316 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2317 local_bss_tlli, &rai_bss, cell_id,
2318 GPRS_SAPI_GMM, bss_nu++,
2319 dtap_attach_complete, sizeof(dtap_attach_complete));
2320
2321 dump_peers(stdout, 0, 0, &gbcfg);
2322
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002323 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2324 OSMO_ASSERT(link_info);
2325 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2326 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2327 OSMO_ASSERT(link_info->tlli.bss_validated);
2328 OSMO_ASSERT(!link_info->tlli.net_validated);
2329 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2330 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2331 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2332 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002333
2334 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2335 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2336 GPRS_SAPI_GMM, sgsn_nu++,
2337 dtap_gmm_information, sizeof(dtap_gmm_information));
2338
2339 dump_peers(stdout, 0, 0, &gbcfg);
2340
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002341 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2342 OSMO_ASSERT(link_info);
2343 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2344 OSMO_ASSERT(link_info->tlli.assigned == 0);
2345 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2346 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002347
Jacob Erlbeck82add782014-09-05 18:08:12 +02002348 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
2349 local_bss_tlli, &rai_bss, cell_id,
2350 GPRS_SAPI_GMM, bss_nu++,
2351 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2352
2353 dump_peers(stdout, 0, 0, &gbcfg);
2354
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002355 /* Non-DTAP */
2356 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2357 local_bss_tlli, &rai_bss, cell_id,
2358 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2359
2360 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2361 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2362 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2363
2364 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2365 local_bss_tlli, &rai_bss, cell_id,
2366 llc_ui_ll11_dns_query_ul,
2367 sizeof(llc_ui_ll11_dns_query_ul));
2368
2369 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2370 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2371 llc_ui_ll11_dns_resp_dl,
2372 sizeof(llc_ui_ll11_dns_resp_dl));
2373
2374 dump_peers(stdout, 0, 0, &gbcfg);
2375
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002376 /* Repeated RA Update Requests */
2377 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", &bss_peer[0], 0x1002,
2378 local_bss_tlli, &rai_bss, 0x7080,
2379 GPRS_SAPI_GMM, bss_nu++,
2380 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2381
2382 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", &sgsn_peer, 0x1002,
2383 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2384 GPRS_SAPI_GMM, sgsn_nu++,
2385 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2386
2387 dump_peers(stdout, 0, 0, &gbcfg);
2388
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002389 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2390 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2391 OSMO_ASSERT(link_info);
2392 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2393 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2394 OSMO_ASSERT(!link_info->tlli.bss_validated);
2395 OSMO_ASSERT(!link_info->tlli.net_validated);
2396 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2397 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2398 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2399 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2400 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2401 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002402
2403 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", &bss_peer[0], 0x1002,
2404 local_bss_tlli2, &rai_bss, 0x7080,
2405 GPRS_SAPI_GMM, bss_nu++,
2406 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2407
2408 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", &sgsn_peer, 0x1002,
2409 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2410 GPRS_SAPI_GMM, sgsn_nu++,
2411 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2412
2413 dump_peers(stdout, 0, 0, &gbcfg);
2414
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002415 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2416 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI) != NULL);
2417 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2418 OSMO_ASSERT(link_info);
2419 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2420 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2421 OSMO_ASSERT(!link_info->tlli.bss_validated);
2422 OSMO_ASSERT(!link_info->tlli.net_validated);
2423 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2424 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2425 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2426 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2427 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2428 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002429
2430 send_llc_ul_ui(nsi, "RA UPD COMPLETE", &bss_peer[0], 0x1002,
2431 local_bss_tlli3, &rai_bss, 0x7080,
2432 GPRS_SAPI_GMM, bss_nu++,
2433 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2434
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002435 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002436
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002437 OSMO_ASSERT(link_info);
2438 OSMO_ASSERT(link_info->tlli.bss_validated);
2439 OSMO_ASSERT(!link_info->tlli.net_validated);
2440 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2441 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002442
2443 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2444 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2445 GPRS_SAPI_GMM, sgsn_nu++,
2446 dtap_gmm_information, sizeof(dtap_gmm_information));
2447
2448 dump_peers(stdout, 0, 0, &gbcfg);
2449
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002450 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2451 OSMO_ASSERT(link_info);
2452 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2453 OSMO_ASSERT(link_info->tlli.assigned == 0);
2454 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2455 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002456
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002457 /* Other messages */
2458 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002459 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002460
2461 dump_peers(stdout, 0, 0, &gbcfg);
2462
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002463 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002464
2465 dump_peers(stdout, 0, 0, &gbcfg);
2466
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002467 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002468
2469 dump_peers(stdout, 0, 0, &gbcfg);
2470
Jacob Erlbeckc37ef6c2014-09-30 13:49:43 +02002471 old_ctr = peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current;
2472
2473 send_bssgp_paging(nsi, &sgsn_peer, imsi, sizeof(imsi), &rai_bss, sgsn_ptmsi3);
2474
2475 dump_peers(stdout, 0, 0, &gbcfg);
2476
2477 OSMO_ASSERT(old_ctr + 1 ==
2478 peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current);
2479
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002480 /* Bad case: Invalid BVCI */
2481 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002482 local_bss_tlli3, 1, 12);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002483 dump_global(stdout, 0);
2484
2485 /* Bad case: Invalid RAI */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002486 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002487
2488 dump_global(stdout, 0);
2489
2490 /* Bad case: Invalid MCC (LAC ok) */
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002491 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3,
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002492 &rai_wrong_mcc_sgsn);
2493
2494 dump_global(stdout, 0);
2495
Jacob Erlbeck7fb26c22014-09-04 11:08:50 +02002496 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
2497 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2498 unknown_sgsn_tlli, 1, NULL, 0,
2499 GPRS_SAPI_GMM, 2,
2500 dtap_gmm_information, sizeof(dtap_gmm_information));
2501
2502 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
2503 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2504 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2505 GPRS_SAPI_GMM, 3,
2506 dtap_gmm_information, sizeof(dtap_gmm_information));
2507
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002508 /* Detach */
2509 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002510 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002511 GPRS_SAPI_GMM, bss_nu++,
2512 dtap_detach_req, sizeof(dtap_detach_req));
2513
2514 dump_peers(stdout, 0, 0, &gbcfg);
2515
2516 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
Jacob Erlbeck52f070a2014-09-04 13:45:56 +02002517 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002518 GPRS_SAPI_GMM, sgsn_nu++,
2519 dtap_detach_acc, sizeof(dtap_detach_acc));
2520
2521 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck299389a2014-08-21 16:34:18 +02002522
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002523 dump_global(stdout, 0);
2524
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002525 talloc_free(gbcfg.core_apn);
2526 gbcfg.core_apn = NULL;
2527
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002528 gbprox_reset(&gbcfg);
2529 gprs_ns_destroy(nsi);
2530 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002531
2532 cleanup_test();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02002533}
2534
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002535static void test_gbproxy_ptmsi_patching_bad_cases()
2536{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002537 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002538 struct sockaddr_in bss_peer[1] = {{0},};
2539 struct sockaddr_in sgsn_peer= {0};
2540 struct gprs_ra_id rai_bss =
2541 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2542 struct gprs_ra_id rai_unknown =
2543 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2544 uint16_t cell_id = 0x1234;
2545
2546 const uint32_t sgsn_ptmsi = 0xefe2b700;
2547 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002548 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002549
Daniel Willmann537d4802015-10-12 19:36:35 +02002550 const uint32_t bss_ptmsi = 0xc0dead01;
2551 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002552 const uint32_t foreign_bss_tlli = 0x8000dead;
2553
2554
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002555 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002556 struct gbproxy_link_info *link_info;
2557 struct gbproxy_peer *peer;
2558 unsigned bss_nu = 0;
2559 unsigned sgsn_nu = 0;
2560
2561 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2562 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2563
2564 bssgp_nsi = nsi;
2565 gbcfg.nsi = bssgp_nsi;
2566 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002567 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002568 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002569 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2570 gbcfg.patch_ptmsi = 1;
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002571
2572 configure_sgsn_peer(&sgsn_peer);
2573 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2574
2575 printf("=== %s ===\n", __func__);
2576 printf("--- Initialise SGSN ---\n\n");
2577
2578 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2579
2580 printf("--- Initialise BSS 1 ---\n\n");
2581
2582 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2583 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2584
2585 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2586 OSMO_ASSERT(peer != NULL);
2587
2588 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2589
2590 gprs_dump_nsi(nsi);
2591 dump_global(stdout, 0);
2592 dump_peers(stdout, 0, 0, &gbcfg);
2593
2594 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2595
2596 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2597 foreign_bss_tlli, &rai_unknown, cell_id,
2598 GPRS_SAPI_GMM, bss_nu++,
2599 dtap_attach_req, sizeof(dtap_attach_req));
2600
2601 dump_peers(stdout, 0, 0, &gbcfg);
2602
2603 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2604 random_sgsn_tlli, 0, NULL, 0,
2605 GPRS_SAPI_GMM, sgsn_nu++,
2606 dtap_identity_req, sizeof(dtap_identity_req));
2607
2608 dump_peers(stdout, 0, 0, &gbcfg);
2609
2610 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2611 foreign_bss_tlli, &rai_bss, cell_id,
2612 GPRS_SAPI_GMM, bss_nu++,
2613 dtap_identity_resp, sizeof(dtap_identity_resp));
2614
2615 dump_peers(stdout, 0, 0, &gbcfg);
2616
2617 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2618 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2619 GPRS_SAPI_GMM, sgsn_nu++,
2620 dtap_attach_acc, sizeof(dtap_attach_acc));
2621
2622 dump_peers(stdout, 0, 0, &gbcfg);
2623
2624 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2625 OSMO_ASSERT(link_info);
2626 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2627 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2628 OSMO_ASSERT(!link_info->tlli.bss_validated);
2629 OSMO_ASSERT(!link_info->tlli.net_validated);
2630 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2631 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2632 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2633 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2634 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2635 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2636
2637 send_llc_dl_ui(nsi, "ATTACH ACCEPT (duplicated)", &sgsn_peer, 0x1002,
2638 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2639 GPRS_SAPI_GMM, sgsn_nu++,
2640 dtap_attach_acc, sizeof(dtap_attach_acc));
2641
2642 dump_peers(stdout, 0, 0, &gbcfg);
2643
2644 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2645 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002646 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002647 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2648 OSMO_ASSERT(!link_info->tlli.bss_validated);
2649 OSMO_ASSERT(!link_info->tlli.net_validated);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002650 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002651 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2652 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2653 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2654 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2655 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2656
2657 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2658 local_bss_tlli, &rai_bss, cell_id,
2659 GPRS_SAPI_GMM, bss_nu++,
2660 dtap_attach_complete, sizeof(dtap_attach_complete));
2661
2662 dump_peers(stdout, 0, 0, &gbcfg);
2663
2664 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2665 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002666 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002667 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002668 OSMO_ASSERT(link_info->tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002669 OSMO_ASSERT(!link_info->tlli.net_validated);
2670 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2671 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002672 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002673 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2674
2675 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2676 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2677 GPRS_SAPI_GMM, sgsn_nu++,
2678 dtap_gmm_information, sizeof(dtap_gmm_information));
2679
2680 dump_peers(stdout, 0, 0, &gbcfg);
2681
2682 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2683 OSMO_ASSERT(link_info);
Jacob Erlbeck91e9f552014-10-20 16:30:06 +02002684 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2685 OSMO_ASSERT(link_info->tlli.assigned == 0);
2686 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2687 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002688
2689 /* Detach */
2690 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2691 local_bss_tlli, &rai_bss, cell_id,
2692 GPRS_SAPI_GMM, bss_nu++,
2693 dtap_detach_req, sizeof(dtap_detach_req));
2694
2695 dump_peers(stdout, 0, 0, &gbcfg);
2696
2697 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2698 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2699 GPRS_SAPI_GMM, sgsn_nu++,
2700 dtap_detach_acc, sizeof(dtap_detach_acc));
2701
2702 dump_peers(stdout, 0, 0, &gbcfg);
2703
2704 dump_global(stdout, 0);
2705
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02002706 talloc_free(gbcfg.core_apn);
2707 gbcfg.core_apn = NULL;
2708
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002709 gbprox_reset(&gbcfg);
2710 gprs_ns_destroy(nsi);
2711 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02002712
2713 cleanup_test();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02002714}
2715
2716
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002717static void test_gbproxy_imsi_acquisition()
2718{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002719 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002720 struct sockaddr_in bss_peer[1] = {{0},};
2721 struct sockaddr_in sgsn_peer= {0};
2722 struct gprs_ra_id rai_bss =
2723 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2724 struct gprs_ra_id rai_sgsn =
2725 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2726 struct gprs_ra_id rai_wrong_mcc_sgsn =
2727 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2728 struct gprs_ra_id rai_unknown =
2729 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2730 uint16_t cell_id = 0x1234;
2731
2732 const uint32_t sgsn_ptmsi = 0xefe2b700;
2733 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02002734 const uint32_t random_sgsn_tlli = 0x78dead00;
2735 const uint32_t random_sgsn_tlli2 = 0x78dead02;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002736
Daniel Willmann537d4802015-10-12 19:36:35 +02002737 const uint32_t bss_ptmsi = 0xc0dead01;
2738 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002739 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002740 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002741
Neels Hofmeyr7369d442020-05-29 17:05:40 +02002742 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002743 struct gbproxy_link_info *link_info;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002744 struct gbproxy_peer *peer;
2745 unsigned bss_nu = 0;
2746 unsigned sgsn_nu = 0;
2747
2748 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2749
2750 bssgp_nsi = nsi;
2751 gbcfg.nsi = bssgp_nsi;
2752 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01002753 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01002754 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002755 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2756 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002757 gbcfg.acquire_imsi = 1;
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002758
2759 configure_sgsn_peer(&sgsn_peer);
2760 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2761
2762 printf("=== %s ===\n", __func__);
2763 printf("--- Initialise SGSN ---\n\n");
2764
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02002765 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002766
2767 printf("--- Initialise BSS 1 ---\n\n");
2768
2769 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2770 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2771
2772 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2773 OSMO_ASSERT(peer != NULL);
2774
2775 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2776
2777 gprs_dump_nsi(nsi);
2778 dump_global(stdout, 0);
2779 dump_peers(stdout, 0, 0, &gbcfg);
2780
2781 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2782
2783 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002784 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002785 GPRS_SAPI_GMM, bss_nu++,
2786 dtap_attach_req, sizeof(dtap_attach_req));
2787
2788 dump_peers(stdout, 0, 0, &gbcfg);
2789
Jacob Erlbeck5f4ef322014-08-22 17:10:01 +02002790 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2791 foreign_bss_tlli, &rai_bss, cell_id,
2792 GPRS_SAPI_GMM, bss_nu++,
2793 dtap_identity_resp, sizeof(dtap_identity_resp));
2794
2795 dump_peers(stdout, 0, 0, &gbcfg);
2796
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002797 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2798 random_sgsn_tlli, 0, NULL, 0,
2799 GPRS_SAPI_GMM, sgsn_nu++,
2800 dtap_identity_req, sizeof(dtap_identity_req));
2801
2802 dump_peers(stdout, 0, 0, &gbcfg);
2803
2804 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2805 foreign_bss_tlli, &rai_bss, cell_id,
2806 GPRS_SAPI_GMM, bss_nu++,
2807 dtap_identity_resp, sizeof(dtap_identity_resp));
2808
2809 dump_peers(stdout, 0, 0, &gbcfg);
2810
2811 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2812 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2813 GPRS_SAPI_GMM, sgsn_nu++,
2814 dtap_attach_acc, sizeof(dtap_attach_acc));
2815
2816 dump_peers(stdout, 0, 0, &gbcfg);
2817
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002818 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2819 OSMO_ASSERT(link_info);
2820 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2821 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2822 OSMO_ASSERT(!link_info->tlli.bss_validated);
2823 OSMO_ASSERT(!link_info->tlli.net_validated);
2824 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2825 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2826 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2827 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2828 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2829 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002830
2831 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2832 local_bss_tlli, &rai_bss, cell_id,
2833 GPRS_SAPI_GMM, bss_nu++,
2834 dtap_attach_complete, sizeof(dtap_attach_complete));
2835
2836 dump_peers(stdout, 0, 0, &gbcfg);
2837
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002838 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2839 OSMO_ASSERT(link_info);
2840 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2841 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2842 OSMO_ASSERT(link_info->tlli.bss_validated);
2843 OSMO_ASSERT(!link_info->tlli.net_validated);
2844 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2845 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2846 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2847 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002848
2849 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2850 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2851 GPRS_SAPI_GMM, sgsn_nu++,
2852 dtap_gmm_information, sizeof(dtap_gmm_information));
2853
2854 dump_peers(stdout, 0, 0, &gbcfg);
2855
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02002856 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2857 OSMO_ASSERT(link_info);
2858 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2859 OSMO_ASSERT(link_info->tlli.assigned == 0);
2860 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2861 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02002862
2863 /* Non-DTAP */
2864 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2865 local_bss_tlli, &rai_bss, cell_id,
2866 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2867
2868 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2869 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2870 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2871
2872 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2873 local_bss_tlli, &rai_bss, cell_id,
2874 llc_ui_ll11_dns_query_ul,
2875 sizeof(llc_ui_ll11_dns_query_ul));
2876
2877 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2878 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2879 llc_ui_ll11_dns_resp_dl,
2880 sizeof(llc_ui_ll11_dns_resp_dl));
2881
2882 dump_peers(stdout, 0, 0, &gbcfg);
2883
2884 /* Other messages */
2885 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2886 local_bss_tlli, 1, 12);
2887
2888 dump_peers(stdout, 0, 0, &gbcfg);
2889
2890 send_bssgp_llc_discarded(nsi, &sgsn_peer, 0x1002,
2891 local_sgsn_tlli, 1, 12);
2892
2893 dump_peers(stdout, 0, 0, &gbcfg);
2894
2895 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2896
2897 dump_peers(stdout, 0, 0, &gbcfg);
2898
2899 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_sgsn);
2900
2901 dump_peers(stdout, 0, 0, &gbcfg);
2902
2903 /* Bad case: Invalid BVCI */
2904 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
2905 local_bss_tlli, 1, 12);
2906 dump_global(stdout, 0);
2907
2908 /* Bad case: Invalid RAI */
2909 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_unknown);
2910
2911 dump_global(stdout, 0);
2912
2913 /* Bad case: Invalid MCC (LAC ok) */
2914 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli,
2915 &rai_wrong_mcc_sgsn);
2916
2917 dump_global(stdout, 0);
2918
2919 /* Detach */
2920 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2921 local_bss_tlli, &rai_bss, cell_id,
2922 GPRS_SAPI_GMM, bss_nu++,
2923 dtap_detach_req, sizeof(dtap_detach_req));
2924
2925 dump_peers(stdout, 0, 0, &gbcfg);
2926
2927 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2928 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2929 GPRS_SAPI_GMM, sgsn_nu++,
2930 dtap_detach_acc, sizeof(dtap_detach_acc));
2931
2932 dump_peers(stdout, 0, 0, &gbcfg);
2933
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002934 /* RA Update request */
2935
2936 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2937 foreign_bss_tlli, &rai_unknown, 0x7080,
2938 GPRS_SAPI_GMM, bss_nu++,
2939 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2940
2941 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2942 foreign_bss_tlli, &rai_bss, cell_id,
2943 GPRS_SAPI_GMM, bss_nu++,
2944 dtap_identity_resp, sizeof(dtap_identity_resp));
2945
2946 dump_peers(stdout, 0, 0, &gbcfg);
2947
2948 send_llc_dl_ui(nsi, "RA UDP ACC", &sgsn_peer, 0x1002,
2949 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2950 GPRS_SAPI_GMM, sgsn_nu++,
2951 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2952
2953 dump_peers(stdout, 0, 0, &gbcfg);
2954
2955 /* Detach */
2956
2957 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2958 local_bss_tlli, &rai_bss, cell_id,
2959 GPRS_SAPI_GMM, bss_nu++,
2960 dtap_detach_req, sizeof(dtap_detach_req));
2961
2962 dump_peers(stdout, 0, 0, &gbcfg);
2963
2964 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2965 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2966 GPRS_SAPI_GMM, sgsn_nu++,
2967 dtap_detach_acc, sizeof(dtap_detach_acc));
2968
2969 dump_peers(stdout, 0, 0, &gbcfg);
2970
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002971 /* Special case: Repeated Attach Requests */
2972
2973 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2974 foreign_bss_tlli, &rai_unknown, cell_id,
2975 GPRS_SAPI_GMM, bss_nu++,
2976 dtap_attach_req, sizeof(dtap_attach_req));
2977
2978 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2979 foreign_bss_tlli, &rai_unknown, cell_id,
2980 GPRS_SAPI_GMM, bss_nu++,
2981 dtap_attach_req, sizeof(dtap_attach_req));
2982
Jacob Erlbeck991606b2014-09-12 10:33:38 +02002983 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2984 foreign_bss_tlli, &rai_bss, cell_id,
2985 GPRS_SAPI_GMM, bss_nu++,
2986 dtap_detach_req, sizeof(dtap_detach_req));
2987
2988 dump_peers(stdout, 0, 0, &gbcfg);
2989
2990 /* Special case: Detach from an unknown TLLI */
2991
2992 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", &bss_peer[0], 0x1002,
2993 other_bss_tlli, &rai_bss, cell_id,
2994 GPRS_SAPI_GMM, bss_nu++,
2995 dtap_detach_req, sizeof(dtap_detach_req));
2996
Jacob Erlbeckea1698e2014-09-02 14:40:11 +02002997 dump_peers(stdout, 0, 0, &gbcfg);
2998
Jacob Erlbeck2ec27572014-09-18 09:57:47 +02002999 /* Special case: Repeated RA Update Requests */
3000
3001 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3002 foreign_bss_tlli, &rai_unknown, 0x7080,
3003 GPRS_SAPI_GMM, bss_nu++,
3004 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3005
3006 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3007 foreign_bss_tlli, &rai_unknown, 0x7080,
3008 GPRS_SAPI_GMM, bss_nu++,
3009 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3010
3011 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3012 foreign_bss_tlli, &rai_bss, cell_id,
3013 GPRS_SAPI_GMM, bss_nu++,
3014 dtap_detach_req, sizeof(dtap_detach_req));
3015
3016 dump_peers(stdout, 0, 0, &gbcfg);
3017
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02003018 dump_global(stdout, 0);
3019
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02003020 talloc_free(gbcfg.core_apn);
3021 gbcfg.core_apn = NULL;
3022
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02003023 gbprox_reset(&gbcfg);
3024 gprs_ns_destroy(nsi);
3025 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003026
3027 cleanup_test();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02003028}
3029
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003030static void test_gbproxy_secondary_sgsn()
3031{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01003032 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003033 struct sockaddr_in bss_peer[1] = {{0},};
3034 struct sockaddr_in sgsn_peer[2]= {{0},};
3035 struct gprs_ra_id rai_bss =
3036 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3037 struct gprs_ra_id rai_sgsn =
3038 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
3039 struct gprs_ra_id rai_unknown =
3040 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
3041 uint16_t cell_id = 0x1234;
3042
3043 const uint32_t sgsn_ptmsi = 0xefe2b700;
3044 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann537d4802015-10-12 19:36:35 +02003045 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003046
Daniel Willmann537d4802015-10-12 19:36:35 +02003047 const uint32_t bss_ptmsi = 0xc0dead01;
3048 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003049 const uint32_t foreign_bss_tlli = 0x8000dead;
3050
3051 const uint32_t sgsn_ptmsi2 = 0xe0987654;
3052 const uint32_t local_sgsn_tlli2 = 0xe0987654;
Daniel Willmann537d4802015-10-12 19:36:35 +02003053 const uint32_t random_sgsn_tlli2 = 0x78dead02;
3054 const uint32_t bss_ptmsi2 = 0xc0dead03;
3055 const uint32_t local_bss_tlli2 = 0xc0dead03;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003056 const uint32_t foreign_bss_tlli2 = 0x8000beef;
3057
Daniel Willmann537d4802015-10-12 19:36:35 +02003058 const uint32_t random_sgsn_tlli3 = 0x78dead04;
3059 const uint32_t bss_ptmsi3 = 0xc0dead05;
3060 const uint32_t local_bss_tlli3 = 0xc0dead05;
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003061 const uint32_t foreign_bss_tlli3 = 0x8000feed;
3062
Neels Hofmeyr7369d442020-05-29 17:05:40 +02003063 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
3064 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0xf8};
3065 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003066 struct gbproxy_link_info *link_info;
3067 struct gbproxy_link_info *other_info;
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003068 struct gbproxy_peer *peer;
3069 unsigned bss_nu = 0;
3070 unsigned sgsn_nu = 0;
3071
3072 const char *err_msg = NULL;
3073 const char *filter_re = "999999";
3074
3075 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
3076 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
3077
3078 bssgp_nsi = nsi;
3079 gbcfg.nsi = bssgp_nsi;
3080 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01003081 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01003082 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003083 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
3084 gbcfg.patch_ptmsi = 1;
3085 gbcfg.acquire_imsi = 1;
Daniel Willmann537d4802015-10-12 19:36:35 +02003086
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003087 gbcfg.route_to_sgsn2 = 1;
3088 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
3089
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003090 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING],
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02003091 filter_re, &err_msg) != 0) {
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003092 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
3093 err_msg);
3094 OSMO_ASSERT(err_msg == NULL);
3095 }
3096
3097 configure_sgsn_peer(&sgsn_peer[0]);
3098 configure_sgsn2_peer(&sgsn_peer[1]);
3099 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3100
3101 printf("=== %s ===\n", __func__);
3102 printf("--- Initialise SGSN 1 ---\n\n");
3103
3104 connect_sgsn(nsi, &sgsn_peer[0], SGSN_NSEI);
3105
3106 printf("--- Initialise SGSN 2 ---\n\n");
3107
3108 connect_sgsn(nsi, &sgsn_peer[1], SGSN2_NSEI);
3109
3110 printf("--- Initialise BSS 1 ---\n\n");
3111
3112 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3113 setup_bssgp(nsi, &bss_peer[0], 0x0);
3114 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x0);
3115 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3116 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x1002);
3117 send_bssgp_reset_ack(nsi, &sgsn_peer[1], 0x1002);
3118
3119 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3120 OSMO_ASSERT(peer != NULL);
3121
3122 gprs_dump_nsi(nsi);
3123 dump_global(stdout, 0);
3124 dump_peers(stdout, 0, 0, &gbcfg);
3125
3126 printf("--- Flow control ---\n\n");
3127
3128 send_bssgp_flow_control_bvc(nsi, &bss_peer[0], 0x1002, 1);
3129 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[0], 0x1002, 1);
3130 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[1], 0x1002, 1);
3131
3132 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
3133
3134 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3135 foreign_bss_tlli, &rai_unknown, cell_id,
3136 GPRS_SAPI_GMM, bss_nu++,
3137 dtap_attach_req, sizeof(dtap_attach_req));
3138
3139 dump_peers(stdout, 0, 0, &gbcfg);
3140
3141 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3142 foreign_bss_tlli, &rai_bss, cell_id,
3143 GPRS_SAPI_GMM, bss_nu++,
3144 dtap_identity_resp, sizeof(dtap_identity_resp));
3145
3146 dump_peers(stdout, 0, 0, &gbcfg);
3147
3148 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[0], 0x1002,
3149 random_sgsn_tlli, 0, NULL, 0,
3150 GPRS_SAPI_GMM, sgsn_nu++,
3151 dtap_identity_req, sizeof(dtap_identity_req));
3152
3153 dump_peers(stdout, 0, 0, &gbcfg);
3154
3155 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3156 foreign_bss_tlli, &rai_bss, cell_id,
3157 GPRS_SAPI_GMM, bss_nu++,
3158 dtap_identity_resp, sizeof(dtap_identity_resp));
3159
3160 dump_peers(stdout, 0, 0, &gbcfg);
3161
3162 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[0], 0x1002,
3163 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3164 GPRS_SAPI_GMM, sgsn_nu++,
3165 dtap_attach_acc, sizeof(dtap_attach_acc));
3166
3167 dump_peers(stdout, 0, 0, &gbcfg);
3168
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003169 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3170 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
3171 OSMO_ASSERT(link_info);
3172 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3173 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3174 OSMO_ASSERT(!link_info->tlli.bss_validated);
3175 OSMO_ASSERT(!link_info->tlli.net_validated);
3176 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
3177 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3178 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3179 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3180 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3181 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003182
3183 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3184 local_bss_tlli, &rai_bss, cell_id,
3185 GPRS_SAPI_GMM, bss_nu++,
3186 dtap_attach_complete, sizeof(dtap_attach_complete));
3187
3188 dump_peers(stdout, 0, 0, &gbcfg);
3189
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003190 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3191 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3192 OSMO_ASSERT(link_info);
3193 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3194 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3195 OSMO_ASSERT(link_info->tlli.bss_validated);
3196 OSMO_ASSERT(!link_info->tlli.net_validated);
3197 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3198 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3199 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3200 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003201
3202 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[0], 0x1002,
3203 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3204 GPRS_SAPI_GMM, sgsn_nu++,
3205 dtap_gmm_information, sizeof(dtap_gmm_information));
3206
3207 dump_peers(stdout, 0, 0, &gbcfg);
3208
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003209 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3210 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3211 OSMO_ASSERT(link_info);
3212 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
3213 OSMO_ASSERT(link_info->tlli.assigned == 0);
3214 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3215 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003216
3217 /* Non-DTAP */
3218 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3219 local_bss_tlli, &rai_bss, cell_id,
3220 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3221
3222 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[0], 0x1002,
3223 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3224 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3225
3226 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3227 local_bss_tlli, &rai_bss, cell_id,
3228 llc_ui_ll11_dns_query_ul,
3229 sizeof(llc_ui_ll11_dns_query_ul));
3230
3231 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[0], 0x1002,
3232 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3233 llc_ui_ll11_dns_resp_dl,
3234 sizeof(llc_ui_ll11_dns_resp_dl));
3235
3236 dump_peers(stdout, 0, 0, &gbcfg);
3237
3238 /* Other messages */
3239 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3240 local_bss_tlli, 1, 12);
3241
3242 dump_peers(stdout, 0, 0, &gbcfg);
3243
3244 send_bssgp_llc_discarded(nsi, &sgsn_peer[0], 0x1002,
3245 local_sgsn_tlli, 1, 12);
3246
3247 dump_peers(stdout, 0, 0, &gbcfg);
3248
3249 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
3250
3251 dump_peers(stdout, 0, 0, &gbcfg);
3252
3253 send_bssgp_suspend_ack(nsi, &sgsn_peer[0], local_sgsn_tlli, &rai_sgsn);
3254
3255 dump_peers(stdout, 0, 0, &gbcfg);
3256
3257 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
3258
3259 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3260 foreign_bss_tlli2, &rai_unknown, cell_id,
3261 GPRS_SAPI_GMM, bss_nu++,
3262 dtap_attach_req, sizeof(dtap_attach_req));
3263
3264 dump_peers(stdout, 0, 0, &gbcfg);
3265
3266 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3267 foreign_bss_tlli2, &rai_bss, cell_id,
3268 GPRS_SAPI_GMM, bss_nu++,
3269 dtap_identity2_resp, sizeof(dtap_identity2_resp));
3270
3271 dump_peers(stdout, 0, 0, &gbcfg);
3272
3273 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3274 random_sgsn_tlli2, 0, NULL, 0,
3275 GPRS_SAPI_GMM, sgsn_nu++,
3276 dtap_identity_req, sizeof(dtap_identity_req));
3277
3278 dump_peers(stdout, 0, 0, &gbcfg);
3279
3280 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3281 foreign_bss_tlli2, &rai_bss, cell_id,
3282 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck2bb45432014-09-17 12:05:08 +02003283 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003284
3285 dump_peers(stdout, 0, 0, &gbcfg);
3286
3287 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[1], 0x1002,
3288 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3289 GPRS_SAPI_GMM, sgsn_nu++,
3290 dtap_attach_acc2, sizeof(dtap_attach_acc2));
3291
3292 dump_peers(stdout, 0, 0, &gbcfg);
3293
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003294 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
3295 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
3296 OSMO_ASSERT(link_info);
3297 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3298 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3299 OSMO_ASSERT(!link_info->tlli.bss_validated);
3300 OSMO_ASSERT(!link_info->tlli.net_validated);
3301 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
3302 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3303 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3304 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3305 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3306 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003307
3308 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3309 local_bss_tlli2, &rai_bss, cell_id,
3310 GPRS_SAPI_GMM, bss_nu++,
3311 dtap_attach_complete, sizeof(dtap_attach_complete));
3312
3313 dump_peers(stdout, 0, 0, &gbcfg);
3314
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003315 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3316 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3317 OSMO_ASSERT(link_info);
3318 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3319 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3320 OSMO_ASSERT(link_info->tlli.bss_validated);
3321 OSMO_ASSERT(!link_info->tlli.net_validated);
3322 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3323 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3324 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3325 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003326
3327 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3328 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3329 GPRS_SAPI_GMM, sgsn_nu++,
3330 dtap_gmm_information, sizeof(dtap_gmm_information));
3331
3332 dump_peers(stdout, 0, 0, &gbcfg);
3333
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003334 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3335 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3336 OSMO_ASSERT(link_info);
3337 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
3338 OSMO_ASSERT(link_info->tlli.assigned == 0);
3339 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
3340 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003341
3342 /* Non-DTAP */
3343 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3344 local_bss_tlli2, &rai_bss, cell_id,
3345 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3346
3347 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[1], 0x1002,
3348 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3349 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3350
3351 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3352 local_bss_tlli2, &rai_bss, cell_id,
3353 llc_ui_ll11_dns_query_ul,
3354 sizeof(llc_ui_ll11_dns_query_ul));
3355
3356 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[1], 0x1002,
3357 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3358 llc_ui_ll11_dns_resp_dl,
3359 sizeof(llc_ui_ll11_dns_resp_dl));
3360
3361 dump_peers(stdout, 0, 0, &gbcfg);
3362
3363 /* Other messages */
3364 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3365 local_bss_tlli2, 1, 12);
3366
3367 dump_peers(stdout, 0, 0, &gbcfg);
3368
3369 send_bssgp_llc_discarded(nsi, &sgsn_peer[1], 0x1002,
3370 local_sgsn_tlli2, 1, 12);
3371
3372 dump_peers(stdout, 0, 0, &gbcfg);
3373
3374 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli2, &rai_bss);
3375
3376 dump_peers(stdout, 0, 0, &gbcfg);
3377
3378 send_bssgp_suspend_ack(nsi, &sgsn_peer[1], local_sgsn_tlli2, &rai_sgsn);
3379
3380 dump_peers(stdout, 0, 0, &gbcfg);
3381
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003382 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
3383
3384 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3385 foreign_bss_tlli3, &rai_unknown, cell_id,
3386 GPRS_SAPI_GMM, bss_nu++,
3387 dtap_attach_req, sizeof(dtap_attach_req));
3388
3389 dump_peers(stdout, 0, 0, &gbcfg);
3390
3391 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3392 foreign_bss_tlli3, &rai_bss, cell_id,
3393 GPRS_SAPI_GMM, bss_nu++,
3394 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3395
3396 dump_peers(stdout, 0, 0, &gbcfg);
3397
3398 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3399 random_sgsn_tlli3, 0, NULL, 0,
3400 GPRS_SAPI_GMM, sgsn_nu++,
3401 dtap_identity_req, sizeof(dtap_identity_req));
3402
3403 dump_peers(stdout, 0, 0, &gbcfg);
3404
3405 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3406 foreign_bss_tlli3, &rai_bss, cell_id,
3407 GPRS_SAPI_GMM, bss_nu++,
3408 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3409
3410 dump_peers(stdout, 0, 0, &gbcfg);
3411
3412 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", &sgsn_peer[1], 0x1002,
3413 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
3414 GPRS_SAPI_GMM, sgsn_nu++,
3415 dtap_attach_acc, sizeof(dtap_attach_acc));
3416
3417 dump_peers(stdout, 0, 0, &gbcfg);
3418
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003419 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
3420 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
3421 OSMO_ASSERT(link_info);
3422 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3423 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3424 OSMO_ASSERT(!link_info->tlli.bss_validated);
3425 OSMO_ASSERT(!link_info->tlli.net_validated);
3426 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
3427 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3428 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3429 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3430 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3431 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003432
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003433 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3434 local_bss_tlli3, &rai_bss, cell_id,
3435 GPRS_SAPI_GMM, bss_nu++,
3436 dtap_attach_complete, sizeof(dtap_attach_complete));
3437
3438 dump_peers(stdout, 0, 0, &gbcfg);
3439
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003440 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003441 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003442 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3443 OSMO_ASSERT(link_info);
3444 OSMO_ASSERT(link_info != other_info);
3445 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3446 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3447 OSMO_ASSERT(link_info->tlli.bss_validated);
3448 OSMO_ASSERT(!link_info->tlli.net_validated);
3449 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3450 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3451 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3452 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003453
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003454 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3455 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3456 GPRS_SAPI_GMM, sgsn_nu++,
3457 dtap_gmm_information, sizeof(dtap_gmm_information));
3458
3459 dump_peers(stdout, 0, 0, &gbcfg);
3460
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003461 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003462 OSMO_ASSERT(other_info);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003463 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3464 OSMO_ASSERT(link_info);
3465 OSMO_ASSERT(link_info != other_info);
3466 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
3467 OSMO_ASSERT(link_info->tlli.assigned == 0);
3468 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3469 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck91a0e862014-09-17 10:56:38 +02003470
3471
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003472 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
3473
3474 /* Detach */
3475 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3476 local_bss_tlli, &rai_bss, cell_id,
3477 GPRS_SAPI_GMM, bss_nu++,
3478 dtap_detach_req, sizeof(dtap_detach_req));
3479
3480 dump_peers(stdout, 0, 0, &gbcfg);
3481
3482 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[0], 0x1002,
3483 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3484 GPRS_SAPI_GMM, sgsn_nu++,
3485 dtap_detach_acc, sizeof(dtap_detach_acc));
3486
3487 dump_peers(stdout, 0, 0, &gbcfg);
3488
3489 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
3490
3491 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3492 local_bss_tlli2, &rai_bss, cell_id,
3493 GPRS_SAPI_GMM, bss_nu++,
3494 dtap_detach_req, sizeof(dtap_detach_req));
3495
3496 dump_peers(stdout, 0, 0, &gbcfg);
3497
3498 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3499 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3500 GPRS_SAPI_GMM, sgsn_nu++,
3501 dtap_detach_acc, sizeof(dtap_detach_acc));
3502
3503 dump_peers(stdout, 0, 0, &gbcfg);
3504
Jacob Erlbeckaf952ba2014-09-17 12:09:25 +02003505 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
3506
3507 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3508 local_bss_tlli3, &rai_bss, cell_id,
3509 GPRS_SAPI_GMM, bss_nu++,
3510 dtap_detach_req, sizeof(dtap_detach_req));
3511
3512 dump_peers(stdout, 0, 0, &gbcfg);
3513
3514 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3515 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3516 GPRS_SAPI_GMM, sgsn_nu++,
3517 dtap_detach_acc, sizeof(dtap_detach_acc));
3518
3519 dump_peers(stdout, 0, 0, &gbcfg);
3520
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003521 dump_global(stdout, 0);
3522
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02003523 talloc_free(gbcfg.core_apn);
3524 gbcfg.core_apn = NULL;
3525
Jacob Erlbeckb36032c2014-09-25 13:21:48 +02003526 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING]);
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003527 gbprox_reset(&gbcfg);
3528 gprs_ns_destroy(nsi);
3529 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02003530
3531 cleanup_test();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02003532}
3533
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003534static void test_gbproxy_keep_info()
3535{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01003536 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003537 struct sockaddr_in bss_peer[1] = {{0},};
3538 struct sockaddr_in sgsn_peer= {0};
3539 struct gprs_ra_id rai_bss =
3540 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3541 uint16_t cell_id = 0x1234;
3542
3543 const uint32_t ptmsi = 0xefe2b700;
3544 const uint32_t local_tlli = 0xefe2b700;
3545 const uint32_t foreign_tlli = 0xafe2b700;
3546
Neels Hofmeyr7369d442020-05-29 17:05:40 +02003547 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xf8};
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003548 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003549 struct gbproxy_peer *peer;
3550 unsigned bss_nu = 0;
3551 unsigned sgsn_nu = 0;
3552
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003553 LLIST_HEAD(rcv_list);
3554
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003555 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3556
3557 bssgp_nsi = nsi;
3558 gbcfg.nsi = bssgp_nsi;
3559 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3560 gbcfg.patch_ptmsi = 0;
3561 gbcfg.acquire_imsi = 1;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01003562 gbcfg.core_plmn = (struct osmo_plmn_id){};
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003563 gbcfg.core_apn = NULL;
3564 gbcfg.core_apn_size = 0;
3565 gbcfg.route_to_sgsn2 = 0;
3566 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003567 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003568
3569 configure_sgsn_peer(&sgsn_peer);
3570 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3571
3572 printf("=== %s ===\n", __func__);
3573 printf("--- Initialise SGSN ---\n\n");
3574
3575 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
3576
3577 printf("--- Initialise BSS 1 ---\n\n");
3578
3579 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3580 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3581
3582 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3583 OSMO_ASSERT(peer != NULL);
3584
3585 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
3586
3587 gprs_dump_nsi(nsi);
3588 dump_global(stdout, 0);
3589 dump_peers(stdout, 0, 0, &gbcfg);
3590
3591 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3592
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003593 received_messages = &rcv_list;
3594
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003595 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3596 foreign_tlli, &rai_bss, cell_id,
3597 GPRS_SAPI_GMM, bss_nu++,
3598 dtap_attach_req, sizeof(dtap_attach_req));
3599
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003600 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3601
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003602 dump_peers(stdout, 0, 0, &gbcfg);
3603
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003604 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3605 OSMO_ASSERT(link_info);
3606 OSMO_ASSERT(link_info->imsi_len == 0);
3607 OSMO_ASSERT(!link_info->is_deregistered);
3608 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003609
3610 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3611 foreign_tlli, &rai_bss, cell_id,
3612 GPRS_SAPI_GMM, bss_nu++,
3613 dtap_identity_resp, sizeof(dtap_identity_resp));
3614
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003615 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3616
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003617 dump_peers(stdout, 0, 0, &gbcfg);
3618
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003619 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3620 OSMO_ASSERT(link_info);
3621 OSMO_ASSERT(link_info->imsi_len > 0);
3622 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003623 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003624
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003625 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
3626 foreign_tlli, 0, NULL, 0,
3627 GPRS_SAPI_GMM, sgsn_nu++,
3628 dtap_identity_req, sizeof(dtap_identity_req));
3629
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003630 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3631
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003632 dump_peers(stdout, 0, 0, &gbcfg);
3633
3634 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3635 foreign_tlli, &rai_bss, cell_id,
3636 GPRS_SAPI_GMM, bss_nu++,
3637 dtap_identity_resp, sizeof(dtap_identity_resp));
3638
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003639 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
3640
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003641 dump_peers(stdout, 0, 0, &gbcfg);
3642
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003643 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3644 OSMO_ASSERT(link_info);
3645 OSMO_ASSERT(link_info->imsi_len > 0);
3646 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003647
3648 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3649 foreign_tlli, 1, imsi, sizeof(imsi),
3650 GPRS_SAPI_GMM, sgsn_nu++,
3651 dtap_attach_acc, sizeof(dtap_attach_acc));
3652
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003653 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3654
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003655 dump_peers(stdout, 0, 0, &gbcfg);
3656
3657 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3658 local_tlli, &rai_bss, cell_id,
3659 GPRS_SAPI_GMM, bss_nu++,
3660 dtap_attach_complete, sizeof(dtap_attach_complete));
3661
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003662 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3663
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003664 dump_peers(stdout, 0, 0, &gbcfg);
3665
3666 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
3667 local_tlli, 1, imsi, sizeof(imsi),
3668 GPRS_SAPI_GMM, sgsn_nu++,
3669 dtap_gmm_information, sizeof(dtap_gmm_information));
3670
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003671 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3672
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003673 dump_peers(stdout, 0, 0, &gbcfg);
3674
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003675 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3676 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003677
3678 /* Detach (MO) */
3679 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3680 local_tlli, &rai_bss, cell_id,
3681 GPRS_SAPI_GMM, bss_nu++,
3682 dtap_detach_req, sizeof(dtap_detach_req));
3683
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003684 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3685
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003686 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3687 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003688
3689 dump_peers(stdout, 0, 0, &gbcfg);
3690
3691 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3692 local_tlli, 1, imsi, sizeof(imsi),
3693 GPRS_SAPI_GMM, sgsn_nu++,
3694 dtap_detach_acc, sizeof(dtap_detach_acc));
3695
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003696 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3697
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003698 dump_peers(stdout, 0, 0, &gbcfg);
3699
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003700 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3701 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3702 OSMO_ASSERT(link_info);
3703 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003704
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003705 OSMO_ASSERT(!expect_msg());
3706
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003707 /* Re-Attach */
3708 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3709 foreign_tlli, &rai_bss, cell_id,
3710 GPRS_SAPI_GMM, bss_nu++,
3711 dtap_attach_req3, sizeof(dtap_attach_req3));
3712
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003713 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3714
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003715 dump_peers(stdout, 0, 0, &gbcfg);
3716
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003717 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3718 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3719 OSMO_ASSERT(link_info);
3720 OSMO_ASSERT(link_info == link_info2);
3721 OSMO_ASSERT(link_info->imsi_len != 0);
3722 OSMO_ASSERT(!link_info->is_deregistered);
3723 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003724 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003725
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003726 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3727 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
3735 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3736 local_tlli, &rai_bss, cell_id,
3737 GPRS_SAPI_GMM, bss_nu++,
3738 dtap_attach_complete, sizeof(dtap_attach_complete));
3739
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003740 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3741
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003742 dump_peers(stdout, 0, 0, &gbcfg);
3743
3744 /* Detach (MT) */
3745 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
3746 local_tlli, 1, imsi, sizeof(imsi),
3747 GPRS_SAPI_GMM, sgsn_nu++,
3748 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3749
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003750 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3751
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003752 dump_peers(stdout, 0, 0, &gbcfg);
3753
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003754 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3755 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003756
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003757 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003758 local_tlli, &rai_bss, cell_id,
3759 GPRS_SAPI_GMM, bss_nu++,
3760 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3761
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003762 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3763 OSMO_ASSERT(!expect_msg());
3764
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003765 dump_peers(stdout, 0, 0, &gbcfg);
3766
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003767 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3768 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3769 OSMO_ASSERT(link_info);
3770 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003771
3772 /* Re-Attach */
3773 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3774 foreign_tlli, &rai_bss, cell_id,
3775 GPRS_SAPI_GMM, bss_nu++,
3776 dtap_attach_req3, sizeof(dtap_attach_req3));
3777
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003778 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3779
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003780 dump_peers(stdout, 0, 0, &gbcfg);
3781
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003782 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3783 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3784 OSMO_ASSERT(link_info);
3785 OSMO_ASSERT(link_info == link_info2);
3786 OSMO_ASSERT(link_info->imsi_len != 0);
3787 OSMO_ASSERT(!link_info->is_deregistered);
3788 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003789
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003790 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3791 foreign_tlli, 1, imsi, sizeof(imsi),
3792 GPRS_SAPI_GMM, sgsn_nu++,
3793 dtap_attach_acc, sizeof(dtap_attach_acc));
3794
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003795 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3796
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003797 dump_peers(stdout, 0, 0, &gbcfg);
3798
3799 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3800 local_tlli, &rai_bss, cell_id,
3801 GPRS_SAPI_GMM, bss_nu++,
3802 dtap_attach_complete, sizeof(dtap_attach_complete));
3803
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003804 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3805
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003806 dump_peers(stdout, 0, 0, &gbcfg);
3807
3808 /* Detach (MT) */
3809 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3810 local_tlli, 1, imsi, sizeof(imsi),
3811 GPRS_SAPI_GMM, sgsn_nu++,
3812 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3813
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003814 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3815
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003816 dump_peers(stdout, 0, 0, &gbcfg);
3817
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003818 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3819 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003820
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003821 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003822 local_tlli, &rai_bss, cell_id,
3823 GPRS_SAPI_GMM, bss_nu++,
3824 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3825
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003826 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3827 OSMO_ASSERT(!expect_msg());
3828
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003829 dump_peers(stdout, 0, 0, &gbcfg);
3830
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003831 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3832 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3833 OSMO_ASSERT(link_info);
3834 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003835
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01003836 /* Re-Attach with IMSI */
3837 send_llc_ul_ui(nsi, "ATTACH REQUEST (IMSI)", &bss_peer[0], 0x1002,
3838 foreign_tlli, &rai_bss, cell_id,
3839 GPRS_SAPI_GMM, bss_nu++,
3840 dtap_attach_req4, sizeof(dtap_attach_req4));
3841
3842 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3843
3844 dump_peers(stdout, 0, 0, &gbcfg);
3845
3846 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3847 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3848 OSMO_ASSERT(link_info);
3849 OSMO_ASSERT(link_info == link_info2);
3850 OSMO_ASSERT(link_info->imsi_len != 0);
3851 OSMO_ASSERT(!link_info->is_deregistered);
3852 OSMO_ASSERT(!link_info->imsi_acq_pending);
3853 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
3854
3855 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3856 foreign_tlli, 1, imsi, sizeof(imsi),
3857 GPRS_SAPI_GMM, sgsn_nu++,
3858 dtap_attach_acc, sizeof(dtap_attach_acc));
3859
3860 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3861
3862 dump_peers(stdout, 0, 0, &gbcfg);
3863
3864 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3865 local_tlli, &rai_bss, cell_id,
3866 GPRS_SAPI_GMM, bss_nu++,
3867 dtap_attach_complete, sizeof(dtap_attach_complete));
3868
3869 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3870
3871 dump_peers(stdout, 0, 0, &gbcfg);
3872
3873 /* Detach (MT) */
3874 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3875 local_tlli, 1, imsi, sizeof(imsi),
3876 GPRS_SAPI_GMM, sgsn_nu++,
3877 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3878
3879 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3880
3881 dump_peers(stdout, 0, 0, &gbcfg);
3882
3883 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3884 OSMO_ASSERT(link_info);
3885
3886 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
3887 local_tlli, &rai_bss, cell_id,
3888 GPRS_SAPI_GMM, bss_nu++,
3889 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3890
3891 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3892 OSMO_ASSERT(!expect_msg());
3893
3894 dump_peers(stdout, 0, 0, &gbcfg);
3895
3896 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3897 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3898 OSMO_ASSERT(link_info);
3899 OSMO_ASSERT(link_info->is_deregistered);
3900
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003901 /* Re-Attach */
3902 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3903 foreign_tlli, &rai_bss, cell_id,
3904 GPRS_SAPI_GMM, bss_nu++,
3905 dtap_attach_req3, sizeof(dtap_attach_req3));
3906
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003907 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3908
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003909 dump_peers(stdout, 0, 0, &gbcfg);
3910
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003911 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3912 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3913 OSMO_ASSERT(link_info);
3914 OSMO_ASSERT(link_info == link_info2);
3915 OSMO_ASSERT(link_info->imsi_len != 0);
3916 OSMO_ASSERT(!link_info->is_deregistered);
3917 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003918
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003919 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3920 foreign_tlli, 1, imsi, sizeof(imsi),
3921 GPRS_SAPI_GMM, sgsn_nu++,
3922 dtap_attach_acc, sizeof(dtap_attach_acc));
3923
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003924 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3925
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003926 dump_peers(stdout, 0, 0, &gbcfg);
3927
3928 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3929 local_tlli, &rai_bss, cell_id,
3930 GPRS_SAPI_GMM, bss_nu++,
3931 dtap_attach_complete, sizeof(dtap_attach_complete));
3932
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003933 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3934
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003935 dump_peers(stdout, 0, 0, &gbcfg);
3936
3937 /* RA update procedure (reject -> Detach) */
3938 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3939 local_tlli, &rai_bss, 0x7080,
3940 GPRS_SAPI_GMM, bss_nu++,
3941 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3942
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003943 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
3944
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003945 send_llc_dl_ui(nsi, "RA UDP REJ", &sgsn_peer, 0x1002,
3946 local_tlli, 1, imsi, sizeof(imsi),
3947 GPRS_SAPI_GMM, sgsn_nu++,
3948 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3949
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003950 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
3951 OSMO_ASSERT(!expect_msg());
3952
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003953 dump_peers(stdout, 0, 0, &gbcfg);
3954
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003955 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3956 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3957 OSMO_ASSERT(link_info);
3958 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003959
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003960 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
3961 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3962 foreign_tlli, &rai_bss, cell_id,
3963 GPRS_SAPI_GMM, bss_nu++,
3964 dtap_attach_req, sizeof(dtap_attach_req));
3965
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003966 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3967
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003968 dump_peers(stdout, 0, 0, &gbcfg);
3969
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02003970 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3971 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3972 OSMO_ASSERT(link_info);
3973 OSMO_ASSERT(link_info != link_info2);
3974 OSMO_ASSERT(link_info->imsi_len == 0);
3975 OSMO_ASSERT(!link_info->is_deregistered);
3976 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02003977
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003978 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3979 foreign_tlli, &rai_bss, cell_id,
3980 GPRS_SAPI_GMM, bss_nu++,
3981 dtap_identity_resp, sizeof(dtap_identity_resp));
3982
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02003983 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3984
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02003985 dump_peers(stdout, 0, 0, &gbcfg);
3986
3987 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3988 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3989 OSMO_ASSERT(link_info);
3990 OSMO_ASSERT(link_info == link_info2);
3991 OSMO_ASSERT(link_info->imsi_len != 0);
3992 OSMO_ASSERT(!link_info->is_deregistered);
3993 OSMO_ASSERT(!link_info->imsi_acq_pending);
3994
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02003995 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3996 foreign_tlli, 1, imsi, sizeof(imsi),
3997 GPRS_SAPI_GMM, sgsn_nu++,
3998 dtap_attach_acc, sizeof(dtap_attach_acc));
3999
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004000 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4001
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004002 dump_peers(stdout, 0, 0, &gbcfg);
4003
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004004 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4005 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4006 OSMO_ASSERT(link_info);
4007 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeckea71b482014-09-22 09:28:27 +02004008 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02004009
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004010 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4011 local_tlli, &rai_bss, cell_id,
4012 GPRS_SAPI_GMM, bss_nu++,
4013 dtap_attach_complete, sizeof(dtap_attach_complete));
4014
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004015 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4016
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004017 dump_peers(stdout, 0, 0, &gbcfg);
4018
4019 /* Detach (MT) */
4020 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4021 local_tlli, 1, imsi, sizeof(imsi),
4022 GPRS_SAPI_GMM, sgsn_nu++,
4023 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4024
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004025 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4026
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004027 dump_peers(stdout, 0, 0, &gbcfg);
4028
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004029 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4030 OSMO_ASSERT(link_info);
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004031
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004032 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004033 local_tlli, &rai_bss, cell_id,
4034 GPRS_SAPI_GMM, bss_nu++,
4035 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4036
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004037 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4038
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004039 dump_peers(stdout, 0, 0, &gbcfg);
4040
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004041 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4042 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4043 OSMO_ASSERT(link_info);
4044 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck7430da62014-09-12 15:09:56 +02004045
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004046 OSMO_ASSERT(!expect_msg());
4047
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004048 /* Bad case: Re-Attach with local TLLI */
4049 send_llc_ul_ui(nsi, "ATTACH REQUEST (local TLLI)", &bss_peer[0], 0x1002,
4050 local_tlli, &rai_bss, cell_id,
4051 GPRS_SAPI_GMM, bss_nu++,
4052 dtap_attach_req3, sizeof(dtap_attach_req3));
4053
4054 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4055
4056 dump_peers(stdout, 0, 0, &gbcfg);
4057
4058 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4059 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4060 OSMO_ASSERT(link_info);
4061 OSMO_ASSERT(link_info == link_info2);
4062 OSMO_ASSERT(link_info->imsi_len != 0);
4063 OSMO_ASSERT(!link_info->is_deregistered);
4064 OSMO_ASSERT(!link_info->imsi_acq_pending);
4065 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
4066
4067 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4068 local_tlli, 1, imsi, sizeof(imsi),
4069 GPRS_SAPI_GMM, sgsn_nu++,
4070 dtap_attach_acc, sizeof(dtap_attach_acc));
4071
4072 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4073
4074 dump_peers(stdout, 0, 0, &gbcfg);
4075
4076 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4077 local_tlli, &rai_bss, cell_id,
4078 GPRS_SAPI_GMM, bss_nu++,
4079 dtap_attach_complete, sizeof(dtap_attach_complete));
4080
4081 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4082
4083 dump_peers(stdout, 0, 0, &gbcfg);
4084
4085 /* Detach (MT) */
4086 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
4087 local_tlli, 1, imsi, sizeof(imsi),
4088 GPRS_SAPI_GMM, sgsn_nu++,
4089 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
4090
4091 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4092
4093 dump_peers(stdout, 0, 0, &gbcfg);
4094
4095 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4096 OSMO_ASSERT(link_info);
4097
4098 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4099 local_tlli, &rai_bss, cell_id,
4100 GPRS_SAPI_GMM, bss_nu++,
4101 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4102
4103 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4104 OSMO_ASSERT(!expect_msg());
4105
4106 dump_peers(stdout, 0, 0, &gbcfg);
4107
4108 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4109 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4110 OSMO_ASSERT(link_info);
4111 OSMO_ASSERT(link_info->is_deregistered);
4112
4113 /* Bad case: Unexpected Re-Attach with IMSI after completed attachment
4114 * procedure */
4115 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4116 foreign_tlli, &rai_bss, cell_id,
4117 GPRS_SAPI_GMM, bss_nu++,
4118 dtap_attach_req3, sizeof(dtap_attach_req3));
4119
4120 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4121
4122 dump_peers(stdout, 0, 0, &gbcfg);
4123
4124 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4125 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4126 OSMO_ASSERT(link_info);
4127 OSMO_ASSERT(link_info == link_info2);
4128 OSMO_ASSERT(link_info->imsi_len != 0);
4129 OSMO_ASSERT(!link_info->is_deregistered);
4130 OSMO_ASSERT(!link_info->imsi_acq_pending);
4131
4132 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4133 foreign_tlli, 1, imsi, sizeof(imsi),
4134 GPRS_SAPI_GMM, sgsn_nu++,
4135 dtap_attach_acc, sizeof(dtap_attach_acc));
4136
4137 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4138
4139 dump_peers(stdout, 0, 0, &gbcfg);
4140
4141 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4142 local_tlli, &rai_bss, cell_id,
4143 GPRS_SAPI_GMM, bss_nu++,
4144 dtap_attach_complete, sizeof(dtap_attach_complete));
4145
4146 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4147
4148 dump_peers(stdout, 0, 0, &gbcfg);
4149
4150 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4151 local_tlli, 1, imsi, sizeof(imsi),
4152 GPRS_SAPI_GMM, sgsn_nu++,
4153 dtap_gmm_information, sizeof(dtap_gmm_information));
4154
4155 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4156
4157 dump_peers(stdout, 0, 0, &gbcfg);
4158
4159 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected, IMSI)",
4160 &bss_peer[0], 0x1002,
4161 foreign_tlli, &rai_bss, cell_id,
4162 GPRS_SAPI_GMM, bss_nu++,
4163 dtap_attach_req4, sizeof(dtap_attach_req4));
4164
4165 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4166
4167 dump_peers(stdout, 0, 0, &gbcfg);
4168
4169 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4170 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004171 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004172 OSMO_ASSERT(link_info == link_info2);
4173 OSMO_ASSERT(link_info->imsi_len != 0);
4174 OSMO_ASSERT(!link_info->is_deregistered);
4175 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004176 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004177 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4178
4179 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4180 foreign_tlli, 1, imsi, sizeof(imsi),
4181 GPRS_SAPI_GMM, sgsn_nu++,
4182 dtap_attach_acc, sizeof(dtap_attach_acc));
4183
4184 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4185
4186 dump_peers(stdout, 0, 0, &gbcfg);
4187
4188 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4189 local_tlli, &rai_bss, cell_id,
4190 GPRS_SAPI_GMM, bss_nu++,
4191 dtap_attach_complete, sizeof(dtap_attach_complete));
4192
4193 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4194
4195 dump_peers(stdout, 0, 0, &gbcfg);
4196
4197 /* Detach (MT) */
4198 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4199 local_tlli, 1, imsi, sizeof(imsi),
4200 GPRS_SAPI_GMM, sgsn_nu++,
4201 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4202
4203 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4204
4205 dump_peers(stdout, 0, 0, &gbcfg);
4206
4207 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4208 OSMO_ASSERT(link_info);
4209
4210 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4211 local_tlli, &rai_bss, cell_id,
4212 GPRS_SAPI_GMM, bss_nu++,
4213 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4214
4215 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4216 OSMO_ASSERT(!expect_msg());
4217
4218 dump_peers(stdout, 0, 0, &gbcfg);
4219
4220 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4221 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4222 OSMO_ASSERT(link_info);
4223 OSMO_ASSERT(link_info->is_deregistered);
4224
4225 /* Bad case: Unexpected Re-Attach with P-TMSI after completed attachment
4226 * procedure */
4227 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4228 foreign_tlli, &rai_bss, cell_id,
4229 GPRS_SAPI_GMM, bss_nu++,
4230 dtap_attach_req3, sizeof(dtap_attach_req3));
4231
4232 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4233
4234 dump_peers(stdout, 0, 0, &gbcfg);
4235
4236 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4237 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4238 OSMO_ASSERT(link_info);
4239 OSMO_ASSERT(link_info == link_info2);
4240 OSMO_ASSERT(link_info->imsi_len != 0);
4241 OSMO_ASSERT(!link_info->is_deregistered);
4242 OSMO_ASSERT(!link_info->imsi_acq_pending);
4243
4244 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4245 foreign_tlli, 1, imsi, sizeof(imsi),
4246 GPRS_SAPI_GMM, sgsn_nu++,
4247 dtap_attach_acc, sizeof(dtap_attach_acc));
4248
4249 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4250
4251 dump_peers(stdout, 0, 0, &gbcfg);
4252
4253 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4254 local_tlli, &rai_bss, cell_id,
4255 GPRS_SAPI_GMM, bss_nu++,
4256 dtap_attach_complete, sizeof(dtap_attach_complete));
4257
4258 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4259
4260 dump_peers(stdout, 0, 0, &gbcfg);
4261
4262 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4263 local_tlli, 1, imsi, sizeof(imsi),
4264 GPRS_SAPI_GMM, sgsn_nu++,
4265 dtap_gmm_information, sizeof(dtap_gmm_information));
4266
4267 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4268
4269 dump_peers(stdout, 0, 0, &gbcfg);
4270
4271 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected)", &bss_peer[0], 0x1002,
4272 foreign_tlli, &rai_bss, cell_id,
4273 GPRS_SAPI_GMM, bss_nu++,
4274 dtap_attach_req3, sizeof(dtap_attach_req3));
4275
4276 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4277
4278 dump_peers(stdout, 0, 0, &gbcfg);
4279
4280 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4281 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004282 OSMO_ASSERT(link_info);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004283 OSMO_ASSERT(link_info == link_info2);
4284 OSMO_ASSERT(link_info->imsi_len != 0);
4285 OSMO_ASSERT(!link_info->is_deregistered);
4286 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck59ac49d2014-10-30 17:15:43 +01004287 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeck9d0fb1e2014-10-31 10:43:44 +01004288 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4289
4290 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4291 foreign_tlli, 1, imsi, sizeof(imsi),
4292 GPRS_SAPI_GMM, sgsn_nu++,
4293 dtap_attach_acc, sizeof(dtap_attach_acc));
4294
4295 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4296
4297 dump_peers(stdout, 0, 0, &gbcfg);
4298
4299 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4300 local_tlli, &rai_bss, cell_id,
4301 GPRS_SAPI_GMM, bss_nu++,
4302 dtap_attach_complete, sizeof(dtap_attach_complete));
4303
4304 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4305
4306 dump_peers(stdout, 0, 0, &gbcfg);
4307
4308 /* Detach (MT) */
4309 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4310 local_tlli, 1, imsi, sizeof(imsi),
4311 GPRS_SAPI_GMM, sgsn_nu++,
4312 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4313
4314 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4315
4316 dump_peers(stdout, 0, 0, &gbcfg);
4317
4318 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4319 OSMO_ASSERT(link_info);
4320
4321 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4322 local_tlli, &rai_bss, cell_id,
4323 GPRS_SAPI_GMM, bss_nu++,
4324 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4325
4326 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4327 OSMO_ASSERT(!expect_msg());
4328
4329 dump_peers(stdout, 0, 0, &gbcfg);
4330
4331 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4332 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4333 OSMO_ASSERT(link_info);
4334 OSMO_ASSERT(link_info->is_deregistered);
4335
4336
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004337 /* Attach rejected */
4338
4339 gbproxy_delete_link_infos(peer);
4340
4341 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4342 foreign_tlli, &rai_bss, cell_id,
4343 GPRS_SAPI_GMM, bss_nu++,
4344 dtap_attach_req, sizeof(dtap_attach_req));
4345
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004346 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4347
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004348 dump_peers(stdout, 0, 0, &gbcfg);
4349
4350 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4351 OSMO_ASSERT(link_info);
4352 OSMO_ASSERT(link_info->imsi_len == 0);
4353 OSMO_ASSERT(!link_info->is_deregistered);
4354 OSMO_ASSERT(link_info->imsi_acq_pending);
4355
4356 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4357 foreign_tlli, &rai_bss, cell_id,
4358 GPRS_SAPI_GMM, bss_nu++,
4359 dtap_identity_resp, sizeof(dtap_identity_resp));
4360
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004361 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4362
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004363 dump_peers(stdout, 0, 0, &gbcfg);
4364
4365 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4366 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4367 OSMO_ASSERT(link_info);
4368 OSMO_ASSERT(link_info == link_info2);
4369 OSMO_ASSERT(link_info->imsi_len != 0);
4370 OSMO_ASSERT(!link_info->is_deregistered);
4371 OSMO_ASSERT(!link_info->imsi_acq_pending);
4372
4373 send_llc_dl_ui(nsi, "ATTACH REJECT", &sgsn_peer, 0x1002,
4374 foreign_tlli, 1, imsi, sizeof(imsi),
4375 GPRS_SAPI_GMM, sgsn_nu++,
4376 dtap_attach_rej7, sizeof(dtap_attach_rej7));
4377
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004378 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
4379
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004380 dump_peers(stdout, 0, 0, &gbcfg);
4381
Jacob Erlbeck9c65c812014-09-22 10:42:05 +02004382 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4383
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004384 OSMO_ASSERT(!expect_msg());
4385
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004386 /* Attach (incomplete) and Detach (MO) */
4387
4388 gbproxy_delete_link_infos(peer);
4389
4390 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4391 foreign_tlli, &rai_bss, cell_id,
4392 GPRS_SAPI_GMM, bss_nu++,
4393 dtap_attach_req, sizeof(dtap_attach_req));
4394
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004395 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4396
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004397 dump_peers(stdout, 0, 0, &gbcfg);
4398
4399 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4400 OSMO_ASSERT(link_info);
4401 OSMO_ASSERT(link_info->imsi_len == 0);
4402 OSMO_ASSERT(!link_info->is_deregistered);
4403 OSMO_ASSERT(link_info->imsi_acq_pending);
4404
4405 send_llc_ul_ui(nsi, "DETACH REQ (MO)", &bss_peer[0], 0x1002,
4406 foreign_tlli, &rai_bss, cell_id,
4407 GPRS_SAPI_GMM, bss_nu++,
4408 dtap_detach_req, sizeof(dtap_detach_req));
4409
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004410 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4411
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004412 dump_peers(stdout, 0, 0, &gbcfg);
4413
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004414 OSMO_ASSERT(!expect_msg());
4415
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004416 /* Attach (incomplete) and Detach (MT) */
4417
4418 gbproxy_delete_link_infos(peer);
4419
4420 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4421 foreign_tlli, &rai_bss, cell_id,
4422 GPRS_SAPI_GMM, bss_nu++,
4423 dtap_attach_req, sizeof(dtap_attach_req));
4424
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004425 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4426
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004427 dump_peers(stdout, 0, 0, &gbcfg);
4428
4429 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4430 OSMO_ASSERT(link_info);
4431 OSMO_ASSERT(link_info->imsi_len == 0);
4432 OSMO_ASSERT(!link_info->is_deregistered);
4433 OSMO_ASSERT(link_info->imsi_acq_pending);
4434
4435 send_llc_dl_ui(nsi, "DETACH REQ (MT)", &sgsn_peer, 0x1002,
4436 foreign_tlli, 1, imsi, sizeof(imsi),
4437 GPRS_SAPI_GMM, sgsn_nu++,
4438 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4439
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004440 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4441
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004442 dump_peers(stdout, 0, 0, &gbcfg);
4443
4444 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4445 OSMO_ASSERT(link_info);
4446
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004447 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004448 foreign_tlli, &rai_bss, cell_id,
4449 GPRS_SAPI_GMM, bss_nu++,
4450 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4451
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004452 /* TODO: The stored messaged should be cleaned when receiving a Detach
4453 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
4454 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4455 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4456
Jacob Erlbeck2bf32612014-09-22 11:26:58 +02004457 dump_peers(stdout, 0, 0, &gbcfg);
4458
4459 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4460 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4461 OSMO_ASSERT(link_info);
4462 OSMO_ASSERT(link_info->is_deregistered);
4463
Jacob Erlbeckfb83ed32014-09-22 19:16:06 +02004464 OSMO_ASSERT(!expect_msg());
4465 received_messages = NULL;
4466
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004467 dump_global(stdout, 0);
4468
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004469 talloc_free(gbcfg.core_apn);
4470 gbcfg.core_apn = NULL;
4471
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004472 gbprox_reset(&gbcfg);
4473 gprs_ns_destroy(nsi);
4474 nsi = NULL;
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004475
4476 cleanup_test();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02004477}
4478
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004479struct gbproxy_link_info *register_tlli(
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004480 struct gbproxy_peer *peer, uint32_t tlli,
4481 const uint8_t *imsi, size_t imsi_len, time_t now)
4482{
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004483 struct gbproxy_link_info *link_info;
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004484 int imsi_matches = -1;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004485 int tlli_already_known = 0;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004486 struct gbproxy_config *cfg = peer->cfg;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004487
4488 /* Check, whether the IMSI matches */
4489 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004490 imsi_matches = gbproxy_check_imsi(
4491 &cfg->matches[GBPROX_MATCH_PATCHING], imsi, imsi_len);
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004492 if (imsi_matches < 0)
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004493 return NULL;
4494 }
4495
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004496 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004497
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004498 if (!link_info) {
4499 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004500
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004501 if (link_info) {
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004502 /* TLLI has changed somehow, adjust it */
4503 LOGP(DGPRS, LOGL_INFO,
4504 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004505 link_info->tlli.current, tlli);
4506 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004507 }
4508 }
4509
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004510 if (!link_info) {
4511 link_info = gbproxy_link_info_alloc(peer);
4512 link_info->tlli.current = tlli;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004513 } else {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004514 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004515 tlli_already_known = 1;
4516 }
4517
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004518 OSMO_ASSERT(link_info != NULL);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004519
4520 if (!tlli_already_known)
4521 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
4522
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004523 gbproxy_attach_link_info(peer, now, link_info);
4524 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004525
Jacob Erlbeck8992f302014-09-19 13:17:55 +02004526 if (imsi_matches >= 0)
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004527 link_info->is_matching[GBPROX_MATCH_PATCHING] = imsi_matches;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004528
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004529 return link_info;
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004530}
4531
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004532static void test_gbproxy_tlli_expire(void)
4533{
4534 struct gbproxy_config cfg = {0};
4535 struct gbproxy_peer *peer;
4536 const char *err_msg = NULL;
Neels Hofmeyr7369d442020-05-29 17:05:40 +02004537 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0xf6 };
4538 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0xf9 };
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004539 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004540 const uint32_t tlli1 = 1234 | 0xc0000000;
4541 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004542 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004543 const char *filter_re = ".*";
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004544 time_t now = 1407479214;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004545
4546 printf("Test TLLI info expiry\n\n");
4547
4548 gbproxy_init_config(&cfg);
4549
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004550 if (gbproxy_set_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING],
4551 filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004552 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
4553 err_msg);
4554 OSMO_ASSERT(err_msg == NULL);
4555 }
4556
4557 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004558 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004559
4560 printf("Test TLLI replacement:\n");
4561
4562 cfg.tlli_max_len = 0;
4563 cfg.tlli_max_age = 0;
4564 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004565 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004566
4567 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004568 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004569 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004570 OSMO_ASSERT(link_info);
4571 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004572 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004573
4574 /* replace the old entry */
4575 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004576 link_info = register_tlli(peer, tlli2,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004577 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004578 OSMO_ASSERT(link_info);
4579 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004580 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004581
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004582 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004583
4584 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004585 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4586 OSMO_ASSERT(link_info);
4587 OSMO_ASSERT(link_info->tlli.current == tlli2);
4588 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4589 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004590
4591 printf("\n");
4592
4593 gbproxy_peer_free(peer);
4594 }
4595
4596 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004597 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004598
4599 printf("Test IMSI replacement:\n");
4600
4601 cfg.tlli_max_len = 0;
4602 cfg.tlli_max_age = 0;
4603 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004604 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004605
4606 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004607 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004608 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004609 OSMO_ASSERT(link_info);
4610 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004611 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004612
4613 /* try to replace the old entry */
4614 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004615 link_info = register_tlli(peer, tlli1,
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004616 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004617 OSMO_ASSERT(link_info);
4618 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004619 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004620
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004621 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004622
4623 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004624 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4625 OSMO_ASSERT(!link_info);
4626 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4627 OSMO_ASSERT(link_info);
4628 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004629
4630 printf("\n");
4631
4632 gbproxy_peer_free(peer);
4633 }
4634
4635 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004636 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004637 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004638
4639 printf("Test TLLI expiry, max_len == 1:\n");
4640
4641 cfg.tlli_max_len = 1;
4642 cfg.tlli_max_age = 0;
4643 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004644 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004645
4646 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004647 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004648 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004649
4650 /* replace the old entry */
4651 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004652 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004653 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004654
Jacob Erlbeck51fde082014-09-19 16:40:21 +02004655 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004656 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004657 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004658
Jacob Erlbeck7b821d02014-08-08 08:37:37 +02004659 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004660
4661 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004662 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4663 OSMO_ASSERT(!link_info);
4664 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4665 OSMO_ASSERT(link_info);
4666 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004667
4668 printf("\n");
4669
4670 gbproxy_peer_free(peer);
4671 }
4672
4673 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004674 struct gbproxy_link_info *link_info;
Jacob Erlbeckaad32bc2014-08-07 17:23:00 +02004675 int num_removed;
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004676
4677 printf("Test TLLI expiry, max_age == 1:\n");
4678
4679 cfg.tlli_max_len = 0;
4680 cfg.tlli_max_age = 1;
4681 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004682 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004683
4684 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004685 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004686 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004687
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004688 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004689 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004690 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004691 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004692
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004693 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004694 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004695 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004696
4697 dump_peers(stdout, 2, now + 2, &cfg);
4698
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004699 /* verify that 5678 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004700 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4701 OSMO_ASSERT(!link_info);
4702 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4703 OSMO_ASSERT(link_info);
4704 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004705
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004706 printf("\n");
4707
4708 gbproxy_peer_free(peer);
4709 }
4710
4711 {
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004712 struct gbproxy_link_info *link_info;
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004713 int num_removed;
4714
4715 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
4716
4717 cfg.tlli_max_len = 0;
4718 cfg.tlli_max_age = 1;
4719 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004720 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004721
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004722 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004723 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004724 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004725
4726 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004727 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004728 now + 1);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004729 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004730
4731 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbecka42fe9f2014-09-12 14:15:02 +02004732 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeck9114bee2014-08-19 12:21:01 +02004733 now + 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004734 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004735
4736 dump_peers(stdout, 2, now + 2, &cfg);
4737
4738 printf(" Remove stale TLLIs\n");
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004739 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004740 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeckf8562e32014-09-19 16:03:07 +02004741 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeckf4946202014-08-08 09:33:06 +02004742
4743 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004744
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004745 /* verify that tlli3 has survived */
Jacob Erlbeck91d2f8a2014-09-19 15:07:27 +02004746 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4747 OSMO_ASSERT(!link_info);
4748 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4749 OSMO_ASSERT(!link_info);
4750 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
4751 OSMO_ASSERT(link_info);
4752 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck9057bc32014-08-12 16:30:30 +02004753
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004754 printf("\n");
4755
4756 gbproxy_peer_free(peer);
4757 }
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004758 gbproxy_clear_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING]);
4759 gbprox_reset(&cfg);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004760 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
4761 rate_ctr_group_free(cfg.ctrg);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004762
4763 cleanup_test();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02004764}
4765
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004766static void test_gbproxy_imsi_matching(void)
4767{
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004768 const char *err_msg = NULL;
4769 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4770 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4771 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4772 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4773 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4774 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4775 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4776 const char *filter_re1 = ".*";
4777 const char *filter_re2 = "^1234";
4778 const char *filter_re3 = "^4321";
4779 const char *filter_re4_bad = "^12[";
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004780 struct gbproxy_match match = {0,};
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004781
4782 printf("=== Test IMSI/TMSI matching ===\n\n");
4783
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004784 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004785
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004786 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re1, &err_msg) == 0);
4787 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004788
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004789 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4790 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004791
4792 err_msg = NULL;
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004793 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004794 OSMO_ASSERT(err_msg != NULL);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004795 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004796
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004797 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4798 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004799
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004800 OSMO_ASSERT(gbproxy_set_patch_filter(&match, NULL, &err_msg) == 0);
4801 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004802
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004803 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4804 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004805
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004806 gbproxy_clear_patch_filter(&match);
4807 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck29805da2014-08-14 08:57:04 +02004808
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004809 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4810 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004811
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004812 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 1);
4813 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 1);
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +02004814 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == -1);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004815 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4816 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4817 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4818 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004819
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004820 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re3, &err_msg) == 0);
4821 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004822
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004823 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 0);
4824 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 0);
Neels Hofmeyrb26a5a82020-05-29 16:53:23 +02004825 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == -1);
Jacob Erlbeck9a83d7a2014-09-25 11:17:31 +02004826 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4827 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4828 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4829 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004830
4831 /* TODO: Check correct length but wrong type with is_mi_tmsi */
Jacob Erlbeck9ccc41e2014-09-25 11:21:34 +02004832
4833 gbproxy_clear_patch_filter(&match);
4834 OSMO_ASSERT(match.enable == 0);
Daniel Willmannd1554ec2015-10-12 19:36:34 +02004835
4836 cleanup_test();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02004837}
4838
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004839static void test_gbproxy_stored_messages()
4840{
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004841 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004842 struct sockaddr_in bss_peer[1] = {{0},};
4843 struct sockaddr_in sgsn_peer= {0};
4844 struct gprs_ra_id rai_bss =
4845 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
4846 struct gprs_ra_id rai_unknown =
4847 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
4848 uint16_t cell_id = 0x1234;
4849
4850 const uint32_t ptmsi = 0xefe2b700;
4851 const uint32_t local_tlli = 0xefe2b700;
4852
4853 const uint32_t foreign_tlli1 = 0x8000dead;
4854
4855 struct gbproxy_peer *peer;
4856 unsigned bss_nu = 0;
4857 unsigned sgsn_nu = 0;
4858
4859 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
4860
4861 bssgp_nsi = nsi;
4862 gbcfg.nsi = bssgp_nsi;
4863 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr10719b72018-02-21 00:39:36 +01004864 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01004865 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004866 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
4867 gbcfg.patch_ptmsi = 0;
4868 gbcfg.acquire_imsi = 1;
4869 gbcfg.keep_link_infos = 0;
4870
4871 configure_sgsn_peer(&sgsn_peer);
4872 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
4873
4874 printf("=== %s ===\n", __func__);
4875 printf("--- Initialise SGSN ---\n\n");
4876
4877 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
4878
4879 printf("--- Initialise BSS 1 ---\n\n");
4880
4881 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
4882 setup_bssgp(nsi, &bss_peer[0], 0x1002);
4883
4884 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
4885 OSMO_ASSERT(peer != NULL);
4886
4887 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
4888
4889 gprs_dump_nsi(nsi);
4890 dump_global(stdout, 0);
4891 dump_peers(stdout, 0, 0, &gbcfg);
4892
4893 printf("--- Establish first LLC connection ---\n\n");
4894
4895 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4896 foreign_tlli1, &rai_unknown, cell_id,
4897 GPRS_SAPI_GMM, bss_nu++,
4898 dtap_attach_req, sizeof(dtap_attach_req));
4899
4900 dump_peers(stdout, 0, 0, &gbcfg);
4901
4902 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
4903 foreign_tlli1, 0, NULL, 0,
4904 GPRS_SAPI_GMM, sgsn_nu++,
4905 dtap_identity_req, sizeof(dtap_identity_req));
4906
4907 dump_peers(stdout, 0, 0, &gbcfg);
4908
4909 send_llc_ul_ui(nsi, "DETACH ACCEPT", &bss_peer[0], 0x1002,
4910 foreign_tlli1, &rai_bss, cell_id,
4911 GPRS_SAPI_GMM, bss_nu++,
4912 dtap_detach_acc, sizeof(dtap_detach_acc));
4913
4914 dump_peers(stdout, 0, 0, &gbcfg);
4915
4916 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4917 foreign_tlli1, &rai_bss, cell_id,
4918 GPRS_SAPI_GMM, bss_nu++,
4919 dtap_identity_resp, sizeof(dtap_identity_resp));
4920
4921 dump_peers(stdout, 0, 0, &gbcfg);
4922
4923 dump_global(stdout, 0);
4924
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02004925 talloc_free(gbcfg.core_apn);
4926 gbcfg.core_apn = NULL;
4927
Daniel Willmannbb42eee2016-11-08 15:29:30 +01004928 gbprox_reset(&gbcfg);
4929 gprs_ns_destroy(nsi);
4930 nsi = NULL;
4931
4932 cleanup_test();
4933}
4934
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004935/* See OS#3178 "gbproxy: failed to parse invalid BSSGP-UNITDATA message" */
4936static void test_gbproxy_parse_bssgp_unitdata()
4937{
4938 const char *hex = "0000239401e155cfea000004088872f4801018009c4000800e000601c0416c4338";
4939 struct msgb *msg = msgb_alloc(1034, "bssgp_unitdata");
4940 struct gprs_gb_parse_context parse_ctx;
4941 int rc;
4942
4943 memset(&parse_ctx, 0, sizeof(parse_ctx));
4944
4945 OSMO_ASSERT(msg);
4946 msgb_bssgph(msg) = msg->head;
4947 msgb_put(msg, osmo_hexparse(hex, msg->head, msgb_tailroom(msg)));
4948
4949 parse_ctx.to_bss = 0;
4950 parse_ctx.peer_nsei = msgb_nsei(msg);
4951
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02004952 rc = gprs_gb_parse_bssgp(msg->data, msg->len, &parse_ctx);
Stefan Sperling322643f2018-06-23 16:50:06 +02004953 if (!rc)
4954 fprintf(stderr, "%s: Test passed; Failed to parse invalid message %s\n", __func__, msgb_hexdump(msg));
4955 else
4956 fprintf(stderr, "%s: Test failed; invalid message was accepted by parser: %s\n", __func__, msgb_hexdump(msg));
4957
4958 OSMO_ASSERT(!rc);
4959
4960 /* Manually decoded message according to:
4961 ETSI TS 148 018 V10.6.0 (2012 07) 96
4962 3GPP TS 48.018 version 10.6.0 Release 10
4963 Table 10.2.2: UL-UNITDATA PDU content
4964
4965 00 - PDU type UL-UNITDATA (ok)
4966
4967 11.3.35 Temporary logical link Identity (TLLI)
4968 00 - TLLI[0]
4969 23 - TLLI[1]
4970 94 - TLLI[2]
4971 01 - TLLI[3]
4972 TLLI == "00239401"
4973
4974 e1 - QOS[0] (bit rate MSB)
4975 55 - QOS[1] (bit rate LSB)
4976 bit rate = "57685" (57685*100000 bit/s per PBRG)
4977 cf - QOS[2] PBRG = 11 (bit rate is expressed in 100000 bit/s increments),
4978 C/R 0 (contains LLC ACK/SACK),
4979 T 0 (contains signalling),
4980 A 1 (radio if uses MAC/UNITDATA,
4981 Precedence 111 (reserved value)
4982
4983 ea - CELL_ID[0] (TLV IEI: wrong, should be 0x08)
4984 00 - CELL_ID[1] (length 1)
4985 00 - CELL_ID[2] (length 2)
4986 lenth == 0
4987 04 -- CELL_ID[3]
4988 08 -- CELL_ID[4]
4989 88 -- CELL_ID[5]
4990 72 -- CELL_ID[6]
4991 f4 -- CELL_ID[7]
4992 80 -- CELL_ID[8]
4993 10 -- CELL_DI[9]
4994
4995 18 -- QOSP[0] OoS Profile IEI
4996 not allowed in BSSGP Userdata
4997 00 -- QOSP[1]
4998 9c -- QOSP[2]
4999 40 -- QOSP[3]
5000 00 -- QOSP[4]
5001
5002 80 -- IEI for "E-UTRAN Inter RAT Handover Info"
5003 not allowed in BSSGP Userdata
5004 0e -- length (14 bytes -- only 8 bytes remain)
5005 00 06 01 c0 41 6c 43 38 */
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02005006
5007 msgb_free(msg);
Stefan Sperling322643f2018-06-23 16:50:06 +02005008
5009 cleanup_test();
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02005010}
5011
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02005012static struct log_info_cat gprs_categories[] = {
5013 [DGPRS] = {
5014 .name = "DGPRS",
5015 .description = "GPRS Packet Service",
5016 .enabled = 1, .loglevel = LOGL_DEBUG,
5017 },
5018 [DNS] = {
5019 .name = "DNS",
5020 .description = "GPRS Network Service (NS)",
5021 .enabled = 1, .loglevel = LOGL_INFO,
5022 },
5023 [DBSSGP] = {
5024 .name = "DBSSGP",
5025 .description = "GPRS BSS Gateway Protocol (BSSGP)",
5026 .enabled = 1, .loglevel = LOGL_DEBUG,
5027 },
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02005028};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02005029
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02005030static struct log_info info = {
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02005031 .cat = gprs_categories,
5032 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther2840b3f2014-07-07 19:48:14 +02005033};
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02005034
5035int main(int argc, char **argv)
5036{
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02005037 talloc_enable_leak_report();
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01005038 tall_sgsn_ctx = talloc_named_const(NULL, 0, "gbproxy_test");
5039 void *log_ctx = talloc_named_const(tall_sgsn_ctx, 0, "log");
Neels Hofmeyr4c2d4ab2016-09-16 02:31:17 +02005040
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01005041 msgb_talloc_ctx_init(tall_sgsn_ctx, 0);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02005042
5043 osmo_init_logging2(log_ctx, &info);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02005044 log_set_use_color(osmo_stderr_target, 0);
5045 log_set_print_filename(osmo_stderr_target, 0);
Holger Hans Peter Freythereece6272014-08-04 15:42:36 +02005046 osmo_signal_register_handler(SS_L_NS, &test_signal, &gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02005047
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02005048 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeck627e7d92014-07-03 13:28:13 +02005049 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
5050 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02005051
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01005052 rate_ctr_init(tall_sgsn_ctx);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02005053
5054 setlinebuf(stdout);
5055
5056 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther18739ea2014-08-04 11:10:09 +02005057 gbproxy_init_config(&gbcfg);
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02005058 test_gbproxy();
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02005059 test_gbproxy_ident_changes();
Jacob Erlbeck291f0502014-08-07 10:46:29 +02005060 test_gbproxy_imsi_matching();
Jacob Erlbeck04f679b2014-09-18 09:21:20 +02005061 test_gbproxy_ptmsi_assignment();
Jacob Erlbeck7fb42db2014-07-07 10:46:01 +02005062 test_gbproxy_ra_patching();
Jacob Erlbeck6bd7ded2014-08-15 17:20:06 +02005063 test_gbproxy_ptmsi_patching();
Jacob Erlbecke99c3332014-10-20 16:25:01 +02005064 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeck28fe9882014-08-26 13:33:36 +02005065 test_gbproxy_imsi_acquisition();
Jacob Erlbeckf181f9e2014-08-27 12:44:25 +02005066 test_gbproxy_secondary_sgsn();
Jacob Erlbeck772a22b2014-09-15 14:18:09 +02005067 test_gbproxy_keep_info();
Holger Hans Peter Freyther0196c992014-08-04 17:10:08 +02005068 test_gbproxy_tlli_expire();
Daniel Willmannbb42eee2016-11-08 15:29:30 +01005069 test_gbproxy_stored_messages();
Stefan Sperlingaaa3e2b2018-06-07 19:12:25 +02005070 test_gbproxy_parse_bssgp_unitdata();
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02005071 gbprox_reset(&gbcfg);
5072 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
5073 rate_ctr_group_free(gbcfg.ctrg);
Jacob Erlbeck72b401f2013-10-24 12:48:55 +02005074 printf("===== GbProxy test END\n\n");
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02005075
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02005076 talloc_free(log_ctx);
5077 /* expecting root and msgb ctx, empty */
Pau Espin Pedrolb1d1c242018-10-30 17:27:59 +01005078 OSMO_ASSERT(talloc_total_blocks(tall_sgsn_ctx) == 2);
5079 talloc_free(tall_sgsn_ctx);
Neels Hofmeyr5bd340e2018-04-16 00:57:10 +02005080
5081 return 0;
Jacob Erlbeck51a869c2013-10-15 12:00:26 +02005082}