blob: f5c730db9c02d076c3fa10d1bb1e626a6bdc0431 [file] [log] [blame]
Jacob Erlbeck76fa57a2013-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 Freytherf28f8f52014-08-04 11:26:54 +020016#include <time.h>
Jacob Erlbeck76fa57a2013-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 Erlbeck077abce2014-07-01 12:41:13 +020027#include <osmocom/gsm/tlv.h>
Jacob Erlbeck31132872014-08-11 17:26:21 +020028#include <osmocom/gsm/gsm_utils.h>
Harald Welte35ade5e2016-04-20 17:11:43 +020029#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
Jacob Erlbeck76fa57a2013-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 Hofmeyr4b4c5862017-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 Erlbeck76fa57a2013-10-15 12:00:26 +020039
40#define REMOTE_BSS_ADDR 0x01020304
41#define REMOTE_SGSN_ADDR 0x05060708
42
Jacob Erlbeck45017722013-10-18 13:04:47 +020043#define SGSN_NSEI 0x0100
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +020044
Jacob Erlbeck12356062014-08-27 12:44:25 +020045#define REMOTE_SGSN2_ADDR 0x15161718
46#define SGSN2_NSEI 0x0102
47
Jacob Erlbecka4b5e892014-09-22 18:54:34 +020048#define MATCH_ANY (-1)
49
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +010050void *tall_sgsn_ctx = NULL;
Neels Hofmeyr62507c52017-07-13 02:03:50 +020051
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +020052struct gbproxy_config gbcfg = {0};
53
Jacob Erlbecka4b5e892014-09-22 18:54:34 +020054struct llist_head *received_messages = NULL;
55
Maxca7be8a2017-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 Willmann2b10af32015-10-12 19:36:35 +020061
Maxca7be8a2017-11-01 13:28:38 +010062int __wrap_osmo_get_rand_id(uint8_t *buf, size_t num)
Daniel Willmann2b10af32015-10-12 19:36:35 +020063{
Maxca7be8a2017-11-01 13:28:38 +010064 return (*osmo_get_rand_id_cb)(buf, num);
Daniel Willmann2b10af32015-10-12 19:36:35 +020065}
66
67static int rand_seq_num = 0;
Maxca7be8a2017-11-01 13:28:38 +010068int mock_osmo_get_rand_id(uint8_t *buf, size_t num)
Daniel Willmann2b10af32015-10-12 19:36:35 +020069{
70 uint32_t val;
71
72 OSMO_ASSERT(num == sizeof(val));
Daniel Willmann2b10af32015-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 Willmann1e0b0002015-10-12 19:36:34 +020083static void cleanup_test()
84{
Daniel Willmann2b10af32015-10-12 19:36:35 +020085 rand_seq_num = 0;
Daniel Willmann1e0b0002015-10-12 19:36:34 +020086}
87
Holger Hans Peter Freytherf28f8f52014-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 Erlbeckc404c082014-08-08 08:37:37 +0200116static int dump_peers(FILE *stream, int indent, time_t now,
117 struct gbproxy_config *cfg)
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +0200118{
Holger Hans Peter Freytherd64bf222014-08-04 11:35:32 +0200119 struct gbproxy_peer *peer;
Holger Hans Peter Freytherf28f8f52014-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 Freytherf28f8f52014-08-04 11:26:54 +0200124
125 rc = fprintf(stream, "%*sPeers:\n", indent, "");
126 if (rc < 0)
127 return rc;
128
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +0200129 llist_for_each_entry(peer, &cfg->bts_peers, list) {
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200130 struct gbproxy_link_info *link_info;
Holger Hans Peter Freytherd64bf222014-08-04 11:35:32 +0200131 struct gbproxy_patch_state *state = &peer->patch_state;
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +0200132 gsm48_parse_ra(&raid, peer->ra);
133
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +0100134 rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, RAI %s\n",
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +0200135 indent, "",
136 peer->nsei, peer->bvci,
137 peer->blocked ? "" : "not ",
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +0100138 osmo_rai_name(&raid));
Holger Hans Peter Freytherf28f8f52014-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 Erlbeck485e28c2014-09-19 16:03:07 +0200159 indent, "", state->logical_link_count);
160 llist_for_each_entry(link_info, &state->logical_links, list) {
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +0200161 char mi_buf[200];
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200162 time_t age = now ? now - link_info->timestamp : 0;
Jacob Erlbeck0c0747f2014-09-02 14:40:11 +0200163 int stored_msgs = 0;
164 struct llist_head *iter;
Jacob Erlbeckf4290b02014-09-25 11:17:31 +0200165 enum gbproxy_match_id match_id;
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200166 llist_for_each(iter, &link_info->stored_msgs)
Jacob Erlbeck0c0747f2014-09-02 14:40:11 +0200167 stored_msgs++;
168
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200169 if (link_info->imsi_len > 0) {
Jacob Erlbeck9ac42ba2014-08-06 18:55:15 +0200170 snprintf(mi_buf, sizeof(mi_buf), "(invalid)");
171 gsm48_mi_to_string(mi_buf, sizeof(mi_buf),
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200172 link_info->imsi,
173 link_info->imsi_len);
Jacob Erlbeck9ac42ba2014-08-06 18:55:15 +0200174 } else {
175 snprintf(mi_buf, sizeof(mi_buf), "(none)");
176 }
Jacob Erlbeck31132872014-08-11 17:26:21 +0200177 fprintf(stream, "%*s TLLI %08x",
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200178 indent, "", link_info->tlli.current);
179 if (link_info->tlli.assigned)
180 fprintf(stream, "/%08x", link_info->tlli.assigned);
181 if (link_info->sgsn_tlli.current) {
Jacob Erlbeck383c8412014-08-12 16:30:30 +0200182 fprintf(stream, " -> %08x",
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200183 link_info->sgsn_tlli.current);
184 if (link_info->sgsn_tlli.assigned)
Jacob Erlbeck383c8412014-08-12 16:30:30 +0200185 fprintf(stream, "/%08x",
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200186 link_info->sgsn_tlli.assigned);
Jacob Erlbeck383c8412014-08-12 16:30:30 +0200187 }
Jacob Erlbeck4c0f6982014-08-22 17:10:01 +0200188 fprintf(stream, ", IMSI %s, AGE %d",
189 mi_buf, (int)age);
190
Jacob Erlbeck0c0747f2014-09-02 14:40:11 +0200191 if (stored_msgs)
192 fprintf(stream, ", STORED %d", stored_msgs);
193
Jacob Erlbeckf4290b02014-09-25 11:17:31 +0200194 for (match_id = 0; match_id < ARRAY_SIZE(cfg->matches);
195 ++match_id) {
196 if (cfg->matches[match_id].enable &&
197 link_info->is_matching[match_id]) {
198 fprintf(stream, ", IMSI matches");
199 break;
200 }
201 }
Jacob Erlbeck12356062014-08-27 12:44:25 +0200202
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200203 if (link_info->imsi_acq_pending)
Jacob Erlbeck4c0f6982014-08-22 17:10:01 +0200204 fprintf(stream, ", IMSI acquisition in progress");
205
Jacob Erlbeckd918f522014-09-17 10:56:38 +0200206 if (cfg->route_to_sgsn2)
207 fprintf(stream, ", SGSN NSEI %d",
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200208 link_info->sgsn_nsei);
Jacob Erlbeckd918f522014-09-17 10:56:38 +0200209
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +0200210 if (link_info->is_deregistered)
Jacob Erlbeckf9038d92014-09-12 15:09:56 +0200211 fprintf(stream, ", DE-REGISTERED");
212
Jacob Erlbeck4c0f6982014-08-22 17:10:01 +0200213 rc = fprintf(stream, "\n");
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +0200214 if (rc < 0)
215 return rc;
216 }
217 }
218
219 return 0;
220}
221
Jacob Erlbeckdab8a6d2014-09-04 11:08:50 +0200222const uint8_t *convert_ra(struct gprs_ra_id *raid)
223{
Max9f13b142018-01-08 14:43:53 +0100224 static struct gsm48_ra_id r;
225 gsm48_encode_ra(&r, raid);
226 return (const uint8_t *)&r;
Jacob Erlbeckdab8a6d2014-09-04 11:08:50 +0200227}
228
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200229/* DTAP - Attach Request */
230static const unsigned char dtap_attach_req[] = {
231 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
232 0x05, 0xf4, 0xfb, 0xc5, 0x46, 0x79, 0x11, 0x22,
233 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
234 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
235 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
236 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200237};
238
Jacob Erlbeck89aa65b2014-09-12 10:33:38 +0200239/* DTAP - Attach Request (invalid RAI) */
240static const unsigned char dtap_attach_req2[] = {
241 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
242 0x05, 0xf4, 0xfb, 0x00, 0xbe, 0xef, 0x99, 0x99,
243 0x99, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
244 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
245 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
246 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
247};
248
Jacob Erlbeck2c74e442014-09-15 14:18:09 +0200249/* DTAP - Attach Request (P-TMSI 0x3f32b700) */
250static const unsigned char dtap_attach_req3[] = {
251 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
252 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x11, 0x22,
253 0x33, 0x40, 0x50, 0x60, 0x19, 0x18, 0xb3, 0x43,
254 0x2b, 0x25, 0x96, 0x62, 0x00, 0x60, 0x80, 0x9a,
255 0xc2, 0xc6, 0x62, 0x00, 0x60, 0x80, 0xba, 0xc8,
256 0xc6, 0x62, 0x00, 0x60, 0x80, 0x00,
257};
258
Jacob Erlbeckb0f61292014-10-31 10:43:44 +0100259/* DTAP - Attach Request (IMSI 12131415161718) */
260static const unsigned char dtap_attach_req4[] = {
261 0x08, 0x01, 0x02, 0xf5, 0xe0, 0x21, 0x08, 0x02,
262 0x08, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
263 0x18, 0x11, 0x22, 0x33, 0x40, 0x50, 0x60, 0x19,
264 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96, 0x62, 0x00,
265 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62, 0x00, 0x60,
266 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00, 0x60, 0x80,
267 0x00,
268};
269
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200270/* DTAP - Identity Request */
271static const unsigned char dtap_identity_req[] = {
272 0x08, 0x15, 0x01
Jacob Erlbeckdc6dcdf2014-08-06 15:16:45 +0200273};
274
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200275/* DTAP - Identity Response */
276static const unsigned char dtap_identity_resp[] = {
277 0x08, 0x16, 0x08, 0x11, 0x12, 0x13, 0x14, 0x15,
278 0x16, 0x17, 0x18
Jacob Erlbeckdc6dcdf2014-08-06 15:16:45 +0200279};
280
Jacob Erlbeck12356062014-08-27 12:44:25 +0200281/* DTAP - Identity Response, IMSI 2 */
282static const unsigned char dtap_identity2_resp[] = {
283 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
284 0x16, 0x17, 0x18
285};
286
Jacob Erlbeckd1056b32014-09-17 12:09:25 +0200287/* DTAP - Identity Response, IMSI 3 */
288static const unsigned char dtap_identity3_resp[] = {
289 0x08, 0x16, 0x08, 0x11, 0x12, 0x99, 0x99, 0x99,
290 0x26, 0x27, 0x28
291};
292
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200293/* DTAP - Attach Accept */
294static const unsigned char dtap_attach_acc[] = {
295 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
296 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
297 0x16, 0x18, 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200298};
299
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +0200300/* DTAP - Attach Accept, P-TMSI 2 */
Jacob Erlbeck12356062014-08-27 12:44:25 +0200301static const unsigned char dtap_attach_acc2[] = {
302 0x08, 0x02, 0x01, 0x49, 0x04, 0x21, 0x63, 0x54,
303 0x40, 0x50, 0x60, 0x19, 0xcd, 0xd7, 0x08, 0x17,
304 0x16, 0x18, 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54
305};
306
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200307/* DTAP - Attach Complete */
308static const unsigned char dtap_attach_complete[] = {
309 0x08, 0x03
Jacob Erlbeck31132872014-08-11 17:26:21 +0200310};
311
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +0200312/* DTAP - Attach Reject (GPRS services not allowed) */
313static const unsigned char dtap_attach_rej7[] = {
314 0x08, 0x04, 0x07
315};
316
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200317/* DTAP - GMM Information */
318static const unsigned char dtap_gmm_information[] = {
319 0x08, 0x21
Jacob Erlbeckab7366f2014-06-06 18:47:36 +0200320};
321
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200322/* DTAP - Routing Area Update Request */
323static const unsigned char dtap_ra_upd_req[] = {
324 0x08, 0x08, 0x10, 0x11, 0x22, 0x33, 0x40, 0x50,
325 0x60, 0x1d, 0x19, 0x13, 0x42, 0x33, 0x57, 0x2b,
326 0xf7, 0xc8, 0x48, 0x02, 0x13, 0x48, 0x50, 0xc8,
327 0x48, 0x02, 0x14, 0x48, 0x50, 0xc8, 0x48, 0x02,
328 0x17, 0x49, 0x10, 0xc8, 0x48, 0x02, 0x00, 0x19,
329 0x8b, 0xb2, 0x92, 0x17, 0x16, 0x27, 0x07, 0x04,
330 0x31, 0x02, 0xe5, 0xe0, 0x32, 0x02, 0x20, 0x00
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200331};
332
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200333/* DTAP - Routing Area Update Accept */
334static const unsigned char dtap_ra_upd_acc[] = {
335 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
336 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
337 0x05, 0xf4, 0xef, 0xe2, 0xb7, 0x00, 0x17, 0x16,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200338};
339
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +0200340/* DTAP - Routing Area Update Accept, P-TMSI 2 */
341static const unsigned char dtap_ra_upd_acc2[] = {
342 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
343 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
344 0x05, 0xf4, 0xe0, 0x98, 0x76, 0x54, 0x17, 0x16,
345};
346
347/* DTAP - Routing Area Update Accept, P-TMSI 3 */
348static const unsigned char dtap_ra_upd_acc3[] = {
349 0x08, 0x09, 0x00, 0x49, 0x21, 0x63, 0x54,
350 0x40, 0x50, 0x60, 0x19, 0x54, 0xab, 0xb3, 0x18,
351 0x05, 0xf4, 0xe0, 0x54, 0x32, 0x10, 0x17, 0x16,
352};
353
354/* DTAP - Routing Area Update Complete */
355static const unsigned char dtap_ra_upd_complete[] = {
356 0x08, 0x0a
357};
358
Jacob Erlbeck2c74e442014-09-15 14:18:09 +0200359/* DTAP - Routing Area Update Reject */
360/* cause = 10 ("Implicitly detached"), force_standby = 0 */
361static const unsigned char dtap_ra_upd_rej[] = {
362 0x08, 0x0b, 0x0a, 0x00,
363};
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +0200364
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200365/* DTAP - Activate PDP Context Request */
366static const unsigned char dtap_act_pdp_ctx_req[] = {
367 0x0a, 0x41, 0x05, 0x03, 0x0c, 0x00,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200368 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x02, 0x01, 0x21, 0x28, 0x03,
370 0x02, 0x61, 0x62, 0x27, 0x14, 0x80, 0x80, 0x21,
371 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00,
372 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00,
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200373 0x00
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200374};
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200375
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200376/* DTAP - Detach Request (MO) */
Jacob Erlbeckf95340d2014-08-11 15:07:37 +0200377/* normal detach, power_off = 1 */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200378static const unsigned char dtap_detach_po_req[] = {
379 0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
380 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckf95340d2014-08-11 15:07:37 +0200381};
382
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200383/* DTAP - Detach Request (MO) */
Jacob Erlbeckf95340d2014-08-11 15:07:37 +0200384/* normal detach, power_off = 0 */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200385static const unsigned char dtap_detach_req[] = {
386 0x08, 0x05, 0x01, 0x18, 0x05, 0xf4, 0xef, 0xe2,
387 0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
Jacob Erlbeckbf6020f2014-06-19 10:23:50 +0200388};
389
Jacob Erlbeck2c74e442014-09-15 14:18:09 +0200390/* DTAP - Detach Accept (MO) */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200391static const unsigned char dtap_detach_acc[] = {
392 0x08, 0x06, 0x00
Jacob Erlbeckbf6020f2014-06-19 10:23:50 +0200393};
394
Jacob Erlbeck2c74e442014-09-15 14:18:09 +0200395/* DTAP - Detach Request (MT) */
396/* normal detach, reattach required, implicitly detached */
397static const unsigned char dtap_mt_detach_rea_req[] = {
398 0x08, 0x05, 0x01, 0x25, 0x0a
399};
400
401/* DTAP - Detach Request (MT) */
402/* normal detach, reattach not required, implicitly detached */
403static const unsigned char dtap_mt_detach_req[] = {
404 0x08, 0x05, 0x02, 0x25, 0x0a
405};
406
407/* DTAP - Detach Accept (MT) */
408static const unsigned char dtap_mt_detach_acc[] = {
409 0x08, 0x06
410};
411
Jacob Erlbeck70e00de2014-08-15 17:20:06 +0200412/* GPRS-LLC - SAPI: LLGMM, U, XID */
413static const unsigned char llc_u_xid_ul[] = {
414 0x41, 0xfb, 0x01, 0x00, 0x0e, 0x00, 0x64, 0x11,
415 0x05, 0x16, 0x01, 0x90, 0x66, 0xb3, 0x28
416};
417
418/* GPRS-LLC - SAPI: LLGMM, U, XID */
419static const unsigned char llc_u_xid_dl[] = {
420 0x41, 0xfb, 0x30, 0x84, 0x10, 0x61, 0xb6, 0x64,
421 0xe4, 0xa9, 0x1a, 0x9e
422};
423
424/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
425static const unsigned char llc_ui_ll11_dns_query_ul[] = {
426 0x0b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
427 0x00, 0x00, 0x38, 0x95, 0x72, 0x00, 0x00, 0x45,
428 0x11, 0x20, 0x85, 0x0a, 0xc0, 0x07, 0xe4, 0xac,
429 0x10, 0x01, 0x0a, 0xad, 0xab, 0x00, 0x35, 0x00,
430 0x24, 0x0e, 0x1c, 0x3b, 0xe0, 0x01, 0x00, 0x00,
431 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
432 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
433 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0x47,
434 0x8f, 0x07
435};
436
437/* GPRS-LLC - SAPI: LL11, UI, NSAPI 5, DNS query */
438static const unsigned char llc_ui_ll11_dns_resp_dl[] = {
439 0x4b, 0xc0, 0x01, 0x65, 0x00, 0x00, 0x00, 0x45,
440 0x00, 0x00, 0xc6, 0x00, 0x00, 0x40, 0x00, 0x3e,
441 0x11, 0x7c, 0x69, 0xac, 0x10, 0x01, 0x0a, 0x0a,
442 0xc0, 0x07, 0xe4, 0x00, 0x35, 0xad, 0xab, 0x00,
443 0xb2, 0x74, 0x4e, 0x3b, 0xe0, 0x81, 0x80, 0x00,
444 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01,
445 0x6d, 0x05, 0x68, 0x65, 0x69, 0x73, 0x65, 0x02,
446 0x64, 0x65, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
447 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e,
448 0x10, 0x00, 0x04, 0xc1, 0x63, 0x90, 0x58, 0xc0,
449 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
450 0x10, 0x00, 0x16, 0x03, 0x6e, 0x73, 0x32, 0x0c,
451 0x70, 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e,
452 0x6f, 0x76, 0x65, 0x72, 0x03, 0x6e, 0x65, 0x74,
453 0x00, 0xc0, 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
454 0x00, 0x0e, 0x10, 0x00, 0x10, 0x02, 0x6e, 0x73,
455 0x01, 0x73, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x6c,
456 0x69, 0x6e, 0x65, 0xc0, 0x14, 0xc0, 0x0e, 0x00,
457 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, 0x00,
458 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x0e, 0xc0, 0x0e,
459 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10,
460 0x00, 0x05, 0x02, 0x6e, 0x73, 0xc0, 0x5f, 0xc0,
461 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e,
462 0x10, 0x00, 0x12, 0x02, 0x6e, 0x73, 0x0c, 0x70,
463 0x6f, 0x70, 0x2d, 0x68, 0x61, 0x6e, 0x6e, 0x6f,
464 0x76, 0x65, 0x72, 0xc0, 0x14, 0xaa, 0xdf, 0x31
465};
466
Jacob Erlbeck45017722013-10-18 13:04:47 +0200467static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text,
468 struct sockaddr_in *peer, const unsigned char* data,
469 size_t data_len);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200470
471static void send_ns_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
472 enum ns_cause cause, uint16_t nsvci, uint16_t nsei)
473{
474 /* GPRS Network Service, PDU type: NS_RESET,
475 */
476 unsigned char msg[12] = {
477 0x02, 0x00, 0x81, 0x01, 0x01, 0x82, 0x11, 0x22,
478 0x04, 0x82, 0x11, 0x22
479 };
480
481 msg[3] = cause;
482 msg[6] = nsvci / 256;
483 msg[7] = nsvci % 256;
484 msg[10] = nsei / 256;
485 msg[11] = nsei % 256;
486
487 gprs_process_message(nsi, "RESET", src_addr, msg, sizeof(msg));
488}
489
Jacob Erlbeck45017722013-10-18 13:04:47 +0200490static void send_ns_reset_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
491 uint16_t nsvci, uint16_t nsei)
492{
493 /* GPRS Network Service, PDU type: NS_RESET_ACK,
494 */
495 unsigned char msg[9] = {
496 0x03, 0x01, 0x82, 0x11, 0x22,
497 0x04, 0x82, 0x11, 0x22
498 };
499
500 msg[3] = nsvci / 256;
501 msg[4] = nsvci % 256;
502 msg[7] = nsei / 256;
503 msg[8] = nsei % 256;
504
505 gprs_process_message(nsi, "RESET_ACK", src_addr, msg, sizeof(msg));
506}
507
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200508static void send_ns_alive(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
509{
510 /* GPRS Network Service, PDU type: NS_ALIVE */
511 unsigned char msg[1] = {
512 0x0a
513 };
514
515 gprs_process_message(nsi, "ALIVE", src_addr, msg, sizeof(msg));
516}
517
518static void send_ns_alive_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
519{
520 /* GPRS Network Service, PDU type: NS_ALIVE_ACK */
521 unsigned char msg[1] = {
522 0x0b
523 };
524
525 gprs_process_message(nsi, "ALIVE_ACK", src_addr, msg, sizeof(msg));
526}
527
528static void send_ns_unblock(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
529{
530 /* GPRS Network Service, PDU type: NS_UNBLOCK */
531 unsigned char msg[1] = {
532 0x06
533 };
534
535 gprs_process_message(nsi, "UNBLOCK", src_addr, msg, sizeof(msg));
536}
537
Jacob Erlbeck45017722013-10-18 13:04:47 +0200538static void send_ns_unblock_ack(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr)
539{
540 /* GPRS Network Service, PDU type: NS_UNBLOCK_ACK */
541 unsigned char msg[1] = {
542 0x07
543 };
544
545 gprs_process_message(nsi, "UNBLOCK_ACK", src_addr, msg, sizeof(msg));
546}
547
548static void send_ns_unitdata(struct gprs_ns_inst *nsi, const char *text,
549 struct sockaddr_in *src_addr, uint16_t nsbvci,
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200550 const unsigned char *bssgp_msg, size_t bssgp_msg_size)
551{
552 /* GPRS Network Service, PDU type: NS_UNITDATA */
553 unsigned char msg[4096] = {
554 0x00, 0x00, 0x00, 0x00
555 };
556
557 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg) - 4);
558
559 msg[2] = nsbvci / 256;
560 msg[3] = nsbvci % 256;
561 memcpy(msg + 4, bssgp_msg, bssgp_msg_size);
562
Jacob Erlbeck45017722013-10-18 13:04:47 +0200563 gprs_process_message(nsi, text ? text : "UNITDATA", src_addr, msg, bssgp_msg_size + 4);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200564}
565
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200566static void send_bssgp_ul_unitdata(
567 struct gprs_ns_inst *nsi, const char *text,
568 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
569 struct gprs_ra_id *raid, uint16_t cell_id,
570 const uint8_t *llc_msg, size_t llc_msg_size)
571{
572 /* GPRS Network Service, PDU type: NS_UNITDATA */
573 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
574 unsigned char msg[4096] = {
575 0x01, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
576 0x08, 0x88, /* RAI */ 0x11, 0x22, 0x33, 0x40, 0x50, 0x60,
577 /* CELL ID */ 0x00, 0x00, 0x00, 0x80, 0x0e, /* LLC LEN */ 0x00, 0x00,
578 };
579
580 size_t bssgp_msg_size = 23 + llc_msg_size;
581
582 OSMO_ASSERT(bssgp_msg_size <= sizeof(msg));
583
Max9f13b142018-01-08 14:43:53 +0100584 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 10), raid);
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200585 msg[1] = (uint8_t)(tlli >> 24);
586 msg[2] = (uint8_t)(tlli >> 16);
587 msg[3] = (uint8_t)(tlli >> 8);
588 msg[4] = (uint8_t)(tlli >> 0);
589 msg[16] = cell_id / 256;
590 msg[17] = cell_id % 256;
591 msg[21] = llc_msg_size / 256;
592 msg[22] = llc_msg_size % 256;
593 memcpy(msg + 23, llc_msg, llc_msg_size);
594
595 send_ns_unitdata(nsi, text ? text : "BSSGP UL UNITDATA",
596 src_addr, nsbvci, msg, bssgp_msg_size);
597}
598
599static void send_bssgp_dl_unitdata(
600 struct gprs_ns_inst *nsi, const char *text,
601 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
602 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
603 const uint8_t *llc_msg, size_t llc_msg_size)
604{
605 /* Base Station Subsystem GPRS Protocol: DL_UNITDATA */
606 unsigned char msg[4096] = {
607 0x00, /* TLLI */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20,
608 0x16, 0x82, 0x02, 0x58,
609 };
610 unsigned char racap_drx[] = {
611 0x13, 0x99, 0x18, 0xb3, 0x43, 0x2b, 0x25, 0x96,
612 0x62, 0x00, 0x60, 0x80, 0x9a, 0xc2, 0xc6, 0x62,
613 0x00, 0x60, 0x80, 0xba, 0xc8, 0xc6, 0x62, 0x00,
614 0x60, 0x80, 0x00, 0x0a, 0x82, 0x08, 0x02
615 };
616
617 size_t bssgp_msg_size = 0;
618
619 OSMO_ASSERT(51 + imsi_size + llc_msg_size <= sizeof(msg));
620
621 msg[1] = (uint8_t)(tlli >> 24);
622 msg[2] = (uint8_t)(tlli >> 16);
623 msg[3] = (uint8_t)(tlli >> 8);
624 msg[4] = (uint8_t)(tlli >> 0);
625
626 bssgp_msg_size = 12;
627
628 if (with_racap_drx) {
629 memcpy(msg + bssgp_msg_size, racap_drx, sizeof(racap_drx));
630 bssgp_msg_size += sizeof(racap_drx);
631 }
632
633 if (imsi) {
634 OSMO_ASSERT(imsi_size <= 127);
635 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
636 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
637 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
638 bssgp_msg_size += 2 + imsi_size;
639 }
640
641 if ((bssgp_msg_size % 4) != 0) {
642 size_t abytes = (4 - (bssgp_msg_size + 2) % 4) % 4;
643 msg[bssgp_msg_size] = BSSGP_IE_ALIGNMENT;
644 msg[bssgp_msg_size + 1] = 0x80 | abytes;
645 memset(msg + bssgp_msg_size + 2, 0, abytes);
646 bssgp_msg_size += 2 + abytes;
647 }
648
649 msg[bssgp_msg_size] = BSSGP_IE_LLC_PDU;
650 if (llc_msg_size < 128) {
651 msg[bssgp_msg_size + 1] = 0x80 | llc_msg_size;
652 bssgp_msg_size += 2;
653 } else {
654 msg[bssgp_msg_size + 1] = llc_msg_size / 256;
655 msg[bssgp_msg_size + 2] = llc_msg_size % 256;
656 bssgp_msg_size += 3;
657 }
658 memcpy(msg + bssgp_msg_size, llc_msg, llc_msg_size);
659 bssgp_msg_size += llc_msg_size;
660
661
662 send_ns_unitdata(nsi, text ? text : "BSSGP DL UNITDATA",
663 src_addr, nsbvci, msg, bssgp_msg_size);
664}
665
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200666static void send_bssgp_reset(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
667 uint16_t bvci)
668{
669 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
670 * BSSGP RESET */
Jacob Erlbeck8a600ae2014-08-06 12:38:10 +0200671 unsigned char msg[18] = {
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200672 0x22, 0x04, 0x82, 0x4a,
Jacob Erlbeck3f086322014-06-02 10:48:59 +0200673 0x2e, 0x07, 0x81, 0x08, 0x08, 0x88, 0x11, 0x22,
674 0x33, 0x40, 0x50, 0x60, 0x10, 0x00
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200675 };
676
677 msg[3] = bvci / 256;
678 msg[4] = bvci % 256;
679
Jacob Erlbeck45017722013-10-18 13:04:47 +0200680 send_ns_unitdata(nsi, "BVC_RESET", src_addr, 0, msg, sizeof(msg));
681}
682
683static void send_bssgp_reset_ack(struct gprs_ns_inst *nsi,
684 struct sockaddr_in *src_addr, uint16_t bvci)
685{
686 /* GPRS Network Service, PDU type: NS_UNITDATA, BVCI 0
687 * BSSGP RESET_ACK */
688 static unsigned char msg[5] = {
689 0x23, 0x04, 0x82, 0x00,
690 0x00
691 };
692
693 msg[3] = bvci / 256;
694 msg[4] = bvci % 256;
695
696 send_ns_unitdata(nsi, "BVC_RESET_ACK", src_addr, 0, msg, sizeof(msg));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200697}
698
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200699static void send_bssgp_suspend(struct gprs_ns_inst *nsi,
700 struct sockaddr_in *src_addr,
Jacob Erlbeck2937b512014-08-21 16:34:18 +0200701 uint32_t tlli,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200702 struct gprs_ra_id *raid)
703{
704 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
705 unsigned char msg[15] = {
Jacob Erlbeck2937b512014-08-21 16:34:18 +0200706 0x0b, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
707 0x86, /* RAI */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200708 };
709
Jacob Erlbeck2937b512014-08-21 16:34:18 +0200710 msg[3] = (uint8_t)(tlli >> 24);
711 msg[4] = (uint8_t)(tlli >> 16);
712 msg[5] = (uint8_t)(tlli >> 8);
713 msg[6] = (uint8_t)(tlli >> 0);
714
Max9f13b142018-01-08 14:43:53 +0100715 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200716
717 send_ns_unitdata(nsi, "BVC_SUSPEND", src_addr, 0, msg, sizeof(msg));
718}
719
720static void send_bssgp_suspend_ack(struct gprs_ns_inst *nsi,
721 struct sockaddr_in *src_addr,
Jacob Erlbeck2937b512014-08-21 16:34:18 +0200722 uint32_t tlli,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200723 struct gprs_ra_id *raid)
724{
725 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND ACK */
726 unsigned char msg[18] = {
Jacob Erlbeck2937b512014-08-21 16:34:18 +0200727 0x0c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x1b,
728 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d,
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200729 0x81, 0x01
730 };
731
Jacob Erlbeck2937b512014-08-21 16:34:18 +0200732 msg[3] = (uint8_t)(tlli >> 24);
733 msg[4] = (uint8_t)(tlli >> 16);
734 msg[5] = (uint8_t)(tlli >> 8);
735 msg[6] = (uint8_t)(tlli >> 0);
736
Max9f13b142018-01-08 14:43:53 +0100737 gsm48_encode_ra((struct gsm48_ra_id *)(msg + 9), raid);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +0200738
739 send_ns_unitdata(nsi, "BVC_SUSPEND_ACK", src_addr, 0, msg, sizeof(msg));
740}
741
Jacob Erlbeck2937b512014-08-21 16:34:18 +0200742static void send_bssgp_llc_discarded(struct gprs_ns_inst *nsi,
743 struct sockaddr_in *src_addr,
744 uint16_t bvci, uint32_t tlli,
745 unsigned n_frames, unsigned n_octets)
746{
747 /* Base Station Subsystem GPRS Protocol: LLC-DISCARDED (0x2c) */
748 unsigned char msg[] = {
749 0x2c, 0x1f, 0x84, /* TLLI */ 0xff, 0xff, 0xff, 0xff, 0x0f,
750 0x81, /* n frames */ 0xff, 0x04, 0x82, /* BVCI */ 0xff, 0xff, 0x25, 0x83,
751 /* n octets */ 0xff, 0xff, 0xff
752 };
753
754 msg[3] = (uint8_t)(tlli >> 24);
755 msg[4] = (uint8_t)(tlli >> 16);
756 msg[5] = (uint8_t)(tlli >> 8);
757 msg[6] = (uint8_t)(tlli >> 0);
758 msg[9] = (uint8_t)(n_frames);
759 msg[12] = (uint8_t)(bvci >> 8);
760 msg[13] = (uint8_t)(bvci >> 0);
761 msg[16] = (uint8_t)(n_octets >> 16);
762 msg[17] = (uint8_t)(n_octets >> 8);
763 msg[18] = (uint8_t)(n_octets >> 0);
764
765 send_ns_unitdata(nsi, "LLC_DISCARDED", src_addr, 0, msg, sizeof(msg));
766}
767
Jacob Erlbeckd5f24fd2014-09-30 13:49:43 +0200768static void send_bssgp_paging(struct gprs_ns_inst *nsi,
769 struct sockaddr_in *src_addr,
770 const uint8_t *imsi, size_t imsi_size,
771 struct gprs_ra_id *raid, uint32_t ptmsi)
772{
773 /* Base Station Subsystem GPRS Protocol, BSSGP SUSPEND */
774 unsigned char msg[100] = {
775 0x06,
776 };
777
778 const unsigned char drx_ie[] = {0x0a, 0x82, 0x07, 0x04};
779 const unsigned char qos_ie[] = {0x18, 0x83, 0x00, 0x00, 0x00};
780
781 size_t bssgp_msg_size = 1;
782
783 if (imsi) {
784 OSMO_ASSERT(imsi_size <= 127);
785 msg[bssgp_msg_size] = BSSGP_IE_IMSI;
786 msg[bssgp_msg_size + 1] = 0x80 | imsi_size;
787 memcpy(msg + bssgp_msg_size + 2, imsi, imsi_size);
788 bssgp_msg_size += 2 + imsi_size;
789 }
790
791 memcpy(msg + bssgp_msg_size, drx_ie, sizeof(drx_ie));
792 bssgp_msg_size += sizeof(drx_ie);
793
794 if (raid) {
795 msg[bssgp_msg_size] = BSSGP_IE_ROUTEING_AREA;
796 msg[bssgp_msg_size+1] = 0x86;
Max9f13b142018-01-08 14:43:53 +0100797 gsm48_encode_ra((struct gsm48_ra_id *)(msg + bssgp_msg_size + 2), raid);
Jacob Erlbeckd5f24fd2014-09-30 13:49:43 +0200798 bssgp_msg_size += 8;
799 }
800
801 memcpy(msg + bssgp_msg_size, qos_ie, sizeof(qos_ie));
802 bssgp_msg_size += sizeof(qos_ie);
803
804 if (ptmsi != GSM_RESERVED_TMSI) {
805 const uint32_t ptmsi_be = htonl(ptmsi);
806 msg[bssgp_msg_size] = BSSGP_IE_TMSI;
807 msg[bssgp_msg_size+1] = 0x84;
808 memcpy(msg + bssgp_msg_size + 2, &ptmsi_be, 4);
809 bssgp_msg_size += 6;
810 }
811
812 send_ns_unitdata(nsi, "PAGING_PS", src_addr, 0, msg, bssgp_msg_size);
813}
814
Jacob Erlbeck12356062014-08-27 12:44:25 +0200815static void send_bssgp_flow_control_bvc(struct gprs_ns_inst *nsi,
816 struct sockaddr_in *src_addr,
817 uint16_t bvci, uint8_t tag)
818{
819 /* GPRS Network Service, PDU type: NS_UNITDATA,
820 * BSSGP FLOW_CONTROL_BVC */
821 unsigned char msg[] = {
822 0x26, 0x1e, 0x81, /* Tag */ 0xff, 0x05, 0x82, 0x01, 0xdc,
823 0x03, 0x82, 0x02, 0x76, 0x01, 0x82, 0x00, 0x50,
824 0x1c, 0x82, 0x02, 0x58, 0x06, 0x82, 0x00, 0x03
825 };
826
827 msg[3] = tag;
828
829 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC", src_addr, bvci,
830 msg, sizeof(msg));
831}
832
833static void send_bssgp_flow_control_bvc_ack(struct gprs_ns_inst *nsi,
834 struct sockaddr_in *src_addr,
835 uint16_t bvci, uint8_t tag)
836{
837 /* GPRS Network Service, PDU type: NS_UNITDATA,
838 * BSSGP FLOW_CONTROL_BVC_ACK */
839 unsigned char msg[] = {
840 0x27, 0x1e, 0x81, /* Tag */ 0xce
841 };
842
843 msg[3] = tag;
844
845 send_ns_unitdata(nsi, "FLOW_CONTROL_BVC_ACK", src_addr, bvci,
846 msg, sizeof(msg));
847}
848
Jacob Erlbeck322d9f92014-08-15 14:56:28 +0200849static void send_llc_ul_ui(
850 struct gprs_ns_inst *nsi, const char *text,
851 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
852 struct gprs_ra_id *raid, uint16_t cell_id,
853 unsigned sapi, unsigned nu,
854 const uint8_t *msg, size_t msg_size)
855{
856 unsigned char llc_msg[4096] = {
857 0x00, 0xc0, 0x01
858 };
859
860 size_t llc_msg_size = 3 + msg_size + 3;
861 uint8_t e_bit = 0;
862 uint8_t pm_bit = 1;
863 unsigned fcs;
864
865 nu &= 0x01ff;
866
867 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
868
869 llc_msg[0] = (sapi & 0x0f);
870 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
871 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
872
873 memcpy(llc_msg + 3, msg, msg_size);
874
875 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
876 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
877 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
878 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
879
880 send_bssgp_ul_unitdata(nsi, text ? text : "LLC UI",
881 src_addr, nsbvci, tlli, raid, cell_id,
882 llc_msg, llc_msg_size);
883}
884
885static void send_llc_dl_ui(
886 struct gprs_ns_inst *nsi, const char *text,
887 struct sockaddr_in *src_addr, uint16_t nsbvci, uint32_t tlli,
888 int with_racap_drx, const uint8_t *imsi, size_t imsi_size,
889 unsigned sapi, unsigned nu,
890 const uint8_t *msg, size_t msg_size)
891{
892 /* GPRS Network Service, PDU type: NS_UNITDATA */
893 /* Base Station Subsystem GPRS Protocol: UL_UNITDATA */
894 unsigned char llc_msg[4096] = {
895 0x00, 0x00, 0x01
896 };
897
898 size_t llc_msg_size = 3 + msg_size + 3;
899 uint8_t e_bit = 0;
900 uint8_t pm_bit = 1;
901 unsigned fcs;
902
903 nu &= 0x01ff;
904
905 OSMO_ASSERT(llc_msg_size <= sizeof(llc_msg));
906
907 llc_msg[0] = 0x40 | (sapi & 0x0f);
908 llc_msg[1] = 0xc0 | (nu >> 6); /* UI frame */
909 llc_msg[2] = (nu << 2) | ((e_bit & 1) << 1) | (pm_bit & 1);
910
911 memcpy(llc_msg + 3, msg, msg_size);
912
913 fcs = gprs_llc_fcs(llc_msg, msg_size + 3);
914 llc_msg[3 + msg_size + 0] = (uint8_t)(fcs >> 0);
915 llc_msg[3 + msg_size + 1] = (uint8_t)(fcs >> 8);
916 llc_msg[3 + msg_size + 2] = (uint8_t)(fcs >> 16);
917
918 send_bssgp_dl_unitdata(nsi, text ? text : "LLC UI",
919 src_addr, nsbvci, tlli,
920 with_racap_drx, imsi, imsi_size,
921 llc_msg, llc_msg_size);
922}
923
924
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200925static void setup_ns(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
926 uint16_t nsvci, uint16_t nsei)
927{
928 printf("Setup NS-VC: remote 0x%08x:%d, "
929 "NSVCI 0x%04x(%d), NSEI 0x%04x(%d)\n\n",
930 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
931 nsvci, nsvci, nsei, nsei);
932
933 send_ns_reset(nsi, src_addr, NS_CAUSE_OM_INTERVENTION, nsvci, nsei);
934 send_ns_alive(nsi, src_addr);
935 send_ns_unblock(nsi, src_addr);
936 send_ns_alive_ack(nsi, src_addr);
937}
938
939static void setup_bssgp(struct gprs_ns_inst *nsi, struct sockaddr_in *src_addr,
940 uint16_t bvci)
941{
942 printf("Setup BSSGP: remote 0x%08x:%d, "
943 "BVCI 0x%04x(%d)\n\n",
944 ntohl(src_addr->sin_addr.s_addr), ntohs(src_addr->sin_port),
945 bvci, bvci);
946
947 send_bssgp_reset(nsi, src_addr, bvci);
948}
949
Jacob Erlbeck12356062014-08-27 12:44:25 +0200950static void connect_sgsn(struct gprs_ns_inst *nsi, struct sockaddr_in *sgsn_peer,
951 uint32_t sgsn_nsei)
Jacob Erlbeck738b1c82014-07-07 10:46:00 +0200952{
Jacob Erlbeck12356062014-08-27 12:44:25 +0200953 gprs_ns_nsip_connect(nsi, sgsn_peer, sgsn_nsei, sgsn_nsei+1);
954 send_ns_reset_ack(nsi, sgsn_peer, sgsn_nsei+1, sgsn_nsei);
Jacob Erlbeck738b1c82014-07-07 10:46:00 +0200955 send_ns_alive_ack(nsi, sgsn_peer);
956 send_ns_unblock_ack(nsi, sgsn_peer);
957 send_ns_alive(nsi, sgsn_peer);
958}
959
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +0200960static void configure_sgsn_peer(struct sockaddr_in *sgsn_peer)
961{
962 sgsn_peer->sin_family = AF_INET;
963 sgsn_peer->sin_port = htons(32000);
964 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN_ADDR);
965}
966
Jacob Erlbeck12356062014-08-27 12:44:25 +0200967static void configure_sgsn2_peer(struct sockaddr_in *sgsn_peer)
968{
969 sgsn_peer->sin_family = AF_INET;
970 sgsn_peer->sin_port = htons(32001);
971 sgsn_peer->sin_addr.s_addr = htonl(REMOTE_SGSN2_ADDR);
972}
973
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +0200974static void configure_bss_peers(struct sockaddr_in *bss_peers, size_t size)
975{
976 size_t i;
977
978 for (i = 0; i < size; ++i) {
979 bss_peers[i].sin_family = AF_INET;
980 bss_peers[i].sin_port = htons((i + 1) * 1111);
981 bss_peers[i].sin_addr.s_addr = htonl(REMOTE_BSS_ADDR);
982 }
983}
984
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200985int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
986 struct sockaddr_in *saddr, enum gprs_ns_ll ll);
987
988/* override */
989int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
990 struct msgb *msg, uint16_t bvci)
991{
Holger Hans Peter Freytherc3b9cf62015-08-03 09:28:41 +0200992 printf("CALLBACK, event %d, msg length %zu, bvci 0x%04x\n%s\n\n",
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200993 event, msgb_bssgp_len(msg), bvci,
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +0200994 osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200995
996 switch (event) {
997 case GPRS_NS_EVT_UNIT_DATA:
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +0200998 return gbprox_rcvmsg(&gbcfg, msg, nsvc->nsei, bvci, nsvc->nsvci);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +0200999 default:
1000 break;
1001 }
1002 return 0;
1003}
1004
1005/* override */
1006ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
1007 const struct sockaddr *dest_addr, socklen_t addrlen)
1008{
1009 typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
1010 const struct sockaddr *, socklen_t);
1011 static sendto_t real_sendto = NULL;
1012 uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001013 int dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001014
1015 if (!real_sendto)
1016 real_sendto = dlsym(RTLD_NEXT, "sendto");
1017
1018 if (dest_host == REMOTE_BSS_ADDR)
Holger Hans Peter Freyther844f4b82015-04-23 11:55:23 -04001019 printf("MESSAGE to BSS at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck45017722013-10-18 13:04:47 +02001020 dest_host, dest_port,
1021 len, osmo_hexdump(buf, len));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001022 else if (dest_host == REMOTE_SGSN_ADDR)
Holger Hans Peter Freyther844f4b82015-04-23 11:55:23 -04001023 printf("MESSAGE to SGSN at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck45017722013-10-18 13:04:47 +02001024 dest_host, dest_port,
1025 len, osmo_hexdump(buf, len));
Jacob Erlbeck12356062014-08-27 12:44:25 +02001026 else if (dest_host == REMOTE_SGSN2_ADDR)
Holger Hans Peter Freyther844f4b82015-04-23 11:55:23 -04001027 printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %zu\n%s\n\n",
Jacob Erlbeck12356062014-08-27 12:44:25 +02001028 dest_host, dest_port,
1029 len, osmo_hexdump(buf, len));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001030 else
1031 return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
1032
1033 return len;
1034}
1035
1036/* override */
1037int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
1038{
Jacob Erlbeck45017722013-10-18 13:04:47 +02001039 typedef int (*gprs_ns_sendmsg_t)(struct gprs_ns_inst *nsi, struct msgb *msg);
1040 static gprs_ns_sendmsg_t real_gprs_ns_sendmsg = NULL;
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001041 uint16_t bvci = msgb_bvci(msg);
1042 uint16_t nsei = msgb_nsei(msg);
1043
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +02001044 size_t len = msgb_length(msg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001045
Jacob Erlbeck45017722013-10-18 13:04:47 +02001046 if (!real_gprs_ns_sendmsg)
1047 real_gprs_ns_sendmsg = dlsym(RTLD_NEXT, "gprs_ns_sendmsg");
1048
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001049 if (nsei == SGSN_NSEI)
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +02001050 printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
Holger Hans Peter Freyther844f4b82015-04-23 11:55:23 -04001051 "msg length %zu (%s)\n",
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +02001052 bvci, len, __func__);
Jacob Erlbeck12356062014-08-27 12:44:25 +02001053 else if (nsei == SGSN2_NSEI)
1054 printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
Holger Hans Peter Freyther844f4b82015-04-23 11:55:23 -04001055 "msg length %zu (%s)\n",
Jacob Erlbeck12356062014-08-27 12:44:25 +02001056 bvci, len, __func__);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001057 else
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +02001058 printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
Holger Hans Peter Freyther844f4b82015-04-23 11:55:23 -04001059 "msg length %zu (%s)\n",
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +02001060 bvci, len, __func__);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001061
Jacob Erlbecka4b5e892014-09-22 18:54:34 +02001062 if (received_messages) {
1063 struct msgb *msg_copy;
Pau Espin Pedrol1877d8e2018-08-15 13:53:48 +02001064 msg_copy = bssgp_msgb_copy(msg, "received_messages");
Jacob Erlbecka4b5e892014-09-22 18:54:34 +02001065 llist_add_tail(&msg_copy->list, received_messages);
1066 }
1067
Jacob Erlbeck45017722013-10-18 13:04:47 +02001068 return real_gprs_ns_sendmsg(nsi, msg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001069}
1070
Jacob Erlbecka4b5e892014-09-22 18:54:34 +02001071/* Get the next message from the receive FIFO
1072 *
1073 * \returns a pointer to the message which will be invalidated at the next call
1074 * to expect_msg. Returns NULL, if there is no message left.
1075 */
1076static struct msgb *expect_msg(void)
1077{
1078 static struct msgb *msg = NULL;
1079
1080 msgb_free(msg);
1081 msg = NULL;
1082
1083 if (!received_messages)
1084 return NULL;
1085
1086 if (llist_empty(received_messages))
1087 return NULL;
1088
1089 msg = llist_entry(received_messages->next, struct msgb, list);
1090 llist_del(&msg->list);
1091
1092 return msg;
1093}
1094
1095struct expect_result {
1096 struct msgb *msg;
1097 struct gprs_gb_parse_context parse_ctx;
1098};
1099
1100static struct expect_result *expect_bssgp_msg(
1101 int match_nsei, int match_bvci, int match_pdu_type)
1102{
1103 static struct expect_result result;
1104 static const struct expect_result empty_result = {0,};
1105 static struct msgb *msg;
1106 uint16_t nsei;
1107 int rc;
1108
1109 memcpy(&result, &empty_result, sizeof(result));
1110
1111 msg = expect_msg();
1112 if (!msg)
1113 return NULL;
1114
1115 nsei = msgb_nsei(msg);
1116
1117 if (match_nsei != MATCH_ANY && match_nsei != nsei) {
1118 fprintf(stderr, "%s: NSEI mismatch (expected %u, got %u)\n",
1119 __func__, match_nsei, nsei);
1120 return NULL;
1121 }
1122
1123 if (match_bvci != MATCH_ANY && match_bvci != msgb_bvci(msg)) {
1124 fprintf(stderr, "%s: BVCI mismatch (expected %u, got %u)\n",
1125 __func__, match_bvci, msgb_bvci(msg));
1126 return NULL;
1127 }
1128
1129 result.msg = msg;
1130
1131 result.parse_ctx.to_bss = nsei != SGSN_NSEI && nsei != SGSN2_NSEI;
1132 result.parse_ctx.peer_nsei = nsei;
1133
1134 if (!msgb_bssgph(msg)) {
1135 fprintf(stderr, "%s: Expected BSSGP\n", __func__);
1136 return NULL;
1137 }
1138
1139 rc = gprs_gb_parse_bssgp(msgb_bssgph(msg), msgb_bssgp_len(msg),
1140 &result.parse_ctx);
1141
1142 if (!rc) {
1143 fprintf(stderr, "%s: Failed to parse message\n", __func__);
1144 return NULL;
1145 }
1146
1147 if (match_pdu_type != MATCH_ANY &&
1148 match_pdu_type != result.parse_ctx.pdu_type) {
1149 fprintf(stderr, "%s: PDU type mismatch (expected %u, got %u)\n",
1150 __func__, match_pdu_type, result.parse_ctx.pdu_type);
1151 return NULL;
1152 }
1153
1154 return &result;
1155}
1156
1157static struct expect_result *expect_llc_msg(
1158 int match_nsei, int match_bvci, int match_sapi, int match_type)
1159{
1160 static struct expect_result *result;
1161
1162 result = expect_bssgp_msg(match_nsei, match_bvci, MATCH_ANY);
1163 if (!result)
1164 return NULL;
1165
1166 if (!result->parse_ctx.llc) {
1167 fprintf(stderr, "%s: Expected LLC message\n", __func__);
1168 return NULL;
1169 }
1170
1171 if (match_sapi != MATCH_ANY &&
1172 match_sapi != result->parse_ctx.llc_hdr_parsed.sapi) {
1173 fprintf(stderr, "%s: LLC SAPI mismatch (expected %u, got %u)\n",
1174 __func__, match_sapi, result->parse_ctx.llc_hdr_parsed.sapi);
1175 return NULL;
1176 }
1177
1178 if (match_type != MATCH_ANY &&
1179 match_type != result->parse_ctx.llc_hdr_parsed.cmd) {
1180 fprintf(stderr,
1181 "%s: LLC command/type mismatch (expected %u, got %u)\n",
1182 __func__, match_type, result->parse_ctx.llc_hdr_parsed.cmd);
1183 return NULL;
1184 }
1185
1186 return result;
1187}
1188
1189static struct expect_result *expect_gmm_msg(int match_nsei, int match_bvci,
1190 int match_type)
1191{
1192 static struct expect_result *result;
1193
1194 result = expect_llc_msg(match_nsei, match_bvci, GPRS_SAPI_GMM, GPRS_LLC_UI);
1195 if (!result)
1196 return NULL;
1197
1198 if (!result->parse_ctx.g48_hdr) {
1199 fprintf(stderr, "%s: Expected GSM 04.08 message\n", __func__);
1200 return NULL;
1201 }
1202
1203 if (match_type != MATCH_ANY &&
1204 match_type != result->parse_ctx.g48_hdr->msg_type) {
1205 fprintf(stderr,
1206 "%s: GSM 04.08 message type mismatch (expected %u, got %u)\n",
1207 __func__, match_type, result->parse_ctx.g48_hdr->msg_type);
1208 return NULL;
1209 }
1210
1211 return result;
1212}
1213
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001214static void dump_rate_ctr_group(FILE *stream, const char *prefix,
1215 struct rate_ctr_group *ctrg)
1216{
1217 unsigned int i;
1218
1219 for (i = 0; i < ctrg->desc->num_ctr; i++) {
1220 struct rate_ctr *ctr = &ctrg->ctr[i];
1221 if (ctr->current && !strchr(ctrg->desc->ctr_desc[i].name, '.'))
1222 fprintf(stream, " %s%s: %llu%s",
1223 prefix, ctrg->desc->ctr_desc[i].description,
1224 (long long)ctr->current,
1225 "\n");
1226 };
1227}
1228
1229/* Signal handler for signals from NS layer */
1230static int test_signal(unsigned int subsys, unsigned int signal,
1231 void *handler_data, void *signal_data)
1232{
1233 struct ns_signal_data *nssd = signal_data;
1234 int rc;
1235
1236 if (subsys != SS_L_NS)
1237 return 0;
1238
1239 switch (signal) {
1240 case S_NS_RESET:
1241 printf("==> got signal NS_RESET, NS-VC 0x%04x/%s\n",
1242 nssd->nsvc->nsvci,
1243 gprs_ns_ll_str(nssd->nsvc));
1244 break;
1245
1246 case S_NS_ALIVE_EXP:
1247 printf("==> got signal NS_ALIVE_EXP, NS-VC 0x%04x/%s\n",
1248 nssd->nsvc->nsvci,
1249 gprs_ns_ll_str(nssd->nsvc));
1250 break;
1251
1252 case S_NS_BLOCK:
1253 printf("==> got signal NS_BLOCK, NS-VC 0x%04x/%s\n",
1254 nssd->nsvc->nsvci,
1255 gprs_ns_ll_str(nssd->nsvc));
1256 break;
1257
1258 case S_NS_UNBLOCK:
1259 printf("==> got signal NS_UNBLOCK, NS-VC 0x%04x/%s\n",
1260 nssd->nsvc->nsvci,
1261 gprs_ns_ll_str(nssd->nsvc));
1262 break;
1263
1264 case S_NS_REPLACED:
1265 printf("==> got signal NS_REPLACED: 0x%04x/%s",
1266 nssd->nsvc->nsvci,
1267 gprs_ns_ll_str(nssd->nsvc));
1268 printf(" -> 0x%04x/%s\n",
1269 nssd->old_nsvc->nsvci,
1270 gprs_ns_ll_str(nssd->old_nsvc));
1271 break;
1272
1273 default:
1274 printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal,
1275 nssd->nsvc->nsvci,
1276 gprs_ns_ll_str(nssd->nsvc));
1277 break;
1278 }
1279 printf("\n");
1280 rc = gbprox_signal(subsys, signal, handler_data, signal_data);
1281 return rc;
1282}
1283
1284static int gprs_process_message(struct gprs_ns_inst *nsi, const char *text, struct sockaddr_in *peer, const unsigned char* data, size_t data_len)
1285{
1286 struct msgb *msg;
1287 int ret;
1288 if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
Holger Hans Peter Freyther844f4b82015-04-23 11:55:23 -04001289 fprintf(stderr, "message too long: %zu\n", data_len);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001290 return -1;
1291 }
1292
1293 msg = gprs_ns_msgb_alloc();
Neels Hofmeyrc871c852016-04-14 15:21:33 +02001294 OSMO_ASSERT(msg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001295 memmove(msg->data, data, data_len);
1296 msg->l2h = msg->data;
1297 msgb_put(msg, data_len);
1298
1299 printf("PROCESSING %s from 0x%08x:%d\n%s\n\n",
1300 text, ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1301 osmo_hexdump(data, data_len));
1302
1303 ret = gprs_ns_rcvmsg(nsi, msg, peer, GPRS_NS_LL_UDP);
1304
Harald Welte06f3d5a2019-02-26 22:36:11 +01001305 /* gprs_ns_rcvmsg() in old libosmocore returns "number of bytes
1306 * transmitted by any response PDU we sent as a result of the
1307 * received message", while modern libosmocore simply retunrs '0'
1308 * for any successfully received message. Let's make sure any
1309 * non-negative responses lead to a reproducible test output
1310 * with both old and new libosmocore. */
1311 printf("result (%s) = %d\n\n", text, ret < 0 ? ret : 0);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001312
1313 msgb_free(msg);
1314
1315 return ret;
1316}
1317
1318static void gprs_dump_nsi(struct gprs_ns_inst *nsi)
1319{
1320 struct gprs_nsvc *nsvc;
1321
1322 printf("Current NS-VCIs:\n");
1323 llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
1324 struct sockaddr_in *peer = &(nsvc->ip.bts_addr);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001325 printf(" VCI 0x%04x, NSEI 0x%04x, peer 0x%08x:%d%s%s\n",
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001326 nsvc->nsvci, nsvc->nsei,
Jacob Erlbeck45017722013-10-18 13:04:47 +02001327 ntohl(peer->sin_addr.s_addr), ntohs(peer->sin_port),
1328 nsvc->state & NSE_S_BLOCKED ? ", blocked" : "",
1329 nsvc->state & NSE_S_ALIVE ? "" : ", dead"
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001330 );
1331 dump_rate_ctr_group(stdout, " ", nsvc->ctrg);
1332 }
1333 printf("\n");
1334}
1335
1336static void test_gbproxy()
1337{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01001338 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001339 struct sockaddr_in bss_peer[4] = {{0},};
Jacob Erlbeck45017722013-10-18 13:04:47 +02001340 struct sockaddr_in sgsn_peer= {0};
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001341
1342 bssgp_nsi = nsi;
1343 gbcfg.nsi = bssgp_nsi;
1344 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1345
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +02001346 configure_sgsn_peer(&sgsn_peer);
1347 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001348
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +02001349 printf("=== %s ===\n", __func__);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001350 printf("--- Initialise SGSN ---\n\n");
1351
Jacob Erlbeck12356062014-08-27 12:44:25 +02001352 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001353 gprs_dump_nsi(nsi);
1354
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001355 printf("--- Initialise BSS 1 ---\n\n");
1356
1357 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1358 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1359 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001360 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001361
Jacob Erlbeck45017722013-10-18 13:04:47 +02001362 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1363
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001364 printf("--- Initialise BSS 2 ---\n\n");
1365
1366 setup_ns(nsi, &bss_peer[1], 0x2001, 0x2000);
1367 setup_bssgp(nsi, &bss_peer[1], 0x2002);
1368 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001369 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001370
Jacob Erlbeck45017722013-10-18 13:04:47 +02001371 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x2002);
1372
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001373 printf("--- Move BSS 1 to new port ---\n\n");
1374
1375 setup_ns(nsi, &bss_peer[2], 0x1001, 0x1000);
1376 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001377 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001378
1379 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1380
1381 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1382 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001383 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001384
1385 printf("--- Move BSS 1 to current BSS 2 port ---\n\n");
1386
1387 setup_ns(nsi, &bss_peer[0], 0x2001, 0x2000);
1388 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001389 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001390
1391 printf("--- Move BSS 2 to new port ---\n\n");
1392
1393 setup_ns(nsi, &bss_peer[3], 0x2001, 0x2000);
1394 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001395 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001396
1397 printf("--- Move BSS 2 to former BSS 1 port ---\n\n");
1398
1399 setup_ns(nsi, &bss_peer[2], 0x2001, 0x2000);
1400 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001401 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001402
Jacob Erlbeck45017722013-10-18 13:04:47 +02001403 printf("--- Move BSS 1 to original BSS 1 port ---\n\n");
1404
1405 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
1406 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001407 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001408
1409 printf("--- Reset BSS 1 with a new BVCI ---\n\n");
1410
1411 setup_bssgp(nsi, &bss_peer[0], 0x1012);
1412 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001413 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001414
1415 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1012);
1416
1417 printf("--- Reset BSS 1 with the old BVCI ---\n\n");
1418
1419 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1420 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001421 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001422
1423 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1424
1425 printf("--- Reset BSS 1 with the old BVCI again ---\n\n");
1426
1427 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1428 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001429 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001430
1431 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1432
1433 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1012 ---\n\n");
1434
1435 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1436
1437 printf("--- Send message from SGSN to BSS 1, BVCI 0x1012 ---\n\n");
1438
1439 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1440
1441 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1442
1443 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1444
1445 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1446
1447 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1448
1449 printf("--- Send message from BSS 2 to SGSN, BVCI 0x2002 ---\n\n");
1450
1451 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x2002, (uint8_t *)"", 0);
1452
1453 printf("--- Send message from SGSN to BSS 2, BVCI 0x2002 ---\n\n");
1454
1455 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x2002, (uint8_t *)"", 0);
1456
1457 printf("--- Reset BSS 1 with the old BVCI on BSS2's link ---\n\n");
1458
1459 setup_bssgp(nsi, &bss_peer[2], 0x1002);
1460 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001461 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck45017722013-10-18 13:04:47 +02001462
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +02001463 dump_global(stdout, 0);
Jacob Erlbeckcc4a2aa2013-10-18 22:12:16 +02001464
Jacob Erlbeck45017722013-10-18 13:04:47 +02001465 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1466
1467 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1468
1469 send_ns_unitdata(nsi, NULL, &bss_peer[0], 0x1012, (uint8_t *)"", 0);
1470
1471 printf("--- Send message from SGSN to BSS 1, BVCI 0x1002 ---\n\n");
1472
1473 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x1012, (uint8_t *)"", 0);
1474
Jacob Erlbeckcc4a2aa2013-10-18 22:12:16 +02001475 printf("--- Send message from SGSN to BSS 1, BVCI 0x10ff (invalid) ---\n\n");
1476
1477 send_ns_unitdata(nsi, NULL, &sgsn_peer, 0x10ff, (uint8_t *)"", 0);
1478
Jacob Erlbeckdab8a6d2014-09-04 11:08:50 +02001479 /* Find peer */
1480 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0xeeee) == NULL);
1481 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1000) == NULL);
1482 OSMO_ASSERT(gbproxy_peer_by_bvci(&gbcfg, 0x1012) != NULL);
1483 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0xeeee) == NULL);
1484 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1012) == NULL);
1485 OSMO_ASSERT(gbproxy_peer_by_nsei(&gbcfg, 0x1000) != NULL);
1486
1487
1488 /* Cleanup */
1489 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0) == 0);
1490 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0xeeee) == 0);
1491 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0, 0x1002) == 0);
1492 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 1);
1493 OSMO_ASSERT(gbproxy_cleanup_peers(&gbcfg, 0x1000, 0x1012) == 0);
1494
1495 dump_peers(stdout, 0, 0, &gbcfg);
1496
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +02001497 dump_global(stdout, 0);
Jacob Erlbeckcc4a2aa2013-10-18 22:12:16 +02001498
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +02001499 gbprox_reset(&gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001500 gprs_ns_destroy(nsi);
1501 nsi = NULL;
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001502}
1503
1504static void test_gbproxy_ident_changes()
1505{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01001506 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001507 struct sockaddr_in bss_peer[1] = {{0},};
1508 struct sockaddr_in sgsn_peer= {0};
1509 uint16_t nsei[2] = {0x1000, 0x2000};
1510 uint16_t nsvci[2] = {0x1001, 0x2001};
1511 uint16_t bvci[4] = {0x1002, 0x2002, 0x3002, 0x4002};
1512
1513 bssgp_nsi = nsi;
1514 gbcfg.nsi = bssgp_nsi;
1515 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
1516
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +02001517 configure_sgsn_peer(&sgsn_peer);
1518 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001519
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +02001520 printf("=== %s ===\n", __func__);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001521 printf("--- Initialise SGSN ---\n\n");
1522
Jacob Erlbeck12356062014-08-27 12:44:25 +02001523 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001524 gprs_dump_nsi(nsi);
1525
1526 printf("--- Initialise BSS 1 ---\n\n");
1527
1528 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[0]);
1529 gprs_dump_nsi(nsi);
1530
1531 printf("--- Setup BVCI 1 ---\n\n");
1532
1533 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1534 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001535 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001536
1537 printf("--- Setup BVCI 2 ---\n\n");
1538
1539 setup_bssgp(nsi, &bss_peer[0], bvci[1]);
1540 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[1]);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001541 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001542
1543 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1544
1545 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1546 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1547
1548 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 ---\n\n");
1549
1550 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
1551 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
1552
1553 printf("--- Change NSEI ---\n\n");
1554
1555 setup_ns(nsi, &bss_peer[0], nsvci[0], nsei[1]);
1556 gprs_dump_nsi(nsi);
1557
1558 printf("--- Setup BVCI 1 ---\n\n");
1559
1560 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1561 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001562 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001563
1564 printf("--- Setup BVCI 3 ---\n\n");
1565
1566 setup_bssgp(nsi, &bss_peer[0], bvci[2]);
1567 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[2]);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001568 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001569
1570 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1571
1572 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1573 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1574
1575 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1576 " (should fail) ---\n\n");
1577
1578 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001579 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001580 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001581 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001582
1583 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1584
1585 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1586 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1587
1588 printf("--- Change NSVCI ---\n\n");
1589
1590 setup_ns(nsi, &bss_peer[0], nsvci[1], nsei[1]);
1591 gprs_dump_nsi(nsi);
1592
1593 printf("--- Setup BVCI 1 ---\n\n");
1594
1595 setup_bssgp(nsi, &bss_peer[0], bvci[0]);
1596 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[0]);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001597 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001598
1599 printf("--- Setup BVCI 4 ---\n\n");
1600
1601 setup_bssgp(nsi, &bss_peer[0], bvci[3]);
1602 send_bssgp_reset_ack(nsi, &sgsn_peer, bvci[3]);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001603 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001604
1605 printf("--- Send message from BSS 1 to SGSN and back, BVCI 1 ---\n\n");
1606
1607 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[0], (uint8_t *)"", 0);
1608 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[0], (uint8_t *)"", 0);
1609
1610 printf("--- Send message from BSS 1 to SGSN and back, BVCI 2 "
1611 " (should fail) ---\n\n");
1612
1613 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001614 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001615 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[1], (uint8_t *)"", 0);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001616 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001617
1618 printf("--- Send message from BSS 1 to SGSN and back, BVCI 3 ---\n\n");
1619
1620 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[2], (uint8_t *)"", 0);
1621 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[2], (uint8_t *)"", 0);
1622
1623 printf("--- Send message from BSS 1 to SGSN and back, BVCI 4 ---\n\n");
1624
1625 send_ns_unitdata(nsi, NULL, &bss_peer[0], bvci[3], (uint8_t *)"", 0);
1626 send_ns_unitdata(nsi, NULL, &sgsn_peer, bvci[3], (uint8_t *)"", 0);
1627
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +02001628 dump_global(stdout, 0);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001629 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001630
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +02001631 gbprox_reset(&gbcfg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02001632 gprs_ns_destroy(nsi);
1633 nsi = NULL;
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02001634}
1635
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001636static void test_gbproxy_ra_patching()
1637{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01001638 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001639 struct sockaddr_in bss_peer[1] = {{0},};
1640 struct sockaddr_in sgsn_peer= {0};
1641 struct gprs_ra_id rai_bss =
1642 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1643 struct gprs_ra_id rai_sgsn =
1644 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
1645 struct gprs_ra_id rai_unknown =
1646 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001647 uint16_t cell_id = 0x7530;
Jacob Erlbeck43037632014-06-06 18:49:23 +02001648 const char *err_msg = NULL;
Jacob Erlbeck31132872014-08-11 17:26:21 +02001649 const uint32_t ptmsi = 0xefe2b700;
1650 const uint32_t local_tlli = 0xefe2b700;
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001651 const uint32_t foreign_tlli = 0xbbc54679;
Jacob Erlbeck89aa65b2014-09-12 10:33:38 +02001652 const uint32_t foreign_tlli2 = 0xbb00beef;
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001653 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02001654 const char *patch_re = "^9898|^121314";
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02001655 struct gbproxy_link_info *link_info;
Jacob Erlbeck31132872014-08-11 17:26:21 +02001656 struct gbproxy_peer *peer;
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001657 LLIST_HEAD(rcv_list);
Jacob Erlbeck4c70e712014-10-10 09:48:12 +02001658 struct expect_result *expect_res;
Jacob Erlbeck31132872014-08-11 17:26:21 +02001659
1660 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001661
1662 bssgp_nsi = nsi;
1663 gbcfg.nsi = bssgp_nsi;
1664 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +01001665 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01001666 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Holger Hans Peter Freyther2d10ad12014-08-04 14:22:13 +02001667 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
Jacob Erlbeck383c8412014-08-12 16:30:30 +02001668 gbcfg.patch_ptmsi = 0;
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001669
Holger Hans Peter Freyther731097d2014-07-07 14:19:10 +02001670 configure_sgsn_peer(&sgsn_peer);
1671 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001672
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02001673 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING],
1674 patch_re, &err_msg) != 0) {
Jacob Erlbeck43037632014-06-06 18:49:23 +02001675 fprintf(stderr, "Failed to compile RE '%s': %s\n",
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02001676 patch_re, err_msg);
Jacob Erlbeck43037632014-06-06 18:49:23 +02001677 exit(1);
1678 }
1679
1680
Jacob Erlbeck03a2ee22014-07-09 23:19:11 +02001681 printf("=== %s ===\n", __func__);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001682 printf("--- Initialise SGSN ---\n\n");
1683
Jacob Erlbeck12356062014-08-27 12:44:25 +02001684 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001685 gprs_dump_nsi(nsi);
1686
1687 printf("--- Initialise BSS 1 ---\n\n");
1688
1689 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001690
1691 received_messages = &rcv_list;
1692
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001693 setup_bssgp(nsi, &bss_peer[0], 0x1002);
1694 gprs_dump_nsi(nsi);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001695 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001696
Jacob Erlbeck040fabc2014-08-21 10:01:30 +02001697 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck31132872014-08-11 17:26:21 +02001698 OSMO_ASSERT(peer != NULL);
1699
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001700 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_BVC_RESET));
1701
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001702 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
1703
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001704 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_BVC_RESET_ACK));
1705
Jacob Erlbeck2937b512014-08-21 16:34:18 +02001706 send_bssgp_suspend(nsi, &bss_peer[0], 0xccd1758b, &rai_bss);
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001707
1708 OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_SUSPEND));
1709
Jacob Erlbeck2937b512014-08-21 16:34:18 +02001710 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_sgsn);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001711
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001712 OSMO_ASSERT(expect_bssgp_msg(0x1000, 0, BSSGP_PDUT_SUSPEND_ACK));
1713
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +02001714 dump_global(stdout, 0);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001715 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001716
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001717 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1718 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1719
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001720 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
1721
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001722 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
1723 foreign_tlli, &rai_bss, cell_id,
1724 GPRS_SAPI_GMM, 0,
1725 dtap_attach_req, sizeof(dtap_attach_req));
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001726
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001727 OSMO_ASSERT(4 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001728 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001729
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001730 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
1731 foreign_tlli, 0, NULL, 0,
1732 GPRS_SAPI_GMM, 0,
1733 dtap_identity_req, sizeof(dtap_identity_req));
Jacob Erlbeckdc6dcdf2014-08-06 15:16:45 +02001734
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001735 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
1736
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001737 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
1738 foreign_tlli, &rai_bss, cell_id,
1739 GPRS_SAPI_GMM, 3,
1740 dtap_identity_resp, sizeof(dtap_identity_resp));
Jacob Erlbeckdc6dcdf2014-08-06 15:16:45 +02001741
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001742 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
1743
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001744 OSMO_ASSERT(5 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1745 OSMO_ASSERT(1 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1746
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001747 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
1748 foreign_tlli, 1, imsi, sizeof(imsi),
1749 GPRS_SAPI_GMM, 1,
1750 dtap_attach_acc, sizeof(dtap_attach_acc));
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001751
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001752 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
1753
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001754 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1755
Jacob Erlbeckdab8a6d2014-09-04 11:08:50 +02001756 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1757 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1758 OSMO_ASSERT(gbproxy_peer_by_rai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1759
1760 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_bss)) != NULL);
1761 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_sgsn)) == NULL);
1762 OSMO_ASSERT(gbproxy_peer_by_lai(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1763
1764 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_bss)) != NULL);
1765 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_sgsn)) != NULL);
1766 OSMO_ASSERT(gbproxy_peer_by_lac(&gbcfg, convert_ra(&rai_unknown)) == NULL);
1767
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02001768 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1769 OSMO_ASSERT(link_info);
1770 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1771 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1772 OSMO_ASSERT(!link_info->tlli.bss_validated);
1773 OSMO_ASSERT(!link_info->tlli.net_validated);
1774 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1775 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1776 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
1777 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck31132872014-08-11 17:26:21 +02001778
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001779 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
1780 local_tlli, &rai_bss, cell_id,
1781 GPRS_SAPI_GMM, 4,
1782 dtap_attach_complete, sizeof(dtap_attach_complete));
Jacob Erlbeck31132872014-08-11 17:26:21 +02001783
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001784 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
1785
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001786 OSMO_ASSERT(6 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1787
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02001788 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1789 OSMO_ASSERT(link_info);
1790 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1791 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1792 OSMO_ASSERT(link_info->tlli.bss_validated);
1793 OSMO_ASSERT(!link_info->tlli.net_validated);
1794 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1795 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1796 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1797 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck31132872014-08-11 17:26:21 +02001798
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001799 /* Replace APN (1) */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001800 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1801 local_tlli, &rai_bss, cell_id,
1802 GPRS_SAPI_GMM, 3,
1803 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001804
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001805 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1806
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001807 OSMO_ASSERT(7 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1808
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02001809 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1810 OSMO_ASSERT(link_info);
1811 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
1812 OSMO_ASSERT(link_info->tlli.current != local_tlli);
1813 OSMO_ASSERT(link_info->tlli.bss_validated);
1814 OSMO_ASSERT(!link_info->tlli.net_validated);
1815 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_tlli);
1816 OSMO_ASSERT(link_info->sgsn_tlli.current != local_tlli);
1817 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
1818 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck31132872014-08-11 17:26:21 +02001819
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001820 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
1821 local_tlli, 1, imsi, sizeof(imsi),
1822 GPRS_SAPI_GMM, 2,
1823 dtap_gmm_information, sizeof(dtap_gmm_information));
Jacob Erlbeckab7366f2014-06-06 18:47:36 +02001824
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001825 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
1826
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001827 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1828
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02001829 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_tlli, SGSN_NSEI);
1830 OSMO_ASSERT(link_info);
1831 OSMO_ASSERT(link_info->tlli.assigned == 0);
1832 OSMO_ASSERT(link_info->tlli.current == local_tlli);
1833 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
1834 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
Jacob Erlbeck31132872014-08-11 17:26:21 +02001835
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001836 /* Replace APN (2) */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001837 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
1838 local_tlli, &rai_bss, cell_id,
1839 GPRS_SAPI_GMM, 3,
1840 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001841
Jacob Erlbeck4c70e712014-10-10 09:48:12 +02001842 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1843 OSMO_ASSERT(expect_res != NULL);
1844 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == gbcfg.core_apn_size + 2);
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001845
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001846 OSMO_ASSERT(8 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1847
Jacob Erlbeck5620c6d2014-05-23 20:48:07 +02001848 gbcfg.core_apn[0] = 0;
1849 gbcfg.core_apn_size = 0;
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001850
1851 /* Remove APN */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001852 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1853 local_tlli, &rai_bss, cell_id,
1854 GPRS_SAPI_GMM, 3,
1855 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001856
Jacob Erlbeck4c70e712014-10-10 09:48:12 +02001857 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1858 OSMO_ASSERT(expect_res != NULL);
1859 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001860
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001861 OSMO_ASSERT(9 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1862
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001863 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001864
Jacob Erlbeckbf6020f2014-06-19 10:23:50 +02001865 /* Detach */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001866 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
1867 local_tlli, &rai_bss, cell_id,
1868 GPRS_SAPI_GMM, 6,
1869 dtap_detach_req, sizeof(dtap_detach_req));
Jacob Erlbeckbf6020f2014-06-19 10:23:50 +02001870
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001871 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1872
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001873 OSMO_ASSERT(10 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1874 OSMO_ASSERT(2 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1875
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001876 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
1877 local_tlli, 1, imsi, sizeof(imsi),
1878 GPRS_SAPI_GMM, 5,
1879 dtap_detach_acc, sizeof(dtap_detach_acc));
Jacob Erlbeckbf6020f2014-06-19 10:23:50 +02001880
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001881 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
1882
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001883 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001884
1885 printf("--- RA update ---\n\n");
1886
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001887 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
1888 foreign_tlli, &rai_bss, 0x7080,
1889 GPRS_SAPI_GMM, 5,
1890 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001891
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001892 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
1893
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001894 OSMO_ASSERT(12 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1895
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001896 send_llc_dl_ui(nsi, "RA UPD ACC", &sgsn_peer, 0x1002,
1897 foreign_tlli, 1, imsi, sizeof(imsi),
1898 GPRS_SAPI_GMM, 6,
1899 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001900
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001901 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_ACK));
1902
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001903 OSMO_ASSERT(3 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_SGSN].current);
1904
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001905 /* Remove APN */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001906 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REMOVE APN)", &bss_peer[0], 0x1002,
1907 local_tlli, &rai_bss, cell_id,
1908 GPRS_SAPI_GMM, 3,
1909 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001910
Jacob Erlbeck4c70e712014-10-10 09:48:12 +02001911 expect_res = expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ);
1912 OSMO_ASSERT(expect_res != NULL);
1913 OSMO_ASSERT(expect_res->parse_ctx.apn_ie_len == 0);
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001914
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001915 OSMO_ASSERT(13 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1916
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001917 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001918
Jacob Erlbeckf95340d2014-08-11 15:07:37 +02001919 /* Detach (power off -> no Detach Accept) */
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001920 send_llc_ul_ui(nsi, "DETACH REQ (PWR OFF)", &bss_peer[0], 0x1002,
1921 local_tlli, &rai_bss, cell_id,
1922 GPRS_SAPI_GMM, 6,
1923 dtap_detach_po_req, sizeof(dtap_detach_po_req));
Jacob Erlbeck386621c2014-06-27 11:55:04 +02001924
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001925 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
1926
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001927 OSMO_ASSERT(14 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1928
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +02001929 dump_global(stdout, 0);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001930 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001931
1932 printf("--- Bad cases ---\n\n");
1933
Jacob Erlbeck89aa65b2014-09-12 10:33:38 +02001934 /* The RAI in the Attach Request message differs from the RAI in the
1935 * BSSGP message, only patch the latter */
1936
1937 send_llc_ul_ui(nsi, "ATTACH REQUEST (foreign RAI)", &bss_peer[0], 0x1002,
1938 foreign_tlli2, &rai_bss, cell_id,
1939 GPRS_SAPI_GMM, 0,
1940 dtap_attach_req2, sizeof(dtap_attach_req2));
1941
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001942 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
1943
Jacob Erlbeck550898a2014-09-11 15:22:18 +02001944 OSMO_ASSERT(15 == peer->ctrg->ctr[GBPROX_PEER_CTR_RAID_PATCHED_BSS].current);
1945
Jacob Erlbeck43037632014-06-06 18:49:23 +02001946 printf("TLLI is already detached, shouldn't patch\n");
Jacob Erlbeck322d9f92014-08-15 14:56:28 +02001947 send_llc_ul_ui(nsi, "ACT PDP CTX REQ", &bss_peer[0], 0x1002,
1948 local_tlli, &rai_bss, cell_id,
1949 GPRS_SAPI_GMM, 3,
1950 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
Jacob Erlbeckbf6020f2014-06-19 10:23:50 +02001951
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001952 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GSM_ACT_PDP_REQ));
1953
Jacob Erlbeck90a1fd12014-05-27 13:49:04 +02001954 printf("Invalid RAI, shouldn't patch\n");
Jacob Erlbeck2937b512014-08-21 16:34:18 +02001955 send_bssgp_suspend_ack(nsi, &sgsn_peer, 0xccd1758b, &rai_unknown);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001956
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001957 /* TODO: The following breaks with the current libosmocore, enable it
1958 * again (and remove the plain expect_msg), when the msgb_bssgph patch
1959 * is integrated */
1960 /* OSMO_ASSERT(expect_bssgp_msg(SGSN_NSEI, 0, BSSGP_PDUT_STATUS)); */
1961 OSMO_ASSERT(expect_msg());
1962
Holger Hans Peter Freytherf28f8f52014-08-04 11:26:54 +02001963 dump_global(stdout, 0);
Jacob Erlbeckc404c082014-08-08 08:37:37 +02001964 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001965
Jacob Erlbecke4b5f382014-09-23 14:56:38 +02001966 OSMO_ASSERT(!expect_msg());
1967 received_messages = NULL;
1968
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02001969 talloc_free(gbcfg.core_apn);
1970 gbcfg.core_apn = NULL;
1971
Jacob Erlbeck8fbf44a2014-09-25 11:21:34 +02001972 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_PATCHING]);
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +02001973 gbprox_reset(&gbcfg);
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001974 gprs_ns_destroy(nsi);
1975 nsi = NULL;
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02001976}
1977
Jacob Erlbeck571aec32014-09-18 09:21:20 +02001978static void test_gbproxy_ptmsi_assignment()
1979{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01001980 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck571aec32014-09-18 09:21:20 +02001981 struct sockaddr_in bss_peer[1] = {{0},};
1982 struct sockaddr_in sgsn_peer= {0};
1983 struct gprs_ra_id rai_bss =
1984 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
1985 struct gprs_ra_id rai_unknown =
1986 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
1987 uint16_t cell_id = 0x1234;
1988
1989 const uint32_t ptmsi = 0xefe2b700;
1990 const uint32_t local_tlli = 0xefe2b700;
1991
1992 const uint32_t foreign_tlli1 = 0x8000dead;
1993 const uint32_t foreign_tlli2 = 0x8000beef;
1994
1995 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
1996 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
1997
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02001998 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck571aec32014-09-18 09:21:20 +02001999 struct gbproxy_peer *peer;
2000 unsigned bss_nu = 0;
2001 unsigned sgsn_nu = 0;
2002
2003 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
2004
2005 bssgp_nsi = nsi;
2006 gbcfg.nsi = bssgp_nsi;
2007 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +01002008 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01002009 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002010 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2011 gbcfg.patch_ptmsi = 0;
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002012
2013 configure_sgsn_peer(&sgsn_peer);
2014 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2015
2016 printf("=== %s ===\n", __func__);
2017 printf("--- Initialise SGSN ---\n\n");
2018
2019 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2020
2021 printf("--- Initialise BSS 1 ---\n\n");
2022
2023 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2024 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2025
2026 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2027 OSMO_ASSERT(peer != NULL);
2028
2029 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2030
2031 gprs_dump_nsi(nsi);
2032 dump_global(stdout, 0);
2033 dump_peers(stdout, 0, 0, &gbcfg);
2034
2035 printf("--- Establish first LLC connection ---\n\n");
2036
2037 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2038 foreign_tlli1, &rai_unknown, cell_id,
2039 GPRS_SAPI_GMM, bss_nu++,
2040 dtap_attach_req, sizeof(dtap_attach_req));
2041
2042 dump_peers(stdout, 0, 0, &gbcfg);
2043
2044 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2045 foreign_tlli1, 0, NULL, 0,
2046 GPRS_SAPI_GMM, sgsn_nu++,
2047 dtap_identity_req, sizeof(dtap_identity_req));
2048
2049 dump_peers(stdout, 0, 0, &gbcfg);
2050
2051 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2052 foreign_tlli1, &rai_bss, cell_id,
2053 GPRS_SAPI_GMM, bss_nu++,
2054 dtap_identity_resp, sizeof(dtap_identity_resp));
2055
2056 dump_peers(stdout, 0, 0, &gbcfg);
2057
2058 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2059 foreign_tlli1, 1, imsi1, sizeof(imsi1),
2060 GPRS_SAPI_GMM, sgsn_nu++,
2061 dtap_attach_acc, sizeof(dtap_attach_acc));
2062
2063 dump_peers(stdout, 0, 0, &gbcfg);
2064
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002065 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli1);
2066 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2067 OSMO_ASSERT(link_info);
2068 OSMO_ASSERT(link_info == link_info2);
2069 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2070 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2071 OSMO_ASSERT(!link_info->tlli.bss_validated);
2072 OSMO_ASSERT(!link_info->tlli.net_validated);
2073 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002074
2075 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2076 local_tlli, &rai_bss, cell_id,
2077 GPRS_SAPI_GMM, bss_nu++,
2078 dtap_attach_complete, sizeof(dtap_attach_complete));
2079
2080 dump_peers(stdout, 0, 0, &gbcfg);
2081
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002082 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2083 OSMO_ASSERT(link_info);
2084 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2085 OSMO_ASSERT(link_info->tlli.current == foreign_tlli1);
2086 OSMO_ASSERT(link_info->tlli.bss_validated);
2087 OSMO_ASSERT(!link_info->tlli.net_validated);
2088 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002089
2090
2091 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2092 local_tlli, 1, imsi1, sizeof(imsi1),
2093 GPRS_SAPI_GMM, sgsn_nu++,
2094 dtap_gmm_information, sizeof(dtap_gmm_information));
2095
2096 dump_peers(stdout, 0, 0, &gbcfg);
2097
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002098 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
2099 OSMO_ASSERT(link_info);
2100 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2101 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2)));
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002102
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002103 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2104 OSMO_ASSERT(link_info == link_info2);
2105 OSMO_ASSERT(link_info->tlli.assigned == 0);
2106 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2107 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002108
2109 printf("--- Establish second LLC connection with the same P-TMSI ---\n\n");
2110
2111 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2112 foreign_tlli2, &rai_unknown, cell_id,
2113 GPRS_SAPI_GMM, bss_nu++,
2114 dtap_attach_req, sizeof(dtap_attach_req));
2115
2116 dump_peers(stdout, 0, 0, &gbcfg);
2117
2118 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2119 foreign_tlli2, 0, NULL, 0,
2120 GPRS_SAPI_GMM, sgsn_nu++,
2121 dtap_identity_req, sizeof(dtap_identity_req));
2122
2123 dump_peers(stdout, 0, 0, &gbcfg);
2124
2125 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2126 foreign_tlli2, &rai_bss, cell_id,
2127 GPRS_SAPI_GMM, bss_nu++,
2128 dtap_identity2_resp, sizeof(dtap_identity2_resp));
2129
2130 dump_peers(stdout, 0, 0, &gbcfg);
2131
2132 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2133 foreign_tlli2, 1, imsi2, sizeof(imsi2),
2134 GPRS_SAPI_GMM, sgsn_nu++,
2135 dtap_attach_acc, sizeof(dtap_attach_acc));
2136
2137 dump_peers(stdout, 0, 0, &gbcfg);
2138
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002139 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli2);
2140 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2141 OSMO_ASSERT(link_info);
2142 OSMO_ASSERT(link_info == link_info2);
2143 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2144 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2145 OSMO_ASSERT(!link_info->tlli.bss_validated);
2146 OSMO_ASSERT(!link_info->tlli.net_validated);
2147 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002148
2149 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2150 local_tlli, &rai_bss, cell_id,
2151 GPRS_SAPI_GMM, bss_nu++,
2152 dtap_attach_complete, sizeof(dtap_attach_complete));
2153
2154 dump_peers(stdout, 0, 0, &gbcfg);
2155
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002156 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
2157 OSMO_ASSERT(link_info);
2158 OSMO_ASSERT(link_info->tlli.assigned == local_tlli);
2159 OSMO_ASSERT(link_info->tlli.current == foreign_tlli2);
2160 OSMO_ASSERT(link_info->tlli.bss_validated);
2161 OSMO_ASSERT(!link_info->tlli.net_validated);
2162 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002163
2164 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2165 local_tlli, 1, imsi2, sizeof(imsi2),
2166 GPRS_SAPI_GMM, sgsn_nu++,
2167 dtap_gmm_information, sizeof(dtap_gmm_information));
2168
2169 dump_peers(stdout, 0, 0, &gbcfg);
2170
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002171 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
2172 OSMO_ASSERT(link_info);
2173 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
2174 OSMO_ASSERT(!gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1)));
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002175
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002176 link_info2 = gbproxy_link_info_by_tlli(peer, local_tlli);
2177 OSMO_ASSERT(link_info == link_info2);
2178 OSMO_ASSERT(link_info->tlli.assigned == 0);
2179 OSMO_ASSERT(link_info->tlli.current == local_tlli);
2180 OSMO_ASSERT(link_info->tlli.ptmsi == ptmsi);
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002181
2182 dump_global(stdout, 0);
2183
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02002184 talloc_free(gbcfg.core_apn);
2185 gbcfg.core_apn = NULL;
2186
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002187 gbprox_reset(&gbcfg);
2188 gprs_ns_destroy(nsi);
2189 nsi = NULL;
Daniel Willmann1e0b0002015-10-12 19:36:34 +02002190
2191 cleanup_test();
Jacob Erlbeck571aec32014-09-18 09:21:20 +02002192}
2193
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002194static void test_gbproxy_ptmsi_patching()
2195{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01002196 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002197 struct sockaddr_in bss_peer[1] = {{0},};
2198 struct sockaddr_in sgsn_peer= {0};
2199 struct gprs_ra_id rai_bss =
2200 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2201 struct gprs_ra_id rai_sgsn =
2202 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002203 struct gprs_ra_id rai_wrong_mcc_sgsn =
2204 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002205 struct gprs_ra_id rai_unknown =
2206 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2207 uint16_t cell_id = 0x1234;
2208
2209 const uint32_t sgsn_ptmsi = 0xefe2b700;
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002210 const uint32_t sgsn_ptmsi2 = 0xe0987654;
2211 const uint32_t sgsn_ptmsi3 = 0xe0543210;
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002212 const uint32_t local_sgsn_tlli = 0xefe2b700;
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002213 const uint32_t local_sgsn_tlli2 = 0xe0987654;
2214 const uint32_t local_sgsn_tlli3 = 0xe0543210;
Daniel Willmann2b10af32015-10-12 19:36:35 +02002215 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeckdab8a6d2014-09-04 11:08:50 +02002216 const uint32_t unknown_sgsn_tlli = 0xeebadbad;
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002217
Daniel Willmann2b10af32015-10-12 19:36:35 +02002218 const uint32_t bss_ptmsi = 0xc0dead01;
2219 const uint32_t bss_ptmsi2 = 0xc0dead02;
2220 const uint32_t bss_ptmsi3 = 0xc0dead03;
2221 const uint32_t local_bss_tlli = 0xc0dead01;
2222 const uint32_t local_bss_tlli2 = 0xc0dead02;
2223 const uint32_t local_bss_tlli3 = 0xc0dead03;
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002224 const uint32_t foreign_bss_tlli = 0x8000dead;
2225
Jacob Erlbeckdab8a6d2014-09-04 11:08:50 +02002226
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002227 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002228 struct gbproxy_link_info *link_info;
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002229 struct gbproxy_peer *peer;
2230 unsigned bss_nu = 0;
2231 unsigned sgsn_nu = 0;
Jacob Erlbeckd5f24fd2014-09-30 13:49:43 +02002232 int old_ctr;
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002233
2234 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002235 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
2236 OSMO_ASSERT(local_sgsn_tlli3 == gprs_tmsi2tlli(sgsn_ptmsi3, TLLI_LOCAL));
2237 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2238 OSMO_ASSERT(local_bss_tlli2 == gprs_tmsi2tlli(bss_ptmsi2, TLLI_LOCAL));
2239 OSMO_ASSERT(local_bss_tlli3 == gprs_tmsi2tlli(bss_ptmsi3, TLLI_LOCAL));
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002240
2241 bssgp_nsi = nsi;
2242 gbcfg.nsi = bssgp_nsi;
2243 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +01002244 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01002245 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002246 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2247 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002248
2249 configure_sgsn_peer(&sgsn_peer);
2250 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2251
2252 printf("=== %s ===\n", __func__);
2253 printf("--- Initialise SGSN ---\n\n");
2254
Jacob Erlbeck12356062014-08-27 12:44:25 +02002255 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002256
2257 printf("--- Initialise BSS 1 ---\n\n");
2258
2259 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2260 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2261
Jacob Erlbeck040fabc2014-08-21 10:01:30 +02002262 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002263 OSMO_ASSERT(peer != NULL);
2264
2265 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2266
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002267 gprs_dump_nsi(nsi);
2268 dump_global(stdout, 0);
2269 dump_peers(stdout, 0, 0, &gbcfg);
2270
2271 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2272
2273 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2274 foreign_bss_tlli, &rai_unknown, cell_id,
2275 GPRS_SAPI_GMM, bss_nu++,
2276 dtap_attach_req, sizeof(dtap_attach_req));
2277
2278 dump_peers(stdout, 0, 0, &gbcfg);
2279
2280 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2281 random_sgsn_tlli, 0, NULL, 0,
2282 GPRS_SAPI_GMM, sgsn_nu++,
2283 dtap_identity_req, sizeof(dtap_identity_req));
2284
2285 dump_peers(stdout, 0, 0, &gbcfg);
2286
2287 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2288 foreign_bss_tlli, &rai_bss, cell_id,
2289 GPRS_SAPI_GMM, bss_nu++,
2290 dtap_identity_resp, sizeof(dtap_identity_resp));
2291
2292 dump_peers(stdout, 0, 0, &gbcfg);
2293
2294 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2295 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2296 GPRS_SAPI_GMM, sgsn_nu++,
2297 dtap_attach_acc, sizeof(dtap_attach_acc));
2298
2299 dump_peers(stdout, 0, 0, &gbcfg);
2300
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002301 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2302 OSMO_ASSERT(link_info);
2303 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2304 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2305 OSMO_ASSERT(!link_info->tlli.bss_validated);
2306 OSMO_ASSERT(!link_info->tlli.net_validated);
2307 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2308 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2309 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2310 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2311 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2312 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002313
2314 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2315 local_bss_tlli, &rai_bss, cell_id,
2316 GPRS_SAPI_GMM, bss_nu++,
2317 dtap_attach_complete, sizeof(dtap_attach_complete));
2318
2319 dump_peers(stdout, 0, 0, &gbcfg);
2320
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002321 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2322 OSMO_ASSERT(link_info);
2323 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2324 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2325 OSMO_ASSERT(link_info->tlli.bss_validated);
2326 OSMO_ASSERT(!link_info->tlli.net_validated);
2327 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2328 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2329 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2330 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002331
2332 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2333 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2334 GPRS_SAPI_GMM, sgsn_nu++,
2335 dtap_gmm_information, sizeof(dtap_gmm_information));
2336
2337 dump_peers(stdout, 0, 0, &gbcfg);
2338
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002339 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2340 OSMO_ASSERT(link_info);
2341 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2342 OSMO_ASSERT(link_info->tlli.assigned == 0);
2343 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2344 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002345
Jacob Erlbeck03e02ac2014-09-05 18:08:12 +02002346 send_llc_ul_ui(nsi, "ACT PDP CTX REQ (REPLACE APN)", &bss_peer[0], 0x1002,
2347 local_bss_tlli, &rai_bss, cell_id,
2348 GPRS_SAPI_GMM, bss_nu++,
2349 dtap_act_pdp_ctx_req, sizeof(dtap_act_pdp_ctx_req));
2350
2351 dump_peers(stdout, 0, 0, &gbcfg);
2352
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002353 /* Non-DTAP */
2354 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2355 local_bss_tlli, &rai_bss, cell_id,
2356 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2357
2358 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2359 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2360 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2361
2362 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2363 local_bss_tlli, &rai_bss, cell_id,
2364 llc_ui_ll11_dns_query_ul,
2365 sizeof(llc_ui_ll11_dns_query_ul));
2366
2367 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2368 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2369 llc_ui_ll11_dns_resp_dl,
2370 sizeof(llc_ui_ll11_dns_resp_dl));
2371
2372 dump_peers(stdout, 0, 0, &gbcfg);
2373
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002374 /* Repeated RA Update Requests */
2375 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 2)", &bss_peer[0], 0x1002,
2376 local_bss_tlli, &rai_bss, 0x7080,
2377 GPRS_SAPI_GMM, bss_nu++,
2378 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2379
2380 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 2)", &sgsn_peer, 0x1002,
2381 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2382 GPRS_SAPI_GMM, sgsn_nu++,
2383 dtap_ra_upd_acc2, sizeof(dtap_ra_upd_acc2));
2384
2385 dump_peers(stdout, 0, 0, &gbcfg);
2386
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002387 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) != NULL);
2388 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2389 OSMO_ASSERT(link_info);
2390 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
2391 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2392 OSMO_ASSERT(!link_info->tlli.bss_validated);
2393 OSMO_ASSERT(!link_info->tlli.net_validated);
2394 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
2395 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
2396 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2397 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2398 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2399 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002400
2401 send_llc_ul_ui(nsi, "RA UPD REQ (P-TMSI 3)", &bss_peer[0], 0x1002,
2402 local_bss_tlli2, &rai_bss, 0x7080,
2403 GPRS_SAPI_GMM, bss_nu++,
2404 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2405
2406 send_llc_dl_ui(nsi, "RA UDP ACC (P-TMSI 3)", &sgsn_peer, 0x1002,
2407 local_sgsn_tlli2, 1, imsi, sizeof(imsi),
2408 GPRS_SAPI_GMM, sgsn_nu++,
2409 dtap_ra_upd_acc3, sizeof(dtap_ra_upd_acc3));
2410
2411 dump_peers(stdout, 0, 0, &gbcfg);
2412
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002413 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI) == NULL);
2414 OSMO_ASSERT(gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI) != NULL);
2415 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2416 OSMO_ASSERT(link_info);
2417 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
2418 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2419 OSMO_ASSERT(!link_info->tlli.bss_validated);
2420 OSMO_ASSERT(!link_info->tlli.net_validated);
2421 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
2422 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli3);
2423 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2424 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2425 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2426 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi3);
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002427
2428 send_llc_ul_ui(nsi, "RA UPD COMPLETE", &bss_peer[0], 0x1002,
2429 local_bss_tlli3, &rai_bss, 0x7080,
2430 GPRS_SAPI_GMM, bss_nu++,
2431 dtap_ra_upd_complete, sizeof(dtap_ra_upd_complete));
2432
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002433 link_info = gbproxy_link_info_by_tlli(peer, local_bss_tlli3);
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002434
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002435 OSMO_ASSERT(link_info);
2436 OSMO_ASSERT(link_info->tlli.bss_validated);
2437 OSMO_ASSERT(!link_info->tlli.net_validated);
2438 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2439 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002440
2441 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2442 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
2443 GPRS_SAPI_GMM, sgsn_nu++,
2444 dtap_gmm_information, sizeof(dtap_gmm_information));
2445
2446 dump_peers(stdout, 0, 0, &gbcfg);
2447
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002448 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli3, SGSN_NSEI);
2449 OSMO_ASSERT(link_info);
2450 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
2451 OSMO_ASSERT(link_info->tlli.assigned == 0);
2452 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli3);
2453 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002454
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002455 /* Other messages */
2456 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002457 local_bss_tlli3, 1, 12);
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002458
2459 dump_peers(stdout, 0, 0, &gbcfg);
2460
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002461 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli3, &rai_bss);
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002462
2463 dump_peers(stdout, 0, 0, &gbcfg);
2464
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002465 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_sgsn);
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002466
2467 dump_peers(stdout, 0, 0, &gbcfg);
2468
Jacob Erlbeckd5f24fd2014-09-30 13:49:43 +02002469 old_ctr = peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current;
2470
2471 send_bssgp_paging(nsi, &sgsn_peer, imsi, sizeof(imsi), &rai_bss, sgsn_ptmsi3);
2472
2473 dump_peers(stdout, 0, 0, &gbcfg);
2474
2475 OSMO_ASSERT(old_ctr + 1 ==
2476 peer->ctrg->ctr[GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN].current);
2477
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002478 /* Bad case: Invalid BVCI */
2479 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002480 local_bss_tlli3, 1, 12);
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002481 dump_global(stdout, 0);
2482
2483 /* Bad case: Invalid RAI */
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002484 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3, &rai_unknown);
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002485
2486 dump_global(stdout, 0);
2487
2488 /* Bad case: Invalid MCC (LAC ok) */
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002489 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli3,
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002490 &rai_wrong_mcc_sgsn);
2491
2492 dump_global(stdout, 0);
2493
Jacob Erlbeckdab8a6d2014-09-04 11:08:50 +02002494 /* Bad case: Invalid TLLI from SGSN (IMSI unknown) */
2495 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2496 unknown_sgsn_tlli, 1, NULL, 0,
2497 GPRS_SAPI_GMM, 2,
2498 dtap_gmm_information, sizeof(dtap_gmm_information));
2499
2500 /* Bad case: Invalid TLLI from SGSN (IMSI known) */
2501 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2502 unknown_sgsn_tlli, 1, imsi, sizeof(imsi),
2503 GPRS_SAPI_GMM, 3,
2504 dtap_gmm_information, sizeof(dtap_gmm_information));
2505
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002506 /* Detach */
2507 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002508 local_bss_tlli3, &rai_bss, cell_id,
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002509 GPRS_SAPI_GMM, bss_nu++,
2510 dtap_detach_req, sizeof(dtap_detach_req));
2511
2512 dump_peers(stdout, 0, 0, &gbcfg);
2513
2514 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
Jacob Erlbeck96f8bc12014-09-04 13:45:56 +02002515 local_sgsn_tlli3, 1, imsi, sizeof(imsi),
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002516 GPRS_SAPI_GMM, sgsn_nu++,
2517 dtap_detach_acc, sizeof(dtap_detach_acc));
2518
2519 dump_peers(stdout, 0, 0, &gbcfg);
Jacob Erlbeck2937b512014-08-21 16:34:18 +02002520
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002521 dump_global(stdout, 0);
2522
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02002523 talloc_free(gbcfg.core_apn);
2524 gbcfg.core_apn = NULL;
2525
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002526 gbprox_reset(&gbcfg);
2527 gprs_ns_destroy(nsi);
2528 nsi = NULL;
Daniel Willmann1e0b0002015-10-12 19:36:34 +02002529
2530 cleanup_test();
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02002531}
2532
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002533static void test_gbproxy_ptmsi_patching_bad_cases()
2534{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01002535 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002536 struct sockaddr_in bss_peer[1] = {{0},};
2537 struct sockaddr_in sgsn_peer= {0};
2538 struct gprs_ra_id rai_bss =
2539 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2540 struct gprs_ra_id rai_unknown =
2541 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2542 uint16_t cell_id = 0x1234;
2543
2544 const uint32_t sgsn_ptmsi = 0xefe2b700;
2545 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann2b10af32015-10-12 19:36:35 +02002546 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002547
Daniel Willmann2b10af32015-10-12 19:36:35 +02002548 const uint32_t bss_ptmsi = 0xc0dead01;
2549 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002550 const uint32_t foreign_bss_tlli = 0x8000dead;
2551
2552
2553 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
2554 struct gbproxy_link_info *link_info;
2555 struct gbproxy_peer *peer;
2556 unsigned bss_nu = 0;
2557 unsigned sgsn_nu = 0;
2558
2559 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2560 OSMO_ASSERT(local_bss_tlli == gprs_tmsi2tlli(bss_ptmsi, TLLI_LOCAL));
2561
2562 bssgp_nsi = nsi;
2563 gbcfg.nsi = bssgp_nsi;
2564 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +01002565 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01002566 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002567 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2568 gbcfg.patch_ptmsi = 1;
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002569
2570 configure_sgsn_peer(&sgsn_peer);
2571 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2572
2573 printf("=== %s ===\n", __func__);
2574 printf("--- Initialise SGSN ---\n\n");
2575
2576 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
2577
2578 printf("--- Initialise BSS 1 ---\n\n");
2579
2580 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2581 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2582
2583 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2584 OSMO_ASSERT(peer != NULL);
2585
2586 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2587
2588 gprs_dump_nsi(nsi);
2589 dump_global(stdout, 0);
2590 dump_peers(stdout, 0, 0, &gbcfg);
2591
2592 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2593
2594 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2595 foreign_bss_tlli, &rai_unknown, cell_id,
2596 GPRS_SAPI_GMM, bss_nu++,
2597 dtap_attach_req, sizeof(dtap_attach_req));
2598
2599 dump_peers(stdout, 0, 0, &gbcfg);
2600
2601 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2602 random_sgsn_tlli, 0, NULL, 0,
2603 GPRS_SAPI_GMM, sgsn_nu++,
2604 dtap_identity_req, sizeof(dtap_identity_req));
2605
2606 dump_peers(stdout, 0, 0, &gbcfg);
2607
2608 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2609 foreign_bss_tlli, &rai_bss, cell_id,
2610 GPRS_SAPI_GMM, bss_nu++,
2611 dtap_identity_resp, sizeof(dtap_identity_resp));
2612
2613 dump_peers(stdout, 0, 0, &gbcfg);
2614
2615 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2616 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2617 GPRS_SAPI_GMM, sgsn_nu++,
2618 dtap_attach_acc, sizeof(dtap_attach_acc));
2619
2620 dump_peers(stdout, 0, 0, &gbcfg);
2621
2622 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2623 OSMO_ASSERT(link_info);
2624 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2625 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2626 OSMO_ASSERT(!link_info->tlli.bss_validated);
2627 OSMO_ASSERT(!link_info->tlli.net_validated);
2628 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2629 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2630 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2631 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2632 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2633 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2634
2635 send_llc_dl_ui(nsi, "ATTACH ACCEPT (duplicated)", &sgsn_peer, 0x1002,
2636 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2637 GPRS_SAPI_GMM, sgsn_nu++,
2638 dtap_attach_acc, sizeof(dtap_attach_acc));
2639
2640 dump_peers(stdout, 0, 0, &gbcfg);
2641
2642 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2643 OSMO_ASSERT(link_info);
Jacob Erlbeck0d1ad5e2014-10-20 16:30:06 +02002644 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002645 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2646 OSMO_ASSERT(!link_info->tlli.bss_validated);
2647 OSMO_ASSERT(!link_info->tlli.net_validated);
Jacob Erlbeck0d1ad5e2014-10-20 16:30:06 +02002648 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002649 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2650 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2651 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2652 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2653 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
2654
2655 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2656 local_bss_tlli, &rai_bss, cell_id,
2657 GPRS_SAPI_GMM, bss_nu++,
2658 dtap_attach_complete, sizeof(dtap_attach_complete));
2659
2660 dump_peers(stdout, 0, 0, &gbcfg);
2661
2662 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2663 OSMO_ASSERT(link_info);
Jacob Erlbeck0d1ad5e2014-10-20 16:30:06 +02002664 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002665 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
Jacob Erlbeck0d1ad5e2014-10-20 16:30:06 +02002666 OSMO_ASSERT(link_info->tlli.bss_validated);
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002667 OSMO_ASSERT(!link_info->tlli.net_validated);
2668 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2669 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
Jacob Erlbeck0d1ad5e2014-10-20 16:30:06 +02002670 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002671 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2672
2673 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2674 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2675 GPRS_SAPI_GMM, sgsn_nu++,
2676 dtap_gmm_information, sizeof(dtap_gmm_information));
2677
2678 dump_peers(stdout, 0, 0, &gbcfg);
2679
2680 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2681 OSMO_ASSERT(link_info);
Jacob Erlbeck0d1ad5e2014-10-20 16:30:06 +02002682 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2683 OSMO_ASSERT(link_info->tlli.assigned == 0);
2684 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2685 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002686
2687 /* Detach */
2688 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2689 local_bss_tlli, &rai_bss, cell_id,
2690 GPRS_SAPI_GMM, bss_nu++,
2691 dtap_detach_req, sizeof(dtap_detach_req));
2692
2693 dump_peers(stdout, 0, 0, &gbcfg);
2694
2695 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2696 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2697 GPRS_SAPI_GMM, sgsn_nu++,
2698 dtap_detach_acc, sizeof(dtap_detach_acc));
2699
2700 dump_peers(stdout, 0, 0, &gbcfg);
2701
2702 dump_global(stdout, 0);
2703
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02002704 talloc_free(gbcfg.core_apn);
2705 gbcfg.core_apn = NULL;
2706
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002707 gbprox_reset(&gbcfg);
2708 gprs_ns_destroy(nsi);
2709 nsi = NULL;
Daniel Willmann1e0b0002015-10-12 19:36:34 +02002710
2711 cleanup_test();
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02002712}
2713
2714
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002715static void test_gbproxy_imsi_acquisition()
2716{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01002717 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002718 struct sockaddr_in bss_peer[1] = {{0},};
2719 struct sockaddr_in sgsn_peer= {0};
2720 struct gprs_ra_id rai_bss =
2721 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
2722 struct gprs_ra_id rai_sgsn =
2723 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
2724 struct gprs_ra_id rai_wrong_mcc_sgsn =
2725 {.mcc = 999, .mnc = 456, .lac = 16464, .rac = 96};
2726 struct gprs_ra_id rai_unknown =
2727 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
2728 uint16_t cell_id = 0x1234;
2729
2730 const uint32_t sgsn_ptmsi = 0xefe2b700;
2731 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann2b10af32015-10-12 19:36:35 +02002732 const uint32_t random_sgsn_tlli = 0x78dead00;
2733 const uint32_t random_sgsn_tlli2 = 0x78dead02;
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002734
Daniel Willmann2b10af32015-10-12 19:36:35 +02002735 const uint32_t bss_ptmsi = 0xc0dead01;
2736 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002737 const uint32_t foreign_bss_tlli = 0x8000dead;
Jacob Erlbeck89aa65b2014-09-12 10:33:38 +02002738 const uint32_t other_bss_tlli = 0x8000beef;
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002739
2740 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002741 struct gbproxy_link_info *link_info;
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002742 struct gbproxy_peer *peer;
2743 unsigned bss_nu = 0;
2744 unsigned sgsn_nu = 0;
2745
2746 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
2747
2748 bssgp_nsi = nsi;
2749 gbcfg.nsi = bssgp_nsi;
2750 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +01002751 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01002752 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002753 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
2754 gbcfg.patch_ptmsi = 1;
Jacob Erlbeck4c0f6982014-08-22 17:10:01 +02002755 gbcfg.acquire_imsi = 1;
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002756
2757 configure_sgsn_peer(&sgsn_peer);
2758 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
2759
2760 printf("=== %s ===\n", __func__);
2761 printf("--- Initialise SGSN ---\n\n");
2762
Jacob Erlbeck12356062014-08-27 12:44:25 +02002763 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002764
2765 printf("--- Initialise BSS 1 ---\n\n");
2766
2767 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
2768 setup_bssgp(nsi, &bss_peer[0], 0x1002);
2769
2770 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
2771 OSMO_ASSERT(peer != NULL);
2772
2773 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
2774
2775 gprs_dump_nsi(nsi);
2776 dump_global(stdout, 0);
2777 dump_peers(stdout, 0, 0, &gbcfg);
2778
2779 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
2780
2781 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
Jacob Erlbeck89aa65b2014-09-12 10:33:38 +02002782 foreign_bss_tlli, &rai_bss, cell_id,
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002783 GPRS_SAPI_GMM, bss_nu++,
2784 dtap_attach_req, sizeof(dtap_attach_req));
2785
2786 dump_peers(stdout, 0, 0, &gbcfg);
2787
Jacob Erlbeck4c0f6982014-08-22 17:10:01 +02002788 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2789 foreign_bss_tlli, &rai_bss, cell_id,
2790 GPRS_SAPI_GMM, bss_nu++,
2791 dtap_identity_resp, sizeof(dtap_identity_resp));
2792
2793 dump_peers(stdout, 0, 0, &gbcfg);
2794
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002795 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
2796 random_sgsn_tlli, 0, NULL, 0,
2797 GPRS_SAPI_GMM, sgsn_nu++,
2798 dtap_identity_req, sizeof(dtap_identity_req));
2799
2800 dump_peers(stdout, 0, 0, &gbcfg);
2801
2802 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2803 foreign_bss_tlli, &rai_bss, cell_id,
2804 GPRS_SAPI_GMM, bss_nu++,
2805 dtap_identity_resp, sizeof(dtap_identity_resp));
2806
2807 dump_peers(stdout, 0, 0, &gbcfg);
2808
2809 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
2810 random_sgsn_tlli, 1, imsi, sizeof(imsi),
2811 GPRS_SAPI_GMM, sgsn_nu++,
2812 dtap_attach_acc, sizeof(dtap_attach_acc));
2813
2814 dump_peers(stdout, 0, 0, &gbcfg);
2815
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002816 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
2817 OSMO_ASSERT(link_info);
2818 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2819 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2820 OSMO_ASSERT(!link_info->tlli.bss_validated);
2821 OSMO_ASSERT(!link_info->tlli.net_validated);
2822 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
2823 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2824 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2825 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
2826 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
2827 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002828
2829 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
2830 local_bss_tlli, &rai_bss, cell_id,
2831 GPRS_SAPI_GMM, bss_nu++,
2832 dtap_attach_complete, sizeof(dtap_attach_complete));
2833
2834 dump_peers(stdout, 0, 0, &gbcfg);
2835
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002836 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2837 OSMO_ASSERT(link_info);
2838 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
2839 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
2840 OSMO_ASSERT(link_info->tlli.bss_validated);
2841 OSMO_ASSERT(!link_info->tlli.net_validated);
2842 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
2843 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
2844 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
2845 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002846
2847 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
2848 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2849 GPRS_SAPI_GMM, sgsn_nu++,
2850 dtap_gmm_information, sizeof(dtap_gmm_information));
2851
2852 dump_peers(stdout, 0, 0, &gbcfg);
2853
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02002854 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
2855 OSMO_ASSERT(link_info);
2856 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
2857 OSMO_ASSERT(link_info->tlli.assigned == 0);
2858 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
2859 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02002860
2861 /* Non-DTAP */
2862 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
2863 local_bss_tlli, &rai_bss, cell_id,
2864 llc_u_xid_ul, sizeof(llc_u_xid_ul));
2865
2866 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer, 0x1002,
2867 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2868 llc_u_xid_dl, sizeof(llc_u_xid_dl));
2869
2870 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
2871 local_bss_tlli, &rai_bss, cell_id,
2872 llc_ui_ll11_dns_query_ul,
2873 sizeof(llc_ui_ll11_dns_query_ul));
2874
2875 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer, 0x1002,
2876 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2877 llc_ui_ll11_dns_resp_dl,
2878 sizeof(llc_ui_ll11_dns_resp_dl));
2879
2880 dump_peers(stdout, 0, 0, &gbcfg);
2881
2882 /* Other messages */
2883 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
2884 local_bss_tlli, 1, 12);
2885
2886 dump_peers(stdout, 0, 0, &gbcfg);
2887
2888 send_bssgp_llc_discarded(nsi, &sgsn_peer, 0x1002,
2889 local_sgsn_tlli, 1, 12);
2890
2891 dump_peers(stdout, 0, 0, &gbcfg);
2892
2893 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
2894
2895 dump_peers(stdout, 0, 0, &gbcfg);
2896
2897 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_sgsn);
2898
2899 dump_peers(stdout, 0, 0, &gbcfg);
2900
2901 /* Bad case: Invalid BVCI */
2902 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0xeee1,
2903 local_bss_tlli, 1, 12);
2904 dump_global(stdout, 0);
2905
2906 /* Bad case: Invalid RAI */
2907 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli, &rai_unknown);
2908
2909 dump_global(stdout, 0);
2910
2911 /* Bad case: Invalid MCC (LAC ok) */
2912 send_bssgp_suspend_ack(nsi, &sgsn_peer, local_sgsn_tlli,
2913 &rai_wrong_mcc_sgsn);
2914
2915 dump_global(stdout, 0);
2916
2917 /* Detach */
2918 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2919 local_bss_tlli, &rai_bss, cell_id,
2920 GPRS_SAPI_GMM, bss_nu++,
2921 dtap_detach_req, sizeof(dtap_detach_req));
2922
2923 dump_peers(stdout, 0, 0, &gbcfg);
2924
2925 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2926 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2927 GPRS_SAPI_GMM, sgsn_nu++,
2928 dtap_detach_acc, sizeof(dtap_detach_acc));
2929
2930 dump_peers(stdout, 0, 0, &gbcfg);
2931
Jacob Erlbeck9e9051f2014-09-18 09:57:47 +02002932 /* RA Update request */
2933
2934 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
2935 foreign_bss_tlli, &rai_unknown, 0x7080,
2936 GPRS_SAPI_GMM, bss_nu++,
2937 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
2938
2939 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
2940 foreign_bss_tlli, &rai_bss, cell_id,
2941 GPRS_SAPI_GMM, bss_nu++,
2942 dtap_identity_resp, sizeof(dtap_identity_resp));
2943
2944 dump_peers(stdout, 0, 0, &gbcfg);
2945
2946 send_llc_dl_ui(nsi, "RA UDP ACC", &sgsn_peer, 0x1002,
2947 random_sgsn_tlli2, 1, imsi, sizeof(imsi),
2948 GPRS_SAPI_GMM, sgsn_nu++,
2949 dtap_ra_upd_acc, sizeof(dtap_ra_upd_acc));
2950
2951 dump_peers(stdout, 0, 0, &gbcfg);
2952
2953 /* Detach */
2954
2955 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2956 local_bss_tlli, &rai_bss, cell_id,
2957 GPRS_SAPI_GMM, bss_nu++,
2958 dtap_detach_req, sizeof(dtap_detach_req));
2959
2960 dump_peers(stdout, 0, 0, &gbcfg);
2961
2962 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
2963 local_sgsn_tlli, 1, imsi, sizeof(imsi),
2964 GPRS_SAPI_GMM, sgsn_nu++,
2965 dtap_detach_acc, sizeof(dtap_detach_acc));
2966
2967 dump_peers(stdout, 0, 0, &gbcfg);
2968
Jacob Erlbeck0c0747f2014-09-02 14:40:11 +02002969 /* Special case: Repeated Attach Requests */
2970
2971 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2972 foreign_bss_tlli, &rai_unknown, cell_id,
2973 GPRS_SAPI_GMM, bss_nu++,
2974 dtap_attach_req, sizeof(dtap_attach_req));
2975
2976 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
2977 foreign_bss_tlli, &rai_unknown, cell_id,
2978 GPRS_SAPI_GMM, bss_nu++,
2979 dtap_attach_req, sizeof(dtap_attach_req));
2980
Jacob Erlbeck89aa65b2014-09-12 10:33:38 +02002981 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
2982 foreign_bss_tlli, &rai_bss, cell_id,
2983 GPRS_SAPI_GMM, bss_nu++,
2984 dtap_detach_req, sizeof(dtap_detach_req));
2985
2986 dump_peers(stdout, 0, 0, &gbcfg);
2987
2988 /* Special case: Detach from an unknown TLLI */
2989
2990 send_llc_ul_ui(nsi, "DETACH REQ (unknown TLLI)", &bss_peer[0], 0x1002,
2991 other_bss_tlli, &rai_bss, cell_id,
2992 GPRS_SAPI_GMM, bss_nu++,
2993 dtap_detach_req, sizeof(dtap_detach_req));
2994
Jacob Erlbeck0c0747f2014-09-02 14:40:11 +02002995 dump_peers(stdout, 0, 0, &gbcfg);
2996
Jacob Erlbeck9e9051f2014-09-18 09:57:47 +02002997 /* Special case: Repeated RA Update Requests */
2998
2999 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3000 foreign_bss_tlli, &rai_unknown, 0x7080,
3001 GPRS_SAPI_GMM, bss_nu++,
3002 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3003
3004 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3005 foreign_bss_tlli, &rai_unknown, 0x7080,
3006 GPRS_SAPI_GMM, bss_nu++,
3007 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3008
3009 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3010 foreign_bss_tlli, &rai_bss, cell_id,
3011 GPRS_SAPI_GMM, bss_nu++,
3012 dtap_detach_req, sizeof(dtap_detach_req));
3013
3014 dump_peers(stdout, 0, 0, &gbcfg);
3015
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02003016 dump_global(stdout, 0);
3017
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02003018 talloc_free(gbcfg.core_apn);
3019 gbcfg.core_apn = NULL;
3020
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02003021 gbprox_reset(&gbcfg);
3022 gprs_ns_destroy(nsi);
3023 nsi = NULL;
Daniel Willmann1e0b0002015-10-12 19:36:34 +02003024
3025 cleanup_test();
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02003026}
3027
Jacob Erlbeck12356062014-08-27 12:44:25 +02003028static void test_gbproxy_secondary_sgsn()
3029{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01003030 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003031 struct sockaddr_in bss_peer[1] = {{0},};
3032 struct sockaddr_in sgsn_peer[2]= {{0},};
3033 struct gprs_ra_id rai_bss =
3034 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3035 struct gprs_ra_id rai_sgsn =
3036 {.mcc = 123, .mnc = 456, .lac = 16464, .rac = 96};
3037 struct gprs_ra_id rai_unknown =
3038 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
3039 uint16_t cell_id = 0x1234;
3040
3041 const uint32_t sgsn_ptmsi = 0xefe2b700;
3042 const uint32_t local_sgsn_tlli = 0xefe2b700;
Daniel Willmann2b10af32015-10-12 19:36:35 +02003043 const uint32_t random_sgsn_tlli = 0x78dead00;
Jacob Erlbeck12356062014-08-27 12:44:25 +02003044
Daniel Willmann2b10af32015-10-12 19:36:35 +02003045 const uint32_t bss_ptmsi = 0xc0dead01;
3046 const uint32_t local_bss_tlli = 0xc0dead01;
Jacob Erlbeck12356062014-08-27 12:44:25 +02003047 const uint32_t foreign_bss_tlli = 0x8000dead;
3048
3049 const uint32_t sgsn_ptmsi2 = 0xe0987654;
3050 const uint32_t local_sgsn_tlli2 = 0xe0987654;
Daniel Willmann2b10af32015-10-12 19:36:35 +02003051 const uint32_t random_sgsn_tlli2 = 0x78dead02;
3052 const uint32_t bss_ptmsi2 = 0xc0dead03;
3053 const uint32_t local_bss_tlli2 = 0xc0dead03;
Jacob Erlbeck12356062014-08-27 12:44:25 +02003054 const uint32_t foreign_bss_tlli2 = 0x8000beef;
3055
Daniel Willmann2b10af32015-10-12 19:36:35 +02003056 const uint32_t random_sgsn_tlli3 = 0x78dead04;
3057 const uint32_t bss_ptmsi3 = 0xc0dead05;
3058 const uint32_t local_bss_tlli3 = 0xc0dead05;
Jacob Erlbeckd1056b32014-09-17 12:09:25 +02003059 const uint32_t foreign_bss_tlli3 = 0x8000feed;
3060
Jacob Erlbeck12356062014-08-27 12:44:25 +02003061 const uint8_t imsi1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
3062 const uint8_t imsi2[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x16, 0x17, 0x18};
Jacob Erlbeckd1056b32014-09-17 12:09:25 +02003063 const uint8_t imsi3[] = {0x11, 0x12, 0x99, 0x99, 0x99, 0x26, 0x27, 0x28};
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003064 struct gbproxy_link_info *link_info;
3065 struct gbproxy_link_info *other_info;
Jacob Erlbeck12356062014-08-27 12:44:25 +02003066 struct gbproxy_peer *peer;
3067 unsigned bss_nu = 0;
3068 unsigned sgsn_nu = 0;
3069
3070 const char *err_msg = NULL;
3071 const char *filter_re = "999999";
3072
3073 OSMO_ASSERT(local_sgsn_tlli == gprs_tmsi2tlli(sgsn_ptmsi, TLLI_LOCAL));
3074 OSMO_ASSERT(local_sgsn_tlli2 == gprs_tmsi2tlli(sgsn_ptmsi2, TLLI_LOCAL));
3075
3076 bssgp_nsi = nsi;
3077 gbcfg.nsi = bssgp_nsi;
3078 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +01003079 gbcfg.core_plmn = (struct osmo_plmn_id){ .mcc = 123, .mnc = 456 };
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01003080 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003081 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
3082 gbcfg.patch_ptmsi = 1;
3083 gbcfg.acquire_imsi = 1;
Daniel Willmann2b10af32015-10-12 19:36:35 +02003084
Jacob Erlbeck12356062014-08-27 12:44:25 +02003085 gbcfg.route_to_sgsn2 = 1;
3086 gbcfg.nsip_sgsn2_nsei = SGSN2_NSEI;
3087
Jacob Erlbeck3d805272014-09-25 13:21:48 +02003088 if (gbproxy_set_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING],
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02003089 filter_re, &err_msg) != 0) {
Jacob Erlbeck12356062014-08-27 12:44:25 +02003090 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
3091 err_msg);
3092 OSMO_ASSERT(err_msg == NULL);
3093 }
3094
3095 configure_sgsn_peer(&sgsn_peer[0]);
3096 configure_sgsn2_peer(&sgsn_peer[1]);
3097 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3098
3099 printf("=== %s ===\n", __func__);
3100 printf("--- Initialise SGSN 1 ---\n\n");
3101
3102 connect_sgsn(nsi, &sgsn_peer[0], SGSN_NSEI);
3103
3104 printf("--- Initialise SGSN 2 ---\n\n");
3105
3106 connect_sgsn(nsi, &sgsn_peer[1], SGSN2_NSEI);
3107
3108 printf("--- Initialise BSS 1 ---\n\n");
3109
3110 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3111 setup_bssgp(nsi, &bss_peer[0], 0x0);
3112 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x0);
3113 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3114 send_bssgp_reset_ack(nsi, &sgsn_peer[0], 0x1002);
3115 send_bssgp_reset_ack(nsi, &sgsn_peer[1], 0x1002);
3116
3117 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3118 OSMO_ASSERT(peer != NULL);
3119
3120 gprs_dump_nsi(nsi);
3121 dump_global(stdout, 0);
3122 dump_peers(stdout, 0, 0, &gbcfg);
3123
3124 printf("--- Flow control ---\n\n");
3125
3126 send_bssgp_flow_control_bvc(nsi, &bss_peer[0], 0x1002, 1);
3127 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[0], 0x1002, 1);
3128 send_bssgp_flow_control_bvc_ack(nsi, &sgsn_peer[1], 0x1002, 1);
3129
3130 printf("--- Establish GPRS connection (SGSN 1) ---\n\n");
3131
3132 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3133 foreign_bss_tlli, &rai_unknown, cell_id,
3134 GPRS_SAPI_GMM, bss_nu++,
3135 dtap_attach_req, sizeof(dtap_attach_req));
3136
3137 dump_peers(stdout, 0, 0, &gbcfg);
3138
3139 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3140 foreign_bss_tlli, &rai_bss, cell_id,
3141 GPRS_SAPI_GMM, bss_nu++,
3142 dtap_identity_resp, sizeof(dtap_identity_resp));
3143
3144 dump_peers(stdout, 0, 0, &gbcfg);
3145
3146 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[0], 0x1002,
3147 random_sgsn_tlli, 0, NULL, 0,
3148 GPRS_SAPI_GMM, sgsn_nu++,
3149 dtap_identity_req, sizeof(dtap_identity_req));
3150
3151 dump_peers(stdout, 0, 0, &gbcfg);
3152
3153 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3154 foreign_bss_tlli, &rai_bss, cell_id,
3155 GPRS_SAPI_GMM, bss_nu++,
3156 dtap_identity_resp, sizeof(dtap_identity_resp));
3157
3158 dump_peers(stdout, 0, 0, &gbcfg);
3159
3160 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[0], 0x1002,
3161 random_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3162 GPRS_SAPI_GMM, sgsn_nu++,
3163 dtap_attach_acc, sizeof(dtap_attach_acc));
3164
3165 dump_peers(stdout, 0, 0, &gbcfg);
3166
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003167 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3168 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli, SGSN_NSEI);
3169 OSMO_ASSERT(link_info);
3170 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3171 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3172 OSMO_ASSERT(!link_info->tlli.bss_validated);
3173 OSMO_ASSERT(!link_info->tlli.net_validated);
3174 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi);
3175 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3176 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3177 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3178 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3179 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003180
3181 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3182 local_bss_tlli, &rai_bss, cell_id,
3183 GPRS_SAPI_GMM, bss_nu++,
3184 dtap_attach_complete, sizeof(dtap_attach_complete));
3185
3186 dump_peers(stdout, 0, 0, &gbcfg);
3187
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003188 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3189 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3190 OSMO_ASSERT(link_info);
3191 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli);
3192 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli);
3193 OSMO_ASSERT(link_info->tlli.bss_validated);
3194 OSMO_ASSERT(!link_info->tlli.net_validated);
3195 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3196 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli);
3197 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3198 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003199
3200 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[0], 0x1002,
3201 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3202 GPRS_SAPI_GMM, sgsn_nu++,
3203 dtap_gmm_information, sizeof(dtap_gmm_information));
3204
3205 dump_peers(stdout, 0, 0, &gbcfg);
3206
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003207 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI));
3208 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
3209 OSMO_ASSERT(link_info);
3210 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli);
3211 OSMO_ASSERT(link_info->tlli.assigned == 0);
3212 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3213 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003214
3215 /* Non-DTAP */
3216 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3217 local_bss_tlli, &rai_bss, cell_id,
3218 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3219
3220 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[0], 0x1002,
3221 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3222 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3223
3224 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3225 local_bss_tlli, &rai_bss, cell_id,
3226 llc_ui_ll11_dns_query_ul,
3227 sizeof(llc_ui_ll11_dns_query_ul));
3228
3229 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[0], 0x1002,
3230 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3231 llc_ui_ll11_dns_resp_dl,
3232 sizeof(llc_ui_ll11_dns_resp_dl));
3233
3234 dump_peers(stdout, 0, 0, &gbcfg);
3235
3236 /* Other messages */
3237 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3238 local_bss_tlli, 1, 12);
3239
3240 dump_peers(stdout, 0, 0, &gbcfg);
3241
3242 send_bssgp_llc_discarded(nsi, &sgsn_peer[0], 0x1002,
3243 local_sgsn_tlli, 1, 12);
3244
3245 dump_peers(stdout, 0, 0, &gbcfg);
3246
3247 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli, &rai_bss);
3248
3249 dump_peers(stdout, 0, 0, &gbcfg);
3250
3251 send_bssgp_suspend_ack(nsi, &sgsn_peer[0], local_sgsn_tlli, &rai_sgsn);
3252
3253 dump_peers(stdout, 0, 0, &gbcfg);
3254
3255 printf("--- Establish GPRS connection (SGSN 2) ---\n\n");
3256
3257 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3258 foreign_bss_tlli2, &rai_unknown, cell_id,
3259 GPRS_SAPI_GMM, bss_nu++,
3260 dtap_attach_req, sizeof(dtap_attach_req));
3261
3262 dump_peers(stdout, 0, 0, &gbcfg);
3263
3264 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3265 foreign_bss_tlli2, &rai_bss, cell_id,
3266 GPRS_SAPI_GMM, bss_nu++,
3267 dtap_identity2_resp, sizeof(dtap_identity2_resp));
3268
3269 dump_peers(stdout, 0, 0, &gbcfg);
3270
3271 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3272 random_sgsn_tlli2, 0, NULL, 0,
3273 GPRS_SAPI_GMM, sgsn_nu++,
3274 dtap_identity_req, sizeof(dtap_identity_req));
3275
3276 dump_peers(stdout, 0, 0, &gbcfg);
3277
3278 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3279 foreign_bss_tlli2, &rai_bss, cell_id,
3280 GPRS_SAPI_GMM, bss_nu++,
Jacob Erlbeck9aa21cd2014-09-17 12:05:08 +02003281 dtap_identity2_resp, sizeof(dtap_identity2_resp));
Jacob Erlbeck12356062014-08-27 12:44:25 +02003282
3283 dump_peers(stdout, 0, 0, &gbcfg);
3284
3285 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer[1], 0x1002,
3286 random_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3287 GPRS_SAPI_GMM, sgsn_nu++,
3288 dtap_attach_acc2, sizeof(dtap_attach_acc2));
3289
3290 dump_peers(stdout, 0, 0, &gbcfg);
3291
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003292 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN_NSEI));
3293 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli2, SGSN2_NSEI);
3294 OSMO_ASSERT(link_info);
3295 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3296 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3297 OSMO_ASSERT(!link_info->tlli.bss_validated);
3298 OSMO_ASSERT(!link_info->tlli.net_validated);
3299 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi2);
3300 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3301 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3302 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3303 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3304 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi2);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003305
3306 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3307 local_bss_tlli2, &rai_bss, cell_id,
3308 GPRS_SAPI_GMM, bss_nu++,
3309 dtap_attach_complete, sizeof(dtap_attach_complete));
3310
3311 dump_peers(stdout, 0, 0, &gbcfg);
3312
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003313 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3314 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3315 OSMO_ASSERT(link_info);
3316 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli2);
3317 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli2);
3318 OSMO_ASSERT(link_info->tlli.bss_validated);
3319 OSMO_ASSERT(!link_info->tlli.net_validated);
3320 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli2);
3321 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli2);
3322 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3323 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003324
3325 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3326 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3327 GPRS_SAPI_GMM, sgsn_nu++,
3328 dtap_gmm_information, sizeof(dtap_gmm_information));
3329
3330 dump_peers(stdout, 0, 0, &gbcfg);
3331
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003332 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN_NSEI));
3333 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli2, SGSN2_NSEI);
3334 OSMO_ASSERT(link_info);
3335 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli2);
3336 OSMO_ASSERT(link_info->tlli.assigned == 0);
3337 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli2);
3338 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003339
3340 /* Non-DTAP */
3341 send_bssgp_ul_unitdata(nsi, "XID (UL)", &bss_peer[0], 0x1002,
3342 local_bss_tlli2, &rai_bss, cell_id,
3343 llc_u_xid_ul, sizeof(llc_u_xid_ul));
3344
3345 send_bssgp_dl_unitdata(nsi, "XID (DL)", &sgsn_peer[1], 0x1002,
3346 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3347 llc_u_xid_dl, sizeof(llc_u_xid_dl));
3348
3349 send_bssgp_ul_unitdata(nsi, "LL11 DNS QUERY (UL)", &bss_peer[0], 0x1002,
3350 local_bss_tlli2, &rai_bss, cell_id,
3351 llc_ui_ll11_dns_query_ul,
3352 sizeof(llc_ui_ll11_dns_query_ul));
3353
3354 send_bssgp_dl_unitdata(nsi, "LL11 DNS RESP (DL)", &sgsn_peer[1], 0x1002,
3355 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3356 llc_ui_ll11_dns_resp_dl,
3357 sizeof(llc_ui_ll11_dns_resp_dl));
3358
3359 dump_peers(stdout, 0, 0, &gbcfg);
3360
3361 /* Other messages */
3362 send_bssgp_llc_discarded(nsi, &bss_peer[0], 0x1002,
3363 local_bss_tlli2, 1, 12);
3364
3365 dump_peers(stdout, 0, 0, &gbcfg);
3366
3367 send_bssgp_llc_discarded(nsi, &sgsn_peer[1], 0x1002,
3368 local_sgsn_tlli2, 1, 12);
3369
3370 dump_peers(stdout, 0, 0, &gbcfg);
3371
3372 send_bssgp_suspend(nsi, &bss_peer[0], local_bss_tlli2, &rai_bss);
3373
3374 dump_peers(stdout, 0, 0, &gbcfg);
3375
3376 send_bssgp_suspend_ack(nsi, &sgsn_peer[1], local_sgsn_tlli2, &rai_sgsn);
3377
3378 dump_peers(stdout, 0, 0, &gbcfg);
3379
Jacob Erlbeckd1056b32014-09-17 12:09:25 +02003380 printf("--- Establish GPRS connection (SGSN 2, P-TMSI collision) ---\n\n");
3381
3382 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3383 foreign_bss_tlli3, &rai_unknown, cell_id,
3384 GPRS_SAPI_GMM, bss_nu++,
3385 dtap_attach_req, sizeof(dtap_attach_req));
3386
3387 dump_peers(stdout, 0, 0, &gbcfg);
3388
3389 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3390 foreign_bss_tlli3, &rai_bss, cell_id,
3391 GPRS_SAPI_GMM, bss_nu++,
3392 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3393
3394 dump_peers(stdout, 0, 0, &gbcfg);
3395
3396 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer[1], 0x1002,
3397 random_sgsn_tlli3, 0, NULL, 0,
3398 GPRS_SAPI_GMM, sgsn_nu++,
3399 dtap_identity_req, sizeof(dtap_identity_req));
3400
3401 dump_peers(stdout, 0, 0, &gbcfg);
3402
3403 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3404 foreign_bss_tlli3, &rai_bss, cell_id,
3405 GPRS_SAPI_GMM, bss_nu++,
3406 dtap_identity3_resp, sizeof(dtap_identity3_resp));
3407
3408 dump_peers(stdout, 0, 0, &gbcfg);
3409
3410 send_llc_dl_ui(nsi, "ATTACH ACCEPT (P-TMSI 1)", &sgsn_peer[1], 0x1002,
3411 random_sgsn_tlli3, 1, imsi3, sizeof(imsi3),
3412 GPRS_SAPI_GMM, sgsn_nu++,
3413 dtap_attach_acc, sizeof(dtap_attach_acc));
3414
3415 dump_peers(stdout, 0, 0, &gbcfg);
3416
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003417 OSMO_ASSERT(!gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN_NSEI));
3418 link_info = gbproxy_link_info_by_sgsn_tlli(peer, random_sgsn_tlli3, SGSN2_NSEI);
3419 OSMO_ASSERT(link_info);
3420 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3421 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3422 OSMO_ASSERT(!link_info->tlli.bss_validated);
3423 OSMO_ASSERT(!link_info->tlli.net_validated);
3424 OSMO_ASSERT(link_info->tlli.ptmsi == bss_ptmsi3);
3425 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3426 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3427 OSMO_ASSERT(!link_info->sgsn_tlli.bss_validated);
3428 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
3429 OSMO_ASSERT(link_info->sgsn_tlli.ptmsi == sgsn_ptmsi);
Jacob Erlbeckd918f522014-09-17 10:56:38 +02003430
Jacob Erlbeckd1056b32014-09-17 12:09:25 +02003431 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3432 local_bss_tlli3, &rai_bss, cell_id,
3433 GPRS_SAPI_GMM, bss_nu++,
3434 dtap_attach_complete, sizeof(dtap_attach_complete));
3435
3436 dump_peers(stdout, 0, 0, &gbcfg);
3437
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003438 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeckd918f522014-09-17 10:56:38 +02003439 OSMO_ASSERT(other_info);
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003440 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3441 OSMO_ASSERT(link_info);
3442 OSMO_ASSERT(link_info != other_info);
3443 OSMO_ASSERT(link_info->tlli.assigned == local_bss_tlli3);
3444 OSMO_ASSERT(link_info->tlli.current == foreign_bss_tlli3);
3445 OSMO_ASSERT(link_info->tlli.bss_validated);
3446 OSMO_ASSERT(!link_info->tlli.net_validated);
3447 OSMO_ASSERT(link_info->sgsn_tlli.assigned == local_sgsn_tlli);
3448 OSMO_ASSERT(link_info->sgsn_tlli.current == random_sgsn_tlli3);
3449 OSMO_ASSERT(link_info->sgsn_tlli.bss_validated);
3450 OSMO_ASSERT(!link_info->sgsn_tlli.net_validated);
Jacob Erlbeckd918f522014-09-17 10:56:38 +02003451
Jacob Erlbeckd1056b32014-09-17 12:09:25 +02003452 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer[1], 0x1002,
3453 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3454 GPRS_SAPI_GMM, sgsn_nu++,
3455 dtap_gmm_information, sizeof(dtap_gmm_information));
3456
3457 dump_peers(stdout, 0, 0, &gbcfg);
3458
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003459 other_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN_NSEI);
Jacob Erlbeckd918f522014-09-17 10:56:38 +02003460 OSMO_ASSERT(other_info);
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003461 link_info = gbproxy_link_info_by_sgsn_tlli(peer, local_sgsn_tlli, SGSN2_NSEI);
3462 OSMO_ASSERT(link_info);
3463 OSMO_ASSERT(link_info != other_info);
3464 OSMO_ASSERT(link_info->tlli.current == local_bss_tlli3);
3465 OSMO_ASSERT(link_info->tlli.assigned == 0);
3466 OSMO_ASSERT(link_info->sgsn_tlli.current == local_sgsn_tlli);
3467 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
Jacob Erlbeckd918f522014-09-17 10:56:38 +02003468
3469
Jacob Erlbeck12356062014-08-27 12:44:25 +02003470 printf("--- Shutdown GPRS connection (SGSN 1) ---\n\n");
3471
3472 /* Detach */
3473 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3474 local_bss_tlli, &rai_bss, cell_id,
3475 GPRS_SAPI_GMM, bss_nu++,
3476 dtap_detach_req, sizeof(dtap_detach_req));
3477
3478 dump_peers(stdout, 0, 0, &gbcfg);
3479
3480 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[0], 0x1002,
3481 local_sgsn_tlli, 1, imsi1, sizeof(imsi1),
3482 GPRS_SAPI_GMM, sgsn_nu++,
3483 dtap_detach_acc, sizeof(dtap_detach_acc));
3484
3485 dump_peers(stdout, 0, 0, &gbcfg);
3486
3487 printf("--- Shutdown GPRS connection (SGSN 2) ---\n\n");
3488
3489 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3490 local_bss_tlli2, &rai_bss, cell_id,
3491 GPRS_SAPI_GMM, bss_nu++,
3492 dtap_detach_req, sizeof(dtap_detach_req));
3493
3494 dump_peers(stdout, 0, 0, &gbcfg);
3495
3496 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3497 local_sgsn_tlli2, 1, imsi2, sizeof(imsi2),
3498 GPRS_SAPI_GMM, sgsn_nu++,
3499 dtap_detach_acc, sizeof(dtap_detach_acc));
3500
3501 dump_peers(stdout, 0, 0, &gbcfg);
3502
Jacob Erlbeckd1056b32014-09-17 12:09:25 +02003503 printf("--- Shutdown GPRS connection (SGSN 2, P-TMSI 1) ---\n\n");
3504
3505 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3506 local_bss_tlli3, &rai_bss, cell_id,
3507 GPRS_SAPI_GMM, bss_nu++,
3508 dtap_detach_req, sizeof(dtap_detach_req));
3509
3510 dump_peers(stdout, 0, 0, &gbcfg);
3511
3512 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer[1], 0x1002,
3513 local_sgsn_tlli, 1, imsi3, sizeof(imsi3),
3514 GPRS_SAPI_GMM, sgsn_nu++,
3515 dtap_detach_acc, sizeof(dtap_detach_acc));
3516
3517 dump_peers(stdout, 0, 0, &gbcfg);
3518
Jacob Erlbeck12356062014-08-27 12:44:25 +02003519 dump_global(stdout, 0);
3520
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02003521 talloc_free(gbcfg.core_apn);
3522 gbcfg.core_apn = NULL;
3523
Jacob Erlbeck3d805272014-09-25 13:21:48 +02003524 gbproxy_clear_patch_filter(&gbcfg.matches[GBPROX_MATCH_ROUTING]);
Jacob Erlbeck12356062014-08-27 12:44:25 +02003525 gbprox_reset(&gbcfg);
3526 gprs_ns_destroy(nsi);
3527 nsi = NULL;
Daniel Willmann1e0b0002015-10-12 19:36:34 +02003528
3529 cleanup_test();
Jacob Erlbeck12356062014-08-27 12:44:25 +02003530}
3531
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003532static void test_gbproxy_keep_info()
3533{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01003534 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003535 struct sockaddr_in bss_peer[1] = {{0},};
3536 struct sockaddr_in sgsn_peer= {0};
3537 struct gprs_ra_id rai_bss =
3538 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
3539 uint16_t cell_id = 0x1234;
3540
3541 const uint32_t ptmsi = 0xefe2b700;
3542 const uint32_t local_tlli = 0xefe2b700;
3543 const uint32_t foreign_tlli = 0xafe2b700;
3544
3545 const uint8_t imsi[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003546 struct gbproxy_link_info *link_info, *link_info2;
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003547 struct gbproxy_peer *peer;
3548 unsigned bss_nu = 0;
3549 unsigned sgsn_nu = 0;
3550
Jacob Erlbecka926e542014-09-22 19:16:06 +02003551 LLIST_HEAD(rcv_list);
3552
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003553 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
3554
3555 bssgp_nsi = nsi;
3556 gbcfg.nsi = bssgp_nsi;
3557 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
3558 gbcfg.patch_ptmsi = 0;
3559 gbcfg.acquire_imsi = 1;
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +01003560 gbcfg.core_plmn = (struct osmo_plmn_id){};
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003561 gbcfg.core_apn = NULL;
3562 gbcfg.core_apn_size = 0;
3563 gbcfg.route_to_sgsn2 = 0;
3564 gbcfg.nsip_sgsn2_nsei = 0xffff;
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003565 gbcfg.keep_link_infos = GBPROX_KEEP_ALWAYS;
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003566
3567 configure_sgsn_peer(&sgsn_peer);
3568 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
3569
3570 printf("=== %s ===\n", __func__);
3571 printf("--- Initialise SGSN ---\n\n");
3572
3573 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
3574
3575 printf("--- Initialise BSS 1 ---\n\n");
3576
3577 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
3578 setup_bssgp(nsi, &bss_peer[0], 0x1002);
3579
3580 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
3581 OSMO_ASSERT(peer != NULL);
3582
3583 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
3584
3585 gprs_dump_nsi(nsi);
3586 dump_global(stdout, 0);
3587 dump_peers(stdout, 0, 0, &gbcfg);
3588
3589 printf("--- Send message from BSS 1 to SGSN, BVCI 0x1002 ---\n\n");
3590
Jacob Erlbecka926e542014-09-22 19:16:06 +02003591 received_messages = &rcv_list;
3592
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003593 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3594 foreign_tlli, &rai_bss, cell_id,
3595 GPRS_SAPI_GMM, bss_nu++,
3596 dtap_attach_req, sizeof(dtap_attach_req));
3597
Jacob Erlbecka926e542014-09-22 19:16:06 +02003598 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3599
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003600 dump_peers(stdout, 0, 0, &gbcfg);
3601
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003602 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3603 OSMO_ASSERT(link_info);
3604 OSMO_ASSERT(link_info->imsi_len == 0);
3605 OSMO_ASSERT(!link_info->is_deregistered);
3606 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003607
3608 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3609 foreign_tlli, &rai_bss, cell_id,
3610 GPRS_SAPI_GMM, bss_nu++,
3611 dtap_identity_resp, sizeof(dtap_identity_resp));
3612
Jacob Erlbecka926e542014-09-22 19:16:06 +02003613 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3614
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003615 dump_peers(stdout, 0, 0, &gbcfg);
3616
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003617 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3618 OSMO_ASSERT(link_info);
3619 OSMO_ASSERT(link_info->imsi_len > 0);
3620 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeckb0f61292014-10-31 10:43:44 +01003621 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeckf9038d92014-09-12 15:09:56 +02003622
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003623 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
3624 foreign_tlli, 0, NULL, 0,
3625 GPRS_SAPI_GMM, sgsn_nu++,
3626 dtap_identity_req, sizeof(dtap_identity_req));
3627
Jacob Erlbecka926e542014-09-22 19:16:06 +02003628 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3629
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003630 dump_peers(stdout, 0, 0, &gbcfg);
3631
3632 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3633 foreign_tlli, &rai_bss, cell_id,
3634 GPRS_SAPI_GMM, bss_nu++,
3635 dtap_identity_resp, sizeof(dtap_identity_resp));
3636
Jacob Erlbecka926e542014-09-22 19:16:06 +02003637 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ID_RESP));
3638
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003639 dump_peers(stdout, 0, 0, &gbcfg);
3640
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003641 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3642 OSMO_ASSERT(link_info);
3643 OSMO_ASSERT(link_info->imsi_len > 0);
3644 OSMO_ASSERT(gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi)));
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003645
3646 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3647 foreign_tlli, 1, imsi, sizeof(imsi),
3648 GPRS_SAPI_GMM, sgsn_nu++,
3649 dtap_attach_acc, sizeof(dtap_attach_acc));
3650
Jacob Erlbecka926e542014-09-22 19:16:06 +02003651 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3652
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003653 dump_peers(stdout, 0, 0, &gbcfg);
3654
3655 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3656 local_tlli, &rai_bss, cell_id,
3657 GPRS_SAPI_GMM, bss_nu++,
3658 dtap_attach_complete, sizeof(dtap_attach_complete));
3659
Jacob Erlbecka926e542014-09-22 19:16:06 +02003660 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3661
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003662 dump_peers(stdout, 0, 0, &gbcfg);
3663
3664 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
3665 local_tlli, 1, imsi, sizeof(imsi),
3666 GPRS_SAPI_GMM, sgsn_nu++,
3667 dtap_gmm_information, sizeof(dtap_gmm_information));
3668
Jacob Erlbecka926e542014-09-22 19:16:06 +02003669 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
3670
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003671 dump_peers(stdout, 0, 0, &gbcfg);
3672
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003673 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3674 OSMO_ASSERT(link_info);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003675
3676 /* Detach (MO) */
3677 send_llc_ul_ui(nsi, "DETACH REQ", &bss_peer[0], 0x1002,
3678 local_tlli, &rai_bss, cell_id,
3679 GPRS_SAPI_GMM, bss_nu++,
3680 dtap_detach_req, sizeof(dtap_detach_req));
3681
Jacob Erlbecka926e542014-09-22 19:16:06 +02003682 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3683
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003684 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3685 OSMO_ASSERT(link_info);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003686
3687 dump_peers(stdout, 0, 0, &gbcfg);
3688
3689 send_llc_dl_ui(nsi, "DETACH ACC", &sgsn_peer, 0x1002,
3690 local_tlli, 1, imsi, sizeof(imsi),
3691 GPRS_SAPI_GMM, sgsn_nu++,
3692 dtap_detach_acc, sizeof(dtap_detach_acc));
3693
Jacob Erlbecka926e542014-09-22 19:16:06 +02003694 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3695
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003696 dump_peers(stdout, 0, 0, &gbcfg);
3697
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003698 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3699 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3700 OSMO_ASSERT(link_info);
3701 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003702
Jacob Erlbecka926e542014-09-22 19:16:06 +02003703 OSMO_ASSERT(!expect_msg());
3704
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003705 /* Re-Attach */
3706 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3707 foreign_tlli, &rai_bss, cell_id,
3708 GPRS_SAPI_GMM, bss_nu++,
3709 dtap_attach_req3, sizeof(dtap_attach_req3));
3710
Jacob Erlbecka926e542014-09-22 19:16:06 +02003711 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3712
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003713 dump_peers(stdout, 0, 0, &gbcfg);
3714
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003715 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3716 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3717 OSMO_ASSERT(link_info);
3718 OSMO_ASSERT(link_info == link_info2);
3719 OSMO_ASSERT(link_info->imsi_len != 0);
3720 OSMO_ASSERT(!link_info->is_deregistered);
3721 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeckb0f61292014-10-31 10:43:44 +01003722 OSMO_ASSERT(gprs_tlli_type(link_info->sgsn_tlli.current) == TLLI_FOREIGN);
Jacob Erlbeckf9038d92014-09-12 15:09:56 +02003723
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003724 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3725 foreign_tlli, 1, imsi, sizeof(imsi),
3726 GPRS_SAPI_GMM, sgsn_nu++,
3727 dtap_attach_acc, sizeof(dtap_attach_acc));
3728
Jacob Erlbecka926e542014-09-22 19:16:06 +02003729 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3730
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003731 dump_peers(stdout, 0, 0, &gbcfg);
3732
3733 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3734 local_tlli, &rai_bss, cell_id,
3735 GPRS_SAPI_GMM, bss_nu++,
3736 dtap_attach_complete, sizeof(dtap_attach_complete));
3737
Jacob Erlbecka926e542014-09-22 19:16:06 +02003738 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3739
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003740 dump_peers(stdout, 0, 0, &gbcfg);
3741
3742 /* Detach (MT) */
3743 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
3744 local_tlli, 1, imsi, sizeof(imsi),
3745 GPRS_SAPI_GMM, sgsn_nu++,
3746 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
3747
Jacob Erlbecka926e542014-09-22 19:16:06 +02003748 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3749
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003750 dump_peers(stdout, 0, 0, &gbcfg);
3751
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003752 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3753 OSMO_ASSERT(link_info);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003754
Jacob Erlbecka926e542014-09-22 19:16:06 +02003755 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003756 local_tlli, &rai_bss, cell_id,
3757 GPRS_SAPI_GMM, bss_nu++,
3758 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3759
Jacob Erlbecka926e542014-09-22 19:16:06 +02003760 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3761 OSMO_ASSERT(!expect_msg());
3762
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003763 dump_peers(stdout, 0, 0, &gbcfg);
3764
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003765 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3766 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3767 OSMO_ASSERT(link_info);
3768 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003769
3770 /* Re-Attach */
3771 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3772 foreign_tlli, &rai_bss, cell_id,
3773 GPRS_SAPI_GMM, bss_nu++,
3774 dtap_attach_req3, sizeof(dtap_attach_req3));
3775
Jacob Erlbecka926e542014-09-22 19:16:06 +02003776 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3777
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003778 dump_peers(stdout, 0, 0, &gbcfg);
3779
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003780 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3781 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3782 OSMO_ASSERT(link_info);
3783 OSMO_ASSERT(link_info == link_info2);
3784 OSMO_ASSERT(link_info->imsi_len != 0);
3785 OSMO_ASSERT(!link_info->is_deregistered);
3786 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeckf9038d92014-09-12 15:09:56 +02003787
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003788 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3789 foreign_tlli, 1, imsi, sizeof(imsi),
3790 GPRS_SAPI_GMM, sgsn_nu++,
3791 dtap_attach_acc, sizeof(dtap_attach_acc));
3792
Jacob Erlbecka926e542014-09-22 19:16:06 +02003793 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3794
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003795 dump_peers(stdout, 0, 0, &gbcfg);
3796
3797 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3798 local_tlli, &rai_bss, cell_id,
3799 GPRS_SAPI_GMM, bss_nu++,
3800 dtap_attach_complete, sizeof(dtap_attach_complete));
3801
Jacob Erlbecka926e542014-09-22 19:16:06 +02003802 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3803
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003804 dump_peers(stdout, 0, 0, &gbcfg);
3805
3806 /* Detach (MT) */
3807 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3808 local_tlli, 1, imsi, sizeof(imsi),
3809 GPRS_SAPI_GMM, sgsn_nu++,
3810 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3811
Jacob Erlbecka926e542014-09-22 19:16:06 +02003812 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3813
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003814 dump_peers(stdout, 0, 0, &gbcfg);
3815
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003816 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3817 OSMO_ASSERT(link_info);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003818
Jacob Erlbecka926e542014-09-22 19:16:06 +02003819 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003820 local_tlli, &rai_bss, cell_id,
3821 GPRS_SAPI_GMM, bss_nu++,
3822 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3823
Jacob Erlbecka926e542014-09-22 19:16:06 +02003824 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3825 OSMO_ASSERT(!expect_msg());
3826
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003827 dump_peers(stdout, 0, 0, &gbcfg);
3828
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003829 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3830 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3831 OSMO_ASSERT(link_info);
3832 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003833
Jacob Erlbeckb0f61292014-10-31 10:43:44 +01003834 /* Re-Attach with IMSI */
3835 send_llc_ul_ui(nsi, "ATTACH REQUEST (IMSI)", &bss_peer[0], 0x1002,
3836 foreign_tlli, &rai_bss, cell_id,
3837 GPRS_SAPI_GMM, bss_nu++,
3838 dtap_attach_req4, sizeof(dtap_attach_req4));
3839
3840 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3841
3842 dump_peers(stdout, 0, 0, &gbcfg);
3843
3844 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3845 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3846 OSMO_ASSERT(link_info);
3847 OSMO_ASSERT(link_info == link_info2);
3848 OSMO_ASSERT(link_info->imsi_len != 0);
3849 OSMO_ASSERT(!link_info->is_deregistered);
3850 OSMO_ASSERT(!link_info->imsi_acq_pending);
3851 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
3852
3853 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3854 foreign_tlli, 1, imsi, sizeof(imsi),
3855 GPRS_SAPI_GMM, sgsn_nu++,
3856 dtap_attach_acc, sizeof(dtap_attach_acc));
3857
3858 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3859
3860 dump_peers(stdout, 0, 0, &gbcfg);
3861
3862 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3863 local_tlli, &rai_bss, cell_id,
3864 GPRS_SAPI_GMM, bss_nu++,
3865 dtap_attach_complete, sizeof(dtap_attach_complete));
3866
3867 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3868
3869 dump_peers(stdout, 0, 0, &gbcfg);
3870
3871 /* Detach (MT) */
3872 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
3873 local_tlli, 1, imsi, sizeof(imsi),
3874 GPRS_SAPI_GMM, sgsn_nu++,
3875 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
3876
3877 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
3878
3879 dump_peers(stdout, 0, 0, &gbcfg);
3880
3881 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
3882 OSMO_ASSERT(link_info);
3883
3884 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
3885 local_tlli, &rai_bss, cell_id,
3886 GPRS_SAPI_GMM, bss_nu++,
3887 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
3888
3889 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
3890 OSMO_ASSERT(!expect_msg());
3891
3892 dump_peers(stdout, 0, 0, &gbcfg);
3893
3894 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3895 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3896 OSMO_ASSERT(link_info);
3897 OSMO_ASSERT(link_info->is_deregistered);
3898
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003899 /* Re-Attach */
3900 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3901 foreign_tlli, &rai_bss, cell_id,
3902 GPRS_SAPI_GMM, bss_nu++,
3903 dtap_attach_req3, sizeof(dtap_attach_req3));
3904
Jacob Erlbecka926e542014-09-22 19:16:06 +02003905 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3906
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003907 dump_peers(stdout, 0, 0, &gbcfg);
3908
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003909 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3910 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3911 OSMO_ASSERT(link_info);
3912 OSMO_ASSERT(link_info == link_info2);
3913 OSMO_ASSERT(link_info->imsi_len != 0);
3914 OSMO_ASSERT(!link_info->is_deregistered);
3915 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeckf9038d92014-09-12 15:09:56 +02003916
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003917 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3918 foreign_tlli, 1, imsi, sizeof(imsi),
3919 GPRS_SAPI_GMM, sgsn_nu++,
3920 dtap_attach_acc, sizeof(dtap_attach_acc));
3921
Jacob Erlbecka926e542014-09-22 19:16:06 +02003922 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3923
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003924 dump_peers(stdout, 0, 0, &gbcfg);
3925
3926 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
3927 local_tlli, &rai_bss, cell_id,
3928 GPRS_SAPI_GMM, bss_nu++,
3929 dtap_attach_complete, sizeof(dtap_attach_complete));
3930
Jacob Erlbecka926e542014-09-22 19:16:06 +02003931 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
3932
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003933 dump_peers(stdout, 0, 0, &gbcfg);
3934
3935 /* RA update procedure (reject -> Detach) */
3936 send_llc_ul_ui(nsi, "RA UPD REQ", &bss_peer[0], 0x1002,
3937 local_tlli, &rai_bss, 0x7080,
3938 GPRS_SAPI_GMM, bss_nu++,
3939 dtap_ra_upd_req, sizeof(dtap_ra_upd_req));
3940
Jacob Erlbecka926e542014-09-22 19:16:06 +02003941 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_RA_UPD_REQ));
3942
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003943 send_llc_dl_ui(nsi, "RA UDP REJ", &sgsn_peer, 0x1002,
3944 local_tlli, 1, imsi, sizeof(imsi),
3945 GPRS_SAPI_GMM, sgsn_nu++,
3946 dtap_ra_upd_rej, sizeof(dtap_ra_upd_rej));
3947
Jacob Erlbecka926e542014-09-22 19:16:06 +02003948 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_RA_UPD_REJ));
3949 OSMO_ASSERT(!expect_msg());
3950
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003951 dump_peers(stdout, 0, 0, &gbcfg);
3952
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003953 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
3954 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3955 OSMO_ASSERT(link_info);
3956 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeckf9038d92014-09-12 15:09:56 +02003957
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003958 /* Bad case: Re-Attach with wrong (initial) P-TMSI */
3959 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
3960 foreign_tlli, &rai_bss, cell_id,
3961 GPRS_SAPI_GMM, bss_nu++,
3962 dtap_attach_req, sizeof(dtap_attach_req));
3963
Jacob Erlbecka926e542014-09-22 19:16:06 +02003964 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
3965
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003966 dump_peers(stdout, 0, 0, &gbcfg);
3967
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02003968 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3969 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3970 OSMO_ASSERT(link_info);
3971 OSMO_ASSERT(link_info != link_info2);
3972 OSMO_ASSERT(link_info->imsi_len == 0);
3973 OSMO_ASSERT(!link_info->is_deregistered);
3974 OSMO_ASSERT(link_info->imsi_acq_pending);
Jacob Erlbeckf9038d92014-09-12 15:09:56 +02003975
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02003976 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
3977 foreign_tlli, &rai_bss, cell_id,
3978 GPRS_SAPI_GMM, bss_nu++,
3979 dtap_identity_resp, sizeof(dtap_identity_resp));
3980
Jacob Erlbecka926e542014-09-22 19:16:06 +02003981 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
3982
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02003983 dump_peers(stdout, 0, 0, &gbcfg);
3984
3985 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
3986 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
3987 OSMO_ASSERT(link_info);
3988 OSMO_ASSERT(link_info == link_info2);
3989 OSMO_ASSERT(link_info->imsi_len != 0);
3990 OSMO_ASSERT(!link_info->is_deregistered);
3991 OSMO_ASSERT(!link_info->imsi_acq_pending);
3992
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02003993 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
3994 foreign_tlli, 1, imsi, sizeof(imsi),
3995 GPRS_SAPI_GMM, sgsn_nu++,
3996 dtap_attach_acc, sizeof(dtap_attach_acc));
3997
Jacob Erlbecka926e542014-09-22 19:16:06 +02003998 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
3999
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004000 dump_peers(stdout, 0, 0, &gbcfg);
4001
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004002 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4003 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4004 OSMO_ASSERT(link_info);
4005 OSMO_ASSERT(link_info == link_info2);
Jacob Erlbeck99b41132014-09-22 09:28:27 +02004006 OSMO_ASSERT(link_info->imsi_len > 0);
Jacob Erlbeckf9038d92014-09-12 15:09:56 +02004007
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004008 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4009 local_tlli, &rai_bss, cell_id,
4010 GPRS_SAPI_GMM, bss_nu++,
4011 dtap_attach_complete, sizeof(dtap_attach_complete));
4012
Jacob Erlbecka926e542014-09-22 19:16:06 +02004013 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4014
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004015 dump_peers(stdout, 0, 0, &gbcfg);
4016
4017 /* Detach (MT) */
4018 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4019 local_tlli, 1, imsi, sizeof(imsi),
4020 GPRS_SAPI_GMM, sgsn_nu++,
4021 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4022
Jacob Erlbecka926e542014-09-22 19:16:06 +02004023 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4024
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004025 dump_peers(stdout, 0, 0, &gbcfg);
4026
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004027 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4028 OSMO_ASSERT(link_info);
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004029
Jacob Erlbecka926e542014-09-22 19:16:06 +02004030 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004031 local_tlli, &rai_bss, cell_id,
4032 GPRS_SAPI_GMM, bss_nu++,
4033 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4034
Jacob Erlbecka926e542014-09-22 19:16:06 +02004035 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4036
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004037 dump_peers(stdout, 0, 0, &gbcfg);
4038
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004039 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4040 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4041 OSMO_ASSERT(link_info);
4042 OSMO_ASSERT(link_info->is_deregistered);
Jacob Erlbeckf9038d92014-09-12 15:09:56 +02004043
Jacob Erlbecka926e542014-09-22 19:16:06 +02004044 OSMO_ASSERT(!expect_msg());
4045
Jacob Erlbeckb0f61292014-10-31 10:43:44 +01004046 /* Bad case: Re-Attach with local TLLI */
4047 send_llc_ul_ui(nsi, "ATTACH REQUEST (local TLLI)", &bss_peer[0], 0x1002,
4048 local_tlli, &rai_bss, cell_id,
4049 GPRS_SAPI_GMM, bss_nu++,
4050 dtap_attach_req3, sizeof(dtap_attach_req3));
4051
4052 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4053
4054 dump_peers(stdout, 0, 0, &gbcfg);
4055
4056 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4057 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4058 OSMO_ASSERT(link_info);
4059 OSMO_ASSERT(link_info == link_info2);
4060 OSMO_ASSERT(link_info->imsi_len != 0);
4061 OSMO_ASSERT(!link_info->is_deregistered);
4062 OSMO_ASSERT(!link_info->imsi_acq_pending);
4063 OSMO_ASSERT(link_info->sgsn_tlli.current == local_tlli);
4064
4065 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4066 local_tlli, 1, imsi, sizeof(imsi),
4067 GPRS_SAPI_GMM, sgsn_nu++,
4068 dtap_attach_acc, sizeof(dtap_attach_acc));
4069
4070 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4071
4072 dump_peers(stdout, 0, 0, &gbcfg);
4073
4074 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4075 local_tlli, &rai_bss, cell_id,
4076 GPRS_SAPI_GMM, bss_nu++,
4077 dtap_attach_complete, sizeof(dtap_attach_complete));
4078
4079 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4080
4081 dump_peers(stdout, 0, 0, &gbcfg);
4082
4083 /* Detach (MT) */
4084 send_llc_dl_ui(nsi, "DETACH REQ (re-attach)", &sgsn_peer, 0x1002,
4085 local_tlli, 1, imsi, sizeof(imsi),
4086 GPRS_SAPI_GMM, sgsn_nu++,
4087 dtap_mt_detach_rea_req, sizeof(dtap_mt_detach_rea_req));
4088
4089 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4090
4091 dump_peers(stdout, 0, 0, &gbcfg);
4092
4093 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4094 OSMO_ASSERT(link_info);
4095
4096 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4097 local_tlli, &rai_bss, cell_id,
4098 GPRS_SAPI_GMM, bss_nu++,
4099 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4100
4101 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4102 OSMO_ASSERT(!expect_msg());
4103
4104 dump_peers(stdout, 0, 0, &gbcfg);
4105
4106 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4107 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4108 OSMO_ASSERT(link_info);
4109 OSMO_ASSERT(link_info->is_deregistered);
4110
4111 /* Bad case: Unexpected Re-Attach with IMSI after completed attachment
4112 * procedure */
4113 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4114 foreign_tlli, &rai_bss, cell_id,
4115 GPRS_SAPI_GMM, bss_nu++,
4116 dtap_attach_req3, sizeof(dtap_attach_req3));
4117
4118 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4119
4120 dump_peers(stdout, 0, 0, &gbcfg);
4121
4122 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4123 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4124 OSMO_ASSERT(link_info);
4125 OSMO_ASSERT(link_info == link_info2);
4126 OSMO_ASSERT(link_info->imsi_len != 0);
4127 OSMO_ASSERT(!link_info->is_deregistered);
4128 OSMO_ASSERT(!link_info->imsi_acq_pending);
4129
4130 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4131 foreign_tlli, 1, imsi, sizeof(imsi),
4132 GPRS_SAPI_GMM, sgsn_nu++,
4133 dtap_attach_acc, sizeof(dtap_attach_acc));
4134
4135 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4136
4137 dump_peers(stdout, 0, 0, &gbcfg);
4138
4139 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4140 local_tlli, &rai_bss, cell_id,
4141 GPRS_SAPI_GMM, bss_nu++,
4142 dtap_attach_complete, sizeof(dtap_attach_complete));
4143
4144 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4145
4146 dump_peers(stdout, 0, 0, &gbcfg);
4147
4148 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4149 local_tlli, 1, imsi, sizeof(imsi),
4150 GPRS_SAPI_GMM, sgsn_nu++,
4151 dtap_gmm_information, sizeof(dtap_gmm_information));
4152
4153 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4154
4155 dump_peers(stdout, 0, 0, &gbcfg);
4156
4157 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected, IMSI)",
4158 &bss_peer[0], 0x1002,
4159 foreign_tlli, &rai_bss, cell_id,
4160 GPRS_SAPI_GMM, bss_nu++,
4161 dtap_attach_req4, sizeof(dtap_attach_req4));
4162
4163 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4164
4165 dump_peers(stdout, 0, 0, &gbcfg);
4166
4167 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4168 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck0bc746f2014-10-30 17:15:43 +01004169 OSMO_ASSERT(link_info);
Jacob Erlbeckb0f61292014-10-31 10:43:44 +01004170 OSMO_ASSERT(link_info == link_info2);
4171 OSMO_ASSERT(link_info->imsi_len != 0);
4172 OSMO_ASSERT(!link_info->is_deregistered);
4173 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck0bc746f2014-10-30 17:15:43 +01004174 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeckb0f61292014-10-31 10:43:44 +01004175 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4176
4177 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4178 foreign_tlli, 1, imsi, sizeof(imsi),
4179 GPRS_SAPI_GMM, sgsn_nu++,
4180 dtap_attach_acc, sizeof(dtap_attach_acc));
4181
4182 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4183
4184 dump_peers(stdout, 0, 0, &gbcfg);
4185
4186 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4187 local_tlli, &rai_bss, cell_id,
4188 GPRS_SAPI_GMM, bss_nu++,
4189 dtap_attach_complete, sizeof(dtap_attach_complete));
4190
4191 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4192
4193 dump_peers(stdout, 0, 0, &gbcfg);
4194
4195 /* Detach (MT) */
4196 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4197 local_tlli, 1, imsi, sizeof(imsi),
4198 GPRS_SAPI_GMM, sgsn_nu++,
4199 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4200
4201 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4202
4203 dump_peers(stdout, 0, 0, &gbcfg);
4204
4205 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4206 OSMO_ASSERT(link_info);
4207
4208 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4209 local_tlli, &rai_bss, cell_id,
4210 GPRS_SAPI_GMM, bss_nu++,
4211 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4212
4213 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4214 OSMO_ASSERT(!expect_msg());
4215
4216 dump_peers(stdout, 0, 0, &gbcfg);
4217
4218 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4219 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4220 OSMO_ASSERT(link_info);
4221 OSMO_ASSERT(link_info->is_deregistered);
4222
4223 /* Bad case: Unexpected Re-Attach with P-TMSI after completed attachment
4224 * procedure */
4225 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4226 foreign_tlli, &rai_bss, cell_id,
4227 GPRS_SAPI_GMM, bss_nu++,
4228 dtap_attach_req3, sizeof(dtap_attach_req3));
4229
4230 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4231
4232 dump_peers(stdout, 0, 0, &gbcfg);
4233
4234 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4235 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4236 OSMO_ASSERT(link_info);
4237 OSMO_ASSERT(link_info == link_info2);
4238 OSMO_ASSERT(link_info->imsi_len != 0);
4239 OSMO_ASSERT(!link_info->is_deregistered);
4240 OSMO_ASSERT(!link_info->imsi_acq_pending);
4241
4242 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4243 foreign_tlli, 1, imsi, sizeof(imsi),
4244 GPRS_SAPI_GMM, sgsn_nu++,
4245 dtap_attach_acc, sizeof(dtap_attach_acc));
4246
4247 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4248
4249 dump_peers(stdout, 0, 0, &gbcfg);
4250
4251 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4252 local_tlli, &rai_bss, cell_id,
4253 GPRS_SAPI_GMM, bss_nu++,
4254 dtap_attach_complete, sizeof(dtap_attach_complete));
4255
4256 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4257
4258 dump_peers(stdout, 0, 0, &gbcfg);
4259
4260 send_llc_dl_ui(nsi, "GMM INFO", &sgsn_peer, 0x1002,
4261 local_tlli, 1, imsi, sizeof(imsi),
4262 GPRS_SAPI_GMM, sgsn_nu++,
4263 dtap_gmm_information, sizeof(dtap_gmm_information));
4264
4265 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_INFO));
4266
4267 dump_peers(stdout, 0, 0, &gbcfg);
4268
4269 send_llc_ul_ui(nsi, "ATTACH REQUEST (unexpected)", &bss_peer[0], 0x1002,
4270 foreign_tlli, &rai_bss, cell_id,
4271 GPRS_SAPI_GMM, bss_nu++,
4272 dtap_attach_req3, sizeof(dtap_attach_req3));
4273
4274 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4275
4276 dump_peers(stdout, 0, 0, &gbcfg);
4277
4278 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4279 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
Jacob Erlbeck0bc746f2014-10-30 17:15:43 +01004280 OSMO_ASSERT(link_info);
Jacob Erlbeckb0f61292014-10-31 10:43:44 +01004281 OSMO_ASSERT(link_info == link_info2);
4282 OSMO_ASSERT(link_info->imsi_len != 0);
4283 OSMO_ASSERT(!link_info->is_deregistered);
4284 OSMO_ASSERT(!link_info->imsi_acq_pending);
Jacob Erlbeck0bc746f2014-10-30 17:15:43 +01004285 OSMO_ASSERT(link_info->sgsn_tlli.current == foreign_tlli);
Jacob Erlbeckb0f61292014-10-31 10:43:44 +01004286 OSMO_ASSERT(link_info->sgsn_tlli.assigned == 0);
4287
4288 send_llc_dl_ui(nsi, "ATTACH ACCEPT", &sgsn_peer, 0x1002,
4289 foreign_tlli, 1, imsi, sizeof(imsi),
4290 GPRS_SAPI_GMM, sgsn_nu++,
4291 dtap_attach_acc, sizeof(dtap_attach_acc));
4292
4293 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_ACK));
4294
4295 dump_peers(stdout, 0, 0, &gbcfg);
4296
4297 send_llc_ul_ui(nsi, "ATTACH COMPLETE", &bss_peer[0], 0x1002,
4298 local_tlli, &rai_bss, cell_id,
4299 GPRS_SAPI_GMM, bss_nu++,
4300 dtap_attach_complete, sizeof(dtap_attach_complete));
4301
4302 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_COMPL));
4303
4304 dump_peers(stdout, 0, 0, &gbcfg);
4305
4306 /* Detach (MT) */
4307 send_llc_dl_ui(nsi, "DETACH REQ", &sgsn_peer, 0x1002,
4308 local_tlli, 1, imsi, sizeof(imsi),
4309 GPRS_SAPI_GMM, sgsn_nu++,
4310 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4311
4312 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4313
4314 dump_peers(stdout, 0, 0, &gbcfg);
4315
4316 link_info = gbproxy_link_info_by_tlli(peer, local_tlli);
4317 OSMO_ASSERT(link_info);
4318
4319 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
4320 local_tlli, &rai_bss, cell_id,
4321 GPRS_SAPI_GMM, bss_nu++,
4322 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4323
4324 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4325 OSMO_ASSERT(!expect_msg());
4326
4327 dump_peers(stdout, 0, 0, &gbcfg);
4328
4329 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, local_tlli));
4330 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4331 OSMO_ASSERT(link_info);
4332 OSMO_ASSERT(link_info->is_deregistered);
4333
4334
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004335 /* Attach rejected */
4336
4337 gbproxy_delete_link_infos(peer);
4338
4339 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4340 foreign_tlli, &rai_bss, cell_id,
4341 GPRS_SAPI_GMM, bss_nu++,
4342 dtap_attach_req, sizeof(dtap_attach_req));
4343
Jacob Erlbecka926e542014-09-22 19:16:06 +02004344 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4345
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004346 dump_peers(stdout, 0, 0, &gbcfg);
4347
4348 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4349 OSMO_ASSERT(link_info);
4350 OSMO_ASSERT(link_info->imsi_len == 0);
4351 OSMO_ASSERT(!link_info->is_deregistered);
4352 OSMO_ASSERT(link_info->imsi_acq_pending);
4353
4354 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4355 foreign_tlli, &rai_bss, cell_id,
4356 GPRS_SAPI_GMM, bss_nu++,
4357 dtap_identity_resp, sizeof(dtap_identity_resp));
4358
Jacob Erlbecka926e542014-09-22 19:16:06 +02004359 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4360
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004361 dump_peers(stdout, 0, 0, &gbcfg);
4362
4363 link_info2 = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4364 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4365 OSMO_ASSERT(link_info);
4366 OSMO_ASSERT(link_info == link_info2);
4367 OSMO_ASSERT(link_info->imsi_len != 0);
4368 OSMO_ASSERT(!link_info->is_deregistered);
4369 OSMO_ASSERT(!link_info->imsi_acq_pending);
4370
4371 send_llc_dl_ui(nsi, "ATTACH REJECT", &sgsn_peer, 0x1002,
4372 foreign_tlli, 1, imsi, sizeof(imsi),
4373 GPRS_SAPI_GMM, sgsn_nu++,
4374 dtap_attach_rej7, sizeof(dtap_attach_rej7));
4375
Jacob Erlbecka926e542014-09-22 19:16:06 +02004376 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ATTACH_REJ));
4377
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004378 dump_peers(stdout, 0, 0, &gbcfg);
4379
Jacob Erlbeck538bee02014-09-22 10:42:05 +02004380 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4381
Jacob Erlbecka926e542014-09-22 19:16:06 +02004382 OSMO_ASSERT(!expect_msg());
4383
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004384 /* Attach (incomplete) and Detach (MO) */
4385
4386 gbproxy_delete_link_infos(peer);
4387
4388 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4389 foreign_tlli, &rai_bss, cell_id,
4390 GPRS_SAPI_GMM, bss_nu++,
4391 dtap_attach_req, sizeof(dtap_attach_req));
4392
Jacob Erlbecka926e542014-09-22 19:16:06 +02004393 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4394
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004395 dump_peers(stdout, 0, 0, &gbcfg);
4396
4397 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4398 OSMO_ASSERT(link_info);
4399 OSMO_ASSERT(link_info->imsi_len == 0);
4400 OSMO_ASSERT(!link_info->is_deregistered);
4401 OSMO_ASSERT(link_info->imsi_acq_pending);
4402
4403 send_llc_ul_ui(nsi, "DETACH REQ (MO)", &bss_peer[0], 0x1002,
4404 foreign_tlli, &rai_bss, cell_id,
4405 GPRS_SAPI_GMM, bss_nu++,
4406 dtap_detach_req, sizeof(dtap_detach_req));
4407
Jacob Erlbecka926e542014-09-22 19:16:06 +02004408 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4409
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004410 dump_peers(stdout, 0, 0, &gbcfg);
4411
Jacob Erlbecka926e542014-09-22 19:16:06 +02004412 OSMO_ASSERT(!expect_msg());
4413
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004414 /* Attach (incomplete) and Detach (MT) */
4415
4416 gbproxy_delete_link_infos(peer);
4417
4418 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4419 foreign_tlli, &rai_bss, cell_id,
4420 GPRS_SAPI_GMM, bss_nu++,
4421 dtap_attach_req, sizeof(dtap_attach_req));
4422
Jacob Erlbecka926e542014-09-22 19:16:06 +02004423 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_ID_REQ));
4424
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004425 dump_peers(stdout, 0, 0, &gbcfg);
4426
4427 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4428 OSMO_ASSERT(link_info);
4429 OSMO_ASSERT(link_info->imsi_len == 0);
4430 OSMO_ASSERT(!link_info->is_deregistered);
4431 OSMO_ASSERT(link_info->imsi_acq_pending);
4432
4433 send_llc_dl_ui(nsi, "DETACH REQ (MT)", &sgsn_peer, 0x1002,
4434 foreign_tlli, 1, imsi, sizeof(imsi),
4435 GPRS_SAPI_GMM, sgsn_nu++,
4436 dtap_mt_detach_req, sizeof(dtap_mt_detach_req));
4437
Jacob Erlbecka926e542014-09-22 19:16:06 +02004438 OSMO_ASSERT(expect_gmm_msg(0x1000, 0x1002, GSM48_MT_GMM_DETACH_REQ));
4439
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004440 dump_peers(stdout, 0, 0, &gbcfg);
4441
4442 link_info = gbproxy_link_info_by_tlli(peer, foreign_tlli);
4443 OSMO_ASSERT(link_info);
4444
Jacob Erlbecka926e542014-09-22 19:16:06 +02004445 send_llc_ul_ui(nsi, "DETACH ACC", &bss_peer[0], 0x1002,
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004446 foreign_tlli, &rai_bss, cell_id,
4447 GPRS_SAPI_GMM, bss_nu++,
4448 dtap_mt_detach_acc, sizeof(dtap_mt_detach_acc));
4449
Jacob Erlbecka926e542014-09-22 19:16:06 +02004450 /* TODO: The stored messaged should be cleaned when receiving a Detach
4451 * Ack. Remove the first OSMO_ASSERT when this is fixed. */
4452 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_ATTACH_REQ));
4453 OSMO_ASSERT(expect_gmm_msg(SGSN_NSEI, 0x1002, GSM48_MT_GMM_DETACH_ACK));
4454
Jacob Erlbeck73e4f5f2014-09-22 11:26:58 +02004455 dump_peers(stdout, 0, 0, &gbcfg);
4456
4457 OSMO_ASSERT(!gbproxy_link_info_by_tlli(peer, foreign_tlli));
4458 link_info = gbproxy_link_info_by_imsi(peer, imsi, sizeof(imsi));
4459 OSMO_ASSERT(link_info);
4460 OSMO_ASSERT(link_info->is_deregistered);
4461
Jacob Erlbecka926e542014-09-22 19:16:06 +02004462 OSMO_ASSERT(!expect_msg());
4463 received_messages = NULL;
4464
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004465 dump_global(stdout, 0);
4466
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02004467 talloc_free(gbcfg.core_apn);
4468 gbcfg.core_apn = NULL;
4469
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004470 gbprox_reset(&gbcfg);
4471 gprs_ns_destroy(nsi);
4472 nsi = NULL;
Daniel Willmann1e0b0002015-10-12 19:36:34 +02004473
4474 cleanup_test();
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02004475}
4476
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004477struct gbproxy_link_info *register_tlli(
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004478 struct gbproxy_peer *peer, uint32_t tlli,
4479 const uint8_t *imsi, size_t imsi_len, time_t now)
4480{
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004481 struct gbproxy_link_info *link_info;
Jacob Erlbeck070702b2014-09-19 13:17:55 +02004482 int imsi_matches = -1;
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004483 int tlli_already_known = 0;
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004484 struct gbproxy_config *cfg = peer->cfg;
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004485
4486 /* Check, whether the IMSI matches */
4487 if (gprs_is_mi_imsi(imsi, imsi_len)) {
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004488 imsi_matches = gbproxy_check_imsi(
4489 &cfg->matches[GBPROX_MATCH_PATCHING], imsi, imsi_len);
Jacob Erlbeck070702b2014-09-19 13:17:55 +02004490 if (imsi_matches < 0)
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004491 return NULL;
4492 }
4493
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004494 link_info = gbproxy_link_info_by_tlli(peer, tlli);
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004495
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004496 if (!link_info) {
4497 link_info = gbproxy_link_info_by_imsi(peer, imsi, imsi_len);
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004498
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004499 if (link_info) {
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004500 /* TLLI has changed somehow, adjust it */
4501 LOGP(DGPRS, LOGL_INFO,
4502 "The TLLI has changed from %08x to %08x\n",
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004503 link_info->tlli.current, tlli);
4504 link_info->tlli.current = tlli;
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004505 }
4506 }
4507
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004508 if (!link_info) {
4509 link_info = gbproxy_link_info_alloc(peer);
4510 link_info->tlli.current = tlli;
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004511 } else {
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004512 gbproxy_detach_link_info(peer, link_info);
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004513 tlli_already_known = 1;
4514 }
4515
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004516 OSMO_ASSERT(link_info != NULL);
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004517
4518 if (!tlli_already_known)
4519 LOGP(DGPRS, LOGL_INFO, "Adding TLLI %08x to list\n", tlli);
4520
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004521 gbproxy_attach_link_info(peer, now, link_info);
4522 gbproxy_update_link_info(link_info, imsi, imsi_len);
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004523
Jacob Erlbeck070702b2014-09-19 13:17:55 +02004524 if (imsi_matches >= 0)
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004525 link_info->is_matching[GBPROX_MATCH_PATCHING] = imsi_matches;
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004526
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004527 return link_info;
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004528}
4529
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004530static void test_gbproxy_tlli_expire(void)
4531{
4532 struct gbproxy_config cfg = {0};
4533 struct gbproxy_peer *peer;
4534 const char *err_msg = NULL;
4535 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI, 0x23, 0x24, 0x25, 0x26 };
4536 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI, 0x26, 0x27, 0x28, 0x29 };
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004537 const uint8_t imsi3[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0x76, 0xf8 };
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004538 const uint32_t tlli1 = 1234 | 0xc0000000;
4539 const uint32_t tlli2 = 5678 | 0xc0000000;
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004540 const uint32_t tlli3 = 3456 | 0xc0000000;
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004541 const char *filter_re = ".*";
Jacob Erlbeckc404c082014-08-08 08:37:37 +02004542 time_t now = 1407479214;
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004543
4544 printf("Test TLLI info expiry\n\n");
4545
4546 gbproxy_init_config(&cfg);
4547
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004548 if (gbproxy_set_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING],
4549 filter_re, &err_msg) != 0) {
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004550 fprintf(stderr, "gbprox_set_patch_filter: got error: %s\n",
4551 err_msg);
4552 OSMO_ASSERT(err_msg == NULL);
4553 }
4554
4555 {
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004556 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004557
4558 printf("Test TLLI replacement:\n");
4559
4560 cfg.tlli_max_len = 0;
4561 cfg.tlli_max_age = 0;
4562 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004563 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004564
4565 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004566 link_info = register_tlli(peer, tlli1,
Jacob Erlbeckcf11e932014-08-19 12:21:01 +02004567 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004568 OSMO_ASSERT(link_info);
4569 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004570 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004571
4572 /* replace the old entry */
4573 printf(" Add TLLI 2, IMSI 1 (should replace TLLI 1)\n");
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004574 link_info = register_tlli(peer, tlli2,
Jacob Erlbeckcf11e932014-08-19 12:21:01 +02004575 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004576 OSMO_ASSERT(link_info);
4577 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004578 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004579
Jacob Erlbeckc404c082014-08-08 08:37:37 +02004580 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004581
4582 /* verify that 5678 has survived */
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004583 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4584 OSMO_ASSERT(link_info);
4585 OSMO_ASSERT(link_info->tlli.current == tlli2);
4586 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4587 OSMO_ASSERT(!link_info);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004588
4589 printf("\n");
4590
4591 gbproxy_peer_free(peer);
4592 }
4593
4594 {
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004595 struct gbproxy_link_info *link_info;
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004596
4597 printf("Test IMSI replacement:\n");
4598
4599 cfg.tlli_max_len = 0;
4600 cfg.tlli_max_age = 0;
4601 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004602 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004603
4604 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004605 link_info = register_tlli(peer, tlli1,
Jacob Erlbeckcf11e932014-08-19 12:21:01 +02004606 imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004607 OSMO_ASSERT(link_info);
4608 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004609 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004610
4611 /* try to replace the old entry */
4612 printf(" Add TLLI 1, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004613 link_info = register_tlli(peer, tlli1,
Jacob Erlbeckcf11e932014-08-19 12:21:01 +02004614 imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004615 OSMO_ASSERT(link_info);
4616 OSMO_ASSERT(link_info->tlli.current == tlli1);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004617 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004618
Jacob Erlbeckc404c082014-08-08 08:37:37 +02004619 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004620
4621 /* verify that 5678 has survived */
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004622 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4623 OSMO_ASSERT(!link_info);
4624 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4625 OSMO_ASSERT(link_info);
4626 OSMO_ASSERT(link_info->tlli.current == tlli1);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004627
4628 printf("\n");
4629
4630 gbproxy_peer_free(peer);
4631 }
4632
4633 {
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004634 struct gbproxy_link_info *link_info;
Jacob Erlbeck985b46e2014-08-07 17:23:00 +02004635 int num_removed;
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004636
4637 printf("Test TLLI expiry, max_len == 1:\n");
4638
4639 cfg.tlli_max_len = 1;
4640 cfg.tlli_max_age = 0;
4641 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004642 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004643
4644 printf(" Add TLLI 1, IMSI 1\n");
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004645 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004646 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004647
4648 /* replace the old entry */
4649 printf(" Add TLLI 2, IMSI 2 (should replace IMSI 1)\n");
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004650 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2), now);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004651 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeck985b46e2014-08-07 17:23:00 +02004652
Jacob Erlbeckc4fb4c22014-09-19 16:40:21 +02004653 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeck985b46e2014-08-07 17:23:00 +02004654 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004655 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004656
Jacob Erlbeckc404c082014-08-08 08:37:37 +02004657 dump_peers(stdout, 2, now, &cfg);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004658
4659 /* verify that 5678 has survived */
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004660 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4661 OSMO_ASSERT(!link_info);
4662 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4663 OSMO_ASSERT(link_info);
4664 OSMO_ASSERT(link_info->tlli.current == tlli2);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004665
4666 printf("\n");
4667
4668 gbproxy_peer_free(peer);
4669 }
4670
4671 {
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004672 struct gbproxy_link_info *link_info;
Jacob Erlbeck985b46e2014-08-07 17:23:00 +02004673 int num_removed;
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004674
4675 printf("Test TLLI expiry, max_age == 1:\n");
4676
4677 cfg.tlli_max_len = 0;
4678 cfg.tlli_max_age = 1;
4679 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004680 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004681
4682 printf(" Add TLLI 1, IMSI 1 (should expire after timeout)\n");
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004683 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004684 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004685
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004686 printf(" Add TLLI 2, IMSI 2 (should not expire after timeout)\n");
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004687 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004688 now + 1);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004689 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004690
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004691 num_removed = gbproxy_remove_stale_link_infos(peer, now + 2);
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004692 OSMO_ASSERT(num_removed == 1);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004693 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004694
4695 dump_peers(stdout, 2, now + 2, &cfg);
4696
Jacob Erlbeck383c8412014-08-12 16:30:30 +02004697 /* verify that 5678 has survived */
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004698 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4699 OSMO_ASSERT(!link_info);
4700 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4701 OSMO_ASSERT(link_info);
4702 OSMO_ASSERT(link_info->tlli.current == tlli2);
Jacob Erlbeck383c8412014-08-12 16:30:30 +02004703
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004704 printf("\n");
4705
4706 gbproxy_peer_free(peer);
4707 }
4708
4709 {
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004710 struct gbproxy_link_info *link_info;
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004711 int num_removed;
4712
4713 printf("Test TLLI expiry, max_len == 2, max_age == 1:\n");
4714
4715 cfg.tlli_max_len = 0;
4716 cfg.tlli_max_age = 1;
4717 peer = gbproxy_peer_alloc(&cfg, 20);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004718 OSMO_ASSERT(peer->patch_state.logical_link_count == 0);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004719
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004720 printf(" Add TLLI 1, IMSI 1 (should expire)\n");
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004721 register_tlli(peer, tlli1, imsi1, ARRAY_SIZE(imsi1), now);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004722 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004723
4724 printf(" Add TLLI 2, IMSI 2 (should expire after timeout)\n");
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004725 register_tlli(peer, tlli2, imsi2, ARRAY_SIZE(imsi2),
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004726 now + 1);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004727 OSMO_ASSERT(peer->patch_state.logical_link_count == 2);
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004728
4729 printf(" Add TLLI 3, IMSI 3 (should not expire after timeout)\n");
Jacob Erlbeckc68f66c2014-09-12 14:15:02 +02004730 register_tlli(peer, tlli3, imsi3, ARRAY_SIZE(imsi3),
Jacob Erlbeckcf11e932014-08-19 12:21:01 +02004731 now + 2);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004732 OSMO_ASSERT(peer->patch_state.logical_link_count == 3);
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004733
4734 dump_peers(stdout, 2, now + 2, &cfg);
4735
4736 printf(" Remove stale TLLIs\n");
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004737 num_removed = gbproxy_remove_stale_link_infos(peer, now + 3);
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004738 OSMO_ASSERT(num_removed == 2);
Jacob Erlbeck485e28c2014-09-19 16:03:07 +02004739 OSMO_ASSERT(peer->patch_state.logical_link_count == 1);
Jacob Erlbeck3e2045e2014-08-08 09:33:06 +02004740
4741 dump_peers(stdout, 2, now + 2, &cfg);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004742
Jacob Erlbeck383c8412014-08-12 16:30:30 +02004743 /* verify that tlli3 has survived */
Jacob Erlbeck2b2406a2014-09-19 15:07:27 +02004744 link_info = gbproxy_link_info_by_imsi(peer, imsi1, ARRAY_SIZE(imsi1));
4745 OSMO_ASSERT(!link_info);
4746 link_info = gbproxy_link_info_by_imsi(peer, imsi2, ARRAY_SIZE(imsi2));
4747 OSMO_ASSERT(!link_info);
4748 link_info = gbproxy_link_info_by_imsi(peer, imsi3, ARRAY_SIZE(imsi3));
4749 OSMO_ASSERT(link_info);
4750 OSMO_ASSERT(link_info->tlli.current == tlli3);
Jacob Erlbeck383c8412014-08-12 16:30:30 +02004751
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004752 printf("\n");
4753
4754 gbproxy_peer_free(peer);
4755 }
Jacob Erlbeck8fbf44a2014-09-25 11:21:34 +02004756 gbproxy_clear_patch_filter(&cfg.matches[GBPROX_MATCH_PATCHING]);
4757 gbprox_reset(&cfg);
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02004758 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
4759 rate_ctr_group_free(cfg.ctrg);
Daniel Willmann1e0b0002015-10-12 19:36:34 +02004760
4761 cleanup_test();
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02004762}
4763
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004764static void test_gbproxy_imsi_matching(void)
4765{
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004766 const char *err_msg = NULL;
4767 const uint8_t imsi1[] = { GSM_MI_TYPE_IMSI | 0x10, 0x32, 0x54, 0xf6 };
4768 const uint8_t imsi2[] = { GSM_MI_TYPE_IMSI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4769 const uint8_t imsi3_bad[] = { GSM_MI_TYPE_IMSI | 0x10, 0xee, 0x54, 0xff };
4770 const uint8_t tmsi1[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22, 0x33, 0x44 };
4771 const uint8_t tmsi2_bad[] = { GSM_MI_TYPE_TMSI | 0xf0, 0x11, 0x22 };
4772 const uint8_t imei1[] = { GSM_MI_TYPE_IMEI | 0x10, 0x32, 0x54, 0xf6 };
4773 const uint8_t imei2[] = { GSM_MI_TYPE_IMEI | GSM_MI_ODD | 0x10, 0x32, 0x54, 0x76 };
4774 const char *filter_re1 = ".*";
4775 const char *filter_re2 = "^1234";
4776 const char *filter_re3 = "^4321";
4777 const char *filter_re4_bad = "^12[";
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004778 struct gbproxy_match match = {0,};
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004779
4780 printf("=== Test IMSI/TMSI matching ===\n\n");
4781
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004782 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004783
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004784 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re1, &err_msg) == 0);
4785 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004786
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004787 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4788 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004789
4790 err_msg = NULL;
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004791 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re4_bad, &err_msg) == -1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004792 OSMO_ASSERT(err_msg != NULL);
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004793 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004794
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004795 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4796 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004797
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004798 OSMO_ASSERT(gbproxy_set_patch_filter(&match, NULL, &err_msg) == 0);
4799 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004800
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004801 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4802 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeck581728f2014-08-14 08:57:04 +02004803
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004804 gbproxy_clear_patch_filter(&match);
4805 OSMO_ASSERT(match.enable == 0);
Jacob Erlbeck581728f2014-08-14 08:57:04 +02004806
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004807 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re2, &err_msg) == 0);
4808 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004809
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004810 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 1);
4811 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004812 /* imsi3_bad contains 0xE and 0xF digits, but the conversion function
Jacob Erlbeckcf11e932014-08-19 12:21:01 +02004813 * doesn't complain, so gbproxy_check_imsi() doesn't return -1 in this
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004814 * case. */
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004815 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4816 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4817 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4818 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4819 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004820
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004821 OSMO_ASSERT(gbproxy_set_patch_filter(&match, filter_re3, &err_msg) == 0);
4822 OSMO_ASSERT(match.enable == 1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004823
Jacob Erlbeckf4290b02014-09-25 11:17:31 +02004824 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi1, ARRAY_SIZE(imsi1)) == 0);
4825 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi2, ARRAY_SIZE(imsi2)) == 0);
4826 OSMO_ASSERT(gbproxy_check_imsi(&match, imsi3_bad, ARRAY_SIZE(imsi3_bad)) == 0);
4827 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi1, ARRAY_SIZE(tmsi1)) == -1);
4828 OSMO_ASSERT(gbproxy_check_imsi(&match, tmsi2_bad, ARRAY_SIZE(tmsi2_bad)) == -1);
4829 OSMO_ASSERT(gbproxy_check_imsi(&match, imei1, ARRAY_SIZE(imei1)) == -1);
4830 OSMO_ASSERT(gbproxy_check_imsi(&match, imei2, ARRAY_SIZE(imei2)) == -1);
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004831
4832 /* TODO: Check correct length but wrong type with is_mi_tmsi */
Jacob Erlbeck8fbf44a2014-09-25 11:21:34 +02004833
4834 gbproxy_clear_patch_filter(&match);
4835 OSMO_ASSERT(match.enable == 0);
Daniel Willmann1e0b0002015-10-12 19:36:34 +02004836
4837 cleanup_test();
Jacob Erlbeckb6799772014-08-07 10:46:29 +02004838}
4839
Daniel Willmann9f98d7b2016-11-08 15:29:30 +01004840static void test_gbproxy_stored_messages()
4841{
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01004842 struct gprs_ns_inst *nsi = gprs_ns_instantiate(gprs_ns_callback, tall_sgsn_ctx);
Daniel Willmann9f98d7b2016-11-08 15:29:30 +01004843 struct sockaddr_in bss_peer[1] = {{0},};
4844 struct sockaddr_in sgsn_peer= {0};
4845 struct gprs_ra_id rai_bss =
4846 {.mcc = 112, .mnc = 332, .lac = 16464, .rac = 96};
4847 struct gprs_ra_id rai_unknown =
4848 {.mcc = 1, .mnc = 99, .lac = 99, .rac = 96};
4849 uint16_t cell_id = 0x1234;
4850
4851 const uint32_t ptmsi = 0xefe2b700;
4852 const uint32_t local_tlli = 0xefe2b700;
4853
4854 const uint32_t foreign_tlli1 = 0x8000dead;
4855
4856 struct gbproxy_peer *peer;
4857 unsigned bss_nu = 0;
4858 unsigned sgsn_nu = 0;
4859
4860 OSMO_ASSERT(local_tlli == gprs_tmsi2tlli(ptmsi, TLLI_LOCAL));
4861
4862 bssgp_nsi = nsi;
4863 gbcfg.nsi = bssgp_nsi;
4864 gbcfg.nsip_sgsn_nsei = SGSN_NSEI;
Neels Hofmeyr6179f0c2018-02-21 00:39:36 +01004865 gbcfg.core_plmn = (struct osmo_plmn_id){};
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01004866 gbcfg.core_apn = talloc_zero_size(tall_sgsn_ctx, 100);
Daniel Willmann9f98d7b2016-11-08 15:29:30 +01004867 gbcfg.core_apn_size = gprs_str_to_apn(gbcfg.core_apn, 100, "foo.bar");
4868 gbcfg.patch_ptmsi = 0;
4869 gbcfg.acquire_imsi = 1;
4870 gbcfg.keep_link_infos = 0;
4871
4872 configure_sgsn_peer(&sgsn_peer);
4873 configure_bss_peers(bss_peer, ARRAY_SIZE(bss_peer));
4874
4875 printf("=== %s ===\n", __func__);
4876 printf("--- Initialise SGSN ---\n\n");
4877
4878 connect_sgsn(nsi, &sgsn_peer, SGSN_NSEI);
4879
4880 printf("--- Initialise BSS 1 ---\n\n");
4881
4882 setup_ns(nsi, &bss_peer[0], 0x1001, 0x1000);
4883 setup_bssgp(nsi, &bss_peer[0], 0x1002);
4884
4885 peer = gbproxy_peer_by_nsei(&gbcfg, 0x1000);
4886 OSMO_ASSERT(peer != NULL);
4887
4888 send_bssgp_reset_ack(nsi, &sgsn_peer, 0x1002);
4889
4890 gprs_dump_nsi(nsi);
4891 dump_global(stdout, 0);
4892 dump_peers(stdout, 0, 0, &gbcfg);
4893
4894 printf("--- Establish first LLC connection ---\n\n");
4895
4896 send_llc_ul_ui(nsi, "ATTACH REQUEST", &bss_peer[0], 0x1002,
4897 foreign_tlli1, &rai_unknown, cell_id,
4898 GPRS_SAPI_GMM, bss_nu++,
4899 dtap_attach_req, sizeof(dtap_attach_req));
4900
4901 dump_peers(stdout, 0, 0, &gbcfg);
4902
4903 send_llc_dl_ui(nsi, "IDENT REQUEST", &sgsn_peer, 0x1002,
4904 foreign_tlli1, 0, NULL, 0,
4905 GPRS_SAPI_GMM, sgsn_nu++,
4906 dtap_identity_req, sizeof(dtap_identity_req));
4907
4908 dump_peers(stdout, 0, 0, &gbcfg);
4909
4910 send_llc_ul_ui(nsi, "DETACH ACCEPT", &bss_peer[0], 0x1002,
4911 foreign_tlli1, &rai_bss, cell_id,
4912 GPRS_SAPI_GMM, bss_nu++,
4913 dtap_detach_acc, sizeof(dtap_detach_acc));
4914
4915 dump_peers(stdout, 0, 0, &gbcfg);
4916
4917 send_llc_ul_ui(nsi, "IDENT RESPONSE", &bss_peer[0], 0x1002,
4918 foreign_tlli1, &rai_bss, cell_id,
4919 GPRS_SAPI_GMM, bss_nu++,
4920 dtap_identity_resp, sizeof(dtap_identity_resp));
4921
4922 dump_peers(stdout, 0, 0, &gbcfg);
4923
4924 dump_global(stdout, 0);
4925
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02004926 talloc_free(gbcfg.core_apn);
4927 gbcfg.core_apn = NULL;
4928
Daniel Willmann9f98d7b2016-11-08 15:29:30 +01004929 gbprox_reset(&gbcfg);
4930 gprs_ns_destroy(nsi);
4931 nsi = NULL;
4932
4933 cleanup_test();
4934}
4935
Stefan Sperling606fb892018-06-07 19:12:25 +02004936/* See OS#3178 "gbproxy: failed to parse invalid BSSGP-UNITDATA message" */
4937static void test_gbproxy_parse_bssgp_unitdata()
4938{
4939 const char *hex = "0000239401e155cfea000004088872f4801018009c4000800e000601c0416c4338";
4940 struct msgb *msg = msgb_alloc(1034, "bssgp_unitdata");
4941 struct gprs_gb_parse_context parse_ctx;
4942 int rc;
4943
4944 memset(&parse_ctx, 0, sizeof(parse_ctx));
4945
4946 OSMO_ASSERT(msg);
4947 msgb_bssgph(msg) = msg->head;
4948 msgb_put(msg, osmo_hexparse(hex, msg->head, msgb_tailroom(msg)));
4949
4950 parse_ctx.to_bss = 0;
4951 parse_ctx.peer_nsei = msgb_nsei(msg);
4952
Stefan Sperling606fb892018-06-07 19:12:25 +02004953 rc = gprs_gb_parse_bssgp(msg->data, msg->len, &parse_ctx);
Stefan Sperling99dc4882018-06-23 16:50:06 +02004954 if (!rc)
4955 fprintf(stderr, "%s: Test passed; Failed to parse invalid message %s\n", __func__, msgb_hexdump(msg));
4956 else
4957 fprintf(stderr, "%s: Test failed; invalid message was accepted by parser: %s\n", __func__, msgb_hexdump(msg));
4958
4959 OSMO_ASSERT(!rc);
4960
4961 /* Manually decoded message according to:
4962 ETSI TS 148 018 V10.6.0 (2012 07) 96
4963 3GPP TS 48.018 version 10.6.0 Release 10
4964 Table 10.2.2: UL-UNITDATA PDU content
4965
4966 00 - PDU type UL-UNITDATA (ok)
4967
4968 11.3.35 Temporary logical link Identity (TLLI)
4969 00 - TLLI[0]
4970 23 - TLLI[1]
4971 94 - TLLI[2]
4972 01 - TLLI[3]
4973 TLLI == "00239401"
4974
4975 e1 - QOS[0] (bit rate MSB)
4976 55 - QOS[1] (bit rate LSB)
4977 bit rate = "57685" (57685*100000 bit/s per PBRG)
4978 cf - QOS[2] PBRG = 11 (bit rate is expressed in 100000 bit/s increments),
4979 C/R 0 (contains LLC ACK/SACK),
4980 T 0 (contains signalling),
4981 A 1 (radio if uses MAC/UNITDATA,
4982 Precedence 111 (reserved value)
4983
4984 ea - CELL_ID[0] (TLV IEI: wrong, should be 0x08)
4985 00 - CELL_ID[1] (length 1)
4986 00 - CELL_ID[2] (length 2)
4987 lenth == 0
4988 04 -- CELL_ID[3]
4989 08 -- CELL_ID[4]
4990 88 -- CELL_ID[5]
4991 72 -- CELL_ID[6]
4992 f4 -- CELL_ID[7]
4993 80 -- CELL_ID[8]
4994 10 -- CELL_DI[9]
4995
4996 18 -- QOSP[0] OoS Profile IEI
4997 not allowed in BSSGP Userdata
4998 00 -- QOSP[1]
4999 9c -- QOSP[2]
5000 40 -- QOSP[3]
5001 00 -- QOSP[4]
5002
5003 80 -- IEI for "E-UTRAN Inter RAT Handover Info"
5004 not allowed in BSSGP Userdata
5005 0e -- length (14 bytes -- only 8 bytes remain)
5006 00 06 01 c0 41 6c 43 38 */
Stefan Sperling606fb892018-06-07 19:12:25 +02005007
5008 msgb_free(msg);
Stefan Sperling99dc4882018-06-23 16:50:06 +02005009
5010 cleanup_test();
Stefan Sperling606fb892018-06-07 19:12:25 +02005011}
5012
Jacob Erlbeckb440bf82014-07-03 13:28:13 +02005013static struct log_info_cat gprs_categories[] = {
5014 [DGPRS] = {
5015 .name = "DGPRS",
5016 .description = "GPRS Packet Service",
5017 .enabled = 1, .loglevel = LOGL_DEBUG,
5018 },
5019 [DNS] = {
5020 .name = "DNS",
5021 .description = "GPRS Network Service (NS)",
5022 .enabled = 1, .loglevel = LOGL_INFO,
5023 },
5024 [DBSSGP] = {
5025 .name = "DBSSGP",
5026 .description = "GPRS BSS Gateway Protocol (BSSGP)",
5027 .enabled = 1, .loglevel = LOGL_DEBUG,
5028 },
Holger Hans Peter Freyther89276422014-07-07 19:48:14 +02005029};
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02005030
Holger Hans Peter Freyther89276422014-07-07 19:48:14 +02005031static struct log_info info = {
Jacob Erlbeckb440bf82014-07-03 13:28:13 +02005032 .cat = gprs_categories,
5033 .num_cat = ARRAY_SIZE(gprs_categories),
Holger Hans Peter Freyther89276422014-07-07 19:48:14 +02005034};
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02005035
5036int main(int argc, char **argv)
5037{
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02005038 talloc_enable_leak_report();
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01005039 tall_sgsn_ctx = talloc_named_const(NULL, 0, "gbproxy_test");
5040 void *log_ctx = talloc_named_const(tall_sgsn_ctx, 0, "log");
Neels Hofmeyr20215f12016-09-16 02:31:17 +02005041
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01005042 msgb_talloc_ctx_init(tall_sgsn_ctx, 0);
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02005043
5044 osmo_init_logging2(log_ctx, &info);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02005045 log_set_use_color(osmo_stderr_target, 0);
5046 log_set_print_filename(osmo_stderr_target, 0);
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +02005047 osmo_signal_register_handler(SS_L_NS, &test_signal, &gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02005048
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02005049 log_set_print_filename(osmo_stderr_target, 0);
Jacob Erlbeckb440bf82014-07-03 13:28:13 +02005050 log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
5051 log_set_all_filter(osmo_stderr_target, 1);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02005052
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01005053 rate_ctr_init(tall_sgsn_ctx);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02005054
5055 setlinebuf(stdout);
5056
5057 printf("===== GbProxy test START\n");
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +02005058 gbproxy_init_config(&gbcfg);
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02005059 test_gbproxy();
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02005060 test_gbproxy_ident_changes();
Jacob Erlbeckb6799772014-08-07 10:46:29 +02005061 test_gbproxy_imsi_matching();
Jacob Erlbeck571aec32014-09-18 09:21:20 +02005062 test_gbproxy_ptmsi_assignment();
Jacob Erlbeckeb3102e2014-07-07 10:46:01 +02005063 test_gbproxy_ra_patching();
Jacob Erlbeck70e00de2014-08-15 17:20:06 +02005064 test_gbproxy_ptmsi_patching();
Jacob Erlbeckf7d1b4e2014-10-20 16:25:01 +02005065 test_gbproxy_ptmsi_patching_bad_cases();
Jacob Erlbeckbfed3b22014-08-26 13:33:36 +02005066 test_gbproxy_imsi_acquisition();
Jacob Erlbeck12356062014-08-27 12:44:25 +02005067 test_gbproxy_secondary_sgsn();
Jacob Erlbeck2c74e442014-09-15 14:18:09 +02005068 test_gbproxy_keep_info();
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +02005069 test_gbproxy_tlli_expire();
Daniel Willmann9f98d7b2016-11-08 15:29:30 +01005070 test_gbproxy_stored_messages();
Stefan Sperling606fb892018-06-07 19:12:25 +02005071 test_gbproxy_parse_bssgp_unitdata();
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02005072 gbprox_reset(&gbcfg);
5073 /* gbprox_reset() frees the rate_ctr, but re-allocates it again. */
5074 rate_ctr_group_free(gbcfg.ctrg);
Jacob Erlbeck67f03bd2013-10-24 12:48:55 +02005075 printf("===== GbProxy test END\n\n");
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02005076
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02005077 talloc_free(log_ctx);
5078 /* expecting root and msgb ctx, empty */
Pau Espin Pedrold7b95e32018-10-30 17:27:59 +01005079 OSMO_ASSERT(talloc_total_blocks(tall_sgsn_ctx) == 2);
5080 talloc_free(tall_sgsn_ctx);
Neels Hofmeyr8de6b862018-04-16 00:57:10 +02005081
5082 return 0;
Jacob Erlbeck76fa57a2013-10-15 12:00:26 +02005083}